diff options
Diffstat (limited to 'src/windows/gss/gss.c')
-rw-r--r-- | src/windows/gss/gss.c | 265 |
1 files changed, 195 insertions, 70 deletions
diff --git a/src/windows/gss/gss.c b/src/windows/gss/gss.c index 9a8e12237..9708a8568 100644 --- a/src/windows/gss/gss.c +++ b/src/windows/gss/gss.c @@ -3,10 +3,9 @@ ** GSS test - Windows scaffolding to test the gssapi dll ** ** Given a hostname it does the equivalent of the Unix command -** ./gss-client <hostname> host@<hostname> "msg" +** ./gss-client [-port <port>] <hostname> host@<hostname> "msg" ** ***************************************************************************/ - #include <windows.h> #include <stdio.h> #include "gss.h" @@ -15,65 +14,95 @@ #define GSS_OK 100 #define GSS_CANCEL 101 -char szConnectName[256]; -char szServiceName[256]; +#define GSSAPI_INI "kerberos.ini" // Which INI file +#define INI_HOSTS "GSSAPI Hosts" // INI file section +#define INI_HOST "Host" // INI file line label + +#define MAX_HOSTS 9 +char hosts[MAX_HOSTS][128]; + +char szHost[128]; // GSSAPI Host to connect to +char szServiceName[128]; // Service to do +int port = 0; // Which port to use -int PASCAL +static void do_gssapi_test (char *name); +static void parse_name (char *name); +static int read_hosts(void); +static void write_hosts (void); +static void update_hosts (char *name); +static void fill_combo (HWND hDlg); + +/*+************************************************************************* +** +** WinMain +** +** Sets up the Dialog that drives our program +** +***************************************************************************/ +int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow) HANDLE hInstance, hPrevInstance; LPSTR lpszCmdLine; int nCmdShow; { - int n; // Return value FARPROC lpfnDlgProc; lpfnDlgProc = MakeProcInstance(OpenGssapiDlg, hInstance); - n = DialogBox (hInstance, "OPENGSSAPIDLG", NULL, lpfnDlgProc); + DialogBox (hInstance, "OPENGSSAPIDLG", NULL, lpfnDlgProc); FreeProcInstance(lpfnDlgProc); - if (n) { - strcpy (szServiceName, "host@"); - strcat (szServiceName, szConnectName); - n = gss (szConnectName, szServiceName, "Test Gssapi Message", 0); - if (n) - MessageBox (NULL, "gss failed", "", IDOK | MB_ICONINFORMATION); - } - return 0; } +/*+************************************************************************* +** +** Do_gssapi_test +** +** Does the actual call to GSS-client +** +***************************************************************************/ +void +do_gssapi_test (char *name) { + int n; // Return value + HCURSOR hcursor; // For the hourglass cursor -/*+*************************************************************************** - - FUNCTION: OpenGssapiDlg(HWND, unsigned, WORD, LONG) - - PURPOSE: Processes messages for "Open Gssapi Connection" dialog box - - MESSAGES: + parse_name(name); // Get host, service and port - WM_INITDIALOG - initialize dialog box - WM_COMMAND - Input received + hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); + n = gss (szHost, szServiceName, "Test Gssapi Message", port); + SetCursor(hcursor); -****************************************************************************/ + if (n) + MessageBox (NULL, "gss failed", "", IDOK | MB_ICONINFORMATION); +} -BOOL FAR PASCAL OpenGssapiDlg( +/*+************************************************************************* +** +** OpenGssapiDlg(HWND, unsigned, WORD, LONG) +** +** Processes messages for "Open Gssapi Connection" dialog box +** +** Messages: +** WM_INITDIALOG - initialize dialog box +** WM_COMMAND - Input received +** +***************************************************************************/ +BOOL FAR PASCAL +OpenGssapiDlg( HWND hDlg, WORD message, WORD wParam, LONG lParam) { - HDC hDC; - int xExt, yExt; - DWORD Ext; -// HWND hEdit; -// int n; -// int iHostNum = 0; -// char tmpName[128]; -// char tmpBuf[80]; -// char *tmpCommaLoc; - - switch (message) { + HDC hDC; // For getting graphic info + DWORD Ext; // Size of dialog + int xExt, yExt; // Size broken apart + char hostname[128]; // What the user typed + switch (message) { case WM_INITDIALOG: + /* + ** First center the dialog + */ hDC = GetDC(hDlg); Ext = GetDialogBaseUnits(); xExt = (190 *LOWORD(Ext)) /4 ; @@ -82,51 +111,147 @@ BOOL FAR PASCAL OpenGssapiDlg( (GetSystemMetrics(SM_CXSCREEN)/2)-(xExt/2), (GetSystemMetrics(SM_CYSCREEN)/2)-(yExt/2), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); - ReleaseDC(hDlg, hDC); -// GetPrivateProfileString(INI_HOSTS, INI_HOST "0", "", tmpName, -// 128, TELNET_INI); -// if (tmpName[0]) { -// tmpCommaLoc = strchr(tmpName, ','); -// if (tmpCommaLoc) -// *tmpCommaLoc = '\0'; -// SetDlgItemText(hDlg, GSS_CONNECT_NAME, tmpName); -// } -// hEdit = GetWindow(GetDlgItem(hDlg, GSS_CONNECT_NAME), GW_CHILD); -// while (TRUE) { -// wsprintf(tmpBuf, INI_HOST "%d", iHostNum++); -// GetPrivateProfileString(INI_HOSTS, tmpBuf, "", tmpName, -// 128, TELNET_INI); -// tmpCommaLoc = strchr(tmpName, ','); -// if (tmpCommaLoc) -// *tmpCommaLoc = '\0'; -// if (tmpName[0]) -// SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_ADDSTRING, 0, -// (LPARAM) ((LPSTR) tmpName)); -// else -// break; -// } -// SendMessage(hEdit, WM_USER+1, NULL, NULL); + ReleaseDC(hDlg, hDC); + + read_hosts (); // Get the host list + fill_combo (hDlg); // Put into combo box + SendMessage(hDlg, WM_SETFOCUS, NULL, NULL); return (TRUE); case WM_COMMAND: switch (wParam) { - case GSS_CANCEL: + case GSS_CANCEL: // Only way out of the dialog + case IDCANCEL: // From the menu EndDialog(hDlg, FALSE); break; - + case GSS_OK: - GetDlgItemText(hDlg, GSS_CONNECT_NAME, szConnectName, 256); - if (! *szConnectName) { + GetDlgItemText(hDlg, GSS_CONNECT_NAME, hostname, 128); + SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_SHOWDROPDOWN, + FALSE, NULL); + + if (! *hostname) { MessageBox(hDlg, "You must enter a host name", NULL, MB_OK); break; } - EndDialog(hDlg, TRUE); + do_gssapi_test (hostname); // Test GSSAPI + update_hosts (hostname); // Add it to the host list + fill_combo (hDlg); // Update the combo box + + //EndDialog(hDlg, TRUE); break; - } - return (FALSE); + } + return FALSE; } - return(FALSE); + return FALSE; + +} +/*+************************************************************************* +** +** Parse_name +** +** Turns NAME which the user entered into host, service and port. +** The host is up to first space, port is after that and service is made +** from host. +** +***************************************************************************/ +static void +parse_name (char *name) { + char *ptr; -} /* OpenGssapiDlg */ + strcpy (szHost, name); + ptr = strchr (szHost, ' '); // Is there a port??? + if (ptr) { // Yep, start parsing it + port = atoi (ptr+1); + *ptr = '\0'; + } + wsprintf (szServiceName, "host@%s", szHost); // Make the service name +} +/*+************************************************************************* +** +** Read_hosts +** +** Reads all the hosts listed in the INI file. +** +***************************************************************************/ +static int +read_hosts (void) { + int i; // Index + char buff[10]; + + for (i = 0; MAX_HOSTS; ++i) { // Read this many entries + wsprintf (buff, INI_HOST "%d", i); + GetPrivateProfileString(INI_HOSTS, buff, "", hosts[i], 128, GSSAPI_INI); + if (*hosts[i] == '\0') // No more entries??? + break; + } + + return i; +} +/*+************************************************************************* +** +** Write_hosts +** +** Writes the hosts list back to the ini file. +** +***************************************************************************/ +static void +write_hosts () { + int i; // Index + char buff[10]; + + for (i = 0; i < MAX_HOSTS; ++i) { + if (*hosts[i] == '\0') // End of the list? + break; + wsprintf (buff, INI_HOST "%d", i); + WritePrivateProfileString(INI_HOSTS, buff, hosts[i], GSSAPI_INI); + } +} +/*+************************************************************************* +** +** Update_hosts +** +** Updates the host list with the new NAME the user typed. +** +***************************************************************************/ +static void +update_hosts (char *name) { + int i; // Index + + for (i = 0; i < MAX_HOSTS-1; ++i) { // Find it in the list + if (! _stricmp (name, hosts[i])) // A match + break; + if (*hosts[i] == '\0') // End of the list + break; + } + memmove (hosts[1], hosts[0], i * sizeof(hosts[0])); // Move the data down + strcpy (hosts[0], name); // Insert this item + + write_hosts (); +} +/*+************************************************************************* +** +** Fill_combo +** +** Fills the combo box with the contents of the host list. Item 0 goes +** into the edit portion and the rest go into the libt box. +** +***************************************************************************/ +static void +fill_combo (HWND hDlg) { + int i; // Index + + SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_RESETCONTENT, NULL, NULL); + + SetDlgItemText(hDlg, GSS_CONNECT_NAME, hosts[0]); + SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_SETEDITSEL, NULL, NULL); + + for (i = 1; i < MAX_HOSTS; ++i) { // Fill in the list box + if (*hosts[i] == '\0') + break; + SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_ADDSTRING, 0, + (LPARAM) ((LPSTR) hosts[i])); + } +} |