Skip to content
Snippets Groups Projects
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 */