}
/* This should only kill the current session, not the whole application. */
-void connection_fatal(void *fontend, char *fmt, ...) {
+void connection_fatal(void *frontend, char *fmt, ...) {
va_list ap;
Str255 stuff;
+ Session *s = frontend;
va_start(ap, fmt);
/* We'd like stuff to be a Pascal string */
va_end(ap);
ParamText(stuff, NULL, NULL, NULL);
StopAlert(128, NULL);
- cleanup_exit(1);
+
+ s->session_closed = TRUE;
+
+ if (s->cfg.close_on_exit == FORCE_ON)
+ mac_closewindow(s->window);
}
/* Null SSH agent client -- never finds an agent. */
/* Temporary null routines for testing. */
-void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
- char *keystr, char *fingerprint)
+int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
+ char *keystr, char *fingerprint,
+ void (*callback)(void *ctx, int result), void *ctx)
{
- Str255 stuff;
+ Str255 pappname;
+ Str255 pfingerprint;
+ Str255 pkeytype;
Session *s = frontend;
- int ret;
+ int ret, alertret;
+
+ c2pstrcpy(pappname, appname);
+ c2pstrcpy(pkeytype, keytype);
+ c2pstrcpy(pfingerprint, fingerprint);
/*
- * This function is horribly wrong. For one thing, the alert
- * shouldn't be modal, it should be movable modal, or a sheet in
- * Aqua. Also, PuTTY might be in the background, in which case we
- * should use the Notification Manager to wake up the user. In
- * any case, we shouldn't hold up processing of other connections'
- * data just because this one's waiting for the user. Also see the
- * note below about closing the connection. All in all, a bit of
- * a mess really.
+ * The alert shouldn't be modal, it should be movable modal, or
+ * a sheet in Aqua. Also, PuTTY might be in the background, in
+ * which case we should use the Notification Manager to wake up
+ * the user. In any case, we shouldn't hold up processing of
+ * other connections' data just because this one's waiting for
+ * the user.
*/
/* Verify the key against the cache */
ret = verify_host_key(host, port, keytype, keystr);
- if (ret == 0) /* success - key matched OK */
- return;
- if (ret == 2) { /* key was different */
- stuff[0] = sprintf((char *)(&stuff[1]),
- "WARNING - POTENTIAL SECURITY BREACH\n",
- "The key fingerprint is: %s\n"
- "Continue connecting?", fingerprint);
- ParamText(stuff, NULL, NULL, NULL);
- }
- if (ret == 1) { /* key was absent */
- stuff[0] = sprintf((char *)(&stuff[1]),
- "The server's key fingerprint is: %s\n"
- "Continue connecting?", fingerprint);
- ParamText(stuff, NULL, NULL, NULL);
- }
-
- if (CautionAlert(wQuestion, NULL) == 2) {
- /*
- * User chose "Cancel". Unfortunately, if I tear the
- * connection down here, Bad Things happen when I return. I
- * think this function should actually return something
- * telling the SSH code to abandon the connection.
- */
- } else {
- store_host_key(host, port, keytype, keystr);
+ if (ret == 0) { /* success - key matched OK */
+ return 1;
+ } else if (ret == 2) { /* key was different */
+ ParamText(pappname, pkeytype, pfingerprint, NULL);
+ alertret=CautionAlert(wWrong, NULL);
+ if (alertret == 8) {
+ /* Cancel */
+ return 0;
+ } else if (alertret == 9) {
+ /* Connect Just Once */
+ return 1;
+ } else {
+ /* Update Key */
+ store_host_key(host, port, keytype, keystr);
+ return 1;
+ }
+ } else /* ret == 1 */ { /* key was absent */
+ ParamText(pkeytype, pfingerprint, pappname, NULL);
+ alertret=CautionAlert(wAbsent, NULL);
+ if (alertret == 7) {
+ /* Cancel */
+ return 0;
+ } else if (alertret == 8) {
+ /* Connect Just Once */
+ return 1;
+ } else {
+ /* Update Key */
+ store_host_key(host, port, keytype, keystr);
+ return 1;
+ }
}
}
-void askalg(void *frontend, const char *algtype, const char *algname)
+int askalg(void *frontend, const char *algtype, const char *algname,
+ void (*callback)(void *ctx, int result), void *ctx)
{
-
+ return 0;
}
void old_keyfile_warning(void)
mac_adjustmenus();
}
-void notify_remote_exit(void *fe) { /* XXX anything needed here? */ }
+void notify_remote_exit(void *frontend)
+{
+ Session *s = frontend;
+ int exitcode;
+
+ if (!s->session_closed &&
+ (exitcode = s->back->exitcode(s->backhandle)) >=0) {
+ s->session_closed = TRUE;
+ if (s->cfg.close_on_exit == FORCE_ON ||
+ (s->cfg.close_on_exit == AUTO && exitcode == 0)) {
+ mac_closewindow(s->window);
+ return;
+ }
+
+ /* The session's dead */
+
+ if (s->ldisc) {
+ ldisc_free(s->ldisc);
+ s->ldisc = NULL;
+ }
+
+ if (s->back) {
+ s->back->free(s->backhandle);
+ s->backhandle = NULL;
+ s->back = NULL;
+ update_specials_menu(s);
+ }
+
+ {
+ char title[100];
+ sprintf(title, "%.70s (inactive)", appname);
+ set_title(s, title);
+ }
+ }
+}
/*
* Local Variables: