home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / clients / xdm / greet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-21  |  5.0 KB  |  212 lines

  1. /*
  2.  * xdm - display manager daemon
  3.  *
  4.  * $XConsortium: greet.c,v 1.30 92/04/15 10:52:33 rws Exp $
  5.  *
  6.  * Copyright 1988 Massachusetts Institute of Technology
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted, provided
  10.  * that the above copyright notice appear in all copies and that both that
  11.  * copyright notice and this permission notice appear in supporting
  12.  * documentation, and that the name of M.I.T. not be used in advertising or
  13.  * publicity pertaining to distribution of the software without specific,
  14.  * written prior permission.  M.I.T. makes no representations about the
  15.  * suitability of this software for any purpose.  It is provided "as is"
  16.  * without express or implied warranty.
  17.  *
  18.  * Author:  Keith Packard, MIT X Consortium
  19.  */
  20.  
  21. /*
  22.  * widget to get username/password
  23.  *
  24.  */
  25.  
  26. # include <X11/Intrinsic.h>
  27. # include <X11/StringDefs.h>
  28. # include <X11/Shell.h>
  29.  
  30. # include <X11/Xaw/Command.h>
  31. # include <X11/Xaw/Logo.h>
  32.  
  33. # include "Login.h"
  34. # include "dm.h"
  35.  
  36. extern Display    *dpy;
  37.  
  38. static int    done, code;
  39. static char    name[128], password[128];
  40. static Widget        toplevel;
  41. static Widget        login;
  42. static XtAppContext    context;
  43. static XtIntervalId    pingTimeout;
  44.  
  45. /*ARGSUSED*/
  46. static void
  47. GreetPingServer (closure, intervalId)
  48.     XtPointer        closure;
  49.     XtIntervalId    *intervalId;
  50. {
  51.     struct display *d;
  52.  
  53.     d = (struct display *) closure;
  54.     if (!PingServer (d, XtDisplay (toplevel)))
  55.     SessionPingFailed (d);
  56.     pingTimeout = XtAppAddTimeOut (context, d->pingInterval * 60 * 1000,
  57.                    GreetPingServer, (closure));
  58. }
  59.  
  60. /*ARGSUSED*/
  61. GreetDone (w, data, status)
  62.     Widget    w;
  63.     LoginData    *data;
  64.     int        status;
  65. {
  66.     Debug ("GreetDone: %s, (password is %d long)\n",
  67.         data->name, strlen (data->passwd));
  68.     switch (status) {
  69.     case NOTIFY_OK:
  70.     strcpy (name, data->name);
  71.     strcpy (password, data->passwd);
  72.     code = 0;
  73.     done = 1;
  74.     break;
  75.     case NOTIFY_ABORT:
  76.     Debug ("RESERVER_DISPLAY\n");
  77.     code = RESERVER_DISPLAY;
  78.     done = 1;
  79.     break;
  80.     case NOTIFY_RESTART:
  81.     Debug ("REMANAGE_DISPLAY\n");
  82.     code = REMANAGE_DISPLAY;
  83.     done = 1;
  84.     break;
  85.     case NOTIFY_ABORT_DISPLAY:
  86.     Debug ("UNMANAGE_DISPLAY\n");
  87.     code = UNMANAGE_DISPLAY;
  88.     done = 1;
  89.     break;
  90.     }
  91. }
  92.  
  93. Display *
  94. InitGreet (d)
  95. struct display    *d;
  96. {
  97.     Arg        arglist[10];
  98.     int        i;
  99.     static int    argc;
  100.     Screen        *scrn;
  101.     static char    *argv[] = { "xlogin", 0 };
  102.     Display        *dpy;
  103.  
  104.     Debug ("greet %s\n", d->name);
  105.     argc = 1;
  106.     XtToolkitInitialize ();
  107.     context = XtCreateApplicationContext();
  108.     dpy = XtOpenDisplay (context, d->name, "xlogin", "Xlogin", 0,0,
  109.              &argc, argv);
  110.  
  111.     if (!dpy)
  112.     return 0;
  113.  
  114.     RegisterCloseOnFork (ConnectionNumber (dpy));
  115.  
  116.     SecureDisplay (d, dpy);
  117.  
  118.     i = 0;
  119.     scrn = DefaultScreenOfDisplay(dpy);
  120.     XtSetArg(arglist[i], XtNscreen, scrn);    i++;
  121.     XtSetArg(arglist[i], XtNargc, argc);    i++;
  122.     XtSetArg(arglist[i], XtNargv, argv);    i++;
  123.  
  124.     toplevel = XtAppCreateShell ((String) NULL, "Xlogin",
  125.             applicationShellWidgetClass, dpy, arglist, i);
  126.  
  127.     i = 0;
  128.     XtSetArg (arglist[i], XtNnotifyDone, GreetDone); i++;
  129.     if (!d->authorize || d->authorizations || !d->authComplain)
  130.     {
  131.     XtSetArg (arglist[i], XtNsecureSession, True); i++;
  132.     }
  133.     login = XtCreateManagedWidget ("login", loginWidgetClass, toplevel,
  134.                     arglist, i);
  135.     XtRealizeWidget (toplevel);
  136.  
  137.     XWarpPointer(dpy, None, RootWindowOfScreen (scrn),
  138.             0, 0, 0, 0,
  139.             WidthOfScreen(scrn) / 2,
  140.             HeightOfScreen(scrn) / 2);
  141.  
  142.     if (d->pingInterval)
  143.     {
  144.         pingTimeout = XtAppAddTimeOut (context, d->pingInterval * 60 * 1000,
  145.                        GreetPingServer, (XtPointer) d);
  146.     }
  147.     return dpy;
  148. }
  149.  
  150. CloseGreet (d)
  151. struct display    *d;
  152. {
  153.     Boolean        allow;
  154.     Arg        arglist[1];
  155.  
  156.     if (pingTimeout)
  157.     {
  158.     XtRemoveTimeOut (pingTimeout);
  159.     pingTimeout = 0;
  160.     }
  161.     UnsecureDisplay (d, XtDisplay (toplevel));
  162.     XtSetArg (arglist[0], XtNallowAccess, (char *) &allow);
  163.     XtGetValues (login, arglist, 1);
  164.     if (allow)
  165.     {
  166.     Debug ("Disabling access control\n");
  167.     XSetAccessControl (XtDisplay (toplevel), DisableAccess);
  168.     }
  169.     XtDestroyWidget (toplevel);
  170.     ClearCloseOnFork (ConnectionNumber (XtDisplay (toplevel)));
  171.     XCloseDisplay (XtDisplay (toplevel));
  172.     Debug ("Greet connection closed\n");
  173. }
  174.  
  175. Greet (d, greet)
  176. struct display        *d;
  177. struct greet_info    *greet;
  178. {
  179.     XEvent        event;
  180.     Arg        arglist[1];
  181.  
  182.     XtSetArg (arglist[0], XtNallowAccess, False);
  183.     XtSetValues (login, arglist, 1);
  184.  
  185.     Debug ("dispatching %s\n", d->name);
  186.     done = 0;
  187.     while (!done) {
  188.         XtAppNextEvent (context, &event);
  189.         XtDispatchEvent (&event);
  190.     }
  191.     XFlush (XtDisplay (toplevel));
  192.     Debug ("Done dispatch %s\n", d->name);
  193.     if (code == 0)
  194.     {
  195.     greet->name = name;
  196.     greet->password = password;
  197.     XtSetArg (arglist[0], XtNsessionArgument, (char *) &(greet->string));
  198.     XtGetValues (login, arglist, 1);
  199.     Debug ("sessionArgument: %s\n", greet->string ? greet->string : "<NULL>");
  200.     }
  201.     return code;
  202. }
  203.  
  204.  
  205. /*ARGSUSED*/
  206. FailedLogin (d, greet)
  207. struct display    *d;
  208. struct greet_info    *greet;
  209. {
  210.     DrawFail (login);
  211. }
  212.