~ubuntu-branches/ubuntu/gutsy/vnc4/gutsy

« back to all changes in this revision

Viewing changes to unix/xc/programs/xkbutils/xkbwatch.c

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2006-05-15 20:35:17 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060515203517-l4lre1ku942mn26k
Tags: 4.1.1+X4.3.0-10
* Correction of critical security issue. Thanks to Martin Kogler
  <e9925248@student.tuwien.ac.at> that informed me about the issue,
  and provided the patch.
  This flaw was originally found by Steve Wiseman of intelliadmin.com.
* Applied patch from Javier Kohen <jkohen@users.sourceforge.net> that
  inform the user that only 8 first characters of the password will
  actually be used when typing more than 8 characters, closes:
  #355619.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Xorg: xkbwatch.c,v 1.4 2000/08/17 19:54:51 cpqbld Exp $ */
 
2
/************************************************************
 
3
 Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
 
4
 
 
5
 Permission to use, copy, modify, and distribute this
 
6
 software and its documentation for any purpose and without
 
7
 fee is hereby granted, provided that the above copyright
 
8
 notice appear in all copies and that both that copyright
 
9
 notice and this permission notice appear in supporting
 
10
 documentation, and that the name of Silicon Graphics not be 
 
11
 used in advertising or publicity pertaining to distribution 
 
12
 of the software without specific prior written permission.
 
13
 Silicon Graphics makes no representation about the suitability 
 
14
 of this software for any purpose. It is provided "as is"
 
15
 without any express or implied warranty.
 
16
 
 
17
 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
 
18
 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
 
19
 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
 
20
 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
 
21
 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
 
22
 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
 
23
 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
 
24
 THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
25
 
 
26
 ********************************************************/
 
27
/* $XFree86: xc/programs/xkbutils/xkbwatch.c,v 3.5 2001/04/01 14:00:22 tsi Exp $ */
 
28
 
 
29
#include <stdlib.h>
 
30
#include <X11/X.h>
 
31
#include <X11/Xlib.h>
 
32
#include <X11/XKBlib.h>
 
33
#include <X11/Intrinsic.h>
 
34
#include <X11/StringDefs.h>
 
35
#include <X11/Shell.h>
 
36
#include <X11/Xaw/Cardinals.h>
 
37
#include <X11/Xaw/Box.h>
 
38
 
 
39
#define OPAQUE_DEFINED
 
40
#define BOOLEAN_DEFINED
 
41
#define DEBUG_VAR_NOT_LOCAL
 
42
#define DEBUG_VAR debugFlags
 
43
#include "utils.h"
 
44
#include "LED.h"
 
45
 
 
46
/***====================================================================***/
 
47
 
 
48
        Display *       inDpy,*outDpy;
 
49
        int             evBase,errBase;
 
50
        Bool            synch;
 
51
 
 
52
/***====================================================================***/
 
53
 
 
54
 
 
55
static XrmOptionDescRec options[] = {
 
56
{"-off",        "*on.on",               XrmoptionNoArg,         "FALSE"},
 
57
{"-on",         "*on.on",               XrmoptionNoArg,         "TRUE"}
 
58
};
 
59
 
 
60
/***====================================================================***/
 
61
 
 
62
int
 
63
main(int argc, char *argv[])
 
