Index: gdm-2.24.0/daemon/gdm-factory-slave.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-factory-slave.c
+++ gdm-2.24.0/daemon/gdm-factory-slave.c
@@ -171,6 +171,15 @@ on_session_info_query (GdmSession      *
 }
 
 static void
+on_session_radio_info_query (GdmSession      *session,
+                              const char      *text,
+                              GdmFactorySlave *slave)
+{
+        g_debug ("GdmFactorySlave: Radio info query: %s", text);
+        gdm_greeter_server_radio_info_query (slave->priv->greeter_server, text);
+}
+
+static void
 on_session_secret_info_query (GdmSession      *session,
                               const char      *text,
                               GdmFactorySlave *slave)
@@ -750,6 +759,10 @@ gdm_factory_slave_start (GdmSlave *slave
                           G_CALLBACK (on_session_info_query),
                           slave);
         g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
+                          "radio-info-query",
+                          G_CALLBACK (on_session_radio_info_query),
+                          slave);
+        g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
                           "secret-info-query",
                           G_CALLBACK (on_session_secret_info_query),
                           slave);
Index: gdm-2.24.0/daemon/gdm-greeter-server.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-greeter-server.c
+++ gdm-2.24.0/daemon/gdm-greeter-server.c
@@ -223,6 +223,14 @@ gdm_greeter_server_setup_complete (GdmGr
 }
 
 gboolean
