Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. // Включаем необходимые заголовочные файлы.
  2.  
  3. #include <security/pam_modules.h>
  4. #include <stdarg.h>
  5. #include <time.h>
  6.  
  7. //Это определит тип нашего модуля
  8.  
  9. #define PAM_SM_AUTH
  10. #define MAX_V 30
  11.  
  12. // Самая интересная функция.
  13. // Именно она реализует наш неповторимый алгоритм аутентификации.
  14. // Подобные внешние функции должны существовать во всех модулях данного класса.
  15.  
  16. PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
  17. ,int argc, const char **argv)
  18. {
  19. unsigned int ctrl;
  20. int retval;
  21. const char *name, *p;
  22. char *right;
  23. /*special variables*/
  24. long x1,x2,x3,x4,y;
  25.  
  26. time_t mytime;
  27. struct tm *mytm;
  28.  
  29. /*готовимся к аутентификации*/
  30. mytime=time(0);
  31. mytm=localtime(&mytime);
  32.  
  33.  
  34. srandom(mytime);
  35. x1=random()%MAX_V;
  36. x2=random()%MAX_V;
  37. x3=random()%MAX_V;
  38. x4=random()%MAX_V;
  39.  
  40. //завели несколько случайных величин, а заодно узнали и время.
  41.  
  42. /* получим имя пользователя */
  43.  
  44. // Получаем имя пользователя
  45. // Вся мудрость PAM в том, что приглашение "login: " появится если имя
  46. еще не известно,
  47. // иначе мы сразу получим ответ, сгенерированный предыдущими модулями.
  48.  
  49. retval = pam_get_user(pamh, &name, "login: ");
  50.  
  51. /*получим пароль используя диалог*/
  52.  
  53. {
  54. struct pam_conv *conv;
  55. struct pam_message *pmsg[3],msg[3];
  56. struct pam_response *response;
  57.  
  58.  
  59. retval = pam_get_item( pamh, PAM_CONV, (const void **) &conv ) ;
  60.  
  61. // Сами мы не знаем как будет осущестляться диалог, это забота программы
  62. (в нашем случае этим займется login). Мы
  63. // лишь только укажем параметры, вид приглашения и более того, можем
  64. задать сразу несколько приглашений, если надо
  65. // получить сразу несколько ответов
  66.  
  67. pmsg[0] = &msg[0];
  68. msg[0].msg_style = PAM_PROMPT_ECHO_OFF;
  69. msg[0].msg=malloc(100);
  70. snprintf(msg[0].msg,60,"Second Password:%d:%d:%d:%d:",x1,x2,x3,x4);
  71.  
  72. retval = conv->conv(1, ( const struct pam_message ** ) pmsg
  73. , &response, conv->appdata_ptr);
  74. // Нам дали указатель на диалоговую функцию. ╢е и запускаем.
  75. /*просчитаем правильный ответ*/
  76. y=2*x1*mytm->tm_mday+x3*mytm->tm_hour;
  77. right=malloc(100);
  78. snprintf(right,20,"%d",y);
  79. // Сравним с ответом пользователя. Ответ формируется диалоговой функцией в спе
  80. циальном формате.
  81. if (!(strcmp(right,response->resp))){
  82. return PAM_SUCCESS;
  83. }else{
  84. return PAM_AUTH_ERR;
  85. }
  86. }/*диалог*/
  87. return PAM_SUCCESS;
  88. // Нашим результатом будет да или нет. Как прервать программу разберется основн
  89. ой модуль PAM.
  90. }
  91.  
  92.  
  93. /*
  94. * The only thing _pam_set_credentials_unix() does is initialization of
  95. * UNIX group IDs.
  96. *
  97. * Well, everybody but me on linux-pam is convinced that it should not
  98. * initialize group IDs, so I am not doing it but don't say that I haven't
  99. * warned you. -- AOY
  100. * Перевожу: ╢динственная вещь которую делает pam_set_cred это инициализация
  101. Идентификаторов групп... короче в данном случае это нам совершенно не нужно
  102. */
  103.  
  104. PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags
  105. ,int argc, const char **argv)
  106. {
  107. unsigned int ctrl;
  108. int retval;
  109.  
  110.  
  111. retval = PAM_SUCCESS;
  112. //Чтобы никто не заметил, что мы ничего не делаем ответим, что все в порядке
  113. return retval;
  114. }
  115.  
  116. // Это определение необходимо для статической линковки модулей PAM в приложения
  117. х.
  118. #ifdef PAM_STATIC
  119. struct pam_module _pam_unix_auth_modstruct = {
  120. "pam_test",
  121. pam_sm_authenticate,
  122. pam_sm_setcred,
  123. NULL,
  124. NULL,
  125. NULL,
  126. NULL,
  127. };
  128. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement