Услуги авторизации, сохраняйте авторизацию со временем - PullRequest
1 голос
/ 03 мая 2011

Я хотел бы знать, возможно ли сохранить полученную аутентификацию с течением времени.
Вот мой код:

- (IBAction)toggleAuthentification:(id)sender {
    if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL) == errAuthorizationSuccess) {
        AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
        authRef = NULL;
        AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
        [sender setState:NSOffState];
    } else if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL) == errAuthorizationSuccess) {
        AuthorizationMakeExternalForm(authRef, &extAuthRef);
        [sender setState:NSOnState];

        NSDictionary *authRightInfo;
        if (AuthorizationRightGet(authRights.items[0].name, (CFDictionaryRef *)&authRightInfo) == errAuthorizationSuccess) {
            //[authRightInfo valueForKey:@"timeout"] == 300
            keepAuthTimer = [NSTimer scheduledTimerWithTimeInterval:([[authRightInfo valueForKey:@"timeout"] unsignedShortValue] - 10) target:self selector:@selector(keepAuthentification:) userInfo:nil repeats:YES];
        }
    } else {
        [sender setState:NSOffState];
    }
}

- (void)keepAuthentification:(NSTimer *)aTimer {
    NSLog(@"%d", AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL));
    NSLog(@"keepAuth", aTimer);
}

Шаг 1: нажмите кнопку, которая вызывает toggleAuthentification:, и выполните авторизацию успешно.
Шаг 2: Через 290 секунд я получаю 0 и keepAuth с консоли, поэтому мой NSTimer работает.
Шаг 3: подождите еще несколько секунд (более 10) и снова нажмите на мою кнопку.Аут панель снова появится !!!

Почему мой вызов AuthorizationCopyRights в keepAuthentification: не сбрасывает время ожидания 300 секунд (для этого права авторизации)?

Я хотел бы иметь приложение, в котором вы должныведение журнала только один раз за выполнение приложения или пока вы вручную не запросите выход из системы, нажав кнопку.

1 Ответ

2 голосов
/ 03 мая 2011

Где задокументировано, что AuthorizationCopyRights должен сбрасывать таймер? AuthorizationCopyRights запросит запрошенные права у подсистемы безопасности, а подсистема безопасности либо сразу выдаст права, либо запросит у пользователя авторизацию. Тайм-аут после того, сколько секунд система должна снова запросить авторизацию пользователя, настроенного в /etc/authorization, и его также можно установить равным 0, что означает, что система всегда должна повторно запрашивать пользователя.

Если вы хотите использовать права авторизации для запуска инструмента с привилегиями root (помощника) несколько раз в будущем, просто сделайте следующее:

  • Если вам нужно запустить приложение с привилегиями root, обратитесь к пользователю за авторизацией.

  • Когда авторизация прошла успешно, не запускайте helper-tool напрямую, а запустите helper-helper-tool с привилегиями root.

  • Инструмент помощник-помощник продолжает работать в фоновом режиме до тех пор, пока ваше приложение не сообщит ему о выходе, что произойдет, когда само ваше приложение собирается выйти или когда пользователь деавторизируется.

  • Помощник-помощник-инструмент связывается с вашим приложением с помощью какого-то метода IPC. E.g.:

    1. Он читает команды из stdin - при запуске задачи вы можете получить доступ к ее каналу stdin (см. Параметр communicationsPipe из AuthorizationExecuteWithPrivileges .

    2. Если инструмент-помощник написан на Obj-C, вы можете использовать Распределенные объекты .

    3. Если это не написано в Obj-C, и вы не хотите использовать файловый канал по какой-либо причине, вы можете предпочесть использовать сокеты UNIX. Сокеты UNIX работают как сетевые сокеты, но без использования сетевого протокола или сетевых адресов. Любой процесс открывает сокет UNIX сервера, а другой процесс создает сокет UNIX клиента и подключает его к сокету сервера. Теперь оба процесса могут обмениваться данными через этот сокет (в обоих направлениях, поскольку сокеты всегда являются двунаправленными).

    4. Если вам необходимо отправить много данных в ваш помощник-помощник, все вышеперечисленные методы могут быть довольно медленными, так как они включают копирование данных или даже их преобразование, копирование и преобразование снова. В этом случае используйте разделяемую память POSIX для передачи данных (это самый быстрый способ передачи данных между процессами, поскольку данные вообще не передаются, они просто доступны нескольким процессам одновременно) и используют только любой из описанные выше способы информируют другой процесс об обновлении содержимого памяти.

  • Теперь отправьте helper-helper-tool команду, которая заставляет его запустить helper-tool (с соответствующими параметрами). Поскольку helper-helper-tool запускается от имени root, helper-tool также запускается от имени root.

  • Поскольку вспомогательный инструмент остается активным до тех пор, пока вы не скажете ему выйти, при необходимости он всегда может запустить другой корневой экземпляр вспомогательного инструмента.

  • Для случаев, когда вы хотите запустить вспомогательный инструмент без привилегий root, просто вызовите его напрямую, не используя вспомогательный инструмент.

Конечно, приведенный выше метод слишком сложен, но, вероятно, его проще всего адаптировать к вашему текущему коду. Лично я бы вообще не использовал вспомогательный инструмент, а вместо этого заставлял сам вспомогательный инструмент постоянно работать в фоновом режиме. Затем вспомогательный инструмент будет либо непосредственно выполнять запрошенные действия, либо, если это невозможно по какой-либо причине, сам форкнуть, а затем выполнить действия (это не будет работать, если вы используете CoreFoundation, Foundation или некоторые другие фреймворки Apple) или сам форк и затем повторно выполнить себя с параметром, который говорит ему просто выполнить определенное действие, а затем выйти. Преимущество состоит в том, что будет только один вспомогательный инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...