+gdm_greeter_server_radio_info_query (GdmGreeterServer *greeter_server,
+                                      const char       *text)
+{
+        send_dbus_string_signal (greeter_server, "RadioInfoQuery", text);
+        return TRUE;
+}
+
+gboolean
 gdm_greeter_server_secret_info_query (GdmGreeterServer *greeter_server,
                                       const char       *text)
 {
@@ -749,6 +757,9 @@ do_introspect (DBusConnection *connectio
                                "    <signal name=\"InfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
+                               "    <signal name=\"RadioInfoQuery\">\n"
+                               "      <arg name=\"text\" type=\"s\"/>\n"
+                               "    </signal>\n"
                                "    <signal name=\"SecretInfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
Index: gdm-2.24.0/daemon/gdm-greeter-server.h
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-greeter-server.h
+++ gdm-2.24.0/daemon/gdm-greeter-server.h
@@ -78,6 +78,8 @@ char *              gdm_greeter_server_g
 
 gboolean            gdm_greeter_server_info_query            (GdmGreeterServer *greeter_server,
                                                               const char       *text);
+gboolean            gdm_greeter_server_radio_info_query     (GdmGreeterServer *greeter_server,
+                                                              const char       *text);
 gboolean            gdm_greeter_server_secret_info_query     (GdmGreeterServer *greeter_server,
                                                               const char       *text);
 gboolean            gdm_greeter_server_info                  (GdmGreeterServer *greeter_server,
Index: gdm-2.24.0/daemon/gdm-product-slave.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-product-slave.c
+++ gdm-2.24.0/daemon/gdm-product-slave.c
@@ -589,6 +589,16 @@ on_session_info_query (GdmSession      *
 }
 
 static void
+on_session_radio_info_query (GdmSession      *session,
+                              const char      *text,
+                              GdmProductSlave *slave)
+{
+        send_dbus_string_method (slave->priv->session_relay_connection,
+                                 "RadioInfoQuery",
+                                 text);
+}
+
+static void
 on_session_secret_info_query (GdmSession      *session,
                               const char      *text,
                               GdmProductSlave *slave)
@@ -889,6 +899,10 @@ create_new_session (GdmProductSlave *sla
                           G_CALLBACK (on_session_info_query),
                           slave);
         g_signal_connect (slave->priv->session,
+                          "radio-info-query",
+                          G_CALLBACK (on_session_radio_info_query),
+                          slave);
+        g_signal_connect (slave->priv->session,
                           "secret-info-query",
                           G_CALLBACK (on_session_secret_info_query),
                           slave);
Index: gdm-2.24.0/daemon/gdm-session.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-session.c
+++ gdm-2.24.0/daemon/gdm-session.c
@@ -43,6 +43,7 @@ enum {
         INFO,
         PROBLEM,
         INFO_QUERY,
+        RADIO_INFO_QUERY,
         SECRET_INFO_QUERY,
         SESSION_STARTED,
         SESSION_START_FAILED,
@@ -330,6 +331,17 @@ gdm_session_class_init (gpointer g_iface
                               G_TYPE_NONE,
                               1,
                               G_TYPE_STRING);
+        signals [RADIO_INFO_QUERY] =
+                g_signal_new ("radio-info-query",
+                              iface_type,
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmSessionIface, radio_info_query),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__STRING,
+                              G_TYPE_NONE,
+                              1,
+                              G_TYPE_STRING);
         signals [SECRET_INFO_QUERY] =
                 g_signal_new ("secret-info-query",
                               iface_type,
@@ -552,6 +564,14 @@ _gdm_session_info_query (GdmSession   *s
 }
 
 void
+_gdm_session_radio_info_query (GdmSession   *session,
+                                const char   *text)
+{
+        g_return_if_fail (GDM_IS_SESSION (session));
+        g_signal_emit (session, signals [RADIO_INFO_QUERY], 0, text);
+}
+
+void
 _gdm_session_secret_info_query (GdmSession   *session,
                                 const char   *text)
 {
Index: gdm-2.24.0/daemon/gdm-session-direct.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-session-direct.c
+++ gdm-2.24.0/daemon/gdm-session-direct.c
@@ -920,6 +920,29 @@ gdm_session_direct_handle_info_query (Gd
 }
 
 static DBusHandlerResult
+gdm_session_direct_handle_radio_info_query (GdmSessionDirect *session,
+                                             DBusConnection   *connection,
+                                             DBusMessage      *message)
+{
+        DBusError    error;
+        const char  *text;
+
+        dbus_error_init (&error);
+        if (! dbus_message_get_args (message, &error,
+                                     DBUS_TYPE_STRING, &text,
+                                     DBUS_TYPE_INVALID)) {
+                g_warning ("ERROR: %s", error.message);
+        }
+
+        set_pending_query (session, message);
+
+        g_debug ("GdmSessionDirect: Emitting 'radio-info-query' signal");
+        _gdm_session_radio_info_query (GDM_SESSION (session), text);
+
+        return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
 gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
                                              DBusConnection   *connection,
                                              DBusMessage      *message)
@@ -1253,6 +1276,8 @@ session_worker_message (DBusConnection *
 
         if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "InfoQuery")) {
                 return gdm_session_direct_handle_info_query (session, connection, message);
+        } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "RadioInfoQuery")) {
+                return gdm_session_direct_handle_radio_info_query (session, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SecretInfoQuery")) {
                 return gdm_session_direct_handle_secret_info_query (session, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "Info")) {
@@ -1356,6 +1381,10 @@ do_introspect (DBusConnection *connectio
                                "      <arg name=\"query\" direction=\"in\" type=\"s\"/>\n"
                                "      <arg name=\"answer\" direction=\"out\" type=\"s\"/>\n"
                                "    </method>\n"
+                               "    <method name=\"RadioInfoQuery\">\n"
+                               "      <arg name=\"query\" direction=\"in\" type=\"s\"/>\n"
+                               "      <arg name=\"answer\" direction=\"out\" type=\"s\"/>\n"
+                               "    </method>\n"
                                "    <method name=\"SecretInfoQuery\">\n"
                                "      <arg name=\"query\" direction=\"in\" type=\"s\"/>\n"
                                "      <arg name=\"answer\" direction=\"out\" type=\"s\"/>\n"
Index: gdm-2.24.0/daemon/gdm-session.h
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-session.h
+++ gdm-2.24.0/daemon/gdm-session.h
@@ -89,6 +89,8 @@ struct _GdmSessionIface
 
         void (* info_query)                  (GdmSession   *session,
                                               const char   *query_text);
+        void (* radio_info_query)            (GdmSession   *session,
+                                              const char   *query_text);
         void (* secret_info_query)           (GdmSession   *session,
                                               const char   *query_text);
         void (* info)                        (GdmSession   *session,
Index: gdm-2.24.0/daemon/gdm-session-relay.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-session-relay.c
+++ gdm-2.24.0/daemon/gdm-session-relay.c
@@ -354,6 +354,35 @@ handle_info_query (GdmSessionRelay *sess
 }
 
 static DBusHandlerResult
+handle_radio_info_query (GdmSessionRelay *session_relay,
+                          DBusConnection  *connection,
+                          DBusMessage     *message)
+{
+        DBusMessage *reply;
+        DBusError    error;
+        const char  *text;
+
+        text = NULL;
+
+        dbus_error_init (&error);
+        if (! dbus_message_get_args (message, &error,
+                                     DBUS_TYPE_STRING, &text,
+                                     DBUS_TYPE_INVALID)) {
+                g_warning ("ERROR: %s", error.message);
+        }
+
+        g_debug ("GdmSessionRelay: RadioInfoQuery: %s", text);
+
+        reply = dbus_message_new_method_return (message);
+        dbus_connection_send (connection, reply, NULL);
+        dbus_message_unref (reply);
+
+        _gdm_session_radio_info_query (GDM_SESSION (session_relay), text);
+
+        return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
 handle_secret_info_query (GdmSessionRelay *session_relay,
                           DBusConnection  *connection,
                           DBusMessage     *message)
@@ -693,6 +722,8 @@ session_handle_child_message (DBusConnec
 
         if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "InfoQuery")) {
                 return handle_info_query (session_relay, connection, message);
+        } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "RadioInfoQuery")) {
+                return handle_radio_info_query (session_relay, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SecretInfoQuery")) {
                 return handle_secret_info_query (session_relay, connection, message);
         } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Info")) {
@@ -779,6 +810,9 @@ do_introspect (DBusConnection *connectio
                                "    <method name=\"InfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </method>\n"
+                               "    <method name=\"RadioInfoQuery\">\n"
+                               "      <arg name=\"text\" type=\"s\"/>\n"
+                               "    </method>\n"
                                "    <method name=\"SecretInfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </method>\n"
Index: gdm-2.24.0/daemon/gdm-session-worker.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-session-worker.c
+++ gdm-2.24.0/daemon/gdm-session-worker.c
@@ -762,6 +762,14 @@ gdm_session_worker_ask_question (GdmSess
 }
 
 static gboolean
+gdm_session_worker_ask_for_radio_answer (GdmSessionWorker *worker,
+                                   const char       *question,
+                                   char            **answerp)
+{
+        return send_question_method (worker, "RadioInfoQuery", question, answerp);
+}
+
+static gboolean
 gdm_session_worker_ask_for_secret (GdmSessionWorker *worker,
                                    const char       *question,
                                    char            **answerp)
@@ -852,6 +860,9 @@ gdm_session_worker_process_pam_message (
                 worker->priv->discard_messages = FALSE;
                 res = gdm_session_worker_ask_for_secret (worker, utf8_msg, &user_answer);
                 break;
+	case PAM_RADIO_TYPE:
+        	res = gdm_session_worker_ask_for_radio_answer (worker, utf8_msg, &user_answer);
+		break;
         case PAM_TEXT_INFO:
                 g_warning ("%s: PAM_TEXT_INFO: %s", __func__, utf8_msg);
                 res = gdm_session_worker_report_problem (worker, utf8_msg);
@@ -859,6 +870,7 @@ gdm_session_worker_process_pam_message (
         case PAM_ERROR_MSG:
                 res = gdm_session_worker_report_problem (worker, utf8_msg);
                 break;
+
         default:
                 g_assert_not_reached ();
                 break;
@@ -1226,6 +1238,16 @@ gdm_session_worker_authenticate_user (Gd
         /* blocking call, does the actual conversation */
         error_code = pam_authenticate (worker->priv->pam_handle, authentication_flags);
 
+	if (error_code == PAM_NEW_AUTHTOK_REQD) {
+                error_code = pam_chauthtok (worker->priv->pam_handle, PAM_CHANGE_EXPIRED_AUTHTOK);
+
+                if (error_code != PAM_SUCCESS) {
+                        gdm_session_auditor_report_password_change_failure (worker->priv->auditor);
+                } else {
+                        gdm_session_auditor_report_password_changed (worker->priv->auditor);
+                }
+        }
+
         if (error_code != PAM_SUCCESS) {
                 g_debug ("GdmSessionWorker: authentication returned %d: %s", error_code, pam_strerror (worker->priv->pam_handle, error_code));
 
Index: gdm-2.24.0/daemon/gdm-simple-slave.c
===================================================================
--- gdm-2.24.0.orig/daemon/gdm-simple-slave.c
+++ gdm-2.24.0/daemon/gdm-simple-slave.c
@@ -479,6 +479,15 @@ on_session_info_query (GdmSession     *s
 }
 
 static void
+on_session_radio_info_query (GdmSession     *session,
+                              const char     *text,
+                              GdmSimpleSlave *slave)
+{
+        g_debug ("GdmSimpleSlave: Radio info query: %s", text);
+        gdm_greeter_server_radio_info_query (slave->priv->greeter_server, text);
+}
+
+static void
 on_session_secret_info_query (GdmSession     *session,
                               const char     *text,
                               GdmSimpleSlave *slave)
@@ -663,6 +672,10 @@ create_new_session (GdmSimpleSlave *slav
                           G_CALLBACK (on_session_info_query),
                           slave);
         g_signal_connect (slave->priv->session,
+                          "radio-info-query",
+                          G_CALLBACK (on_session_radio_info_query),
+                          slave);
+        g_signal_connect (slave->priv->session,
                           "secret-info-query",
                           G_CALLBACK (on_session_secret_info_query),
                           slave);
Index: gdm-2.24.0/gui/simple-greeter/gdm-greeter-client.c
===================================================================
--- gdm-2.24.0.orig/gui/simple-greeter/gdm-greeter-client.c
+++ gdm-2.24.0/gui/simple-greeter/gdm-greeter-client.c
@@ -62,6 +62,7 @@ enum {
         INFO,
         PROBLEM,
         INFO_QUERY,
+        RADIO_INFO_QUERY,
         SECRET_INFO_QUERY,
         READY,
         RESET,
@@ -223,6 +224,13 @@ on_info_query (GdmGreeterClient *client,
 }
 
 static void
+on_radio_info_query (GdmGreeterClient *client,
+                      DBusMessage      *message)
+{
+        emit_string_signal_for_message (client, "RadioInfoQuery", message, RADIO_INFO_QUERY);
+}
+
+static void
 on_secret_info_query (GdmGreeterClient *client,
                       DBusMessage      *message)
 {
@@ -647,6 +655,8 @@ client_dbus_handle_message (DBusConnecti
                 on_setup_complete (client, message);
         } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "InfoQuery")) {
                 on_info_query (client, message);
+        } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "RadioInfoQuery")) {
+                on_radio_info_query (client, message);
         } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "SecretInfoQuery")) {
                 on_secret_info_query (client, message);
         } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "Info")) {
@@ -844,6 +854,18 @@ gdm_greeter_client_class_init (GdmGreete
                               NULL,
                               NULL,
                               g_cclosure_marshal_VOID__STRING,
+                              G_TYPE_NONE,
+                              1,
+                              G_TYPE_STRING);
+
+        gdm_greeter_client_signals[RADIO_INFO_QUERY] =
+                g_signal_new ("radio-info-query",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GdmGreeterClientClass, radio_info_query),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__STRING,
                               G_TYPE_NONE,
                               1,
                               G_TYPE_STRING);
Index: gdm-2.24.0/gui/simple-greeter/gdm-greeter-client.h
===================================================================
--- gdm-2.24.0.orig/gui/simple-greeter/gdm-greeter-client.h
+++ gdm-2.24.0/gui/simple-greeter/gdm-greeter-client.h
@@ -47,6 +47,9 @@ typedef struct
         void (* info_query)              (GdmGreeterClient  *client,
                                           const char        *query_text);
 
+        void (* radio_info_query)       (GdmGreeterClient  *client,
+                                          const char        *query_text);
+
         void (* secret_info_query)       (GdmGreeterClient  *client,
                                           const char        *query_text);
 
Index: gdm-2.24.0/gui/simple-greeter/gdm-greeter-login-window.c
===================================================================
--- gdm-2.24.0.orig/gui/simple-greeter/gdm-greeter-login-window.c
+++ gdm-2.24.0/gui/simple-greeter/gdm-greeter-login-window.c
@@ -1026,6 +1026,29 @@ gdm_greeter_login_window_info_query (Gdm
 }
 
 gboolean
+gdm_greeter_login_window_radio_info_query (GdmGreeterLoginWindow *login_window,
+                                               const char *text)
+{
+       const char *answer;
+       GtkWidget *dialog;
+       int response_id;
+             
+       dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+                               text);
+    
+       response_id = gtk_dialog_run (GTK_DIALOG (dialog));
+       gtk_widget_destroy (dialog);
+       if (response_id == GTK_RESPONSE_YES)
+               answer = "yes";
+       else
+               answer =  "no";
+
+        g_signal_emit (login_window, signals[QUERY_ANSWER], 0, answer);
+
+       return TRUE;
+}
+
+gboolean
 gdm_greeter_login_window_secret_info_query (GdmGreeterLoginWindow *login_window,
                                             const char            *text)
 {
Index: gdm-2.24.0/gui/simple-greeter/gdm-greeter-login-window.h
===================================================================
--- gdm-2.24.0.orig/gui/simple-greeter/gdm-greeter-login-window.h
+++ gdm-2.24.0/gui/simple-greeter/gdm-greeter-login-window.h
@@ -70,6 +70,8 @@ gboolean            gdm_greeter_login_wi
 gboolean            gdm_greeter_login_window_ready              (GdmGreeterLoginWindow *login_window);
 gboolean            gdm_greeter_login_window_info_query         (GdmGreeterLoginWindow *login_window,
                                                                  const char *text);
+gboolean            gdm_greeter_login_window_radio_info_query  (GdmGreeterLoginWindow *login_window,
+                                                                 const char *text);
 gboolean            gdm_greeter_login_window_secret_info_query  (GdmGreeterLoginWindow *login_window,
                                                                  const char *text);
 gboolean            gdm_greeter_login_window_info               (GdmGreeterLoginWindow *login_window,
Index: gdm-2.24.0/gui/simple-greeter/gdm-greeter-session.c
===================================================================
--- gdm-2.24.0.orig/gui/simple-greeter/gdm-greeter-session.c
+++ gdm-2.24.0/gui/simple-greeter/gdm-greeter-session.c
@@ -226,6 +226,19 @@ on_info_query (GdmGreeterClient  *client
 }
 
 static void
+on_radio_info_query (GdmGreeterClient  *client,
+                      const char        *text,
+                      GdmGreeterSession *session)
+{
+        g_debug ("GdmGreeterSession: Radio info query: %s", text);
+
+        if (session->priv->panel)
+                gdm_greeter_panel_set_domain_enabled (GDM_GREETER_PANEL (session->priv->panel), FALSE);
+
+        gdm_greeter_login_window_radio_info_query (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window), text);
+}
+
+static void
 on_secret_info_query (GdmGreeterClient  *client,
                       const char        *text,
                       GdmGreeterSession *session)
@@ -641,6 +654,10 @@ gdm_greeter_session_init (GdmGreeterSess
                           G_CALLBACK (on_info_query),
                           session);
         g_signal_connect (session->priv->client,
+                          "radio-info-query",
+                          G_CALLBACK (on_radio_info_query),
+                          session);
+        g_signal_connect (session->priv->client,
                           "secret-info-query",
                           G_CALLBACK (on_secret_info_query),
                           session);
