patches/libgnometsol-03-perzoneauth.diff
author rohinis
Tue, 29 Nov 2011 17:32:55 +0000
branchs11express-2010-11
changeset 22234 c23e64da3e06
parent 17767 3000c8a937e1
permissions -rw-r--r--
2011-11-29 Rohini S <[email protected]> * patches/Python26-22-audio.diff: Fixes CVE-2010-1634 * specs/SUNWPython26.spec: Fixes CR 7085446

diff -urN libgtsol.orig/src/pam_conv.c libgtsol.new/src/pam_conv.c
--- libgtsol.orig/src/pam_conv.c	2010-03-29 01:07:54.520458917 +0100
+++ libgtsol.new/src/pam_conv.c	2010-03-29 01:08:09.960481341 +0100
@@ -44,6 +44,18 @@
 free_resp (int num_msg,
 	   struct pam_response * pr);
 
+static gchar*
+prompt_in_global_zone (conv_info_t *info, gchar *msg, gchar *c)
+{
+	char buf[PAM_MAX_MSG_SIZE];
+	int nbytes;
+	write (info->writefd, c, 1);
+	write (info->writefd, msg, strlen (msg));
+	nbytes = read (info->readfd, buf, PAM_MAX_MSG_SIZE);
+	buf[nbytes] = '\0';
+	return g_strdup (buf);
+}
+
 /*
  * gnometsol_pam_conv():
  * 
@@ -151,38 +163,44 @@
 					locale_msg ? locale_msg : "(null)");
 		}
 		g_free (locale_msg);
-
-		pamdialog = gnome_tsol_password_dialog_new ("", "", "", (((conv_info_t *) info)->sysmodal), TRUE);
-		msgdialog = gnome_tsol_message_dialog_new (NULL,
+		
+		if (c_info->writefd == -1){/*cross zone prompting not required*/
+			pamdialog = gnome_tsol_password_dialog_new ("", "", "", (((conv_info_t *) info)->sysmodal), TRUE);
+			msgdialog = gnome_tsol_message_dialog_new (NULL,
 							   GTK_DIALOG_MODAL,
 							   GTK_MESSAGE_INFO,
 							   GTK_BUTTONS_OK,
 					 (((conv_info_t *) info)->sysmodal),
 							   "",
 							   NULL);
-		gtk_window_set_screen (GTK_WINDOW (pamdialog), screen);
-		gtk_window_set_screen (GTK_WINDOW (msgdialog), screen);
+			gtk_window_set_screen (GTK_WINDOW (pamdialog), screen);
+			gtk_window_set_screen (GTK_WINDOW (msgdialog), screen);
+		}
 
 		switch (m->msg_style) {
 		case PAM_PROMPT_ECHO_ON:
-			/* Pop up a dialog to get user id from the user */
-			gnome_tsol_password_dialog_set_input_prompt (GNOME_TSOL_PASSWORD_DIALOG (pamdialog),
-								     utf8_msg);
-			gnome_tsol_password_dialog_set_input_visibility (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), TRUE);
-			gnome_tsol_password_dialog_set_message (GNOME_TSOL_PASSWORD_DIALOG (pamdialog),
-				c_info->echoonmsg ? c_info->echoonmsg : "");
-			response = gtk_dialog_run (GTK_DIALOG (pamdialog));
-
-			if (response == GTK_RESPONSE_OK) {
-				g_object_get (G_OBJECT (pamdialog), "input-text", &password, NULL);
-				r->resp = g_strdup (password);
-				if (r->resp == NULL) {
-					syslog (LOG_AUTH | LOG_ERR, "libgnometsol: unable "
-						"to allocate PAM conversation response memory %m");
-					*resp = NULL;
-					goto err;
-				}
+			if (c_info->writefd != -1) { /* cross zone prompting */
+				r->resp = prompt_in_global_zone(c_info,
+						utf8_msg, "u");
+				if (!strncmp (r->resp, "RESPONSE_CANCELLED",18))
+					goto cancel;
 			} else {
+				/*Pop up a dialog to get user id from the user*/
+				gnome_tsol_password_dialog_set_input_prompt (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), utf8_msg);
+				gnome_tsol_password_dialog_set_input_visibility (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), TRUE);
+				gnome_tsol_password_dialog_set_message (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), c_info->echoonmsg ? c_info->echoonmsg : "");
+				response=gtk_dialog_run(GTK_DIALOG (pamdialog));
+
+				if (response == GTK_RESPONSE_OK) {
+					g_object_get (G_OBJECT (pamdialog), "input-text", &password, NULL);
+					r->resp = g_strdup (password);
+				} else goto cancel;
+			}
+
+			if (r->resp == NULL) {
+				syslog (LOG_AUTH | LOG_ERR, "libgnometsol: unable "
+					"to allocate PAM conversation response memory %m");
+				*resp = NULL;
 				goto err;
 			}
 
