]> git.hungrycats.org Git - xscreensaver/blobdiff - driver/test-passwd.c
From https://www.jwz.org/xscreensaver/xscreensaver-6.09.tar.gz
[xscreensaver] / driver / test-passwd.c
index b9b6c328a7594244c30ebcc754c28dffa20064b5..2c894ac1f26cc3c20fed8797ef3f920665f4dd25 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -10,8 +10,6 @@
  */
 
 /* This is a kludgy test harness for debugging the password dialog box.
-   It's somewhat easier to debug it here than in the xscreensaver executable
-   itself.
  */
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #include <stdio.h>
-#include <ctype.h>
-#include <pwd.h>
-
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/Xlocale.h>
-
-#include "xscreensaver.h"
-#include "resources.h"
-#include "version.h"
-#include "visual.h"
+#include <stdlib.h>
+#include "blurb.h"
 #include "auth.h"
 
-char *progname = 0;
-char *progclass = 0;
-XrmDatabase db = 0;
-saver_info *global_si_kludge;
-
-FILE *real_stderr, *real_stdout;
-
-void monitor_power_on (saver_info *si, Bool on_p) {}
-Bool monitor_powered_on_p (saver_info *si) { return True; }
-void initialize_screensaver_window (saver_info *si) {}
-void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
-Bool blank_screen (saver_info *si) {return False;}
-void unblank_screen (saver_info *si) {}
-void reset_watchdog_timer(saver_info *si, Bool on_p) {}
-Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
-Bool window_exists_p (Display *dpy, Window window) {return True;}
-void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
-Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
-int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
-const char *signal_name(int signal) { return "???"; }
-Bool restore_real_vroot (saver_info *si) { return False; }
-void store_saver_status (saver_info *si) {}
-void saver_exit (saver_info *si, int status, const char *core) { exit(status);}
-int move_mouse_grab (saver_info *si, Window to, Cursor c, int ts) { return 0; }
-int mouse_screen (saver_info *si) { return 0; }
-void check_for_leaks (const char *where) { }
-void shutdown_stderr (saver_info *si) { }
-void resize_screensaver_window (saver_info *si) { }
-void describe_monitor_layout (saver_info *si) { }
-Bool update_screen_layout (saver_info *si) { return 0; }
-Bool in_signal_handler_p = 0;
-
-const char *blurb(void) { return progname; }
-Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
+extern Bool test_auth_conv (void *, int, auth_message *, auth_response **);
 
-void
-idle_timer (XtPointer closure, XtIntervalId *id)
+Bool
+test_auth_conv (void *closure,
+                int nmsgs,
+                auth_message *msg,
+                auth_response **resp)
 {
-  saver_info *si = (saver_info *) closure;
-  XEvent fake_event;
-  fake_event.type = 0; /* XAnyEvent type, ignored. */
-  fake_event.xany.display = si->dpy;
-  fake_event.xany.window  = 0;
-  XPutBackEvent (si->dpy, &fake_event);
-}
-
-static int
-text_auth_conv (
-  int num_msg,
-  const struct auth_message *auth_msgs,
-  struct auth_response **resp,
-  saver_info *si)
-{
-  char *input;
-  char buf[255];
-  struct auth_response *responses;
+  int page = 1;
   int i;
+  nmsgs = 0;
+  msg = (auth_message *) calloc (100, sizeof(*msg));
 
-  responses = calloc(num_msg, sizeof(struct auth_response));
-  if (!responses)
-    return -1;
-
-  /* The unlock state won't actually be used until this function returns and
-   * the auth module processes the response, but set it anyway for consistency
-   */
-  si->unlock_state = ul_read;
-
-  for (i = 0; i < num_msg; ++i)
-    {
-      printf ("\n%s: %s", progname, auth_msgs[i].msg);
-      if (   auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO
-          || auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO)
-        {
-          input = fgets (buf, sizeof(buf)-1, stdin);
-          if (!input || !*input)
-            exit (0);
-          if (input[strlen(input)-1] == '\n')
-            input[strlen(input)-1] = 0;
-
-          responses[i].response = strdup(input);
-        }
-    }
-
-  *resp = responses;
-
-  si->unlock_state = ul_finished;
-
-  return 0;
-}
-
-
-#ifdef __GNUC__
- __extension__     /* shut up about "string length is greater than the length
-                      ISO C89 compilers are required to support" when including
-                      the .ad file... */
-#endif
-
-static char *fallback[] = {
-#include "XScreenSaver_ad.h"
- 0
-};
+# define DIALOG()                                                       \
+  fprintf (stderr, "\n%s: page %d\n", blurb(), page++);                 \
+  xscreensaver_auth_conv (closure, nmsgs, msg, resp);                   \
+  if (*resp)                                                            \
+    for (i = 0; i < nmsgs; i++)                                         \
+      fprintf (stderr, "%s: resp %d = \"%s\"\n", blurb(), i,            \
+               ((*resp)[i].response ? (*resp)[i].response : ""));       \
+  nmsgs = 0
 
