summaryrefslogtreecommitdiffstats
path: root/src/windows/cns
diff options
context:
space:
mode:
authorKeith Vetter <keithv@fusion.com>1995-04-07 22:29:33 +0000
committerKeith Vetter <keithv@fusion.com>1995-04-07 22:29:33 +0000
commit5842f721c467c16410759743659da8e784b760b1 (patch)
treeb1f0beebdaebf52d75680c154daeae48adb1cddb /src/windows/cns
parent8ae426aca4d7f95de05ec34a9e0dfe5cc70395a3 (diff)
downloadkrb5-5842f721c467c16410759743659da8e784b760b1.tar.gz
krb5-5842f721c467c16410759743659da8e784b760b1.tar.xz
krb5-5842f721c467c16410759743659da8e784b760b1.zip
Windows cns: user can now specify the ccache file on the options dialog.
Windows telnet: accepts and remembers port number specified after the host name in the initial dialog. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@5344 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/windows/cns')
-rw-r--r--src/windows/cns/changelo7
-rw-r--r--src/windows/cns/cns.c247
-rw-r--r--src/windows/cns/cns.h7
-rw-r--r--src/windows/cns/cns.rc62
4 files changed, 245 insertions, 78 deletions
diff --git a/src/windows/cns/changelo b/src/windows/cns/changelo
index eb98d9a906..c1acf83867 100644
--- a/src/windows/cns/changelo
+++ b/src/windows/cns/changelo
@@ -1,3 +1,10 @@
+Fri Apr 7 15:03:10 1995 Keith Vetter (keithv@fusion.com)
+
+ * cns.c, cns.h, cns.rc: added option dialog widget allowing user
+ to specify where the ccache lives. Also, default name and realm
+ is now pulled from the ccache everytime you select one.
+ * cns.c: fixed memory leak in k5_dest_tkt.
+
Wed Apr 5 16:01:16 1995 Keith Vetter (keithv@fusion.com)
* cns.h, cns.rc, cns.c: GUI changes: re-order and resize
diff --git a/src/windows/cns/cns.c b/src/windows/cns/cns.c
index 97b4b6bdb9..50cf1cdd2c 100644
--- a/src/windows/cns/cns.c
+++ b/src/windows/cns/cns.c
@@ -39,7 +39,7 @@
#include "krbini.h"
#include "com_err.h"
- #define DEFAULT_TKT_LIFE 120
+ #define DEFAULT_TKT_LIFE 120 // In 5 minute units
#define ANAME_SZ 40
#define REALM_SZ 40
#define SNAME_SZ 40
@@ -77,8 +77,6 @@ static HFONT hfontdialog = NULL; /* Font in which the dialog is drawn. */
static HFONT hfonticon = NULL; /* Font for icon label */
static HINSTANCE hinstance;
static int dlgncmdshow; /* ncmdshow from WinMain */
-static char confname[FILENAME_MAX]; /* current krb.conf location */
-static char realmsname[FILENAME_MAX]; /* current krb.realms location */
static UINT wm_kerberos_changed; /* Registered message for cache changing */
static int action; /* After login actions */
static UINT kwin_timer_id; /* Timer being used for update */
@@ -92,6 +90,7 @@ static FARPROC hook_instance; /* Intance handle for blocking hook function */
#ifdef KRB5
krb5_context k5_context;
krb5_ccache k5_ccache;
+ static char ccname[FILENAME_MAX]; /* ccache file location */
#endif
/*+
@@ -803,40 +802,54 @@ opts_initdialog (
LPARAM lparam)
{
char defname[FILENAME_MAX];
+ char newname[FILENAME_MAX];
UINT rc;
int lifetime;
center_dialog(hwnd);
set_dialog_font(hwnd, hfontdialog);
- /* krb.conf file */
+/* krb.conf file */
rc = GetWindowsDirectory(defname, sizeof(defname));
assert(rc > 0);
strcat(defname, "\\");
strcat(defname, DEF_KRB_CONF);
GetPrivateProfileString(INI_FILES, INI_KRB_CONF, defname,
- confname, sizeof(confname), KERBEROS_INI);
- _strupr(confname);
- SetDlgItemText(hwnd, IDD_CONF, confname);
+ newname, sizeof(newname), KERBEROS_INI);
+ _strupr(newname);
+ SetDlgItemText(hwnd, IDD_CONF, newname);
- /* krb.realms file */
+/* krb.realms file */
rc = GetWindowsDirectory(defname, sizeof(defname));
assert(rc > 0);
strcat(defname, "\\");
strcat(defname, DEF_KRB_REALMS);
GetPrivateProfileString(INI_FILES, INI_KRB_REALMS, defname,
- realmsname, sizeof(realmsname), KERBEROS_INI);
- _strupr(realmsname);
- SetDlgItemText(hwnd, IDD_REALMS, realmsname);
+ newname, sizeof(newname), KERBEROS_INI);
+ _strupr(newname);
+ SetDlgItemText(hwnd, IDD_REALMS, newname);
- /* Ticket duration */
+/* Credential cache file */
+ #ifdef KRB5
+ rc = GetWindowsDirectory(defname, sizeof(defname));
+ assert(rc > 0);
+
+ strcat(defname, "\\");
+ strcat(defname, "krb5cc");
+ GetPrivateProfileString(INI_FILES, INI_KRB_CCACHE, defname,
+ ccname, sizeof(ccname), KERBEROS_INI);
+ _strupr(ccname);
+ SetDlgItemText(hwnd, IDD_CCACHE, ccname);
+ #endif /* KRB5 */
+
+/* Ticket duration */
lifetime = GetPrivateProfileInt(INI_OPTIONS, INI_DURATION,
DEFAULT_TKT_LIFE * 5, KERBEROS_INI);
SetDlgItemInt(hwnd, IDD_LIFETIME, lifetime, FALSE);
- /* Expiration action */
+/* Expiration action */
GetPrivateProfileString(INI_EXPIRATION, INI_ALERT, "No",
defname, sizeof(defname), KERBEROS_INI);
alert = _stricmp(defname, "Yes") == 0;
@@ -870,20 +883,19 @@ opts_command (
LPARAM lparam)
{
char defname[FILENAME_MAX];
+ char newname[FILENAME_MAX];
char *p;
BOOL b;
int lifetime;
int rc;
switch (wparam) {
-
case IDOK:
- /* Ticket duration */
+/* Ticket duration */
lifetime = GetDlgItemInt(hwnd, IDD_LIFETIME, &b, FALSE);
if (!b) {
MessageBox(hwnd, "Lifetime must be a number!", "", MB_OK | MB_ICONEXCLAMATION);
-
return TRUE;
}
@@ -891,37 +903,79 @@ opts_command (
b = WritePrivateProfileString(INI_OPTIONS, INI_DURATION, defname, KERBEROS_INI);
assert(b);
- /* krb.conf file */
- GetDlgItemText(hwnd, IDD_CONF, confname, sizeof(confname));
- trim(confname);
+/* krb.conf file */
+ GetDlgItemText(hwnd, IDD_CONF, newname, sizeof(newname));
+ trim(newname);
rc = GetWindowsDirectory(defname, sizeof(defname));
assert(rc > 0);
strcat(defname, "\\");
strcat(defname, DEF_KRB_CONF);
- if (_stricmp(confname, defname) == 0 || !confname[0])
+ if (_stricmp(newname, defname) == 0 || !newname[0])
p = NULL;
else
- p = confname;
+ p = newname;
b = WritePrivateProfileString(INI_FILES, INI_KRB_CONF, p, KERBEROS_INI);
assert(b);
- /* krb.realms file */
- GetDlgItemText(hwnd, IDD_REALMS, realmsname, sizeof(realmsname));
- trim(realmsname);
+/* krb.realms file */
+ GetDlgItemText(hwnd, IDD_REALMS, newname, sizeof(newname));
+ trim(newname);
rc = GetWindowsDirectory(defname, sizeof(defname));
assert(rc > 0);
strcat(defname, "\\");
strcat(defname, DEF_KRB_REALMS);
- if (_stricmp(realmsname, defname) == 0 || !realmsname[0])
+ if (_stricmp(newname, defname) == 0 || !newname[0])
p = NULL;
else
- p = realmsname;
+ p = newname;
b = WritePrivateProfileString(INI_FILES, INI_KRB_REALMS, p, KERBEROS_INI);
assert(b);
- /* Expiration action */
+/* Credential cache file */
+ #ifdef KRB5
+ GetDlgItemText(hwnd, IDD_CCACHE, newname, sizeof(newname));
+ trim(newname);
+ rc = GetWindowsDirectory(defname, sizeof(defname));
+ assert(rc > 0);
+
+ strcat(defname, "\\");
+ strcat(defname, "krb5cc");
+ if (*newname == '\0')
+ strcpy (newname, defname);
+ if (_stricmp(newname, defname) == 0 || *newname == '\0')
+ p = NULL;
+ else
+ p = newname;
+ b = WritePrivateProfileString(INI_FILES, INI_KRB_CCACHE, p, KERBEROS_INI);
+ assert(b);
+
+ if (strcmp (ccname, newname)) { // Did we change ccache file?
+ krb5_error_code code;
+ krb5_ccache cctemp;
+
+ code = k5_init_ccache (&cctemp);
+ if (code) { // Problem opening new one?
+ com_err (NULL, code,
+ "while changing ccache.\r\nRestoring old ccache.");
+ b = WritePrivateProfileString(INI_FILES, INI_KRB_CCACHE,
+ ccname, KERBEROS_INI);
+ } else {
+ code = krb5_cc_close (k5_context, k5_ccache);
+ k5_ccache = cctemp; // Copy new into old
+ if (k5_name_from_ccache (k5_ccache)) {
+ kwin_init_name (GetParent(hwnd), "");
+ kwin_set_default_focus(GetParent(hwnd));
+ }
+ ticket_init_list (GetDlgItem (GetParent(hwnd),
+ IDD_TICKET_LIST));
+ }
+ }
+
+ #endif /* KRB5 */
+
+/* Expiration action */
alert = (BOOL) SendDlgItemMessage(hwnd, IDD_ALERT, BM_GETCHECK, 0, 0);
p = (alert) ? "Yes" : "No";
b = WritePrivateProfileString(INI_EXPIRATION, INI_ALERT, p, KERBEROS_INI);
@@ -1260,6 +1314,8 @@ kwin_init_name (
krc = krb_get_lrealm(realm, 1);
if (krc != KSUCCESS)
realm[0] = 0;
+ GetPrivateProfileString(INI_DEFAULTS, INI_REALM, realm,
+ realm, sizeof(realm), KERBEROS_INI);
#endif
@@ -1270,9 +1326,6 @@ kwin_init_name (
GetPrivateProfileString (INI_DEFAULTS, INI_USER, "",
name, sizeof(name), KERBEROS_INI);
- //GetPrivateProfileString(INI_DEFAULTS, INI_INSTANCE, "",
- // instance, sizeof(instance), KERBEROS_INI);
- *instance = '\0';
*realm = '\0';
code = krb5_get_default_realm (k5_context, &ptr);
@@ -1280,14 +1333,15 @@ kwin_init_name (
strcpy (realm, ptr);
free (ptr);
}
+ GetPrivateProfileString(INI_DEFAULTS, INI_REALM, realm,
+ realm, sizeof(realm), KERBEROS_INI);
}
#endif
- GetPrivateProfileString(INI_DEFAULTS, INI_REALM, realm,
- realm, sizeof(realm), KERBEROS_INI);
} else {
#ifdef KRB4
kname_parse(name, instance, realm, fullname);
+ SetDlgItemText(hwnd, IDD_LOGIN_INSTANCE, instance);
#endif
#ifdef KRB5
@@ -1297,14 +1351,8 @@ kwin_init_name (
}
SetDlgItemText(hwnd, IDD_LOGIN_NAME, name);
- name[0] = 0;
- GetDlgItemText(hwnd, IDD_LOGIN_NAME, name, sizeof(name));
SetDlgItemText(hwnd, IDD_LOGIN_REALM, realm);
- #ifdef KRB4
- SetDlgItemText(hwnd, IDD_LOGIN_INSTANCE, instance);
- #endif
-
} /* kwin_init_name */
@@ -2013,16 +2061,16 @@ kwin_command (
creds.client = principal;
creds.server = server;
- //code = krb5_timeofday(k5_context, &now);
- //if (code) break;
code = krb5_us_timeofday(k5_context, &sec, &usec);
if (code) break;
-//if (labs(now-sec) > 60*60) { // Off by more than an hour
-// MessageBox (NULL, "DEBUG: timeofday != us_timeofday", NULL, 0);
-// now = sec;
-//}
+ code = krb5_timeofday(k5_context, &now);
+ if (code) break;
+ if (labs(now-sec) > 60*60) { // Off by more than an hour
+ MessageBox (NULL, "DEBUG: timeofday != us_timeofday", NULL, 0);
+ now = sec;
+ }
creds.times.starttime = 0;
- creds.times.endtime = now + 60L * lifetime;
+ creds.times.endtime = sec + 60L * lifetime;
creds.times.renew_till = 0;
code = krb5_get_in_tkt_with_password(k5_context, 0, NULL,
@@ -2113,6 +2161,7 @@ kwin_command (
return TRUE;
case IDM_ABOUT:
+ ticket_init_list(GetDlgItem(hwnd, IDD_TICKET_LIST));
if (isblocking)
return TRUE;
@@ -2555,16 +2604,19 @@ init_instance (
#endif
#ifdef KRB5
- krb5_init_context(&k5_context);
- krb5_init_ets(k5_context);
- krb5_cc_default(k5_context, &k5_ccache);
-
- i = k5_get_num_cred (0); /* Test integrity */
- if (i == -1) {
- remove (krb5_cc_get_name(k5_context, k5_ccache));
- i = k5_get_num_cred (1);
- if (i == -1)
+ {
+ krb5_error_code code;
+
+ code = krb5_init_context(&k5_context);
+ if (! code) {
+ krb5_init_ets(k5_context);
+ code = k5_init_ccache (&k5_ccache);
+ }
+ if (code) {
+ com_err (NULL, code, "while initializing program");
return FALSE;
+ }
+ k5_name_from_ccache (k5_ccache);
}
#endif
@@ -2836,23 +2888,20 @@ static krb5_error_code
k5_dest_tkt (void) {
krb5_error_code code;
krb5_principal princ;
- char *defname; /* Name of cache */
if (code = krb5_cc_get_principal(k5_context, k5_ccache, &princ)) {
com_err (NULL, code, "while retrieving principal name");
return code;
}
- if (code = krb5_unparse_name(k5_context, princ, &defname)) {
- com_err (NULL, code, "while unparsing principal name");
- return code;
- }
code = krb5_cc_initialize (k5_context, k5_ccache, princ);
if (code != 0) {
com_err (NULL, code, "when re-initializing cache");
+ krb5_free_principal (k5_context, princ);
return code;
}
+ krb5_free_principal (k5_context, princ);
return code;
}
@@ -2969,4 +3018,84 @@ k5_kname_parse (char *name, char *realm, char *fullname) {
return 0;
}
+/*+
+ * Function: Initializes ccache and catches illegal caches such as
+ * bad format or no permissions.
+ *
+ * Parameters:
+ * ccache - credential cache structure to use
+ *
+ * Returns: krb5_error_code
+ */
+static krb5_error_code
+k5_init_ccache (krb5_ccache *ccache) {
+ krb5_error_code code;
+ krb5_principal princ;
+ FILE *fp;
+
+ code = krb5_cc_default (k5_context, ccache); // Initialize the ccache
+ if (code)
+ return code;
+
+ code = krb5_cc_get_principal (k5_context, *ccache, &princ);
+ if (code == KRB5_FCC_NOFILE) { // Doesn't exist yet
+ fp = fopen (krb5_cc_get_name(k5_context, *ccache), "w");
+ if (fp == NULL) // Can't open it
+ return KRB5_FCC_PERM;
+ fclose (fp);
+ }
+
+ if (code) { // Bad, delete and try again
+ remove (krb5_cc_get_name(k5_context, *ccache));
+ code = krb5_cc_get_principal (k5_context, *ccache, &princ);
+ if (code == KRB5_FCC_NOFILE) // Doesn't exist yet
+ return 0;
+ if (code)
+ return code;
+ }
+
+ krb5_free_principal (k5_context, princ);
+ return 0;
+}
+/*+
+ *
+ * Function: Reads the name and realm out of the ccache.
+ *
+ * Parameters:
+ * ccache - credentials cache to get info from
+ *
+ * name - buffer to hold user name
+ *
+ * realm - buffer to hold the realm
+ *
+ *
+ * Returns: TRUE if read names, FALSE if not
+ *
+ */
+static int
+k5_name_from_ccache (krb5_ccache k5_ccache) {
+ krb5_error_code code;
+ krb5_principal princ;
+ char name[ANAME_SZ];
+ char realm[REALM_SZ];
+ char *defname;
+
+ if (code = krb5_cc_get_principal(k5_context, k5_ccache, &princ))
+ return FALSE;
+
+ code = krb5_unparse_name(k5_context, princ, &defname);
+ if (code) {
+ krb5_free_principal (k5_context, princ);
+ return FALSE;
+ }
+
+ k5_kname_parse(name, realm, defname); // Extract the components
+ WritePrivateProfileString(INI_DEFAULTS, INI_USER, name, KERBEROS_INI);
+ WritePrivateProfileString(INI_DEFAULTS, INI_REALM, realm, KERBEROS_INI);
+
+ krb5_free_principal(k5_context, princ);
+ free (defname);
+
+ return TRUE;
+}
#endif /* KRB5 */
diff --git a/src/windows/cns/cns.h b/src/windows/cns/cns.h
index 1508c09e18..deac2f64c1 100644
--- a/src/windows/cns/cns.h
+++ b/src/windows/cns/cns.h
@@ -97,7 +97,7 @@
#define IDD_LIFETIME 303
#define IDD_BEEP 304
#define IDD_ALERT 305
-
+ #define IDD_CCACHE 306
/*
* Dialog dimensions
*/
@@ -142,12 +142,17 @@
* Prototypes
*/
+static void kwin_init_name (HWND hwnd, char *fullname);
+void kwin_set_default_focus (HWND hwnd);
time_t kwin_get_epoch(void);
+
#ifdef KRB5
static krb5_error_code k5_dest_tkt (void);
static int k5_get_num_cred (int verbose);
static int k5_kname_parse (char *name, char *realm, char *fullname);
static int k5_get_lrealm (char *realm);
+ static krb5_error_code k5_init_ccache (krb5_ccache *ccache);
+ static int k5_name_from_ccache (krb5_ccache k5_ccache);
#endif
HICON kwin_get_icon(time_t expiration);
diff --git a/src/windows/cns/cns.rc b/src/windows/cns/cns.rc
index 1a49e2a48f..097f6b3cd2 100644
--- a/src/windows/cns/cns.rc
+++ b/src/windows/cns/cns.rc
@@ -119,21 +119,47 @@ END
END
#endif /* KRB5 */
-ID_OPTS DIALOG 97, 52, 148, 107
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Kerberos Options"
-FONT 8, "Arial"
-BEGIN
- CONTROL "&Conf file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 9, 40, 8
- CONTROL "", IDD_CONF, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 6, 82, 12
- CONTROL "&Realms file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 26, 40, 8
- CONTROL "", IDD_REALMS, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 23, 82, 12
- CONTROL "&Ticket lifetime:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 43, 53, 8
- CONTROL "", IDD_LIFETIME, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 40, 20, 12
- CONTROL "minutes", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 85, 43, 46, 8
- CONTROL "Action when login expires", 209, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 56, 138, 23
- CONTROL "&Alert ", IDD_ALERT, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 31, 65, 28, 12
- CONTROL "&Beep", IDD_BEEP, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 80, 65, 39, 12
- CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 17, 87, 52, 14
- CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 81, 87, 52, 14
-END
+#ifdef KRB4
+ ID_OPTS DIALOG 97, 52, 148, 107
+ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+ CAPTION "Kerberos Options"
+ FONT 8, "Arial"
+ BEGIN
+ CONTROL "&Conf file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 9, 40, 8
+ CONTROL "", IDD_CONF, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 6, 82, 12
+ CONTROL "&Realms file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 26, 40, 8
+ CONTROL "", IDD_REALMS, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 23, 82, 12
+ CONTROL "&Ticket lifetime:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 43, 53, 8
+ CONTROL "", IDD_LIFETIME, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 60, 40, 20, 12
+ CONTROL "minutes", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 85, 43, 46, 8
+ CONTROL "Action when login expires", 209, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 56, 138, 23
+ CONTROL "&Alert ", IDD_ALERT, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 31, 65, 28, 12
+ CONTROL "&Beep", IDD_BEEP, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 80, 65, 39, 12
+ CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 17, 87, 52, 14
+ CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 81, 87, 52, 14
+ END
+#endif /* KRB4 */
+
+#ifdef KRB5
+ ID_OPTS DIALOG 97, 52, 158, 124
+ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+ CAPTION "Kerberos Options"
+ FONT 8, "Arial"
+ BEGIN
+ CONTROL "&Conf file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 9, 40, 8
+ CONTROL "", IDD_CONF, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 70, 6, 82, 12
+ CONTROL "&Realms file:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 26, 40, 8
+ CONTROL "", IDD_REALMS, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 70, 23, 82, 12
+ CONTROL "Cre&dential cache:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 43, 58, 8
+ CONTROL "", IDD_CCACHE, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 70, 40, 82, 12
+ CONTROL "&Ticket lifetime:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 60, 53, 8
+ CONTROL "", IDD_LIFETIME, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 70, 57, 20, 12
+ CONTROL "minutes", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 95, 60, 46, 8
+ CONTROL "Action when login expires", 209, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 73, 148, 23
+ CONTROL "&Alert ", IDD_ALERT, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 36, 82, 28, 12
+ CONTROL "&Beep", IDD_BEEP, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 85, 82, 39, 12
+ CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 22, 104, 52, 14
+ CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 104, 52, 14
+ END
+#endif /* KRB5 */
+