См. man 5 pam.d
для получения дополнительной информации об этих hijinx. Я предполагаю, что вы работаете в Linux с Linux-PAM.
Я предполагаю, что pam_test.so - это то, что вы написали. Таким образом, вы должны возвращать PAM_AUTH_ERR, когда пароль недействителен. Вы можете указать разные действия на основе разных кодов возврата с «расширенным» синтаксисом. Для справки, на (моей) справочной странице pam.d «простые» действия имеют следующий «расширенный» синтаксис:
required
[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
requisite
[success=ok new_authtok_reqd=ok ignore=ignore default=die]
sufficient
[success=done new_authtok_reqd=done default=ignore]
optional
[success=ok new_authtok_reqd=ok default=ignore]
Они имеют форму retval=action, где retval — это код возврата PAM_*, с удаленным PAM_ и преобразованным в нижний регистр (поэтому PAM_SUCCESS становится успешным). Действия bad и die дают статус неудачи, но die выходит из стека. Действия ok и done (и целое число N) указывают на успешный статус. «Готово» также останавливает выполнение стека. Использование целого числа N пропускает такое количество следующих модулей. Специальное «по умолчанию» означает «любое другое значение, возвращаемое модулем».
Затем вы можете сделать:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
Это остановит выполнение стека авторизации с ошибкой, если пароль неверный, остановит выполнение с успехом, когда модуль пройдет, и переместится по стеку аутентификации в любом другом сценарии.
Что касается возврата к вашему коду... это целая новая банка червей. Вы можете сделать это, но я не могу придумать способ, который не является полным взломом. Например, прыгайте через обручи с потоком управления, используя code=N, чтобы прыгать и вызывать свой модуль со специальными аргументами, которые затем завершаются успехом или неудачей в зависимости от аргумента. Для полноты (и полного HACK) что-то вроде:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=1] pam_test.so wasvalid
auth [default=bad] pam_test.so wasinvalid
Он имеет следующие свойства: Если пароль недействителен или удовлетворяет условиям pam_test.so, дальнейшая проверка подлинности не выполняется и завершается с ошибкой или успехом соответственно. Если pam_test не работает по какой-либо другой причине, он вызывает аутентификатор Google. Если это удается, он переходит к следующей строке с вызовом pam_test.so wasvalid
, в противном случае переходит к pam_test.so wasinvalid
. Выполняется только один из двух последующих вызовов pam_test.so. После этого фрагмента код возврата будет успешным или неудачным, в зависимости от статуса аутентификатора Google. Это фактически «требовать pam_google_authenticator.so, но также вызывать мой модуль с соответствующим флагом». Если вы хотите, чтобы авторизация заканчивалась этим, несмотря ни на что, вы можете использовать:
auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=done] pam_test.so wasvalid
auth [default=die] pam_test.so wasinvalid
person
Zach
schedule
10.03.2015