-extern Bool debug_passwd_window_p;  /* lock.c kludge */
 
-int
-main (int argc, char **argv)
-{
-  enum { PASS, SPLASH, TTY } which;
-  Widget toplevel_shell = 0;
-  saver_screen_info ssip;
-  saver_info sip;
-  saver_info *si = &sip;
-  saver_preferences *p = &si->prefs;
-  struct passwd *pw;
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "1/4 Page One";
+  nmsgs++;
 
-  memset(&sip, 0, sizeof(sip));
-  memset(&ssip, 0, sizeof(ssip));
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "2/4 All work and no play makes Jack a dull boy. "
+                   "All work and no play makes Jack a dull boy. ";
+  nmsgs++;
 
-  si->nscreens = 1;
-  si->screens = si->default_screen = &ssip;
-  ssip.global = si;
+  msg[nmsgs].type = AUTH_MSGTYPE_ERROR;
+  msg[nmsgs].msg = "3/4 Red";
+  nmsgs++;
 
-  global_si_kludge = si;
-  real_stderr = stderr;
-  real_stdout = stdout;
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "4/4 Greets to Crash Override.";
+  nmsgs++;
+  DIALOG();
 
-  si->version = (char *) malloc (5);
-  memcpy (si->version, screensaver_id + 17, 4);
-  si->version[4] = 0;
-  progname = argv[0];
-  {
-    char *s = strrchr(progname, '/');
-    if (*s) strcpy (progname, s+1);
-  }
 
-  if (argc != 2) goto USAGE;
-  else if (!strcmp (argv[1], "pass"))   which = PASS;
-  else if (!strcmp (argv[1], "splash")) which = SPLASH;
-  else if (!strcmp (argv[1], "tty"))    which = TTY;
-  else
-    {
-    USAGE:
-      fprintf (stderr, "usage: %s [ pass | splash | tty ]\n", progname);
-      exit (1);
-    }
-
-#ifdef NO_LOCKING
-  if (which == PASS || which == TTY)
-    {
-      fprintf (stderr, "%s: compiled with NO_LOCKING\n", progname);
-      exit (1);
-    }
-#endif
-
-#ifndef NO_LOCKING
-  /* before hack_uid() for proper permissions */
-  lock_priv_init (argc, argv, True);
-
-  hack_uid (si);
-
-  if (! lock_init (argc, argv, True))
-    {
-      si->locking_disabled_p = True;
-      si->nolock_reason = "error getting password";
-    }
-#endif
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "1/1 Page Two";
+  nmsgs++;
+  DIALOG();
 
-  progclass = "XScreenSaver";
 
-  if (!setlocale (LC_CTYPE, ""))
-    fprintf (stderr, "%s: warning: could not set default locale\n",
-             progname);
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "1/2 Page Three";
+  nmsgs++;
 
+  msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO;
+  msg[nmsgs].msg = "2/2 Greets to Crash Override and also Joey";
+  nmsgs++;
 
-  if (which != TTY)
-    {
-      toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
-                                        &argc, argv, fallback,
-                                        0, 0);
 
-      si->dpy = XtDisplay (toplevel_shell);
-      p->db = XtDatabase (si->dpy);
-      si->default_screen->toplevel_shell = toplevel_shell;
-      si->default_screen->screen = XtScreen(toplevel_shell);
-      si->default_screen->default_visual =
-        si->default_screen->current_visual =
-        DefaultVisualOfScreen(si->default_screen->screen);
-      si->default_screen->screensaver_window =
-        RootWindowOfScreen(si->default_screen->screen);
-      si->default_screen->current_depth =
-        visual_depth(si->default_screen->screen,
-                     si->default_screen->current_visual);
+  msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO;
+  msg[nmsgs].msg = "1/3 Page Four";
+  nmsgs++;
 
-      ssip.width = WidthOfScreen(ssip.screen);
-      ssip.height = HeightOfScreen(ssip.screen);
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "2/3 Hack the planet.";
+  nmsgs++;
 
-      db = p->db;
-      XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "3/3 Hack the planet.";
+  nmsgs++;
+  DIALOG();
 
-      load_init_file (si->dpy, &si->prefs);
-    }
 
