Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Как вариант, вам будет необходимо реализовать свою собственную функцию диалога. Для этого вы должны разобраться еще с двумя структурами данных.

struct pam_message {

 int msg_style;

 const char * msg;

};

struct pam_response {

 char * resp;

 int resp_retcode; /*пока что не используется, ожидается нулевое значение*/

};

Функции диалога передается массив указателей на структуры

pam_message
и массив указателей на структуры pam_response, каждый из которых имеет длину
num_msg
. При получении отклика его необходимо передавать каждой структуре
pam_message
в структуре
pam_response
с одним и тем же индексом массива,
msg_style
может принимать одно из перечисленных ниже значений.

PAM_PROMPT_ECHO_OFF
Выводит текст, определенный в msg как информационный (например, в стандартном дескрипторе выходного файла), просит пользователя об отклике, не отображая введенные символы (например, пароль), и возвращает текст в новую сформированную строку символов, хранящуюся в соответствующей структуре
resp pam_response
.
PAM_PROMPT_ECHO_ON
Выводит текст, определенный в
msg
как информационный (например, в стандартном дескрипторе выходного файла), просит пользователя об отклике, отображая введенные символы (например, имя пользователя), и возвращает текст в новую сформированную строку символов, хранящуюся в соответствующей структуре
resp pam_response
.
PAM_ERROR_MSG
Выводит текст, определенный в msg как текст ошибки (например, стандартный дескриптор файла ошибок), присваивает соответствующей структуре
resp pam_response
значение
NULL
.
PAM_TEXT_INFO
Выводит текст, определенный в
msg
как информационный (например, стандартный дескриптор выходного файла), присваивает структуре
resp pam_response
значение
NULL
.

Остальные значения могут быть определены как расширения стандарта; ваша функция диалога должна игнорировать их, если они не записываются для последующей их обработки, и должна просто передавать им

NULL
– отклик. РАМ (вернее, модуль РАМ, производящий запрос) отвечает за освобождение каждой строки
resp
, не содержащей
NULL
, а также массивов структур
pam_message
и
pam_response
.

Член

appdate_ptr
, который задается в структуре диалога, передается функции диалога. Это будет полезно в тех случаях, когда вы используете одну функцию диалога в нескольких контекстах, или если вы хотите передать контекстную информацию функции диалога. Эта информация может включать спецификацию дисплея X, внутреннюю структуру данных, в которой хранятся описатели файлов для соединения, или любые другие данные, которые могут быть полезны для вашего приложения. В любом случае, эта информация не интерпретируется библиотекой РАМ.

Функция диалога должна вернуть

PAM_CONVERR
, если во время выполнения возникнет ошибка, в противном случае —
PAM_SUCCESS
.

28.2.2. Действия РАМ

РАМ не хранит никакой статической информации в библиотеке между вызовами, а хранит всю постоянную информацию с использованием непрозрачной структуры данных, передаваемой всем вызовам. Этот непрозрачный объект,

pam_handle
, управляется РАМ, однако хранится в вызывающем приложении. Он инициализируется с помощью функции
pam_start
и освобождается функцией
pam_end
.

#include <security/pam_appl.h>

int pam_start (const char * service_name, const char * user,

 const struct pam_conv * pam_conversation,

 pam_handle_t ** pamh);

int pam_end(pam_handle_t * pamh, int pam_status);

Аргумент

service_name
должен представлять уникальное имя для вашего приложения. Это уникальное имя позволяет администратору системы конфигурировать защиту применительно к вашему приложению; два приложения, использующие одно и то же имя
service name
, разделяют одну и ту же конфигурацию. Аргумент
user
представляет имя аутентифицированного пользователя. Аргумент
pam_conversation
представляет структуру диалога, о которой мы уже говорили. Аргумент
pamh
представляет непрозрачный объект, который следит за внутренним состоянием. Функция
pam_start
показана в строке 97 кода.

Функция

pam_end
, показанная в строке 137 кода
pamexample.с
, очищает каждое; состояние, хранящееся в непрозрачном объекте
pamh
, и информирует модули, на которые он ссылается, о конечном состоянии действий. Если приложение успешно использовало РАМ, оно должно присвоить
pam_status
значение
PAM_SUCCESS
; в противном случае оно должно предоставить самую последнюю ошибку, возвращенную РАМ.

Бывают ситуации, когда модули РАМ могут использовать дополнительную информацию при принятии решения об аутентификации пользователя; эту информацию предоставляет система, а не пользователь. Кроме того, в некоторых случаях модули РАМ должны посылать приложению предупреждение об изменениях. Механизмом передачи этой дополнительной информации является элемент РАМ. Значение элемента задается с помощью функции

pam_set_item
, а его запрос осуществляется функцией
pam_get_item
.

#include <security/pam_appl.h>

extern int pam_set_item(pam_handle_t * pamh, int item_type,

 const void * item);

extern int pam_get_item(const pam_handle_t * pamh, int item_type,

 const void ** item);

Аргумент

item_type
определяет идентичность и семантику элемента РАМ
item
. Мы рассмотрим только наиболее часто используемые значения
item_type
.

PAM_TTY
item
представляет указатель на строку, содержащую имя устройства TTY, с которым связан запрос аутентификации. Это может быть
tty59
для первого последовательного порта в стандартной системе или
pts/0
для первого псевдотерминала, или
tty1
для первой виртуальной консоли.
PAM_USER
Функция
pam_start
автоматически присваивает это значение аргументу
user
, переданному функции
pam_start
. Важно отметить, что это имя может изменяться! Если вашему приложению нужно имя пользователя, то оно должно проверять значение посредством функции
pam_get_item
после попадания в стек РАМ и перед производством изменения имени в другом коде.
PAM_RUSER
Для сетевых протоколов (например, rsh и ssh) этот элемент должен применяться для передачи имени пользователя удаленной системы любым модулям РАМ, которые используют его. Благодаря этому администратор системы сможет определить, разрешена ли аутентификация типа
rhost
.
PAM_RHOST
Подобно
PAM_RUSER
,
PAM_RHOST
необходимо задавать для сетевых протоколов, в которых имя удаленного хоста может использоваться как компонент аутентификации, или при управлении учетной записью.
  • Читать дальше
  • 1
  • ...
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: