aboutsummaryrefslogtreecommitdiff
path: root/Linux-PAM/libpam/pam_password.c
diff options
context:
space:
mode:
authorSteve Langasek <steve.langasek@ubuntu.com>2019-01-03 13:00:10 -0800
committerSteve Langasek <steve.langasek@ubuntu.com>2019-01-03 13:00:10 -0800
commit9d69c7bbb05cc22edce56e751cef5828e652988a (patch)
treeb97c4aa6e6133fa3e319805c5190819020838c32 /Linux-PAM/libpam/pam_password.c
parenta6f4ab0bebc76acf85cc0244bd21c1036009c28c (diff)
parentd5b06b67bbeeed7c05c0eb2e05d6a972ad050d1c (diff)
downloadpam-9d69c7bbb05cc22edce56e751cef5828e652988a.tar.gz
pam-9d69c7bbb05cc22edce56e751cef5828e652988a.tar.bz2
pam-9d69c7bbb05cc22edce56e751cef5828e652988a.zip
Merge tag 'upstream/0.99.7.1' into debian
Diffstat (limited to 'Linux-PAM/libpam/pam_password.c')
-rw-r--r--Linux-PAM/libpam/pam_password.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/Linux-PAM/libpam/pam_password.c b/Linux-PAM/libpam/pam_password.c
new file mode 100644
index 00000000..cd57f20b
--- /dev/null
+++ b/Linux-PAM/libpam/pam_password.c
@@ -0,0 +1,61 @@
+/* pam_password.c - PAM Password Management */
+
+/*
+ * $Id: pam_password.c,v 1.5 2006/07/24 15:47:40 kukuk Exp $
+ */
+
+/* #define DEBUG */
+
+#include "pam_private.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int pam_chauthtok(pam_handle_t *pamh, int flags)
+{
+ int retval;
+
+ D(("called."));
+
+ IF_NO_PAMH("pam_chauthtok", pamh, PAM_SYSTEM_ERR);
+
+ if (__PAM_FROM_MODULE(pamh)) {
+ D(("called from module!?"));
+ return PAM_SYSTEM_ERR;
+ }
+
+ if (pamh->former.choice == PAM_NOT_STACKED) {
+ _pam_start_timer(pamh); /* we try to make the time for a failure
+ independent of the time it takes to
+ fail */
+ _pam_sanitize(pamh);
+ pamh->former.update = PAM_FALSE;
+ }
+
+ /* first call to check if there will be a problem */
+ if (pamh->former.update ||
+ (retval = _pam_dispatch(pamh, flags|PAM_PRELIM_CHECK,
+ PAM_CHAUTHTOK)) == PAM_SUCCESS) {
+ D(("completed check ok: former=%d", pamh->former.update));
+ pamh->former.update = PAM_TRUE;
+ retval = _pam_dispatch(pamh, flags|PAM_UPDATE_AUTHTOK,
+ PAM_CHAUTHTOK);
+ }
+
+ /* if we completed we should clean up */
+ if (retval != PAM_INCOMPLETE) {
+ _pam_sanitize(pamh);
+ pamh->former.update = PAM_FALSE;
+ _pam_await_timer(pamh, retval); /* if unsuccessful then wait now */
+ D(("pam_chauthtok exit %d - %d", retval, pamh->former.choice));
+ } else {
+ D(("will resume when ready", retval));
+ }
+
+#ifdef HAVE_LIBAUDIT
+ retval = _pam_auditlog(pamh, PAM_CHAUTHTOK, retval, flags);
+#endif
+
+ return retval;
+}
+