@@ -201,28 +219,32 @@
 			break;
 
 		case PAM_PROMPT_ECHO_OFF:
-			/*
-			 * Pop up a dialog to get the password from
-			 * the user. Zap anything in the input field.
-			 */
-			gnome_tsol_password_dialog_set_input_prompt (GNOME_TSOL_PASSWORD_DIALOG (pamdialog),
-							    utf8_msg);
-			gnome_tsol_password_dialog_set_input_visibility (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), FALSE);
-			gnome_tsol_password_dialog_set_message (GNOME_TSOL_PASSWORD_DIALOG (pamdialog),
-								c_info->echooffmsg ? c_info->echooffmsg : "");
-			response = gtk_dialog_run (GTK_DIALOG (pamdialog));
-
-			if (response == GTK_RESPONSE_OK) {
-				g_object_get (G_OBJECT (pamdialog), "input-text", &password, NULL);
-				r->resp = g_strdup (password);
-				if (r->resp == NULL) {
-					syslog (LOG_AUTH | LOG_ERR, "libgnometsol: unable "
-						"to allocate PAM conversation response memory %m");
-					*resp = NULL;
-					goto err;
-				}
+			if (c_info->writefd != -1) { /* cross zone prompting */
+				r->resp = prompt_in_global_zone(c_info,
+						utf8_msg, "p");
+				if (!strncmp (r->resp, "RESPONSE_CANCELLED",18))
+					goto cancel;
 			} else {
-				goto cancel;
+				/*
+			 	* Pop up a dialog to get the password from
+			 	* the user. Zap anything in the input field.
+			 	*/
+				gnome_tsol_password_dialog_set_input_prompt (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), utf8_msg);
+				gnome_tsol_password_dialog_set_input_visibility (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), FALSE);
+				gnome_tsol_password_dialog_set_message (GNOME_TSOL_PASSWORD_DIALOG (pamdialog), c_info->echooffmsg ? c_info->echooffmsg : "");
+				response = gtk_dialog_run (GTK_DIALOG (pamdialog));
+
+				if (response == GTK_RESPONSE_OK) {
+					g_object_get (G_OBJECT (pamdialog), "input-text", &password, NULL);
+					r->resp = g_strdup (password);
+				} else goto cancel;
+			}
+
+			if (r->resp == NULL) {
+				syslog (LOG_AUTH | LOG_ERR, "libgnometsol: unable "
+					"to allocate PAM conversation response memory %m");
+				*resp = NULL;
+				goto err;
 			}
 
 			if (strlen (r->resp) > PAM_MAX_RESP_SIZE) {
@@ -243,26 +265,40 @@
 			/* ensure newline for message */
 			utf8_msg = g_renew (char, utf8_msg,  m_len + 2);
 			g_strlcat (utf8_msg , "\n", m_len + 2);
-			/*
-			 * Write information dialogue "utf8_msg" to user
-			 */
-			g_object_set (G_OBJECT (msgdialog), "message-type", GTK_MESSAGE_ERROR, NULL);
-			gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (msgdialog), utf8_msg);
-			gtk_widget_hide (GTK_WIDGET (pamdialog));
-			gtk_dialog_run (GTK_DIALOG (msgdialog));
+			if (c_info->writefd != -1) { /* cross zone prompting */
+				gchar *tmp;
+				tmp = prompt_in_global_zone(c_info, 
+							    utf8_msg, "e");
+				g_free (tmp);
+			} else {
+				/*
+			 	* Write information dialogue "utf8_msg" to user
+			 	*/
+				g_object_set (G_OBJECT (msgdialog), "message-type", GTK_MESSAGE_ERROR, NULL);
+				gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (msgdialog), utf8_msg);
+				gtk_widget_hide (GTK_WIDGET (pamdialog));
+				gtk_dialog_run (GTK_DIALOG (msgdialog));
+			}
 			break;
 
 		case PAM_TEXT_INFO:
 			/* ensure newline for message */
 			utf8_msg = g_renew (char, utf8_msg,  m_len + 2);
 			g_strlcat (utf8_msg , "\n", m_len + 2);
