#! /bin/sh /usr/share/dpatch/dpatch-run ## fix-autologin-lp161794.dpatch by ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad ltsp-5.0.39~/client/ldm2/src/greeter_iface.c ltsp-5.0.39/client/ldm2/src/greeter_iface.c --- ltsp-5.0.39~/client/ldm2/src/greeter_iface.c 2007-10-08 05:19:00.000000000 -0400 +++ ltsp-5.0.39/client/ldm2/src/greeter_iface.c 2007-12-02 01:46:20.000000000 -0500 @@ -79,15 +79,11 @@ char *p; fprintf(ldmlog, "In get_userid\n"); - if (p = getenv("LDM_USERNAME")) { - scopy(ldminfo.username, p); - return 0; - } else { - write(ldminfo.greeterwfd, prompt1, strlen(prompt1)); - write(ldminfo.greeterwfd, prompt2, strlen(prompt2)); - write(ldminfo.greeterwfd, prompt3, strlen(prompt3)); - return get_greeter_string(ldminfo.username, sizeof ldminfo.username); - } + + write(ldminfo.greeterwfd, prompt1, strlen(prompt1)); + write(ldminfo.greeterwfd, prompt2, strlen(prompt2)); + write(ldminfo.greeterwfd, prompt3, strlen(prompt3)); + return get_greeter_string(ldminfo.username, sizeof ldminfo.username); } int @@ -100,16 +96,12 @@ char *p; fprintf(ldmlog, "In get_passwd\n"); - if (p = getenv("LDM_PASSWORD")) { - scopy(ldminfo.password, p); - return 0; - } else { - write(ldminfo.greeterwfd, prompt1, strlen(prompt1)); - write(ldminfo.greeterwfd, prompt2, strlen(prompt2)); - write(ldminfo.greeterwfd, prompt3, strlen(prompt3)); - write(ldminfo.greeterwfd, pw, strlen(pw)); - return get_greeter_string(ldminfo.password, sizeof ldminfo.password); - } + + write(ldminfo.greeterwfd, prompt1, strlen(prompt1)); + write(ldminfo.greeterwfd, prompt2, strlen(prompt2)); + write(ldminfo.greeterwfd, prompt3, strlen(prompt3)); + write(ldminfo.greeterwfd, pw, strlen(pw)); + return get_greeter_string(ldminfo.password, sizeof ldminfo.password); } void @@ -120,6 +112,8 @@ char *pw = "\n"; char *p; + fprintf(ldmlog, "In set_message\n"); + write(ldminfo.greeterwfd, prompt, strlen(prompt)); write(ldminfo.greeterwfd, message, strlen(message)); write(ldminfo.greeterwfd, pw, strlen(pw)); @@ -130,6 +124,8 @@ { char *cmd = "hostname\n"; + fprintf(ldmlog, "In get_host\n"); + write(ldminfo.greeterwfd, cmd, strlen(cmd)); return get_greeter_string(ldminfo.server, sizeof ldminfo.server); } @@ -141,6 +137,8 @@ char lang[LDMSTRSZ]; int status; + fprintf(ldmlog, "In get_language\n"); + write(ldminfo.greeterwfd, cmd, strlen(cmd)); status = get_greeter_string(lang, sizeof lang); if (*(ldminfo.lang) != '\0') @@ -157,6 +155,8 @@ char session[LDMSTRSZ]; int status; + fprintf(ldmlog, "In get_session\n"); + write(ldminfo.greeterwfd, cmd, strlen(cmd)); status = get_greeter_string(session, sizeof session); if (strncmp(session, "None", 4)) /* If "None", use default */ diff -urNad ltsp-5.0.39~/client/ldm2/src/ldm.c ltsp-5.0.39/client/ldm2/src/ldm.c --- ltsp-5.0.39~/client/ldm2/src/ldm.c 2007-10-08 05:19:00.000000000 -0400 +++ ltsp-5.0.39/client/ldm2/src/ldm.c 2007-12-02 01:46:11.000000000 -0500 @@ -42,7 +42,7 @@ void die(char *msg) { - fprintf(ldmlog, "%s", msg); + fprintf(ldmlog, "%s\n", msg); fclose(ldmlog); /* @@ -348,7 +348,12 @@ /* decls */ char display_env[ENVSIZE], xauth_env[ENVSIZE]; char server_env[ENVSIZE], socket_env[ENVSIZE]; - + gboolean err_flag = FALSE; + char *err_msg = NULL; + char *p = NULL; + char **hosts_char = NULL; + int i; + g_type_init(); /* @@ -405,6 +410,8 @@ if (ldm_getenv_bool("USE_XFS")) { char *xfs_server; xfs_server = getenv("XFS_SERVER"); + // FIXME: ldminfo.server is not yet defined, so fallback in the case + // xfs_server is not defined won't work snprintf(ldminfo.fontpath, sizeof ldminfo.fontpath, "tcp/%s:7100", xfs_server ? xfs_server : ldminfo.server); } @@ -446,15 +453,51 @@ if (!ldminfo.autologin) { fprintf(ldmlog, _("Spawning greeter: %s\n"), ldminfo.greeter_prog); spawn_greeter(); + + // ask greeter to fill ldminfo.username and ldminfo.server + if (get_userid()) + die(_("ERROR: get_userid from greeter failed")); + + if (get_host()) + die(_("ERROR: get_host from greeter failed")); + + if (get_language()) + die(_("ERROR: get_language from greeter failed")); + + if (get_session()) + die("ERROR: get_session from greeter failed"); + + } else { + // Get all info for autologin, without greeter + fprintf(ldmlog, _("Autologin enabled\n")); + scopy(ldminfo.username, getenv("LDM_USERNAME")); + scopy(ldminfo.password, getenv("LDM_PASSWORD")); + // Make sure that if there are multiple servers in the list + // always take the first one + hosts_char = g_strsplit(getenv("LDM_SERVER"), " ", -1); + + if ( hosts_char[0] != NULL ) + scopy(ldminfo.server, hosts_char[0]); } - if (get_userid() || - *(ldminfo.username) == '\0') - die(_("Greeter returned null userid")); + // Verify that we have all info needed to connect + if (*(ldminfo.username) == '\0'){ + err_msg = g_strconcat(_("ERROR: username variable empty"), "\n", NULL ); + err_flag = TRUE; + } + if (*(ldminfo.password) == '\0'){ + err_msg = g_strconcat(_("ERROR: password variable empty"), "\n", NULL ); + err_flag = TRUE; + } + if (*(ldminfo.server) == '\0'){ + err_msg = g_strconcat(_("ERROR: server variable empty"), "\n", NULL ); + err_flag = TRUE; + } - if (get_host() || - *(ldminfo.server) == '\0') - die("Couldn't get a valid hostname"); + if (err_flag){ + fprintf(ldmlog, "%s", err_msg); + die(_("Fatal error, missing mandatory information")); + } /* * If we run multiple ldm sessions on multiply vty's we need separate @@ -489,12 +532,6 @@ bzero(ldminfo.password, sizeof ldminfo.password); - if (get_language()) - die("Couldn't get a valid language setting"); - if (get_session()) - die("Couldn't get a valid session setting"); - - fprintf(ldmlog, "Established ssh session.\n"); if (ldminfo.greeterpid) close_greeter();