-  p->verbose_p = True;
+  msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO;
+  msg[nmsgs].msg = "1/1 Page Five visible text";
+  nmsgs++;
 
-  pw = getpwuid (getuid ());
-  si->user = strdup (pw->pw_name);
+  msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO;
+  msg[nmsgs].msg = "1/3 Page six visible text";
+  nmsgs++;
 
-/*  si->nscreens = 0;
-  si->screens = si->default_screen = 0; */
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "2/3 Poop.";
+  nmsgs++;
 
-  while (1)
-    {
-#ifndef NO_LOCKING
-      if (which == PASS)
-        {
-         si->unlock_cb = gui_auth_conv;
-          si->auth_finished_cb = auth_finished_cb;
+  msg[nmsgs].type = AUTH_MSGTYPE_INFO;
+  msg[nmsgs].msg = "3/3 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9"
+    " \xE2\x80\x9C"
+    " \xE2\xAC\xA4 \xE2\x80\xA2 \xE2\xAD\x98 "
+    "\xE2\x80\x9D";
+  nmsgs++;
+  DIALOG();
 
-          debug_passwd_window_p = True;
-         xss_authenticate(si, True);
-
-          if (si->unlock_state == ul_success)
-            fprintf (stderr, "%s: authentication succeeded\n", progname);
-          else
-            fprintf (stderr, "%s: authentication FAILED!\n", progname);
-
-          XSync(si->dpy, False);
-          fprintf (stderr, "\n######################################\n\n");
-          sleep (3);
-        }
-      else
-#endif
-      if (which == SPLASH)
-        {
-          XEvent event;
-          make_splash_dialog (si);
-          XtAppAddTimeOut (si->app, p->splash_duration + 1000,
-                           idle_timer, (XtPointer) si);
-          while (si->splash_dialog)
-            {
-              XtAppNextEvent (si->app, &event);
-              if (event.xany.window == si->splash_dialog)
-                handle_splash_event (si, &event);
-              XtDispatchEvent (&event);
-            }
-          XSync (si->dpy, False);
-          sleep (1);
-        }
-#ifndef NO_LOCKING
-      else if (which == TTY)
-        {
-          si->unlock_cb = text_auth_conv;
-
-          printf ("%s: Authenticating user %s\n", progname, si->user);
-          xss_authenticate(si, True);
-
-          if (si->unlock_state == ul_success)
-            printf ("%s: Ok!\n", progname);
-          else
-            printf ("%s: Wrong!\n", progname);
-        }
-#endif
-      else
-        abort();
-    }
-
-  free(si->user);
+  exit(0);
 }
+