terminal-params.patch 4.66 KiB
diff -ur ../cl.patched/cryptlib.h ./cryptlib.h
--- ../cl.patched/cryptlib.h 2014-06-20 12:40:45.000000000 -0700
+++ ./cryptlib.h 2014-06-20 12:47:00.000000000 -0700
@@ -1237,6 +1237,11 @@
CRYPT_SESSINFO_SSL_OPTIONS, /* SSL/TLS protocol options */
CRYPT_SESSINFO_TSP_MSGIMPRINT, /* TSP message imprint */
+ /* Terminal attributes */
+ CRYPT_SESSINFO_SSH_TERMINAL, /* TERM string sent to remote */
+ CRYPT_SESSINFO_SSH_WIDTH, /* Terminal width */
+ CRYPT_SESSINFO_SSH_HEIGHT, /* Terminal height */
+
/* Used internally */
CRYPT_SESSINFO_LAST, CRYPT_USERINFO_FIRST = 7000,
diff -ur ../cl.patched/kernel/attr_acl.c ./kernel/attr_acl.c
--- ../cl.patched/kernel/attr_acl.c 2014-06-20 12:40:39.000000000 -0700
+++ ./kernel/attr_acl.c 2014-06-20 20:32:54.000000000 -0700
@@ -3742,6 +3742,25 @@
MKPERM_TSP( xWD_xWD ),
ROUTE( OBJECT_TYPE_SESSION ), &objectCtxHash ),
+ MKACL_S( /* SSH client: Read/write */
+ CRYPT_SESSINFO_SSH_TERMINAL,
+ ST_NONE, ST_NONE, ST_SESS_SSH,
+ 0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
+ ROUTE( OBJECT_TYPE_SESSION ),
+ RANGE( 1, CRYPT_MAX_TEXTSIZE ) ),
+ MKACL_N( /* SSH client: Read/write */
+ CRYPT_SESSINFO_SSH_WIDTH,
+ ST_NONE, ST_NONE, ST_SESS_SSH,
+ 0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
+ ROUTE( OBJECT_TYPE_SESSION ),
+ RANGE( 1, 800 ) ),
+ MKACL_N( /* SSH client: Read/write */
+ CRYPT_SESSINFO_SSH_HEIGHT,
+ ST_NONE, ST_NONE, ST_SESS_SSH,
+ 0xffffffff /*MKPERM_SSH_EXT( RWD_RWD )*/,
+ ROUTE( OBJECT_TYPE_SESSION ),
+ RANGE( 1, 800 ) ),
+
MKACL_END(), MKACL_END()
};
diff -ur ../cl.patched/session/sess_attr.c ./session/sess_attr.c
--- ../cl.patched/session/sess_attr.c 2014-06-20 12:40:41.000000000 -0700
+++ ./session/sess_attr.c 2014-06-20 20:33:27.000000000 -0700
@@ -323,6 +323,8 @@
TRUE : FALSE;
return( CRYPT_OK );
+ case CRYPT_SESSINFO_SSH_WIDTH:
+ case CRYPT_SESSINFO_SSH_HEIGHT:
case CRYPT_SESSINFO_SERVER_PORT:
case CRYPT_SESSINFO_CLIENT_PORT:
{
@@ -392,6 +394,7 @@
return( CRYPT_ERROR_NOTFOUND );
}
+ case CRYPT_SESSINFO_SSH_TERMINAL:
case CRYPT_SESSINFO_USERNAME:
case CRYPT_SESSINFO_PASSWORD:
case CRYPT_SESSINFO_SERVER_FINGERPRINT_SHA1:
@@ -532,6 +535,13 @@
return( status );
}
+ case CRYPT_SESSINFO_SSH_WIDTH:
+ return( addSessionInfo( sessionInfoPtr,
+ CRYPT_SESSINFO_SSH_WIDTH, value ) );
+ case CRYPT_SESSINFO_SSH_HEIGHT:
+ return( addSessionInfo( sessionInfoPtr,
+ CRYPT_SESSINFO_SSH_HEIGHT, value ) );
+
case CRYPT_SESSINFO_SERVER_PORT:
/* If there's already a transport session or network socket
specified then we can't set a port as well */
@@ -883,6 +893,7 @@
attribute, data, dataLength, flags ) );
}
+ case CRYPT_SESSINFO_SSH_TERMINAL:
case CRYPT_SESSINFO_SERVER_FINGERPRINT_SHA1:
/* Remember the value */
return( addSessionInfoS( sessionInfoPtr,
@@ -938,6 +949,9 @@
sessionInfoPtr->writeTimeout = CRYPT_ERROR;
return( CRYPT_OK );
+ case CRYPT_SESSINFO_SSH_TERMINAL:
+ case CRYPT_SESSINFO_SSH_WIDTH:
+ case CRYPT_SESSINFO_SSH_HEIGHT:
case CRYPT_SESSINFO_USERNAME:
case CRYPT_SESSINFO_PASSWORD:
case CRYPT_SESSINFO_SERVER_NAME:
diff -ur ../cl.patched/session/ssh2_msgc.c ./session/ssh2_msgc.c
--- ../cl.patched/session/ssh2_msgc.c 2014-06-20 12:40:41.000000000 -0700
+++ ./session/ssh2_msgc.c 2014-06-20 20:36:36.000000000 -0700
@@ -447,6 +447,12 @@
CHANNEL_WRITE );
int packetOffset, status;
+ MESSAGE_DATA term;
+ BYTE termString[ CRYPT_MAX_TEXTSIZE + 8 ];
+ int value;
+
+ term.data=termString;
+ term.length=CRYPT_MAX_TEXTSIZE;
assert( isWritePtr( sessionInfoPtr, sizeof( SESSION_INFO ) ) );
assert( isWritePtr( stream, sizeof( STREAM ) ) );
@@ -545,9 +551,18 @@
writeUint32( stream, channelNo );
writeString32( stream, "pty-req", 7 );
sputc( stream, 0 ); /* No reply */
- writeString32( stream, "xterm", 5 );/* Generic */
- writeUint32( stream, 80 );
- writeUint32( stream, 48 ); /* 48 x 80 (24 x 80 is so 1970s) */
+ if( cryptStatusError( status = getSessionAttributeS( sessionInfoPtr, &term, CRYPT_SESSINFO_SSH_TERMINAL) ) )
+ writeString32( stream, "xterm", 5 );/* Generic */
+ else
+ writeString32( stream, term.data, term.length );/* Generic */
+ if( cryptStatusError( getSessionAttribute( sessionInfoPtr, &value, CRYPT_SESSINFO_SSH_WIDTH ) ) )
+ writeUint32( stream, 80 );
+ else
+ writeUint32( stream, value);
+ if( cryptStatusError( getSessionAttribute( sessionInfoPtr, &value, CRYPT_SESSINFO_SSH_HEIGHT ) ) )
+ writeUint32( stream, 48 ); /* 48 x 80 (24 x 80 is so 1970s) */
+ else
+ writeUint32( stream, value);
writeUint32( stream, 0 );
writeUint32( stream, 0 ); /* No graphics capabilities */
status = writeUint32( stream, 0 ); /* No special TTY modes */