/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
* Jonathan Schleifer <js@heap.zone>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFSandbox.h"
#import "OFString.h"
#import "OFArray.h"
@implementation OFSandbox
@synthesize allowsStdIO = _allowsStdIO;
@synthesize allowsReadingFiles = _allowsReadingFiles;
@synthesize allowsWritingFiles = _allowsWritingFiles;
@synthesize allowsCreatingFiles = _allowsCreatingFiles;
@synthesize allowsCreatingSpecialFiles = _allowsCreatingSpecialFiles;
@synthesize allowsTemporaryFiles = _allowsTemporaryFiles;
@synthesize allowsIPSockets = _allowsIPSockets;
@synthesize allowsMulticastSockets = _allowsMulticastSockets;
@synthesize allowsChangingFileAttributes = _allowsChangingFileAttributes;
@synthesize allowsFileOwnerChanges = _allowsFileOwnerChanges;
@synthesize allowsFileLocks = _allowsFileLocks;
@synthesize allowsUNIXSockets = _allowsUNIXSockets;
@synthesize allowsDNS = _allowsDNS;
@synthesize allowsUserDatabaseReading = _allowsUserDatabaseReading;
@synthesize allowsFileDescriptorSending = _allowsFileDescriptorSending;
@synthesize allowsFileDescriptorReceiving = _allowsFileDescriptorReceiving;
@synthesize allowsTape = _allowsTape;
@synthesize allowsTTY = _allowsTTY;
@synthesize allowsProcessOperations = _allowsProcessOperations;
@synthesize allowsExec = _allowsExec;
@synthesize allowsProtExec = _allowsProtExec;
@synthesize allowsSetTime = _allowsSetTime;
@synthesize allowsPS = _allowsPS;
@synthesize allowsVMInfo = _allowsVMInfo;
@synthesize allowsChangingProcessRights = _allowsChangingProcessRights;
@synthesize allowsPF = _allowsPF;
@synthesize allowsAudio = _allowsAudio;
@synthesize allowsBPF = _allowsBPF;
+ (instancetype)sandbox
{
return [[[self alloc] init] autorelease];
}
- copy
{
OFSandbox *copy = [[OFSandbox alloc] init];
copy->_allowsStdIO = _allowsStdIO;
copy->_allowsReadingFiles = _allowsReadingFiles;
copy->_allowsWritingFiles = _allowsWritingFiles;
copy->_allowsCreatingFiles = _allowsCreatingFiles;
copy->_allowsCreatingSpecialFiles = _allowsCreatingSpecialFiles;
copy->_allowsTemporaryFiles = _allowsTemporaryFiles;
copy->_allowsIPSockets = _allowsIPSockets;
copy->_allowsMulticastSockets = _allowsMulticastSockets;
copy->_allowsChangingFileAttributes = _allowsChangingFileAttributes;
copy->_allowsFileOwnerChanges = _allowsFileOwnerChanges;
copy->_allowsFileLocks = _allowsFileLocks;
copy->_allowsUNIXSockets = _allowsUNIXSockets;
copy->_allowsDNS = _allowsDNS;
copy->_allowsUserDatabaseReading = _allowsUserDatabaseReading;
copy->_allowsFileDescriptorSending = _allowsFileDescriptorSending;
copy->_allowsFileDescriptorReceiving = _allowsFileDescriptorReceiving;
copy->_allowsTape = _allowsTape;
copy->_allowsTTY = _allowsTTY;
copy->_allowsProcessOperations = _allowsProcessOperations;
copy->_allowsExec = _allowsExec;
copy->_allowsProtExec = _allowsProtExec;
copy->_allowsSetTime = _allowsSetTime;
copy->_allowsPS = _allowsPS;
copy->_allowsVMInfo = _allowsVMInfo;
copy->_allowsChangingProcessRights = _allowsChangingProcessRights;
copy->_allowsPF = _allowsPF;
copy->_allowsAudio = _allowsAudio;
copy->_allowsBPF = _allowsBPF;
return copy;
}
- (bool)isEqual: (id)otherObject
{
OFSandbox *otherSandbox;
if (![otherObject isKindOfClass: [OFSandbox class]])
return false;
otherSandbox = otherObject;
if (otherSandbox->_allowsStdIO != _allowsStdIO)
return false;
if (otherSandbox->_allowsReadingFiles != _allowsReadingFiles)
return false;
if (otherSandbox->_allowsWritingFiles != _allowsWritingFiles)
return false;
if (otherSandbox->_allowsCreatingFiles != _allowsCreatingFiles)
return false;
if (otherSandbox->_allowsCreatingSpecialFiles !=
_allowsCreatingSpecialFiles)
return false;
if (otherSandbox->_allowsTemporaryFiles != _allowsTemporaryFiles)
return false;
if (otherSandbox->_allowsIPSockets != _allowsIPSockets)
return false;
if (otherSandbox->_allowsMulticastSockets != _allowsMulticastSockets)
return false;
if (otherSandbox->_allowsChangingFileAttributes !=
_allowsChangingFileAttributes)
return false;
if (otherSandbox->_allowsFileOwnerChanges != _allowsFileOwnerChanges)
return false;
if (otherSandbox->_allowsFileLocks != _allowsFileLocks)
return false;
if (otherSandbox->_allowsUNIXSockets != _allowsUNIXSockets)
return false;
if (otherSandbox->_allowsDNS != _allowsDNS)
return false;
if (otherSandbox->_allowsUserDatabaseReading !=
_allowsUserDatabaseReading)
return false;
if (otherSandbox->_allowsFileDescriptorSending !=
_allowsFileDescriptorSending)
return false;
if (otherSandbox->_allowsFileDescriptorReceiving !=
_allowsFileDescriptorReceiving)
return false;
if (otherSandbox->_allowsTape != _allowsTape)
return false;
if (otherSandbox->_allowsTTY != _allowsTTY)
return false;
if (otherSandbox->_allowsProcessOperations != _allowsProcessOperations)
return false;
if (otherSandbox->_allowsExec != _allowsExec)
return false;
if (otherSandbox->_allowsProtExec != _allowsProtExec)
return false;
if (otherSandbox->_allowsSetTime != _allowsSetTime)
return false;
if (otherSandbox->_allowsPS != _allowsPS)
return false;
if (otherSandbox->_allowsVMInfo != _allowsVMInfo)
return false;
if (otherSandbox->_allowsChangingProcessRights !=
_allowsChangingProcessRights)
return false;
if (otherSandbox->_allowsPF != _allowsPF)
return false;
if (otherSandbox->_allowsAudio != _allowsAudio)
return false;
if (otherSandbox->_allowsBPF != _allowsBPF)
return false;
return true;
}
- (uint32_t)hash
{
uint32_t hash;
OF_HASH_INIT(hash);
OF_HASH_ADD(hash, _allowsStdIO);
OF_HASH_ADD(hash, _allowsReadingFiles);
OF_HASH_ADD(hash, _allowsWritingFiles);
OF_HASH_ADD(hash, _allowsCreatingFiles);
OF_HASH_ADD(hash, _allowsCreatingSpecialFiles);
OF_HASH_ADD(hash, _allowsTemporaryFiles);
OF_HASH_ADD(hash, _allowsIPSockets);
OF_HASH_ADD(hash, _allowsMulticastSockets);
OF_HASH_ADD(hash, _allowsChangingFileAttributes);
OF_HASH_ADD(hash, _allowsFileOwnerChanges);
OF_HASH_ADD(hash, _allowsFileLocks);
OF_HASH_ADD(hash, _allowsUNIXSockets);
OF_HASH_ADD(hash, _allowsDNS);
OF_HASH_ADD(hash, _allowsUserDatabaseReading);
OF_HASH_ADD(hash, _allowsFileDescriptorSending);
OF_HASH_ADD(hash, _allowsFileDescriptorReceiving);
OF_HASH_ADD(hash, _allowsTape);
OF_HASH_ADD(hash, _allowsTTY);
OF_HASH_ADD(hash, _allowsProcessOperations);
OF_HASH_ADD(hash, _allowsExec);
OF_HASH_ADD(hash, _allowsProtExec);
OF_HASH_ADD(hash, _allowsSetTime);
OF_HASH_ADD(hash, _allowsPS);
OF_HASH_ADD(hash, _allowsVMInfo);
OF_HASH_ADD(hash, _allowsChangingProcessRights);
OF_HASH_ADD(hash, _allowsPF);
OF_HASH_ADD(hash, _allowsAudio);
OF_HASH_ADD(hash, _allowsBPF);
OF_HASH_FINALIZE(hash);
return hash;
}
#ifdef OF_HAVE_PLEDGE
- (OFString *)pledgeString
{
void *pool = objc_autoreleasePoolPush();
OFMutableArray *pledges = [OFMutableArray array];
OFString *ret;
if (_allowsStdIO)
[pledges addObject: @"stdio"];
if (_allowsReadingFiles)
[pledges addObject: @"rpath"];
if (_allowsWritingFiles)
[pledges addObject: @"wpath"];
if (_allowsCreatingFiles)
[pledges addObject: @"cpath"];
if (_allowsCreatingSpecialFiles)
[pledges addObject: @"dpath"];
if (_allowsTemporaryFiles)
[pledges addObject: @"tmppath"];
if (_allowsIPSockets)
[pledges addObject: @"inet"];
if (_allowsMulticastSockets)
[pledges addObject: @"mcast"];
if (_allowsChangingFileAttributes)
[pledges addObject: @"fattr"];
if (_allowsFileOwnerChanges)
[pledges addObject: @"chown"];
if (_allowsFileLocks)
[pledges addObject: @"flock"];
if (_allowsUNIXSockets)
[pledges addObject: @"unix"];
if (_allowsDNS)
[pledges addObject: @"dns"];
if (_allowsUserDatabaseReading)
[pledges addObject: @"getpw"];
if (_allowsFileDescriptorSending)
[pledges addObject: @"sendfd"];
if (_allowsFileDescriptorReceiving)
[pledges addObject: @"recvfd"];
if (_allowsTape)
[pledges addObject: @"tape"];
if (_allowsTTY)
[pledges addObject: @"tty"];
if (_allowsProcessOperations)
[pledges addObject: @"proc"];
if (_allowsExec)
[pledges addObject: @"exec"];
if (_allowsProtExec)
[pledges addObject: @"prot_exec"];
if (_allowsSetTime)
[pledges addObject: @"settime"];
if (_allowsPS)
[pledges addObject: @"ps"];
if (_allowsVMInfo)
[pledges addObject: @"vminfo"];
if (_allowsChangingProcessRights)
[pledges addObject: @"id"];
if (_allowsPF)
[pledges addObject: @"pf"];
if (_allowsAudio)
[pledges addObject: @"audio"];
if (_allowsBPF)
[pledges addObject: @"bpf"];
ret = [pledges componentsJoinedByString: @" "];
[ret retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
#endif
@end