Я не могу получить ACL для файла в XCode. Все время терпит неудачу. Мой код:
acl_type_t opt = ACL_TYPE_ACCESS;
const char *path_p = path.fileSystemRepresentation;
acl_t acl = acl_get_file(path_p, opt);
if (acl == NULL) {
NSAssert(NO, @"acl_get_file %s", path_p);
return;
}
Нашел пример, который делает то же самое, но не работает в моем случае.
ACL - Список контроля доступа. (Чтобы прочитать, что такое ACL, вы можете написать «man acl» или «man chmod» в приложении терминала.)
ACL файловой системы — это структура данных (обычно таблица), содержащая записи, определяющие права отдельных пользователей или групп на определенные системные объекты, такие как программы, процессы или файлы.
Я использовал NSOpenPanel для получения доступа:
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.directoryURL = [NSURL fileURLWithPath:@"/"];
openPanel.canChooseDirectories = false;
openPanel.canChooseFiles = !openPanel.canChooseDirectories;
[openPanel beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse result) {
[openPanel orderOut:nil];
if (result == NSModalResponseOK && openPanel.URL != nil) {
//My code getting ACL for openPanel.URL.path
}
}];
И затем я проверяю доступ к модификации для файла (я понятия не имею, как проверить доступ к ACL. Похоже, у меня его нет)
NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;
__auto_type resourceValues = [url resourceValuesForKeys:@[NSURLIsUserImmutableKey, NSURLIsWritableKey] error:&error];
NSParameterAssert(error == nil);
NSParameterAssert(!resourceValues.fileIsImmutable);
if ([resourceValues[NSURLIsWritableKey] isKindOfClass:[NSNumber class]]) {
NSParameterAssert([(NSNumber *)resourceValues[NSURLIsWritableKey] boolValue]);
} else {
NSParameterAssert(NO);
}
NSParameterAssert([[NSFileManager defaultManager] isWritableFileAtPath:path]);
Что я вижу в консоли:
12/14/20 5:59:15.383 PM ACLTest[915]: acl_get_file /Users/test/Desktop/untitled folder
Что я пробовал:
Я получил данные, которые мне нужны, в приложении «Терминал» (я знаю, как запустить скрипт из приложения, но предположим, что это может нарушить некоторые политики Apple. И иметь дополнительный цвет лица для пользователей. Поэтому моя цель — получить информацию из кода без запуск дополнительных скриптов):
# ls -le
total 64
drwxrwxr-x@ 8 <UserName> staff 256 Dec 14 16:29 <Folder Name>
0: group:everyone deny add_file,delete,add_subdirectory,delete_child,writeattr,writeextattr,chown
Вы видели эту библиотеку, которая работает с Xcode acl-dev.github.io/acl/README_EN.html и github.com/acl-dev/acl/tree/master
@paiv Не могли бы вы посоветовать, как это сделать? acl_get_file просто возвращает значение NULL или не NULL. Есть ли какая-то попытка/улов? системные журналы? не нашел =(
Когда acl_get_file возвращает NULL, он также устанавливает значение глобальной переменной errno
. Значения errno можно увидеть в системном заголовке <sys/errno.h>.
Используйте ACL_TYPE_EXTENDED
, так как другие типы не поддерживаются:
#import <sys/acl.h>
#import <stdio.h>
#import <sys/errno.h>
acl_t acl = acl_get_file(fn, ACL_TYPE_EXTENDED);
if (acl == NULL) {
if (errno == ENOENT) {
// either file not found, or does not have ACL attached
}
else {
perror("acl_get_file");
}
}
От acl.h :
/* 23.2.6 Individual ACL types */
typedef enum {
ACL_TYPE_EXTENDED = 0x00000100,
/* Posix 1003.1e types - not supported */
ACL_TYPE_ACCESS = 0x00000000,
ACL_TYPE_DEFAULT = 0x00000001,
/* The following types are defined on FreeBSD/Linux - not supported */
ACL_TYPE_AFS = 0x00000002,
ACL_TYPE_CODA = 0x00000003,
ACL_TYPE_NTFS = 0x00000004,
ACL_TYPE_NWFS = 0x00000005
} acl_type_t;
Связанные руководства:
Проверьте errno, возвращаемый acl_get_file