Exemplo n.º 1
0
static int
get_vt_num (char **vec, char *vtpart, int depth)
{
	int i;

	if (ve_string_empty (vtpart) || depth <= 0)
		return -1;

	if (strchr (vtpart, ':') == NULL)
		return atoi (vtpart);

	for (i = 0; vec[i] != NULL; i++) {
		char **rvec;
		rvec = g_strsplit (vec[i], ",", -1);
		if (mdm_vector_len (rvec) != 3) {
			g_strfreev (rvec);
			continue;
		}

		if (strcmp (rvec[0], vtpart) == 0) {
			/* could be nested? */
			int r = get_vt_num (vec, rvec[2], depth-1);
			g_strfreev (rvec);
			return r;

		}

		g_strfreev (rvec);
	}
	return -1;
}
Exemplo n.º 2
0
static void
check_for_users (void)
{
	char *result_string;
	char **servers;
	int i;

	// Return if we're not on a VT
	if (auth_cookie == NULL || get_cur_vt () < 0) {
		return;
	}
		
    // Get the list of running servers from the daemon
	result_string = mdmcomm_send_cmd_to_daemon_with_args (MDM_SUP_ATTACHED_SERVERS, auth_cookie, 5);

	// Return if the daemon didn't send us the list
	if (ve_string_empty (result_string) || strncmp (result_string, "OK ", 3) != 0) {
		g_free (result_string);
		return;
	}

	// Place the servers into the servers variable	
	servers = g_strsplit (&result_string[3], ";", -1);
	g_free (result_string);

	// Return if there are no servers running
	if (servers == NULL)
		return;

	// Each server is composed of 3 parts: [display, user, tty]
	for (i = 0; servers[i] != NULL; i++) {
		char **server;
		int vt;
		server = g_strsplit (servers[i], ",", -1);
		if (mdm_vector_len (server) != 3) {
			g_strfreev (server);
			continue;
		}

		// Get the VT of the server
		vt = get_vt_num (servers, server[2], 5);

		// If the server's username is empty, this is a greeter and we want to switch to it
		if (strcmp (server[1], "") == 0 && vt >= 0) {			
			// lock the screen
			if ( ! no_lock && vt != get_cur_vt () && vt >= 0) {
				maybe_lock_screen ();
			}
			// Switch VT
			change_vt (vt);	
			printf ("Switching to MDM server on VT #%d\n", vt);
			exit (0);
		}

		g_strfreev (server);
	}
	
	printf ("Found no MDM server, ordering a new one\n");
	g_strfreev (servers);
}
Exemplo n.º 3
0
gboolean
mdm_common_is_action_available (gchar *action)
{
	gchar **allowsyscmd = NULL;
	const gchar *allowsyscmdval;
	gboolean ret = FALSE;
	int i;

	allowsyscmdval = mdm_config_get_string (MDM_KEY_SYSTEM_COMMANDS_IN_MENU);
	if (allowsyscmdval)
		allowsyscmd = g_strsplit (allowsyscmdval, ";", 0);

	if (allowsyscmd) {
		for (i = 0; allowsyscmd[i] != NULL; i++) {
			if (strcmp (allowsyscmd[i], action) == 0) {
				ret = TRUE;
				break;
			}
		}
	}

#ifdef HAVE_CHKAUTHATTR
	if (ret == TRUE) {
		gchar **rbackeys = NULL;
		const gchar *rbackeysval;
		const char *mdmuser;

		mdmuser     = mdm_config_get_string (MDM_KEY_USER);
		rbackeysval = mdm_config_get_string (MDM_KEY_RBAC_SYSTEM_COMMAND_KEYS);
		if (rbackeysval)
			rbackeys = g_strsplit (rbackeysval, ";", 0);

		if (rbackeys) {
			for (i = 0; rbackeys[i] != NULL; i++) {
				gchar **rbackey = g_strsplit (rbackeys[i], ":", 2);

				if (mdm_vector_len (rbackey) == 2 &&
				    ! ve_string_empty (rbackey[0]) &&
				    ! ve_string_empty (rbackey[1]) &&
				    strcmp (rbackey[0], action) == 0) {

					if (!chkauthattr (rbackey[1], mdmuser)) {
						g_strfreev (rbackey);
						ret = FALSE;
						break;
					}
				}
				g_strfreev (rbackey);
			}
		}
		g_strfreev (rbackeys);
	}
#endif
	g_strfreev (allowsyscmd);

	return ret;
}
Exemplo n.º 4
0
static void
check_for_users (void)
{
	char *ret;
	char **vec;
	int i;
	int extra;

	/* only for console logins on vt supporting systems */
	if (auth_cookie == NULL ||
	    get_cur_vt () < 0)
		return;

	ret = mdmcomm_call_mdm ("CONSOLE_SERVERS", auth_cookie, "1.0.0.0", 5);
	if (ve_string_empty (ret) ||
	    strncmp (ret, "OK ", 3) != 0) {
		g_free (ret);
		return;
	}

	vec = g_strsplit (&ret[3], ";", -1);
	g_free (ret);
	if (vec == NULL)
		return;

	extra = 0;

	for (i = 0; vec[i] != NULL; i++) {
		char **rvec;
		int vt;
		rvec = g_strsplit (vec[i], ",", -1);
		if (mdm_vector_len (rvec) != 3) {
			g_strfreev (rvec);
			continue;
		}

		vt = get_vt_num (vec, rvec[2], 5);

		if (strcmp (rvec[0], mdmcomm_get_display ()) != 0 &&
		    vt >= 0) {
			/* this is not the current display */
			extra++;
		}

		g_strfreev (rvec);
	}

	if (extra == 0) {
		g_strfreev (vec);
		return;
	}

	run_logged_in_dialogue (vec);

	g_strfreev (vec);
}
Exemplo n.º 5
0
static void
check_for_displays (void)
{
	char  *ret;
	char **vec;
	char  *auth_cookie = NULL;
	int    i;

	/*
	 * Might be nice to move this call into read_config() so that it happens
	 * on the same socket call as reading the configuration.
	 */
	ret = mdmcomm_call_mdm (MDM_SUP_ATTACHED_SERVERS, auth_cookie, "1.0.0.0", 5);
	if (ve_string_empty (ret) || strncmp (ret, "OK ", 3) != 0) {
		g_free (ret);
		return;
	}

	vec = g_strsplit (&ret[3], ";", -1);
	g_free (ret);
	if (vec == NULL)
		return;

	if (displays_hash == NULL)
		displays_hash = g_hash_table_new_full (g_str_hash,
						       g_str_equal,
						       g_free,
						       g_free);

	for (i = 0; vec[i] != NULL; i++) {
		char **rvec;

		rvec = g_strsplit (vec[i], ",", -1);
		if (mdm_vector_len (rvec) != 3) {
			g_strfreev (rvec);
			continue;
		}

		g_hash_table_insert (displays_hash,
				     g_strdup (rvec[1]),
				     g_strdup (rvec[0]));

		g_strfreev (rvec);
	}

	g_strfreev (vec);
}
Exemplo n.º 6
0
static GtkTreeModel *
create_model (char **vec)
{
	int i;
	GtkListStore *store;
	GtkTreeIter iter;

	/* create list store */
	store = gtk_list_store_new (COLUMN_NUM,
				    G_TYPE_STRING /* login */,
				    G_TYPE_STRING /* display */,
				    G_TYPE_INT /* vt */);

	for (i = 0; vec[i] != NULL; i++) {
		char **rvec;
		int vt;
		rvec = g_strsplit (vec[i], ",", -1);
		if (mdm_vector_len (rvec) != 3) {
			g_strfreev (rvec);
			continue;
		}

		vt = get_vt_num (vec, rvec[2], 5);

		if (strcmp (rvec[0], mdmcomm_get_display ()) != 0 &&
		    vt >= 0) {
			char *user;
			char *disp;

			if (ve_string_empty (rvec[1])) {
				user = g_strdup (_("Nobody"));
			} else {
				struct passwd *pw = getpwnam (rvec[1]);
				if (pw == NULL ||
				    ve_string_empty (pw->pw_gecos)) {
					char *login;
					login = g_markup_escape_text (rvec[1], -1);

					user = g_strdup_printf ("<b>%s</b>",
								login);

					g_free (login);
				} else {
					char *utf8gecos;
					char *gecos, *login;
					login = g_markup_escape_text (rvec[1], -1);
					if ( ! g_utf8_validate (pw->pw_gecos, -1, NULL))
						utf8gecos = ve_locale_to_utf8 (pw->pw_gecos);
					else
						utf8gecos = g_strdup (pw->pw_gecos);

					gecos = g_markup_escape_text (utf8gecos, -1);

					user = g_strdup_printf ("<b>%s</b>\n%s",
								login,
								gecos);

					g_free (login);
					g_free (gecos);
					g_free (utf8gecos);
				}
			}

			if (strchr (rvec[2], ':') == NULL) {
				disp = g_strdup_printf
					(_("Display %s on virtual "
					   "terminal %d"),
					 rvec[0], vt);
			} else {
				disp = g_strdup_printf
					(_("Nested display %s on virtual "
					   "terminal %d"),
					 rvec[0], vt);
			}

			/* this is not the current display */
			gtk_list_store_append (store, &iter);
			gtk_list_store_set (store, &iter,
					    COLUMN_LOGIN, user,
					    COLUMN_DISPLAY, disp,
					    COLUMN_VT, vt,
					    -1);

			g_free (user);
			g_free (disp);
		}

		g_strfreev (rvec);
	}

	return GTK_TREE_MODEL (store);
}