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; }
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); }
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; }
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); }
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); }
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); }