diff --git a/3rdp/build/GNUmakefile b/3rdp/build/GNUmakefile index 8e615d93a1ed1337f7c0d6f99ce647b71bffd869..8f21d156b1a77b96171c503b0dfb3496581cbc74 100644 --- a/3rdp/build/GNUmakefile +++ b/3rdp/build/GNUmakefile @@ -81,7 +81,7 @@ $(CRYPT_SRC): | $(3RDPSRCDIR) $(CRYPT_IDIR): | $(3RDPODIR) $(QUIET)$(IFNOTEXIST) mkdir $(CRYPT_IDIR) -$(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)build/terminal-params.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw32-static.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ranlib.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-noasm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zz-country.patch $(3RDP_ROOT)$(DIRSEP)build/cl-algorithms.patch $(3RDP_ROOT)$(DIRSEP)build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)$(DIRSEP)build/cl-macosx-minver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-endian.patch $(3RDP_ROOT)$(DIRSEP)build/cl-cryptodev.patch $(3RDP_ROOT)$(DIRSEP)build/cl-posix-me-gently.patch $(3RDP_ROOT)$(DIRSEP)build/cl-tpm-linux.patch $(3RDP_ROOT)$(DIRSEP)build/cl-PAM-noprompts.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zlib.patch $(3RDP_ROOT)$(DIRSEP)build/Dynamic-linked-static-lib.patch $(3RDP_ROOT)$(DIRSEP)build/SSL-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bigger-maxattribute.patch $(3RDP_ROOT)$(DIRSEP)build/cl-vcxproj.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw-vcver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-build-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-gcc-non-const-time-val.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-odbc.patch $(3RDP_ROOT)$(DIRSEP)build/cl-noasm-defines.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-RSA-suites.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ECC-RSA.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)$(DIRSEP)build/cl-more-RSA-ECC-fixes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-DH-key-init.patch $(3RDP_ROOT)$(DIRSEP)build/cl-clear-GCM-flag.patch $(3RDP_ROOT)$(DIRSEP)build/cl-use-ssh-ctr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-incCtr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-tpm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-via-aes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-just-use-cc.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-learn-numbers.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-no-safe-stack.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-uint64_t-redefine.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-random-openbsd.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-openbsd-threads.patch | $(CRYPT_SRC) $(CRYPT_IDIR) +$(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)build/terminal-params.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw32-static.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ranlib.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-noasm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zz-country.patch $(3RDP_ROOT)$(DIRSEP)build/cl-algorithms.patch $(3RDP_ROOT)$(DIRSEP)build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)$(DIRSEP)build/cl-macosx-minver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-endian.patch $(3RDP_ROOT)$(DIRSEP)build/cl-cryptodev.patch $(3RDP_ROOT)$(DIRSEP)build/cl-posix-me-gently.patch $(3RDP_ROOT)$(DIRSEP)build/cl-tpm-linux.patch $(3RDP_ROOT)$(DIRSEP)build/cl-PAM-noprompts.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zlib.patch $(3RDP_ROOT)$(DIRSEP)build/Dynamic-linked-static-lib.patch $(3RDP_ROOT)$(DIRSEP)build/SSL-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bigger-maxattribute.patch $(3RDP_ROOT)$(DIRSEP)build/cl-vcxproj.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw-vcver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-build-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-gcc-non-const-time-val.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-odbc.patch $(3RDP_ROOT)$(DIRSEP)build/cl-noasm-defines.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-RSA-suites.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ECC-RSA.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)$(DIRSEP)build/cl-more-RSA-ECC-fixes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-DH-key-init.patch $(3RDP_ROOT)$(DIRSEP)build/cl-clear-GCM-flag.patch $(3RDP_ROOT)$(DIRSEP)build/cl-use-ssh-ctr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-incCtr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-tpm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-via-aes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-just-use-cc.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-learn-numbers.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-no-safe-stack.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-uint64_t-redefine.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-random-openbsd.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-openbsd-threads.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-none-auth.patch | $(CRYPT_SRC) $(CRYPT_IDIR) @echo Creating $@ ... $(QUIET)-rm -rf $(CRYPT_SRC)/* $(QUIET)unzip -oa $(3RDPDISTDIR)$(DIRSEP)cryptlib.zip -d $(CRYPT_SRC) @@ -131,6 +131,7 @@ $(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)b $(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-uint64_t-redefine.patch $(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-random-openbsd.patch $(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-openbsd-threads.patch + $(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-allow-none-auth.patch ifeq ($(CC),mingw32-gcc) $(QUIET)cd $(CRYPT_SRC) && env - PATH="$(PATH)" CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" make directories $(QUIET)cd $(CRYPT_SRC) && env - PATH="$(PATH)" CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" make toolscripts diff --git a/3rdp/build/cl-allow-none-auth.patch b/3rdp/build/cl-allow-none-auth.patch new file mode 100644 index 0000000000000000000000000000000000000000..95ab0fd6985c068f9bd2092abf2aaee3b541be31 --- /dev/null +++ b/3rdp/build/cl-allow-none-auth.patch @@ -0,0 +1,158 @@ +--- ../cl-old/cryptlib.h 2021-03-16 04:15:50.265534000 -0400 ++++ ./cryptlib.h 2021-03-16 06:53:47.582168000 -0400 +@@ -1215,6 +1215,7 @@ + CRYPT_SESSINFO_SSH_CHANNEL_ARG1,/* SSH channel argument 1 */ + CRYPT_SESSINFO_SSH_CHANNEL_ARG2,/* SSH channel argument 2 */ + CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE,/* SSH channel active */ ++ CRYPT_SESSINFO_SSH_OPTIONS, /* SSH protocol options */ + CRYPT_SESSINFO_SSL_OPTIONS, /* SSL/TLS protocol options */ + CRYPT_SESSINFO_SSL_SUBPROTOCOL, /* SSL/TLS additional sub-protocol */ + CRYPT_SESSINFO_SSL_WSPROTOCOL, /* SSL/TLS WebSockets sub-protocol */ +@@ -1680,6 +1681,14 @@ + #define CRYPT_SSLOPTION_SUITEB_256 0x200 /* vanish in future releases) */ + #ifdef _CRYPT_DEFINED + #define CRYPT_SSLOPTION_MAX 0x7F /* Defines for range checking */ ++#endif /* _CRYPT_DEFINED */ ++ ++/* SSH protocol options. */ ++ ++#define CRYPT_SSHOPTION_NONE 0x000 ++#define CRYPT_SSHOPTION_NONE_AUTH 0x001 /* Try none authentication */ ++#ifdef _CRYPT_DEFINED ++#define CRYPT_SSHOPTION_MAX 0x01 /* Defines for range checking */ + #endif /* _CRYPT_DEFINED */ + + /**************************************************************************** +diff -ur ../cl-old/kernel/attr_acl.c ./kernel/attr_acl.c +--- ../cl-old/kernel/attr_acl.c 2021-03-16 04:15:50.398060000 -0400 ++++ ./kernel/attr_acl.c 2021-03-16 06:53:47.606473000 -0400 +@@ -3731,6 +3731,12 @@ + ST_NONE, ST_NONE, ST_SESS_SSH | ST_SESS_SSH_SVR, + MKPERM_SSH_EXT( RWx_xxx ), + ROUTE( OBJECT_TYPE_SESSION ) ), ++ MKACL_N( /* SSH protocol options */ ++ CRYPT_SESSINFO_SSH_OPTIONS, ++ ST_NONE, ST_NONE, ST_SESS_SSH, ++ MKPERM_SSH_EXT( Rxx_RWx ), ++ ROUTE( OBJECT_TYPE_SESSION ), ++ RANGE( CRYPT_SSHOPTION_NONE, CRYPT_SSHOPTION_MAX ) ), + + MKACL_N( /* SSL/TLS protocol options */ + CRYPT_SESSINFO_SSL_OPTIONS, +@@ -4653,7 +4659,7 @@ + static_assert( CRYPT_CERTINFO_FIRST_EXTENSION == 2200, "Attribute value" ); + static_assert( CRYPT_CERTINFO_FIRST_CMS == 2500, "Attribute value" ); + static_assert( CRYPT_SESSINFO_FIRST_SPECIFIC == 6016, "Attribute value" ); +- static_assert( CRYPT_SESSINFO_LAST_SPECIFIC == 6031, "Attribute value" ); ++ static_assert( CRYPT_SESSINFO_LAST_SPECIFIC == 6032, "Attribute value" ); + static_assert( CRYPT_CERTFORMAT_LAST == 12, "Attribute value" ); + + /* Perform a consistency check on the attribute ACLs. The ACLs are +diff -ur ../cl-old/session/ssh.c ./session/ssh.c +--- ../cl-old/session/ssh.c 2021-03-16 04:15:50.257467000 -0400 ++++ ./session/ssh.c 2021-03-16 06:53:47.638940000 -0400 +@@ -980,6 +980,18 @@ + type == CRYPT_SESSINFO_SSH_CHANNEL_ARG2 || \ + type == CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE ); + ++ if( type == CRYPT_SESSINFO_SSH_OPTIONS ) ++ { ++ int *valuePtr = ( int * ) data; ++ ++ *valuePtr = CRYPT_SSHOPTION_NONE; ++ if( TEST_FLAG( sessionInfoPtr->protocolFlags, ++ SSH_PFLAG_DUMMYUSERAUTH ) ) ++ *valuePtr |= CRYPT_SSHOPTION_NONE_AUTH; ++ ++ return( CRYPT_OK ); ++ } ++ + if( type == CRYPT_SESSINFO_SSH_CHANNEL || \ + type == CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE ) + { +@@ -1010,11 +1022,13 @@ + type == CRYPT_SESSINFO_SSH_CHANNEL_TYPE || \ + type == CRYPT_SESSINFO_SSH_CHANNEL_ARG1 || \ + type == CRYPT_SESSINFO_SSH_CHANNEL_ARG2 || \ ++ type == CRYPT_SESSINFO_SSH_OPTIONS || \ + type == CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE ); + + /* Get the data value if it's an integer parameter */ + if( type == CRYPT_SESSINFO_SSH_CHANNEL || \ +- type == CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE ) ++ type == CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE || \ ++ type == CRYPT_SESSINFO_SSH_OPTIONS) + value = *( ( int * ) data ); + + /* If we're selecting a channel and there's unwritten data from a +@@ -1038,6 +1052,13 @@ + return( createChannel( sessionInfoPtr ) ); + } + ++ if( type == CRYPT_SESSINFO_SSH_OPTIONS ) ++ { ++ if (value & CRYPT_SSHOPTION_NONE_AUTH) ++ SET_FLAG( sessionInfoPtr->protocolFlags, SSH_PFLAG_DUMMYUSERAUTH ); ++ return( CRYPT_OK ); ++ } ++ + /* If we 're setting the channel-active attribute, this implicitly + activates or deactivates the channel rather than setting any + attribute value */ +@@ -1165,8 +1186,6 @@ + SESSION_FLAG_NONE, /* Flags */ + SSH_PORT, /* SSH port */ + SESSION_NEEDS_USERID | /* Client attributes */ +- SESSION_NEEDS_PASSWORD | \ +- SESSION_NEEDS_KEYORPASSWORD | \ + SESSION_NEEDS_PRIVKEYSIGN, + /* The client private key is optional, but if present it has + to be signature-capable */ +diff -ur ../cl-old/session/ssh2_authc.c ./session/ssh2_authc.c +--- ../cl-old/session/ssh2_authc.c 2021-03-16 04:15:50.264206000 -0400 ++++ ./session/ssh2_authc.c 2021-03-16 07:46:47.873769000 -0400 +@@ -315,13 +315,22 @@ + assert( isWritePtr( authAlgo, sizeof( CRYPT_ALGO_TYPE ) ) ); + assert( isWritePtr( furtherAuthRequired, sizeof( BOOLEAN ) ) ); + +- REQUIRES( isShortIntegerRangeNZ( length ) ); + REQUIRES( usedPasswordAuth == TRUE || usedPasswordAuth == FALSE ); + + /* Clear return values */ + *authAlgo = CRYPT_ALGO_NONE; + *furtherAuthRequired = FALSE; + ++ if (length == 0 && GET_FLAG( sessionInfoPtr->protocolFlags, SSH_PFLAG_DUMMYUSERAUTH ) && !usedPasswordAuth) ++ { ++ CLEAR_FLAG( sessionInfoPtr->protocolFlags, SSH_PFLAG_DUMMYUSERAUTH ); ++ *furtherAuthRequired = TRUE; ++ *authAlgo = CRYPT_PSEUDOALGO_PASSWORD; ++ return( CRYPT_OK ); ++ } ++ ++ REQUIRES( isShortIntegerRangeNZ( length ) ); ++ + /* Before we can try and interpret the response, we have to check for an + empty response */ + if( length >= LENGTH_SIZE && \ +@@ -647,6 +656,8 @@ + SSH_MSG_USERAUTH_REQUEST ); + if( cryptStatusError( status ) ) + return( status ); ++ if (passwordPtr == NULL && GET_FLAG( sessionInfoPtr->protocolFlags, SSH_PFLAG_DUMMYUSERAUTH )) ++ return( OK_SPECIAL ); + if( usePasswordAuth ) + { + /* byte type = SSH_MSG_USERAUTH_REQUEST +@@ -1220,6 +1231,11 @@ + auth required */ + if( !hasPassword ) + { ++ if (length == 0) ++ { ++ return( reportAuthFailure( sessionInfoPtr, CRYPT_PSEUDOALGO_PASSWORD, ++ requiredAuthAlgo, TRUE ) ); ++ } + return( reportAuthFailure( sessionInfoPtr, CRYPT_ALGO_RSA, + requiredAuthAlgo, TRUE ) ); + } diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index 17695425cbb1e04d55c55d449fd74f4c5073a105..4fe5b12f30eb6ee7aa15635f95eb270d21e4e672 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -966,10 +966,18 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd fc_str(opt[i++], item->flow_control); else if (item->conn_type != CONN_TYPE_SHELL) sprintf(opt[i++], "TCP Port %hu",item->port); - printf_trunc(opt[i], sizeof(opt[i]), "Username %s",item->user); - i++; - sprintf(opt[i++], "Password %s",item->password[0]?"********":"<none>"); - sprintf(opt[i++], "System Password %s",item->syspass[0]?"********":"<none>"); + if (item->conn_type == CONN_TYPE_SSHNA) { + printf_trunc(opt[i], sizeof(opt[i]), "SSH Username %s",item->user); + i++; + sprintf(opt[i++], "BBS Username %s",item->password); + sprintf(opt[i++], "BBS Password %s",item->syspass[0]?"********":"<none>"); + } + else { + printf_trunc(opt[i], sizeof(opt[i]), "Username %s",item->user); + i++; + sprintf(opt[i++], "Password %s",item->password[0]?"********":"<none>"); + sprintf(opt[i++], "System Password %s",item->syspass[0]?"********":"<none>"); + } sprintf(opt[i++], "Screen Mode %s",screen_modes[item->screen_mode]); sprintf(opt[i++], "Hide Status Line %s",item->nostatus?"Yes":"No"); printf_trunc(opt[i], sizeof(opt[i]), "Download Path %s", item->dldir); @@ -1179,27 +1187,45 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd } break; case 4: - uifc.helpbuf= "`Username`\n\n" - "Enter the username to attempt auto-login to the remote with.\n" - "For SSH, this must be the SSH user name."; + if (item->conn_type == CONN_TYPE_SSHNA) { + uifc.helpbuf= "`SSH Username`\n\n" + "Enter the username for passwordless SSH authentication."; + } + else { + uifc.helpbuf= "`Username`\n\n" + "Enter the username to attempt auto-login to the remote with.\n" + "For SSH, this must be the SSH user name."; + } uifc.input(WIN_MID|WIN_SAV,0,0,"Username",item->user,MAX_USER_LEN,K_EDIT); check_exit(FALSE); iniSetString(&inifile,itemname,"UserName",item->user,&ini_style); break; case 5: - uifc.helpbuf= "`Password`\n\n" - "Enter your password for auto-login.\n" - "For SSH, this must be the SSH password if it exists.\n"; + if (item->conn_type == CONN_TYPE_SSHNA) { + uifc.helpbuf= "`BBS Username`\n\n" + "Enter the username to be sent for auto-login (ALT-L)."; + } + else { + uifc.helpbuf= "`Password`\n\n" + "Enter your password for auto-login.\n" + "For SSH, this must be the SSH password if it exists.\n"; + } uifc.input(WIN_MID|WIN_SAV,0,0,"Password",item->password,MAX_PASSWD_LEN,K_EDIT); check_exit(FALSE); iniSetString(&inifile,itemname,"Password",item->password,&ini_style); break; case 6: - uifc.helpbuf= "`System Password`\n\n" - "Enter your System password for auto-login.\n" - "This password is sent after the username and password, so for non-\n" - "Synchronet, or non-sysop accounts, this can be used for simple\n" - "scripting."; + if (item->conn_type == CONN_TYPE_SSHNA) { + uifc.helpbuf= "`BBS Password`\n\n" + "Enter your password for auto-login. (ALT-L)\n"; + } + else { + uifc.helpbuf= "`System Password`\n\n" + "Enter your System password for auto-login.\n" + "This password is sent after the username and password, so for non-\n" + "Synchronet, or non-sysop accounts, this can be used for simple\n" + "scripting."; + } uifc.input(WIN_MID|WIN_SAV,0,0,"System Password",item->syspass,MAX_SYSPASS_LEN,K_EDIT); check_exit(FALSE); iniSetString(&inifile,itemname,"SystemPassword",item->syspass,&ini_style); @@ -1217,6 +1243,18 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd item->conn_type++; iniSetEnum(&inifile,itemname,"ConnectionType",conn_types_enum,item->conn_type,&ini_style); + // TODO: NOTE: This is destructive! Beware! Ooooooo.... + if (i == CONN_TYPE_SSHNA && item->conn_type != CONN_TYPE_SSHNA) { + SAFECOPY(item->user, item->password); + SAFECOPY(item->password, item->syspass); + item->syspass[0] = 0; + } + if (i != CONN_TYPE_SSHNA && item->conn_type == CONN_TYPE_SSHNA) { + SAFECOPY(item->syspass, item->password); + SAFECOPY(item->password, item->user); + item->user[0] = 0; + } + if(item->conn_type!=CONN_TYPE_MODEM && item->conn_type!=CONN_TYPE_SERIAL && item->conn_type!=CONN_TYPE_SHELL ) { diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c index 6a04211ebd6a6f9f6932e8a71b9810b84f3bfe33..572dab1c3e05e3b09926b318b0dfe0257dad23af 100644 --- a/src/syncterm/conn.c +++ b/src/syncterm/conn.c @@ -45,9 +45,9 @@ #include "conn_telnet.h" struct conn_api conn_api; -char *conn_types_enum[]={"Unknown","RLogin","RLoginReversed","Telnet","Raw","SSH","Modem","Serial","Shell","MBBSGhost","TelnetS", NULL}; -char *conn_types[]={"Unknown","RLogin","RLogin Reversed","Telnet","Raw","SSH","Modem","Serial","Shell","MBBS GHost","TelnetS",NULL}; -short unsigned int conn_ports[]={0,513,513,23,0,22,0,0,0,65535,992,0}; +char *conn_types_enum[]={"Unknown","RLogin","RLoginReversed","Telnet","Raw","SSH","SSHNA","Modem","Serial","Shell","MBBSGhost","TelnetS", NULL}; +char *conn_types[]={"Unknown","RLogin","RLogin Reversed","Telnet","Raw","SSH","SSH (no auth)","Modem","Serial","Shell","MBBS GHost","TelnetS",NULL}; +short unsigned int conn_ports[]={0,513,513,23,0,22,22,0,0,0,65535,992,0}; struct conn_buffer conn_inbuf; struct conn_buffer conn_outbuf; @@ -367,6 +367,7 @@ int conn_connect(struct bbslist *bbs) conn_api.binary_mode_on=telnet_binary_mode_on; conn_api.binary_mode_off=telnet_binary_mode_off; break; + case CONN_TYPE_SSHNA: case CONN_TYPE_SSH: conn_api.connect=ssh_connect; conn_api.close=ssh_close; diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h index 0356e15fa7d83aa0c2b7556d37581968ad560a3f..2178e3708f376d9b1edc1770e073e64a45e2ad1f 100644 --- a/src/syncterm/conn.h +++ b/src/syncterm/conn.h @@ -21,6 +21,7 @@ enum { ,CONN_TYPE_TELNET ,CONN_TYPE_RAW ,CONN_TYPE_SSH + ,CONN_TYPE_SSHNA ,CONN_TYPE_MODEM ,CONN_TYPE_SERIAL ,CONN_TYPE_SHELL diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c index ad9ad0bb44222b0a6d9e37a1289c2eee194deb9b..1dcaae8b8edd61cc671034622cadd5f148f78ea2 100644 --- a/src/syncterm/ssh.c +++ b/src/syncterm/ssh.c @@ -229,26 +229,41 @@ int ssh_connect(struct bbslist *bbs) if (!bbs->hidepopups) uifc.pop(NULL); - if(!password[0]) { - if (bbs->hidepopups) - init_uifc(FALSE, FALSE); - uifcinput("Password",MAX_PASSWD_LEN,password,K_PASSWORD,"Incorrect password. Try again."); - if (bbs->hidepopups) - uifcbail(); + if (bbs->conn_type == CONN_TYPE_SSHNA) { + status = cl.SetAttribute(ssh_session, CRYPT_SESSINFO_SSH_OPTIONS, CRYPT_SSHOPTION_NONE_AUTH); + if(cryptStatusError(status)) { + char str[1024]; + sprintf(str,"Error %d disabling password auth",status); + if (!bbs->hidepopups) + uifcmsg("Error disabling password auth",str); + conn_api.terminate=1; + if (!bbs->hidepopups) + uifc.pop(NULL); + return(-1); + } } + else { + if(!password[0]) { + if (bbs->hidepopups) + init_uifc(FALSE, FALSE); + uifcinput("Password",MAX_PASSWD_LEN,password,K_PASSWORD,"Incorrect password. Try again."); + if (bbs->hidepopups) + uifcbail(); + } - if (!bbs->hidepopups) - uifc.pop("Setting Password"); - status=cl.SetAttributeString(ssh_session, CRYPT_SESSINFO_PASSWORD, password, strlen(password)); - if(cryptStatusError(status)) { - char str[1024]; - sprintf(str,"Error %d setting password",status); - if (!bbs->hidepopups) - uifcmsg("Error setting password",str); - conn_api.terminate=1; if (!bbs->hidepopups) - uifc.pop(NULL); - return(-1); + uifc.pop("Setting Password"); + status=cl.SetAttributeString(ssh_session, CRYPT_SESSINFO_PASSWORD, password, strlen(password)); + if(cryptStatusError(status)) { + char str[1024]; + sprintf(str,"Error %d setting password",status); + if (!bbs->hidepopups) + uifcmsg("Error setting password",str); + conn_api.terminate=1; + if (!bbs->hidepopups) + uifc.pop(NULL); + return(-1); + } } if (!bbs->hidepopups) { diff --git a/src/syncterm/st_crypt.c b/src/syncterm/st_crypt.c index 90cdc7f634aae97899848e5411f68619cd7b0f2a..e46c51373b12ca5e473432965201d93915459649 100644 --- a/src/syncterm/st_crypt.c +++ b/src/syncterm/st_crypt.c @@ -49,6 +49,7 @@ int init_crypt(void) cl.SetAttributeString=cryptSetAttributeString; cl.DestroySession=cryptDestroySession; cl.AddRandom=cryptAddRandom; + cl.DeleteAttribute=cryptDeleteAttribute; #else cryptlib=xp_dlopen(libnames,RTLD_LAZY, CRYPTLIB_VERSION/1000); if(cryptlib==NULL) @@ -101,6 +102,10 @@ int init_crypt(void) xp_dlclose(cryptlib); return(-1); } + if((cl.DeleteAttribute=xp_dlsym(cryptlib,cryptDeleteAttribute))==NULL) { + xp_dlclose(cryptlib); + return(-1); + } #endif if(cryptStatusOK(cl.Init())) { if(cryptStatusOK(cl.AddRandom(NULL, CRYPT_RANDOM_SLOWPOLL))) { diff --git a/src/syncterm/st_crypt.h b/src/syncterm/st_crypt.h index d9a704fecdf71266968db65f4fcf40fcf4088dcb..323b9a1f233b80a18e6750a9fed1df3a96000a1a 100644 --- a/src/syncterm/st_crypt.h +++ b/src/syncterm/st_crypt.h @@ -37,6 +37,8 @@ struct crypt_funcs { C_IN void C_PTR value, C_IN int valueLength ); int (*DestroySession)( C_IN CRYPT_SESSION session ); int (*AddRandom)( C_IN void C_PTR randomData, C_IN int randomDataLength ); + int (*DeleteAttribute)( C_IN CRYPT_HANDLE cryptHandle, + C_IN CRYPT_ATTRIBUTE_TYPE attributeType); }; #endif diff --git a/src/syncterm/term.c b/src/syncterm/term.c index bbb608a0145e0fe820a1709151e90ef94fceb7af..6e5db091b259d99dfa1afbb3a0df0002c9413b0c 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -2824,10 +2824,12 @@ BOOL doterm(struct bbslist *bbs) break; case 0x2600: /* ALT-L */ if(bbs->conn_type != CONN_TYPE_RLOGIN && bbs->conn_type != CONN_TYPE_RLOGIN_REVERSED && bbs->conn_type != CONN_TYPE_SSH) { - if(bbs->user[0]) { - conn_send(bbs->user,strlen(bbs->user),0); - conn_send(cterm->emulation==CTERM_EMULATION_ATASCII?"\x9b":"\r",1,0); - SLEEP(10); + if (bbs->conn_type != CONN_TYPE_SSHNA) { + if(bbs->user[0]) { + conn_send(bbs->user,strlen(bbs->user),0); + conn_send(cterm->emulation==CTERM_EMULATION_ATASCII?"\x9b":"\r",1,0); + SLEEP(10); + } } if(bbs->password[0]) { conn_send(bbs->password,strlen(bbs->password),0);