mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-06-04 14:39:54 +00:00
lxdm: support to change user password
Update lxdm to support change user password when the password expired. It also add a label to show useful information to tell user that 'Authentication failed' or 'password expired' etc. It only work with distro feature 'pam'. Signed-off-by: Kai Kang <kai.kang@windriver.com> Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
+33
@@ -0,0 +1,33 @@
|
|||||||
|
From f6b8e141e00c4837239f5b69af4e7bee1204abba Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Thu, 17 Dec 2020 10:18:58 +0800
|
||||||
|
Subject: [PATCH 1/8] greeter: set visible when switch to input user
|
||||||
|
|
||||||
|
It switches back to input user entry if press Esc key when input the
|
||||||
|
password. At this time, the user name input is shown as '*' rather than
|
||||||
|
plain text. Set the visibility to fix this issue. And clean the text as
|
||||||
|
well.
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/greeter.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/greeter.c b/src/greeter.c
|
||||||
|
index 2c6e5be..f100c72 100644
|
||||||
|
--- a/src/greeter.c
|
||||||
|
+++ b/src/greeter.c
|
||||||
|
@@ -139,6 +139,8 @@ static void switch_to_input_user(void)
|
||||||
|
pass=NULL;
|
||||||
|
}
|
||||||
|
gtk_label_set_text( GTK_LABEL(prompt), _("User:"));
|
||||||
|
+ gtk_entry_set_text(GTK_ENTRY(login_entry), "");
|
||||||
|
+ gtk_entry_set_visibility(GTK_ENTRY(login_entry), TRUE);
|
||||||
|
gtk_widget_show(prompt);
|
||||||
|
if(user_list)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
From 3a3c5c644c9790cb3f88f3ce3757c2803cff90c5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Thu, 17 Dec 2020 14:32:40 +0800
|
||||||
|
Subject: [PATCH 2/8] greeter-gdk.c: fix typo
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/greeter-gdk.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/greeter-gdk.c b/src/greeter-gdk.c
|
||||||
|
index 1b27d2e..5aa3e7f 100644
|
||||||
|
--- a/src/greeter-gdk.c
|
||||||
|
+++ b/src/greeter-gdk.c
|
||||||
|
@@ -299,7 +299,7 @@ void ui_prepare(void)
|
||||||
|
attr.wclass = GDK_INPUT_OUTPUT;
|
||||||
|
win = gdk_window_new(root, &attr, mask);
|
||||||
|
gdk_window_set_decorations(win,0);
|
||||||
|
- gdk_window_set_title(win,"lxdm-greter-gdk");
|
||||||
|
+ gdk_window_set_title(win,"lxdm-greeter-gdk");
|
||||||
|
|
||||||
|
scr=gdk_screen_get_default();
|
||||||
|
g_signal_connect(scr, "size-changed", G_CALLBACK(on_screen_size_changed), win);
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
From 497e0fc7010969759c8247f7013a89589c44234a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Thu, 17 Dec 2020 18:12:29 +0800
|
||||||
|
Subject: [PATCH 3/8] check whether password expired with pam
|
||||||
|
|
||||||
|
Introduce a new enum AuthResult type AUTH_PASSWD_EXPIRE. When user's
|
||||||
|
password is expired, return it. Only work with pam.
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/lxdm.h | 1 +
|
||||||
|
src/pam.c | 4 ++++
|
||||||
|
2 files changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/lxdm.h b/src/lxdm.h
|
||||||
|
index 568573f..1c2f837 100644
|
||||||
|
--- a/src/lxdm.h
|
||||||
|
+++ b/src/lxdm.h
|
||||||
|
@@ -41,6 +41,7 @@ enum AuthResult
|
||||||
|
AUTH_SUCCESS,
|
||||||
|
AUTH_BAD_USER,
|
||||||
|
AUTH_FAIL,
|
||||||
|
+ AUTH_PASSWD_EXPIRE,
|
||||||
|
AUTH_PRIV,
|
||||||
|
AUTH_ERROR
|
||||||
|
};
|
||||||
|
diff --git a/src/pam.c b/src/pam.c
|
||||||
|
index 43bd687..16a36f0 100644
|
||||||
|
--- a/src/pam.c
|
||||||
|
+++ b/src/pam.c
|
||||||
|
@@ -257,6 +257,10 @@ int lxdm_auth_user_authenticate(LXDM_AUTH *a,const char *user,const char *pass,i
|
||||||
|
return AUTH_FAIL;
|
||||||
|
}
|
||||||
|
ret=pam_acct_mgmt(a->handle,PAM_SILENT);
|
||||||
|
+ if (ret == PAM_NEW_AUTHTOK_REQD) {
|
||||||
|
+ g_debug("user %s account has expired\n", user);
|
||||||
|
+ return AUTH_PASSWD_EXPIRE;
|
||||||
|
+ }
|
||||||
|
if(ret!=PAM_SUCCESS)
|
||||||
|
{
|
||||||
|
g_debug("user %s acct mgmt fail with %d\n",user,ret);
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
+124
@@ -0,0 +1,124 @@
|
|||||||
|
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
|
||||||
|
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
From 54b2ed18ca52fa682ade2fe84e1b0d19d1b78cc4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Mon, 11 Jan 2021 16:48:26 +0800
|
||||||
|
Subject: [PATCH 5/8] ui.c: handle password-expire and update-new-password
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/ui.c | 20 ++++++++++++++++++++
|
||||||
|
1 file changed, 20 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/ui.c b/src/ui.c
|
||||||
|
index f233589..3ddb484 100644
|
||||||
|
--- a/src/ui.c
|
||||||
|
+++ b/src/ui.c
|
||||||
|
@@ -161,6 +161,9 @@ static gboolean on_greeter_input(GIOChannel *source, GIOCondition condition, gpo
|
||||||
|
ui_drop();
|
||||||
|
lxdm_do_login(pw, session, lang,NULL);
|
||||||
|
}
|
||||||
|
+ else if (AUTH_PASSWD_EXPIRE == ret) {
|
||||||
|
+ xwrite(greeter_pipe[0], "password-expire\n", 16);
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(pass!=NULL)
|
||||||
|
@@ -205,6 +208,23 @@ static gboolean on_greeter_input(GIOChannel *source, GIOCondition condition, gpo
|
||||||
|
g_free(session);
|
||||||
|
g_free(lang);
|
||||||
|
}
|
||||||
|
+ else if (!strncmp(str, "update-new-password", 19)) {
|
||||||
|
+ xwrite(greeter_pipe[0], "update-new-password\n", 20);
|
||||||
|
+ char *user = greeter_param(str, "user");
|
||||||
|
+ char *pass = greeter_param(str, "newpass");
|
||||||
|
+ char *session = greeter_param(str, "session");
|
||||||
|
+ char *lang = greeter_param(str, "lang");
|
||||||
|
+
|
||||||
|
+ int ret = lxdm_change_passwd(user, pass);
|
||||||
|
+ if (ret) {
|
||||||
|
+ xwrite(greeter_pipe[0], "invalid-new-password\n", 21);
|
||||||
|
+ } else {
|
||||||
|
+ struct passwd *pw;
|
||||||
|
+ ret = lxdm_auth_user(AUTH_TYPE_NORMAL, user, pass, &pw);
|
||||||
|
+ ui_drop();
|
||||||
|
+ lxdm_do_login(pw, session, lang, NULL);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
g_free(str);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
From 8414d63343cc7909bc7a972941c678509d5d5be6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Mon, 11 Jan 2021 10:15:45 +0800
|
||||||
|
Subject: [PATCH 6/8] themes/Industrial: add info label in ui
|
||||||
|
|
||||||
|
Adjust the layout and add a new label "info" under the labe "prompt" in
|
||||||
|
themes/Industrial to tell user some useful information such as
|
||||||
|
"Authentication failed" or "Invalid password".
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
data/themes/Industrial/greeter-gtk3.ui | 27 +++++++++++++++++++++++++-
|
||||||
|
data/themes/Industrial/greeter.ui | 27 +++++++++++++++++++++++++-
|
||||||
|
data/themes/Industrial/gtk.css | 5 +++++
|
||||||
|
3 files changed, 57 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/data/themes/Industrial/greeter-gtk3.ui b/data/themes/Industrial/greeter-gtk3.ui
|
||||||
|
index 2f4e631..e59eee3 100644
|
||||||
|
--- a/data/themes/Industrial/greeter-gtk3.ui
|
||||||
|
+++ b/data/themes/Industrial/greeter-gtk3.ui
|
||||||
|
@@ -45,7 +45,12 @@
|
||||||
|
<property name="xscale">0</property>
|
||||||
|
<property name="yscale">0</property>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkHBox" id="hbox3">
|
||||||
|
+ <object class="GtkVBox" id="vbox3">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="orientation">vertical</property>
|
||||||
|
+ <property name="spacing">12</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkHBox" id="hbox3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
@@ -91,6 +96,26 @@
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkHBox" id="hbox4">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="spacing">12</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="info">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="label" translatable="yes"></property>
|
||||||
|
+ <property name="yalign">0.2</property>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">False</property>
|
||||||
|
+ <property name="position">0</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
diff --git a/data/themes/Industrial/greeter.ui b/data/themes/Industrial/greeter.ui
|
||||||
|
index 3413922..6a02d8d 100644
|
||||||
|
--- a/data/themes/Industrial/greeter.ui
|
||||||
|
+++ b/data/themes/Industrial/greeter.ui
|
||||||
|
@@ -47,7 +47,12 @@
|
||||||
|
<property name="xscale">0</property>
|
||||||
|
<property name="yscale">0</property>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkHBox" id="hbox3">
|
||||||
|
+ <object class="GtkVBox" id="vbox3">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="orientation">vertical</property>
|
||||||
|
+ <property name="spacing">12</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkHBox" id="hbox3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
@@ -93,6 +98,26 @@
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkHBox" id="hbox4">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="spacing">12</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="info">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="label" translatable="yes"></property>
|
||||||
|
+ <property name="yalign">0.2</property>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">False</property>
|
||||||
|
+ <property name="position">0</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
diff --git a/data/themes/Industrial/gtk.css b/data/themes/Industrial/gtk.css
|
||||||
|
index 7621345..be15f43 100644
|
||||||
|
--- a/data/themes/Industrial/gtk.css
|
||||||
|
+++ b/data/themes/Industrial/gtk.css
|
||||||
|
@@ -22,3 +22,8 @@
|
||||||
|
font: Sans 12;
|
||||||
|
color: #9E9D9B;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#info {
|
||||||
|
+ font: Sans 14;
|
||||||
|
+ font-style: italic;
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
+180
@@ -0,0 +1,180 @@
|
|||||||
|
From bae6a2b3a2232abd16a8d8558dda542d4970f1bb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Tue, 12 Jan 2021 09:23:05 +0800
|
||||||
|
Subject: [PATCH 7/8] greeter.c: support to update expired password
|
||||||
|
|
||||||
|
Update greeter to work with ui to handle expired password. It checks
|
||||||
|
whether password is expired after input user and password. If expired,
|
||||||
|
force user to update password immediately. It allows 3 times to try. If
|
||||||
|
exceeds, reset to input user.
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/greeter.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 81 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/greeter.c b/src/greeter.c
|
||||||
|
index f100c72..804fca0 100644
|
||||||
|
--- a/src/greeter.c
|
||||||
|
+++ b/src/greeter.c
|
||||||
|
@@ -77,6 +77,8 @@ static GtkWidget *lang_menu;
|
||||||
|
|
||||||
|
static char* user = NULL;
|
||||||
|
static char* pass = NULL;
|
||||||
|
+static char* new_pass = NULL;
|
||||||
|
+static gboolean pass_expired = FALSE;
|
||||||
|
|
||||||
|
static char* ui_file = NULL;
|
||||||
|
static char *ui_nobody = NULL;
|
||||||
|
@@ -167,10 +169,19 @@ static void switch_to_input_passwd(void)
|
||||||
|
else
|
||||||
|
gtk_widget_hide(user_list);
|
||||||
|
}
|
||||||
|
- gtk_label_set_text( GTK_LABEL(prompt), _("Password:") );
|
||||||
|
+ if (pass_expired) {
|
||||||
|
+ if (!new_pass) {
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(prompt), _("New password:"));
|
||||||
|
+ } else {
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(prompt), _("Retype new password:"));
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ gtk_label_set_text( GTK_LABEL(prompt), _("Password:") );
|
||||||
|
+ }
|
||||||
|
gtk_entry_set_text(GTK_ENTRY(login_entry), "");
|
||||||
|
gtk_entry_set_visibility(GTK_ENTRY(login_entry), FALSE);
|
||||||
|
gtk_widget_show(login_entry);
|
||||||
|
+ gtk_widget_show(prompt);
|
||||||
|
gtk_widget_grab_focus(login_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -189,6 +200,8 @@ static void try_login_user(const char *user)
|
||||||
|
|
||||||
|
static void on_entry_activate(GtkEntry* entry)
|
||||||
|
{
|
||||||
|
+ static int count = 0;
|
||||||
|
+
|
||||||
|
char* tmp;
|
||||||
|
if( !user )
|
||||||
|
{
|
||||||
|
@@ -217,6 +230,46 @@ static void on_entry_activate(GtkEntry* entry)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
+ if (pass_expired) {
|
||||||
|
+ if (!new_pass) {
|
||||||
|
+ new_pass = g_strdup(gtk_entry_get_text(entry));
|
||||||
|
+ switch_to_input_passwd();
|
||||||
|
+ } else {
|
||||||
|
+ tmp = g_strdup(gtk_entry_get_text(entry));
|
||||||
|
+ if (strcmp(new_pass, tmp)) {
|
||||||
|
+ g_free(new_pass);
|
||||||
|
+ new_pass = NULL;
|
||||||
|
+ // if new passwords not match, retry for 3 times at most
|
||||||
|
+ if (++count < 3) {
|
||||||
|
+ switch_to_input_passwd();
|
||||||
|
+ } else {
|
||||||
|
+ count = 0;
|
||||||
|
+ pass_expired = FALSE;
|
||||||
|
+ switch_to_input_user();
|
||||||
|
+ }
|
||||||
|
+ } else if (!strcmp(pass, g_base64_encode((guchar*)new_pass, strlen(new_pass) + 1))) {
|
||||||
|
+ // if new password is same as old one
|
||||||
|
+ g_free(new_pass);
|
||||||
|
+ new_pass = NULL;
|
||||||
|
+ if (++count < 3) {
|
||||||
|
+ switch_to_input_passwd();
|
||||||
|
+ } else {
|
||||||
|
+ count = 0;
|
||||||
|
+ pass_expired = FALSE;
|
||||||
|
+ switch_to_input_user();
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ char *session_exec=get_session_exec();
|
||||||
|
+ char *session_lang=get_session_lang();
|
||||||
|
+
|
||||||
|
+ printf("update-new-password user=%s newpass=%s session=%s lang=%s\n",
|
||||||
|
+ user, new_pass, session_exec, session_lang);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
char *session_exec=get_session_exec();
|
||||||
|
char *session_lang=get_session_lang();
|
||||||
|
|
||||||
|
@@ -227,6 +280,7 @@ static void on_entry_activate(GtkEntry* entry)
|
||||||
|
printf("login user=%s pass=%s session=%s lang=%s\n",
|
||||||
|
user, pass, session_exec, session_lang);
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
/* password check failed */
|
||||||
|
g_free(user);
|
||||||
|
user = NULL;
|
||||||
|
@@ -241,6 +295,7 @@ static void on_entry_activate(GtkEntry* entry)
|
||||||
|
gtk_label_set_text( GTK_LABEL(prompt), _("User:") );
|
||||||
|
gtk_entry_set_text(GTK_ENTRY(entry), "");
|
||||||
|
gtk_entry_set_visibility(GTK_ENTRY(entry), TRUE);
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1091,8 +1146,12 @@ static void on_screen_size_changed(GdkScreen *screen,GtkWidget *win)
|
||||||
|
|
||||||
|
static gint login_entry_on_key_press (GtkWidget *widget,GdkEventKey *event)
|
||||||
|
{
|
||||||
|
- if(event->keyval == GDK_Escape)
|
||||||
|
+ if(event->keyval == GDK_Escape) {
|
||||||
|
+ g_free(new_pass);
|
||||||
|
+ new_pass = NULL;
|
||||||
|
+ pass_expired = FALSE;
|
||||||
|
switch_to_input_user();
|
||||||
|
+ }
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1285,8 +1344,10 @@ static void create_win()
|
||||||
|
|
||||||
|
static gboolean on_lxdm_command(GIOChannel *source, GIOCondition condition, gpointer data)
|
||||||
|
{
|
||||||
|
+
|
||||||
|
GIOStatus ret;
|
||||||
|
char *str;
|
||||||
|
+ static int count = 0;
|
||||||
|
|
||||||
|
if( !(G_IO_IN & condition) )
|
||||||
|
return FALSE;
|
||||||
|
@@ -1300,10 +1361,28 @@ static gboolean on_lxdm_command(GIOChannel *source, GIOCondition condition, gpoi
|
||||||
|
{
|
||||||
|
switch_to_input_user();
|
||||||
|
}
|
||||||
|
+ else if (!strncmp(str, "password-expire", 15))
|
||||||
|
+ {
|
||||||
|
+ pass_expired = TRUE;
|
||||||
|
+ switch_to_input_passwd();
|
||||||
|
+ }
|
||||||
|
else if( !strncmp(str, "password", 8))
|
||||||
|
{
|
||||||
|
switch_to_input_passwd();
|
||||||
|
}
|
||||||
|
+ else if (!strncmp(str, "invalid-new-password", 20))
|
||||||
|
+ {
|
||||||
|
+ g_free(new_pass);
|
||||||
|
+ new_pass = NULL;
|
||||||
|
+
|
||||||
|
+ if (count++ < 3) {
|
||||||
|
+ switch_to_input_passwd();
|
||||||
|
+ } else {
|
||||||
|
+ count = 0;
|
||||||
|
+ pass_expired = FALSE;
|
||||||
|
+ switch_to_input_user();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
g_free(str);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
+99
@@ -0,0 +1,99 @@
|
|||||||
|
From bb4ff4b134383bfdadf7cb5353d3553a8a72d47e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kai Kang <kai.kang@windriver.com>
|
||||||
|
Date: Wed, 13 Jan 2021 10:45:48 +0800
|
||||||
|
Subject: [PATCH 8/8] greeter.c: show information on gtk label 'info'
|
||||||
|
|
||||||
|
Show information on a gtk label 'info' which is added under label
|
||||||
|
'prompt' in the .glade or .ui files.
|
||||||
|
|
||||||
|
Upstream-Status: Submitted [https://sourceforge.net/p/lxdm/code/merge-requests/1/]
|
||||||
|
|
||||||
|
Signed-off-by: Kai Kang <kai.kang@windriver.com>
|
||||||
|
---
|
||||||
|
src/greeter.c | 15 ++++++++++++++-
|
||||||
|
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/greeter.c b/src/greeter.c
|
||||||
|
index 804fca0..a4a2336 100644
|
||||||
|
--- a/src/greeter.c
|
||||||
|
+++ b/src/greeter.c
|
||||||
|
@@ -64,6 +64,7 @@ static GtkWidget* win;
|
||||||
|
static GtkWidget* alignment2;
|
||||||
|
static GtkWidget* prompt;
|
||||||
|
static GtkWidget* login_entry;
|
||||||
|
+static GtkWidget* info;
|
||||||
|
static GtkWidget* user_list_scrolled;
|
||||||
|
static GtkWidget* user_list;
|
||||||
|
|
||||||
|
@@ -241,10 +242,12 @@ static void on_entry_activate(GtkEntry* entry)
|
||||||
|
new_pass = NULL;
|
||||||
|
// if new passwords not match, retry for 3 times at most
|
||||||
|
if (++count < 3) {
|
||||||
|
+ gtk_label_set_text((GtkLabel *)info, _("Passwords do not match, please retry."));
|
||||||
|
switch_to_input_passwd();
|
||||||
|
} else {
|
||||||
|
count = 0;
|
||||||
|
pass_expired = FALSE;
|
||||||
|
+ gtk_label_set_text((GtkLabel *)info, _("Maximum number of failed update password attempts exceeded."));
|
||||||
|
switch_to_input_user();
|
||||||
|
}
|
||||||
|
} else if (!strcmp(pass, g_base64_encode((guchar*)new_pass, strlen(new_pass) + 1))) {
|
||||||
|
@@ -252,6 +255,7 @@ static void on_entry_activate(GtkEntry* entry)
|
||||||
|
g_free(new_pass);
|
||||||
|
new_pass = NULL;
|
||||||
|
if (++count < 3) {
|
||||||
|
+ gtk_label_set_text((GtkLabel *)info, _("New password is same as old one, password unchanged."));
|
||||||
|
switch_to_input_passwd();
|
||||||
|
} else {
|
||||||
|
count = 0;
|
||||||
|
@@ -1146,6 +1150,9 @@ static void on_screen_size_changed(GdkScreen *screen,GtkWidget *win)
|
||||||
|
|
||||||
|
static gint login_entry_on_key_press (GtkWidget *widget,GdkEventKey *event)
|
||||||
|
{
|
||||||
|
+
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(info), "");
|
||||||
|
+
|
||||||
|
if(event->keyval == GDK_Escape) {
|
||||||
|
g_free(new_pass);
|
||||||
|
new_pass = NULL;
|
||||||
|
@@ -1211,11 +1218,14 @@ static void create_win()
|
||||||
|
login_entry = (GtkWidget*)gtk_builder_get_object(builder, "login_entry");
|
||||||
|
if(login_entry!=NULL)
|
||||||
|
{
|
||||||
|
- g_signal_connect_after(login_entry,"key-press-event",G_CALLBACK(login_entry_on_key_press),NULL);
|
||||||
|
+ g_signal_connect(login_entry,"key-press-event",G_CALLBACK(login_entry_on_key_press),NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_connect(login_entry, "activate", G_CALLBACK(on_entry_activate), NULL);
|
||||||
|
|
||||||
|
+ info = (GtkWidget *)gtk_builder_get_object(builder, "info");
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(info), "");
|
||||||
|
+
|
||||||
|
if( g_key_file_get_integer(config, "display", "bottom_pane", 0)==1)
|
||||||
|
{
|
||||||
|
/* hacks to let GtkEventBox paintable with gtk pixmap engine. */
|
||||||
|
@@ -1359,11 +1369,13 @@ static gboolean on_lxdm_command(GIOChannel *source, GIOCondition condition, gpoi
|
||||||
|
gtk_main_quit();
|
||||||
|
else if( !strncmp(str, "reset", 5) )
|
||||||
|
{
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(info), _("Authentication failed."));
|
||||||
|
switch_to_input_user();
|
||||||
|
}
|
||||||
|
else if (!strncmp(str, "password-expire", 15))
|
||||||
|
{
|
||||||
|
pass_expired = TRUE;
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(info), _("You are required to change your password immediately."));
|
||||||
|
switch_to_input_passwd();
|
||||||
|
}
|
||||||
|
else if( !strncmp(str, "password", 8))
|
||||||
|
@@ -1376,6 +1388,7 @@ static gboolean on_lxdm_command(GIOChannel *source, GIOCondition condition, gpoi
|
||||||
|
new_pass = NULL;
|
||||||
|
|
||||||
|
if (count++ < 3) {
|
||||||
|
+ gtk_label_set_text(GTK_LABEL(info), _("Invalid new password. Please input new password again."));
|
||||||
|
switch_to_input_passwd();
|
||||||
|
} else {
|
||||||
|
count = 0;
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@@ -9,6 +9,14 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/project/${BPN}/${BPN}%20${PV}/${BPN}-${PV}.tar.
|
|||||||
file://0002-let-autotools-create-lxdm.conf.patch \
|
file://0002-let-autotools-create-lxdm.conf.patch \
|
||||||
file://0003-check-for-libexecinfo-providing-backtrace-APIs.patch \
|
file://0003-check-for-libexecinfo-providing-backtrace-APIs.patch \
|
||||||
file://0004-fix-css-under-gtk-3.20.patch \
|
file://0004-fix-css-under-gtk-3.20.patch \
|
||||||
|
file://0001-greeter-set-visible-when-switch-to-input-user.patch \
|
||||||
|
file://0002-greeter-gdk.c-fix-typo.patch \
|
||||||
|
file://0003-check-whether-password-expired-with-pam.patch \
|
||||||
|
file://0004-lxdm.c-add-function-to-change-password-with-pam.patch \
|
||||||
|
file://0005-ui.c-handle-password-expire-and-update-new-password.patch \
|
||||||
|
file://0006-themes-Industrial-add-info-label-in-ui.patch \
|
||||||
|
file://0007-greeter.c-support-to-update-expired-password.patch \
|
||||||
|
file://0008-greeter.c-show-information-on-gtk-label-info.patch \
|
||||||
"
|
"
|
||||||
SRC_URI[md5sum] = "061caae432634e6db38bbdc84bc6ffa0"
|
SRC_URI[md5sum] = "061caae432634e6db38bbdc84bc6ffa0"
|
||||||
SRC_URI[sha256sum] = "4891efee81c72a400cc6703e40aa76f3f3853833d048b72ec805da0f93567f2f"
|
SRC_URI[sha256sum] = "4891efee81c72a400cc6703e40aa76f3f3853833d048b72ec805da0f93567f2f"
|
||||||
|
|||||||
Reference in New Issue
Block a user