1 | /* x11-ssh-askpass.h: A generic X11-based password dialog for OpenSSH. |
---|
2 | * created 1999-Nov-17 03:40 Jim Knoble <jmknoble@pobox.com> |
---|
3 | * autodate: 2001-Sep-16 18:08 |
---|
4 | * |
---|
5 | * by Jim Knoble <jmknoble@pobox.com> |
---|
6 | * Copyright (C) 1999,2000,2001 Jim Knoble |
---|
7 | * |
---|
8 | * Disclaimer: |
---|
9 | * |
---|
10 | * The software is provided "as is", without warranty of any kind, |
---|
11 | * express or implied, including but not limited to the warranties of |
---|
12 | * merchantability, fitness for a particular purpose and |
---|
13 | * noninfringement. In no event shall the author(s) be liable for any |
---|
14 | * claim, damages or other liability, whether in an action of |
---|
15 | * contract, tort or otherwise, arising from, out of or in connection |
---|
16 | * with the software or the use or other dealings in the software. |
---|
17 | * |
---|
18 | * Portions of this code are distantly derived from code in xscreensaver |
---|
19 | * by Jamie Zawinski <jwz@jwz.org>. That code says: |
---|
20 | * |
---|
21 | * --------8<------------------------------------------------8<-------- |
---|
22 | * xscreensaver, Copyright (c) 1991-1999 Jamie Zawinski <jwz@jwz.org> |
---|
23 | * |
---|
24 | * Permission to use, copy, modify, distribute, and sell this software and its |
---|
25 | * documentation for any purpose is hereby granted without fee, provided that |
---|
26 | * the above copyright notice appear in all copies and that both that |
---|
27 | * copyright notice and this permission notice appear in supporting |
---|
28 | * documentation. No representations are made about the suitability of this |
---|
29 | * software for any purpose. It is provided "as is" without express or |
---|
30 | * implied warranty. |
---|
31 | * --------8<------------------------------------------------8<-------- |
---|
32 | * |
---|
33 | * The remainder of this code falls under the same permissions and |
---|
34 | * provisions as those of the xscreensaver code. |
---|
35 | */ |
---|
36 | |
---|
37 | #ifndef H_X11_SSH_ASKPASS |
---|
38 | #define H_X11_SSH_ASKPASS |
---|
39 | |
---|
40 | #include <X11/Xlib.h> |
---|
41 | #include <X11/Intrinsic.h> |
---|
42 | #include <X11/Shell.h> |
---|
43 | |
---|
44 | #define EXIT_STATUS_ACCEPT 0 |
---|
45 | #define EXIT_STATUS_CANCEL 1 |
---|
46 | #define EXIT_STATUS_NO_MEMORY 2 |
---|
47 | #define EXIT_STATUS_ERROR 3 |
---|
48 | #define EXIT_STATUS_TIMEOUT 4 |
---|
49 | #define EXIT_STATUS_ANOMALY 127 |
---|
50 | |
---|
51 | typedef struct |
---|
52 | { |
---|
53 | Pixel foreground; |
---|
54 | Pixel background; |
---|
55 | Dimension width; |
---|
56 | Dimension height; |
---|
57 | Position x; |
---|
58 | Position y; |
---|
59 | } WidgetInfo; |
---|
60 | |
---|
61 | typedef struct |
---|
62 | { |
---|
63 | WidgetInfo w; |
---|
64 | Pixel topShadowColor; |
---|
65 | Pixel bottomShadowColor; |
---|
66 | Dimension shadowThickness; |
---|
67 | Pixel borderColor; |
---|
68 | Dimension borderWidth; |
---|
69 | Dimension interiorWidth; |
---|
70 | Dimension interiorHeight; |
---|
71 | Dimension horizontalSpacing; |
---|
72 | Dimension verticalSpacing; |
---|
73 | } Widget3dInfo; |
---|
74 | |
---|
75 | typedef struct TextObjectStruct |
---|
76 | { |
---|
77 | char *text; |
---|
78 | int textLength; |
---|
79 | int direction; |
---|
80 | int ascent; |
---|
81 | int descent; |
---|
82 | XCharStruct overall; |
---|
83 | struct TextObjectStruct *next; |
---|
84 | } TextObject; |
---|
85 | |
---|
86 | typedef struct |
---|
87 | { |
---|
88 | char *fullText; |
---|
89 | XFontStruct *font; |
---|
90 | TextObject *multiText; |
---|
91 | WidgetInfo w; |
---|
92 | } LabelInfo; |
---|
93 | |
---|
94 | typedef struct |
---|
95 | { |
---|
96 | Widget3dInfo w3; |
---|
97 | LabelInfo label; |
---|
98 | Bool pressed; |
---|
99 | } ButtonInfo; |
---|
100 | |
---|
101 | typedef struct |
---|
102 | { |
---|
103 | Widget3dInfo w3; |
---|
104 | int count; |
---|
105 | int current; |
---|
106 | int minimumCount; |
---|
107 | int maximumCount; |
---|
108 | } MasterIndicatorInfo; |
---|
109 | |
---|
110 | typedef struct |
---|
111 | { |
---|
112 | MasterIndicatorInfo *parent; |
---|
113 | WidgetInfo w; |
---|
114 | Bool isLit; |
---|
115 | } IndicatorElement; |
---|
116 | |
---|
117 | typedef struct |
---|
118 | { |
---|
119 | Window dialogWindow; |
---|
120 | |
---|
121 | XSizeHints *sizeHints; |
---|
122 | XWMHints *wmHints; |
---|
123 | XClassHint *classHints; |
---|
124 | XTextProperty windowName; |
---|
125 | |
---|
126 | char *title; |
---|
127 | Widget3dInfo w3; |
---|
128 | |
---|
129 | LabelInfo label; |
---|
130 | |
---|
131 | MasterIndicatorInfo indicator; |
---|
132 | IndicatorElement *indicators; |
---|
133 | |
---|
134 | ButtonInfo okButton; |
---|
135 | ButtonInfo cancelButton; |
---|
136 | |
---|
137 | int pressedButton; |
---|
138 | } DialogInfo; |
---|
139 | |
---|
140 | #define NO_BUTTON 0 |
---|
141 | #define OK_BUTTON 1 |
---|
142 | #define CANCEL_BUTTON 2 |
---|
143 | |
---|
144 | typedef struct |
---|
145 | { |
---|
146 | char *appName; |
---|
147 | char *appClass; |
---|
148 | |
---|
149 | int argc; |
---|
150 | char **argv; |
---|
151 | |
---|
152 | pid_t pid; |
---|
153 | |
---|
154 | char *buf; |
---|
155 | int bufSize; |
---|
156 | int bufIndex; |
---|
157 | |
---|
158 | Display *dpy; |
---|
159 | Screen *screen; |
---|
160 | Window rootWindow; |
---|
161 | Pixel black; |
---|
162 | Pixel white; |
---|
163 | Colormap colormap; |
---|
164 | |
---|
165 | /* Resolution measurements are normalized to dots/meter. */ |
---|
166 | long xResolution; |
---|
167 | long yResolution; |
---|
168 | long defaultXResolution; |
---|
169 | long defaultYResolution; |
---|
170 | long xFuzz; |
---|
171 | long yFuzz; |
---|
172 | |
---|
173 | XtAppContext appContext; |
---|
174 | Widget toplevelShell; |
---|
175 | XrmDatabase resourceDb; |
---|
176 | |
---|
177 | Atom wmDeleteWindowAtom; |
---|
178 | |
---|
179 | GC fillGC; |
---|
180 | GC borderGC; |
---|
181 | GC textGC; |
---|
182 | GC brightGC; |
---|
183 | GC dimGC; |
---|
184 | |
---|
185 | long eventMask; |
---|
186 | |
---|
187 | Bool grabKeyboard; |
---|
188 | Bool grabPointer; |
---|
189 | Bool grabServer; |
---|
190 | Bool isKeyboardGrabbed; |
---|
191 | Bool isPointerGrabbed; |
---|
192 | Bool isServerGrabbed; |
---|
193 | unsigned int grabFailTimeout; |
---|
194 | unsigned int grabRetryInterval; |
---|
195 | |
---|
196 | unsigned long inputTimeout; |
---|
197 | XtIntervalId inputTimeoutTimerId; |
---|
198 | Bool inputTimeoutActive; |
---|
199 | |
---|
200 | DialogInfo *dialog; |
---|
201 | } AppInfo; |
---|
202 | |
---|
203 | void outOfMemory(AppInfo *app, int line); |
---|
204 | void freeIf(void *p); |
---|
205 | void freeFontIf(AppInfo *app, XFontStruct *f); |
---|
206 | |
---|
207 | XFontStruct *getFontResource(AppInfo *app, char *instanceName, char *className); |
---|
208 | char *getStringResourceWithDefault(char *instanceName, char *className, |
---|
209 | char *defaultText); |
---|
210 | unsigned int getUnsignedIntegerResource(AppInfo *app, char *instanceName, |
---|
211 | char *className, |
---|
212 | unsigned int defaultValue); |
---|
213 | long getResolutionResource(AppInfo *app, char *instanceName, char *className, |
---|
214 | char *defaultResolutionSpec); |
---|
215 | |
---|
216 | void calcLabelTextExtents(LabelInfo *label); |
---|
217 | void calcTotalButtonExtents(ButtonInfo *button); |
---|
218 | void calcButtonExtents(ButtonInfo *button); |
---|
219 | void balanceButtonExtents(ButtonInfo *button1, ButtonInfo *button2); |
---|
220 | void calcButtonLabelPosition(ButtonInfo *button); |
---|
221 | |
---|
222 | Dimension scaleXDimension(AppInfo *app, Dimension unscaled); |
---|
223 | Dimension scaleYDimension(AppInfo *app, Dimension unscaled); |
---|
224 | |
---|
225 | void createDialog(AppInfo *app); |
---|
226 | void destroyDialog(AppInfo *app); |
---|
227 | void createDialogWindow(AppInfo *app); |
---|
228 | void createGCs(AppInfo *app); |
---|
229 | void destroyGCs(AppInfo *app); |
---|
230 | |
---|
231 | void paintLabel(AppInfo *app, Drawable draw, LabelInfo label); |
---|
232 | void paintButton(AppInfo *app, Drawable draw, ButtonInfo button); |
---|
233 | void paintIndicator(AppInfo *app, Drawable draw, IndicatorElement indicator); |
---|
234 | void updateIndicatorElement(AppInfo *app, int i); |
---|
235 | void updateIndicators(AppInfo *app, int condition); |
---|
236 | void paintDialog(AppInfo *app); |
---|
237 | |
---|
238 | #define GRAB_KEYBOARD 0 |
---|
239 | #define GRAB_POINTER 1 |
---|
240 | void performGrab(AppInfo *app, int grabType, char *grabTypeName, |
---|
241 | Bool shouldGrab, Bool *isGrabbed); |
---|
242 | |
---|
243 | void grabKeyboard(AppInfo *app); |
---|
244 | void ungrabKeyboard(AppInfo *app); |
---|
245 | void grabPointer(AppInfo *app); |
---|
246 | void ungrabPointer(AppInfo *app); |
---|
247 | void grabServer(AppInfo *app); |
---|
248 | void ungrabServer(AppInfo *app); |
---|
249 | |
---|
250 | void cleanUp(AppInfo *app); |
---|
251 | void exitApp(AppInfo *app, int exitCode); |
---|
252 | |
---|
253 | void acceptAction(AppInfo *app); |
---|
254 | void cancelAction(AppInfo *app); |
---|
255 | |
---|
256 | void backspacePassphrase(AppInfo *app); |
---|
257 | void erasePassphrase(AppInfo *app); |
---|
258 | void addToPassphrase(AppInfo *app, char c); |
---|
259 | |
---|
260 | void handleKeyPress(AppInfo *app, XEvent *event); |
---|
261 | Bool eventIsInsideButton(AppInfo *app, XEvent *event, ButtonInfo button); |
---|
262 | void handleButtonPress(AppInfo *app, XEvent *event); |
---|
263 | void handlePointerMotion(AppInfo *app, XEvent *event); |
---|
264 | |
---|
265 | void handleInputTimeout(XtPointer data, XtIntervalId *timerId); |
---|
266 | void cancelInputTimeout(AppInfo *app); |
---|
267 | |
---|
268 | #endif /* H_X11_SSH_ASKPASS */ |
---|