Путь к Linux. Руководство по установке и настройке


           

долгожданный пример, демонстрирующий использование механизма


Вот, наконец, долгожданный пример, демонстрирующий использование механизма поддержки теневых паролей программой, которая нуждается в этом механизме, но изначально его не обслуживает. Пример использует сервер протокола Point-to-Point (pppd-1.2.1d), который имеет режим аутентификации пользователей PAP, с использованием записей из файла /etc/passwd вместо PAP и CHAP файлов.
Этот режим используется не слишком часто, но если вы установите Shadow Suite то он просто не будет работать вообще, поскольку пароли более не хранятся в файле /etc/passwd.
Программы аутентификации пользователей  pppd-1.2.1d вы можете найти в файле  /usr/src/pppd-1.2.1d/pppd/auth.c.
Вначале вам придется добавить в начало этого файла несколько директив, включающих заголовочные файлы. Обратите вниамание на директивы условной компиляции.
  #ifdef HAS_SHADOW
  #include <shadow.h>
  #include <shadow/pwauth.h>
  #endif
Следующий шаг — модификация исходного кода. Мы продолжаем модифицировать файл auth.c.
Вот функция auth.c до модификации:
   /*
   * login - Проверка имени пользователя и его пароля по
   * данным из базы /etc/passwd.
   *
   * Возвращает:
   *      UPAP_AUTHNAK: Регистрация неудачна.
   *      UPAP_AUTHACK: Регистрация прошла успешно.
   * В любом случае msg указывает на соответствующее сообщение.
   */
  static int
  login(user, passwd, msg, msglen)
      char *user;
      char *passwd;
      char **msg;
      int *msglen;
  {
      struct passwd *pw;
      char *epasswd;
      char *tty;
      if ((pw = getpwnam(user)) == NULL) {
          return (UPAP_AUTHNAK);
      }
       /*
       * XXX Если пароля нет, регистрируемся без него.
       */
      if (pw->pw_passwd == '\0') {
          return (UPAP_AUTHACK);
      }
      epasswd = crypt(passwd, pw->pw_passwd);
      if (strcmp(epasswd, pw->pw_passwd)) {
          return (UPAP_AUTHNAK);
      }
      syslog(LOG_INFO, "user %s logged in", user);
      /*
       * Заполняем запись wtmp для этого пользователя.

Содержание  Назад  Вперед