| From d4de5497bd89c408377194b9fa9026ba8e68b634 Mon Sep 17 00:00:00 2001 |
| From: Kai Kang <kai.kang@windriver.com> |
| Date: Mon, 11 Jan 2021 14:11:05 +0800 |
| Subject: [PATCH 4/8] lxdm.c: add function to change password with pam |
| |
| Add function to change user's password when pam is enabled. It is useful |
| to change user's password when the password is expired. |
| |
| Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/] |
| |
| Signed-off-by: Kai Kang <kai.kang@windriver.com> |
| --- |
| src/lxdm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| src/lxdm.h | 1 + |
| 2 files changed, 69 insertions(+) |
| |
| diff --git a/src/lxdm.c b/src/lxdm.c |
| index 638c30f..fe17a71 100644 |
| --- a/src/lxdm.c |
| +++ b/src/lxdm.c |
| @@ -104,6 +104,10 @@ static int old_tty=1,def_tty = 7,nr_tty=0; |
| static int def_display=0; |
| static GSList *session_list; |
| |
| +#if HAVE_LIBPAM |
| +static const char *new_passwd = NULL; |
| +#endif |
| + |
| static void lxdm_startx(LXSession *s); |
| |
| static int get_active_vt(void) |
| @@ -759,6 +763,69 @@ int lxdm_auth_user(int type,char *user, char *pass, struct passwd **ppw) |
| return ret; |
| } |
| |
| + |
| +#if HAVE_LIBPAM |
| + |
| +static int do_conv(int num, const struct pam_message **msg,struct pam_response **resp, void *arg) |
| +{ |
| + int result = PAM_SUCCESS; |
| + int i; |
| + |
| + *resp = (struct pam_response *) calloc(num, sizeof(struct pam_response)); |
| + for(i = 0; i < num; i++) |
| + { |
| + switch (msg[i]->msg_style) { |
| + case PAM_PROMPT_ECHO_ON: |
| + break; |
| + case PAM_PROMPT_ECHO_OFF: |
| + resp[i]->resp = strdup(new_passwd); |
| + break; |
| + case PAM_ERROR_MSG: |
| + case PAM_TEXT_INFO: |
| + break; |
| + default: |
| + break; |
| + } |
| + } |
| + return result; |
| +} |
| + |
| +static int lxdm_change_passwd_pam(const char *service, const char *user, const char *pass) |
| +{ |
| + pam_handle_t *pamh = NULL; |
| + static struct pam_conv conv = { |
| + do_conv, |
| + NULL |
| + }; |
| + |
| + int ret = pam_start("lxdm", user, &conv, &pamh); |
| + if (PAM_SUCCESS != ret) { |
| + g_warning("pam_start failed."); |
| + return 1; |
| + } |
| + |
| + new_passwd = pass; |
| + ret = pam_chauthtok(pamh, 0); |
| + if (PAM_SUCCESS != ret) { |
| + g_warning("pam_chauthtok failed: %s", pam_strerror(pamh, ret)); |
| + return 1; |
| + } |
| + |
| + (void)pam_end(pamh, PAM_SUCCESS); |
| + |
| + return 0; |
| +} |
| +#endif |
| + |
| +int lxdm_change_passwd(const char *user, const char *pass) |
| +{ |
| +#if HAVE_LIBPAM |
| + return lxdm_change_passwd_pam("lxdm", user, pass); |
| +#else |
| + return 0; |
| +#endif |
| +} |
| + |
| static void close_left_fds(void) |
| { |
| struct dirent **list; |
| @@ -1446,6 +1513,7 @@ int lxdm_do_auto_login(void) |
| lxdm_do_login(pw,session,lang,option); |
| success=1; |
| } |
| + |
| g_free(user);g_free(session);g_free(lang); |
| } |
| g_free(last_lang); |
| diff --git a/src/lxdm.h b/src/lxdm.h |
| index 1c2f837..be3c81f 100644 |
| --- a/src/lxdm.h |
| +++ b/src/lxdm.h |
| @@ -30,6 +30,7 @@ G_BEGIN_DECLS |
| extern GKeyFile *config; |
| |
| int lxdm_auth_user(int type,char *user,char *pass,struct passwd **ppw); |
| +int lxdm_change_passwd(const char *user, const char *pass); |
| void lxdm_do_login(struct passwd *pw,char *session,char *lang,char *option); |
| void lxdm_do_reboot(void); |
| void lxdm_do_shutdown(void); |
| -- |
| 2.25.1 |
| |