mirror of https://github.com/cy384/ssheven.git
add password entry dialog with hidden text
This commit is contained in:
parent
96bb885279
commit
a2904cb7bd
|
@ -51,6 +51,10 @@
|
||||||
#define DITL_ABOUT 133
|
#define DITL_ABOUT 133
|
||||||
#define PICT_ABOUT 133
|
#define PICT_ABOUT 133
|
||||||
|
|
||||||
|
/* password entry window */
|
||||||
|
#define DLOG_PASSWORD 134
|
||||||
|
#define DITL_PASSWORD 134
|
||||||
|
|
||||||
/* menus */
|
/* menus */
|
||||||
#define MBAR_SSHEVEN 128
|
#define MBAR_SSHEVEN 128
|
||||||
#define MENU_APPLE 128
|
#define MENU_APPLE 128
|
||||||
|
|
115
ssheven.c
115
ssheven.c
|
@ -500,9 +500,109 @@ int ssh_setup_terminal(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// from the ATS password sample code
|
||||||
|
pascal Boolean TwoItemFilter(DialogPtr dlog, EventRecord *event, short *itemHit)
|
||||||
|
{
|
||||||
|
DialogPtr evtDlog;
|
||||||
|
short selStart, selEnd;
|
||||||
|
long ticks;
|
||||||
|
Handle itemH;
|
||||||
|
DialogItemType type;
|
||||||
|
Rect box;
|
||||||
|
|
||||||
|
// TODO: this should be declared somewhere? include it?
|
||||||
|
int kVisualDelay = 8;
|
||||||
|
|
||||||
|
if (event->what == keyDown || event->what == autoKey)
|
||||||
|
{
|
||||||
|
char c = event->message & charCodeMask;
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case kEnterCharCode: // select the ok button
|
||||||
|
case kReturnCharCode: // we have to manually blink it...
|
||||||
|
case kLineFeedCharCode:
|
||||||
|
GetDialogItem(dlog, 1, &type, &itemH, &box);
|
||||||
|
HiliteControl((ControlHandle)(itemH), kControlButtonPart);
|
||||||
|
Delay(kVisualDelay, &ticks);
|
||||||
|
HiliteControl((ControlHandle)(itemH), 1);
|
||||||
|
*itemHit = 1;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case kTabCharCode: // cancel out tab events
|
||||||
|
event->what = nullEvent;
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case kEscapeCharCode: // hit cancel on esc or cmd-period
|
||||||
|
case '.':
|
||||||
|
if ((event->modifiers & cmdKey) || c == kEscapeCharCode)
|
||||||
|
{
|
||||||
|
GetDialogItem(dlog, 6, &type, &itemH, &box);
|
||||||
|
HiliteControl((ControlHandle)(itemH), kControlButtonPart);
|
||||||
|
Delay(kVisualDelay, &ticks);
|
||||||
|
HiliteControl((ControlHandle)(itemH), 6);
|
||||||
|
*itemHit = 6;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kLeftArrowCharCode:
|
||||||
|
case kRightArrowCharCode:
|
||||||
|
case kUpArrowCharCode:
|
||||||
|
case kDownArrowCharCode:
|
||||||
|
case kHomeCharCode:
|
||||||
|
case kEndCharCode:
|
||||||
|
return false; // don't handle them
|
||||||
|
|
||||||
|
default: // TODO: this is dumb and assumes everything else is a valid text character
|
||||||
|
selStart = (**((DialogPeek)dlog)->textH).selStart; // Get the selection in the visible item
|
||||||
|
selEnd = (**((DialogPeek)dlog)->textH).selEnd;
|
||||||
|
SelectDialogItemText(dlog, 5, selStart, selEnd); // Select text in invisible item
|
||||||
|
DialogSelect(event, &evtDlog, itemHit); // Input key
|
||||||
|
SelectDialogItemText(dlog, 4, selStart, selEnd); // Select same area in visible item
|
||||||
|
if ((event->message & charCodeMask) != kBackspaceCharCode) // If it's not a backspace (backspace is the only key that can affect both the text and the selection- thus we need to process it in both fields, but not change it for the hidden field.
|
||||||
|
event->message = 0xa5; // Replace with character to use (the bullet)
|
||||||
|
DialogSelect(event, &evtDlog, itemHit); // Put in fake character
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // pass on other (non-keypress) events
|
||||||
|
}
|
||||||
|
|
||||||
|
// from the ATS password sample code
|
||||||
|
// 1 for ok, 0 for cancel
|
||||||
|
int password_dialog(void)
|
||||||
|
{
|
||||||
|
// n.b. dialog strings can't be longer than this, so no overflow risk
|
||||||
|
//static char password[256];
|
||||||
|
DialogPtr dlog;
|
||||||
|
Handle itemH;
|
||||||
|
short item;
|
||||||
|
Rect box;
|
||||||
|
DialogItemType type;
|
||||||
|
|
||||||
|
dlog = GetNewDialog(DLOG_PASSWORD, 0, (WindowPtr) - 1);
|
||||||
|
|
||||||
|
// draw default button indicator around the connect button
|
||||||
|
GetDialogItem(dlog, 2, &type, &itemH, &box);
|
||||||
|
SetDialogItem(dlog, 2, type, (Handle)NewUserItemUPP(&ButtonFrameProc), &box);
|
||||||
|
|
||||||
|
do {
|
||||||
|
ModalDialog(NewModalFilterUPP(TwoItemFilter), &item);
|
||||||
|
} while (item != 1 && item != 6); // until OK or cancel
|
||||||
|
|
||||||
|
if (6 == item) return 0;
|
||||||
|
|
||||||
|
// read out of the hidden text box
|
||||||
|
GetDialogItem(dlog, 5, &type, &itemH, &box);
|
||||||
|
GetDialogItemText(itemH, password);
|
||||||
|
|
||||||
|
DisposeDialog(dlog);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int intro_dialog(char* hostname, char* username, char* password)
|
int intro_dialog(char* hostname, char* username, char* password)
|
||||||
{
|
{
|
||||||
|
|
||||||
// modal dialog setup
|
// modal dialog setup
|
||||||
TEInit();
|
TEInit();
|
||||||
InitDialogs(NULL);
|
InitDialogs(NULL);
|
||||||
|
@ -529,28 +629,25 @@ int intro_dialog(char* hostname, char* username, char* password)
|
||||||
GetDialogItem(dlg, 6, &type, &itemH, &box);
|
GetDialogItem(dlg, 6, &type, &itemH, &box);
|
||||||
username_text_box = (ControlHandle)itemH;
|
username_text_box = (ControlHandle)itemH;
|
||||||
|
|
||||||
ControlHandle password_text_box;
|
|
||||||
GetDialogItem(dlg, 8, &type, &itemH, &box);
|
|
||||||
password_text_box = (ControlHandle)itemH;
|
|
||||||
|
|
||||||
// let the modalmanager do everything
|
// let the modalmanager do everything
|
||||||
// stop when the connect button is hit
|
// stop when the connect button is hit
|
||||||
short item;
|
short item;
|
||||||
do {
|
do {
|
||||||
ModalDialog(NULL, &item);
|
ModalDialog(NULL, &item);
|
||||||
} while(item != 1 && item != 9);
|
} while(item != 1 && item != 7);
|
||||||
|
|
||||||
// copy the text out of the boxes
|
// copy the text out of the boxes
|
||||||
GetDialogItemText((Handle)address_text_box, hostname);
|
GetDialogItemText((Handle)address_text_box, hostname);
|
||||||
GetDialogItemText((Handle)username_text_box, username);
|
GetDialogItemText((Handle)username_text_box, username);
|
||||||
GetDialogItemText((Handle)password_text_box, password);
|
|
||||||
|
|
||||||
// clean it up
|
// clean it up
|
||||||
CloseDialog(dlg);
|
DisposeDialog(dlg);
|
||||||
FlushEvents(everyEvent, -1);
|
FlushEvents(everyEvent, -1);
|
||||||
|
|
||||||
// if we hit cancel, 0
|
// if we hit cancel, 0
|
||||||
if (item == 9) return 0; else return 1;
|
if (item == 7) return 0;
|
||||||
|
|
||||||
|
return password_dialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
//enum { WAIT, READ, EXIT } read_thread_command = WAIT;
|
//enum { WAIT, READ, EXIT } read_thread_command = WAIT;
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#include <Gestalt.h>
|
#include <Gestalt.h>
|
||||||
#include <Devices.h>
|
#include <Devices.h>
|
||||||
#include <Scrap.h>
|
#include <Scrap.h>
|
||||||
|
#include <Controls.h>
|
||||||
|
#include <ControlDefinitions.h>
|
||||||
|
|
||||||
// libssh2
|
// libssh2
|
||||||
#include <libssh2.h>
|
#include <libssh2.h>
|
||||||
|
@ -28,6 +30,7 @@
|
||||||
// ssheven constants
|
// ssheven constants
|
||||||
#include "ssheven-constants.r"
|
#include "ssheven-constants.r"
|
||||||
|
|
||||||
|
// libvterm
|
||||||
#include <vterm.h>
|
#include <vterm.h>
|
||||||
#include <vterm_keycodes.h>
|
#include <vterm_keycodes.h>
|
||||||
|
|
||||||
|
|
51
ssheven.r
51
ssheven.r
|
@ -30,19 +30,19 @@ resource 'DITL' (DITL_ABOUT, purgeable) {
|
||||||
};
|
};
|
||||||
|
|
||||||
resource 'DLOG' (DLOG_CONNECT) {
|
resource 'DLOG' (DLOG_CONNECT) {
|
||||||
{ 50, 100, 240, 420 },
|
{ 50, 100, 195, 420 },
|
||||||
dBoxProc,
|
dBoxProc,
|
||||||
visible,
|
visible,
|
||||||
noGoAway,
|
noGoAway,
|
||||||
0,
|
0,
|
||||||
128,
|
DLOG_CONNECT,
|
||||||
"",
|
"",
|
||||||
centerMainScreen
|
centerMainScreen
|
||||||
};
|
};
|
||||||
|
|
||||||
resource 'DITL' (DITL_CONNECT) {
|
resource 'DITL' (DITL_CONNECT) {
|
||||||
{
|
{
|
||||||
{ 190-10-20, 320-10-80, 190-10, 320-10 },
|
{ 115, 320-10-80, 135, 320-10 },
|
||||||
Button { enabled, "Connect" };
|
Button { enabled, "Connect" };
|
||||||
|
|
||||||
{ 190-10-20-5, 320-10-80-5, 190-10+5, 320-10+5 },
|
{ 190-10-20-5, 320-10-80-5, 190-10+5, 320-10+5 },
|
||||||
|
@ -51,22 +51,16 @@ resource 'DITL' (DITL_CONNECT) {
|
||||||
{ 10, 10, 30, 310 },
|
{ 10, 10, 30, 310 },
|
||||||
StaticText { enabled, "Address with port" };
|
StaticText { enabled, "Address with port" };
|
||||||
|
|
||||||
{ 35, 10, 51, 310 },
|
{ 35, 15, 51, 305 },
|
||||||
EditText { enabled, "10.0.2.2:22" };
|
EditText { enabled, "10.0.2.2:22" };
|
||||||
|
|
||||||
{ 60, 10, 80, 310 },
|
{ 60, 10, 80, 310 },
|
||||||
StaticText { enabled, "Username" };
|
StaticText { enabled, "Username" };
|
||||||
|
|
||||||
{ 85, 10, 101, 310 },
|
{ 85, 15, 101, 305 },
|
||||||
EditText { enabled, "" };
|
EditText { enabled, "" };
|
||||||
|
|
||||||
{ 110, 10, 130, 310 },
|
{ 115, 10, 135, 90 },
|
||||||
StaticText { enabled, "Password" };
|
|
||||||
|
|
||||||
{ 135, 10, 151, 310 },
|
|
||||||
EditText { enabled, "" };
|
|
||||||
|
|
||||||
{ 190-10-20, 10, 190-10, 90 },
|
|
||||||
Button { enabled, "Cancel" };
|
Button { enabled, "Cancel" };
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -167,6 +161,39 @@ resource 'ALRT' (ALRT_CPU_BAD, purgeable) {
|
||||||
alertPositionMainScreen
|
alertPositionMainScreen
|
||||||
};
|
};
|
||||||
|
|
||||||
|
resource 'DLOG' (DLOG_PASSWORD) {
|
||||||
|
{ 50, 100, 150, 420 },
|
||||||
|
dBoxProc,
|
||||||
|
visible,
|
||||||
|
noGoAway,
|
||||||
|
0,
|
||||||
|
DLOG_PASSWORD,
|
||||||
|
"",
|
||||||
|
centerMainScreen
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'DITL' (DITL_PASSWORD) {
|
||||||
|
{
|
||||||
|
{ 70, 320-10-80, 90, 320-10 },
|
||||||
|
Button { enabled, "OK" };
|
||||||
|
|
||||||
|
{ 190-10-20-5, 320-10-80-5, 190-10+5, 320-10+5 },
|
||||||
|
UserItem { enabled };
|
||||||
|
|
||||||
|
{ 10, 10, 30, 310 },
|
||||||
|
StaticText { enabled, "Enter password:" };
|
||||||
|
|
||||||
|
{ 35, 15, 51, 305 },
|
||||||
|
EditText { enabled, "" };
|
||||||
|
|
||||||
|
{ 240, 10, 240, 10 },
|
||||||
|
EditText { enabled, "" };
|
||||||
|
|
||||||
|
{ 70, 10, 90, 90 },
|
||||||
|
Button { enabled, "Cancel" };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#include "Processes.r"
|
#include "Processes.r"
|
||||||
|
|
||||||
resource 'SIZE' (-1) {
|
resource 'SIZE' (-1) {
|
||||||
|
|
Loading…
Reference in New Issue