64
{
 
65
Widget          toplevel;
 
66
XtAppContext    app_con;
 
67
Widget          panel;
 
68
Widget          base[XkbNumModifiers];
 
69
Widget          latched[XkbNumModifiers];
 
70
Widget          locked[XkbNumModifiers];
 
71
Widget          effective[XkbNumModifiers];
 
72
Widget          compat[XkbNumModifiers];
 
73
Widget          baseBox,latchBox,lockBox,effBox,compatBox;
 
74
register int    i;
 
75
unsigned        bit;
 
76
XkbEvent        ev;
 
77
XkbStateRec     state;
 
78
static Arg      hArgs[]= {{ XtNorientation, (XtArgVal)XtorientHorizontal }};
 
79
static Arg      vArgs[]= {{ XtNorientation, (XtArgVal)XtorientVertical }};
 
80
static Arg      onArgs[]=  {{ XtNon, (XtArgVal)True }};
 
81
static Arg      offArgs[]=  {{ XtNon, (XtArgVal)False }};
 
82
static char *   fallback_resources[] = {
 
83
    "*Box*background: grey50",
 
84
    "*Box*borderWidth: 0",
 
85
    "*Box*vSpace: 1",
 
86
    NULL
 
87
};
 
88
 
 
89
    uSetEntryFile(NullString);
 
90
    uSetDebugFile(NullString);
 
91
    uSetErrorFile(NullString);
 
92
    toplevel = XtOpenApplication(&app_con, "XkbWatch",
 
93
                                 options, XtNumber(options), &argc, argv, 
 
94
                                 fallback_resources,
 
95
                                 sessionShellWidgetClass, NULL, ZERO);
 
96
    if (toplevel==NULL) {
 
97
        uFatalError("Couldn't create application top level\n");
 
98
        exit(1);
 
99
    }
 
100
    inDpy= outDpy= XtDisplay(toplevel);
 
101
    if (inDpy) {
 
102
        int i1,mn,mj;
 
103
        mj= XkbMajorVersion;
 
104
        mn= XkbMinorVersion;
 
105
        if (!XkbQueryExtension(inDpy,&i1,&evBase,&errBase,&mj,&mn)) {
 
106
            uFatalError("Server doesn't support a compatible XKB\n");
 
107
            exit(1);
 
108
        }
 
109
    }
 
110
    panel= XtCreateManagedWidget("xkbwatch",boxWidgetClass,toplevel,vArgs,1);
 
111
    if (panel==NULL) {
 
112
        uFatalError("Couldn't create top level box\n");
 
113
        exit(1);
 
114
    }
 
115
    baseBox= XtCreateManagedWidget("base",boxWidgetClass,panel,hArgs,1);
 
116
    if (baseBox==NULL)
 
117
        uFatalError("Couldn't create base modifiers box\n");
 
118
    latchBox= XtCreateManagedWidget("latched",boxWidgetClass,panel,hArgs,1);
 
119
    if (latchBox==NULL)
 
120
        uFatalError("Couldn't create latched modifiers box\n");
 
121
    lockBox= XtCreateManagedWidget("locked",boxWidgetClass,panel,hArgs,1);
 
122
    if (lockBox==NULL)
 
123
        uFatalError("Couldn't create locked modifiers box\n");
 
124
    effBox= XtCreateManagedWidget("effective",boxWidgetClass,panel,hArgs,1);
 
125
    if (effBox==NULL)
 
126
        uFatalError("Couldn't create effective modifiers box\n");
 
127
    compatBox= XtCreateManagedWidget("compat",boxWidgetClass,panel,hArgs,1);
 
128
    if (compatBox==NULL)
 
129
        uFatalError("Couldn't create compatibility state box\n");
 
130
    XkbSelectEvents(inDpy,XkbUseCoreKbd,XkbStateNotifyMask,XkbStateNotifyMask);
 
131
    XkbGetState(inDpy,XkbUseCoreKbd,&state);
 
132
    for (i=XkbNumModifiers-1,bit=0x80;i>=0;i--,bit>>=1) {
 
133
        ArgList list;
 
134
        char    buf[30];
 
135
        sprintf(buf,"base%d",i);
 
136
        if (state.base_mods&bit)        list= onArgs;
 
137
        else                            list= offArgs;
 
138
        base[i]= XtCreateManagedWidget(buf,ledWidgetClass,baseBox,list,1);
 
139
        sprintf(buf,"latched%d",i);
 
140
        if (state.latched_mods&bit)     list= onArgs;
 
141
        else                            list= offArgs;
 
142
        latched[i]= XtCreateManagedWidget(buf,ledWidgetClass,latchBox,list,1);
 
143
        sprintf(buf,"locked%d",i);
 
144
        if (state.locked_mods&bit)      list= onArgs;
 
145
        else                            list= offArgs;
 
146
        locked[i]= XtCreateManagedWidget(buf,ledWidgetClass,lockBox,list,1);
 
147
        sprintf(buf,"effective%d",i);
 
148
        if (state.mods&bit)             list= onArgs;
 
149
        else                            list= offArgs;
 
150
        effective[i]= XtCreateManagedWidget(buf,ledWidgetClass,effBox,list,1);
 
151
        sprintf(buf,"compat%d",i);
 
152
        if (state.compat_state&bit)     list= onArgs;
 
153
        else                            list= offArgs;
 
154
        compat[i]= XtCreateManagedWidget(buf,ledWidgetClass,compatBox,list,1);
 
155
    }
 
156
    XtRealizeWidget(toplevel);
 
157
    while (1) {
 
158
        XtAppNextEvent(app_con,&ev.core);
 
159
        if (ev.core.type==evBase+XkbEventCode) {
 
160
            if (ev.any.xkb_type==XkbStateNotify) {
 
161
                unsigned changed;
 
162
                if (ev.state.changed&XkbModifierBaseMask) {
 
163
                    changed= ev.state.base_mods^state.base_mods;
 
164
                    state.base_mods= ev.state.base_mods;
 
165
                    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
 
166
                        if (changed&bit) {
 
167
                            ArgList     list;
 
168
                            if (state.base_mods&bit)    list= onArgs;
 
169
                            else                        list= offArgs;
 
170
                            XtSetValues(base[i],list,1);
 
171
                        }
 
172
                    }
 
173
                }
 
174
                if (ev.state.changed&XkbModifierLatchMask) {
 
175
                    changed= ev.state.latched_mods^state.latched_mods;
 
176
                    state.latched_mods= ev.state.latched_mods;
 
177
                    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
 
178
                        if (changed&bit) {
 
179
                            ArgList     list;
 
180
                            if (state.latched_mods&bit) list= onArgs;
 
181
                            else                        list= offArgs;
 
182
                            XtSetValues(latched[i],list,1);
 
183
                        }
 
184
                    }
 
185
                }
 
186
                if (ev.state.changed&XkbModifierLockMask) {
 
187
                    changed= ev.state.locked_mods^state.locked_mods;
 
188
                    state.locked_mods= ev.state.locked_mods;
 
189
                    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
 
190
                        if (changed&bit) {
 
191
                            ArgList     list;
 
192
                            if (state.locked_mods&bit)  list= onArgs;
 
193
                            else                        list= offArgs;
 
194
                            XtSetValues(locked[i],list,1);
 
195
                        }
 
196
                    }
 
197
                }
 
198
                if (ev.state.changed&XkbModifierStateMask) {
 
199
                    changed= ev.state.mods^state.mods;
 
200
                    state.mods= ev.state.mods;
 
201
                    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
 
202
                        if (changed&bit) {
 
203
                            ArgList     list;
 
204
                            if (state.mods&bit) list= onArgs;
 
205
                            else                list= offArgs;
 
206
                            XtSetValues(effective[i],list,1);
 
207
                        }
 
208
                    }
 
209
                }
 
210
                if (ev.state.changed&XkbCompatStateMask) {
 
211
                    changed= ev.state.compat_state^state.compat_state;
 
212
                    state.compat_state= ev.state.compat_state;
 
213
                    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
 
214
                        if (changed&bit) {
 
215
                            ArgList     list;
 
216
                            if (state.compat_state&bit) list= onArgs;
 
217
                            else                        list= offArgs;
 
218
                            XtSetValues(compat[i],list,1);
 
219
                        }
 
220
                    }
 
221
                }
 
222
            }
 
223
        }
 
224
        else XtDispatchEvent(&ev.core);
 
225
    }
 
226
/* BAIL: */
 
227
    if (inDpy) 
 
228
        XCloseDisplay(inDpy);
 
229
    if (outDpy!=inDpy)
 
230
        XCloseDisplay(outDpy);
 
231
    inDpy= outDpy= NULL;
 
232
    return 0;
 
233
}