Как получить список контроля доступа (POSIX ACL) для файла в проекте XCode

Я не могу получить 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

Что я пробовал:

  • Дал моему приложению "Полный доступ к диску"
  • Запустил мое приложение 10.10 и 10.15
  • Написал тот же код в "Шаблон консольного проекта"
  • Пытался использовать каждый элемент перечисления из acl_type_t
  • Неудачный поиск в Google без каких-либо полезных результатов

Я получил данные, которые мне нужны, в приложении «Терминал» (я знаю, как запустить скрипт из приложения, но предположим, что это может нарушить некоторые политики 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

Проверьте errno, возвращаемый acl_get_file

paiv 28.04.2021 19:29

Вы видели эту библиотеку, которая работает с Xcode acl-dev.github.io/acl/README_EN.html и github.com/acl-dev/acl/tree/master

Devolus 29.04.2021 09:20

@paiv Не могли бы вы посоветовать, как это сделать? acl_get_file просто возвращает значение NULL или не NULL. Есть ли какая-то попытка/улов? системные журналы? не нашел =(

Nuzhdin Vladimir 29.04.2021 11:47

Когда acl_get_file возвращает NULL, он также устанавливает значение глобальной переменной errno. Значения errno можно увидеть в системном заголовке <sys/errno.h>.

Dave Weston 03.05.2021 16:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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;

Связанные руководства:

Другие вопросы по теме