-			/*
-			 * write information dialogue "utf8_msg" to user
-			 */
-			g_object_set (G_OBJECT (msgdialog), "message-type", GTK_MESSAGE_INFO, NULL);
-			gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (msgdialog), utf8_msg);
-			gtk_widget_hide (GTK_WIDGET (pamdialog));
-			gtk_dialog_run (GTK_DIALOG (msgdialog));
+			if (c_info->writefd != -1) { /* cross zone prompting */
+				gchar *tmp;
+				tmp = prompt_in_global_zone(c_info, 
+							    utf8_msg, "i");
+				g_free (tmp);
+			} else {
+				/*
+			 	* write information dialogue "utf8_msg" to user
+			 	*/
+				g_object_set (G_OBJECT (msgdialog), "message-type", GTK_MESSAGE_INFO, NULL);
+				gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (msgdialog), utf8_msg);
+				gtk_widget_hide (GTK_WIDGET (pamdialog));
+				gtk_dialog_run (GTK_DIALOG (msgdialog));
+			}
 			break;
 
 		default:
@@ -287,21 +323,27 @@
 		r++;
 	}
 
-	gtk_widget_hide (pamdialog);
-	gtk_widget_destroy (pamdialog);
-	gtk_widget_destroy (msgdialog);
+	if (c_info->writefd == -1) {
+		gtk_widget_hide (pamdialog);
+		gtk_widget_destroy (pamdialog);
+		gtk_widget_destroy (msgdialog);
+	}
 	return GNOME_TSOL_PAM_SUCCESS;
 cancel:
-	gtk_widget_hide (pamdialog);
-	gtk_widget_destroy (pamdialog);
-	gtk_widget_destroy (msgdialog);
+	if (c_info->writefd == -1) {
+		gtk_widget_hide (pamdialog);
+		gtk_widget_destroy (pamdialog);
+		gtk_widget_destroy (msgdialog);
+	}
 	free_resp (i, r);
 	*resp = NULL;
 	return GNOME_TSOL_PAM_CANCEL;
 err:
-	gtk_widget_hide (pamdialog);
-	gtk_widget_destroy (pamdialog);
-	gtk_widget_destroy (msgdialog);
+	if (c_info->writefd == -1) {
+		gtk_widget_hide (pamdialog);
+		gtk_widget_destroy (pamdialog);
+		gtk_widget_destroy (msgdialog);
+	}
 	free_resp (i, r);
 	*resp = NULL;
 	return GNOME_TSOL_PAM_CONV_ERR;
diff -urN libgtsol.orig/src/pam_conv.h libgtsol.new/src/pam_conv.h
--- libgtsol.orig/src/pam_conv.h	2010-03-29 01:07:54.523438607 +0100
+++ libgtsol.new/src/pam_conv.h	2010-03-29 01:08:09.960626355 +0100
@@ -37,6 +37,8 @@
 	char *echoonmsg;			/* Extra message to display to user during PAM_PROMPT_ECHO_ON */
 	char *echooffmsg;			/* Extra message to display to user during PAM_PROMPT_ECHO_OFF */
 	GdkScreen *screen;  	 /* screen on which to display the dialog */
+	int writefd;	 /* write file descriptor for cross zone prompting */
+	int readfd;	 /* read  file descriptor for cross zone prompting */
 } conv_info_t;
 
 int
diff -urN libgtsol.orig/src/pam_dialog.c libgtsol.new/src/pam_dialog.c
--- libgtsol.orig/src/pam_dialog.c	2010-03-29 01:07:54.522629231 +0100
+++ libgtsol.new/src/pam_dialog.c	2010-03-29 01:08:19.512882368 +0100
@@ -298,6 +298,8 @@
 
 	gtk_window_set_position (GTK_WINDOW (password_dialog), GTK_WIN_POS_CENTER);
 
+	gtk_window_set_title (GTK_WINDOW (password_dialog), " ");
+
 	gtk_container_set_border_width (GTK_CONTAINER (password_dialog), DIALOG_BORDER_WIDTH);
 
 	gtk_dialog_set_default_response (GTK_DIALOG (password_dialog), GTK_RESPONSE_OK);
@@ -337,7 +339,7 @@
 
 	/* Set up the dialog's icon */
 	hbox = gtk_hbox_new (FALSE, 12);
-	dialog_icon = gtk_image_new_from_stock (GNOME_STOCK_AUTHENTICATION, GTK_ICON_SIZE_DIALOG);
+	dialog_icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG);
 	gtk_misc_set_alignment (GTK_MISC (dialog_icon), 0.5, 0.0);
 	gtk_box_pack_start (GTK_BOX (hbox), dialog_icon, FALSE, FALSE, 0);