diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp index 84aeff05f1ebb93879b8c4cbab4931812aa34f16..974d0faf65dd99a91d00bc8208adea53cf8e0e5d 100644 --- a/src/sbbs3/js_bbs.cpp +++ b/src/sbbs3/js_bbs.cpp @@ -2989,11 +2989,13 @@ static JSBool js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist) { jsval *argv=JS_ARGV(cx, arglist); + uintN argn; char* addr; uint32 mode=0; uint32 timeout=10; JSString* js_addr; sbbs_t* sbbs; + str_list_t send_strings = NULL; jsrefcount rc; if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL) @@ -3009,22 +3011,45 @@ js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist) if(addr==NULL) return(JS_FALSE); - if(argc>1 && JSVAL_IS_NUMBER(argv[1])) { - if(!JS_ValueToECMAUint32(cx,argv[1],&mode)) { + argn = 1; + if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) { + if(!JS_ValueToECMAUint32(cx,argv[argn],&mode)) { free(addr); return JS_FALSE; } + ++argn; } - if(argc>2 && JSVAL_IS_NUMBER(argv[2])) { - if(!JS_ValueToECMAUint32(cx,argv[2],&timeout)) { + if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) { + if(!JS_ValueToECMAUint32(cx,argv[argn],&timeout)) { free(addr); return JS_FALSE; } + ++argn; + } + if(argc > argn && JSVAL_IS_OBJECT(argv[argn])) { + JSObject* array = JSVAL_TO_OBJECT(argv[argn]); + jsuint count = 0; + if(array != NULL && JS_IsArrayObject(cx, array) && JS_GetArrayLength(cx, array, &count)) { + send_strings = strListInit(); + char* tmp = NULL; + size_t tmplen = 0; + for(jsuint i = 0; i < count; ++i) { + jsval val; + if(!JS_GetElement(cx, array, i, &val)) + break; + JSVALUE_TO_RASTRING(cx, val, tmp, &tmplen, NULL); + HANDLE_PENDING(cx, tmp); + strListPush(&send_strings, tmp); + } + free(tmp); + ++argn; + } } rc=JS_SUSPENDREQUEST(cx); - JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr,mode,timeout))); + JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr, mode, timeout, send_strings))); free(addr); + strListFree(&send_strings); JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); @@ -3045,6 +3070,7 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) uint32 timeout = 10; JSString* js_str; sbbs_t* sbbs; + str_list_t send_strings = NULL; jsrefcount rc; if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL) @@ -3086,6 +3112,23 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) break; } } + } else if(JSVAL_IS_OBJECT(argv[argn])) { + JSObject* array = JSVAL_TO_OBJECT(argv[argn]); + jsuint count = 0; + if(array != NULL && JS_IsArrayObject(cx, array) && JS_GetArrayLength(cx, array, &count)) { + send_strings = strListInit(); + char* tmp = NULL; + size_t tmplen = 0; + for(jsuint i = 0; i < count; ++i) { + jsval val; + if(!JS_GetElement(cx, array, i, &val)) + break; + JSVALUE_TO_RASTRING(cx, val, tmp, &tmplen, NULL); + HANDLE_PENDING(cx, tmp); + strListPush(&send_strings, tmp); + } + free(tmp); + } } } if(!fail) { @@ -3093,13 +3136,14 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) mode = 0; rc=JS_SUSPENDREQUEST(cx); JS_SET_RVAL(cx, arglist - ,BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr,mode|TG_RLOGIN,timeout,client_user_name,server_user_name,term_type))); + ,BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr, mode|TG_RLOGIN, timeout, send_strings, client_user_name, server_user_name, term_type))); JS_RESUMEREQUEST(cx, rc); } FREE_AND_NULL(addr); FREE_AND_NULL(client_user_name); FREE_AND_NULL(server_user_name); FREE_AND_NULL(term_type); + strListFree(&send_strings); return(fail ? JS_FALSE : JS_TRUE); } @@ -4765,12 +4809,12 @@ static jsSyncMethodSpec js_bbs_functions[] = { "(see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)") ,310 }, - {"telnet_gate", js_telnet_gate, 1, JSTYPE_BOOLEAN, JSDOCSTR("address[:port] [,<i>number</i> mode=TG_NONE] [,<i>number</i> timeout=10]") + {"telnet_gate", js_telnet_gate, 1, JSTYPE_BOOLEAN, JSDOCSTR("address[:port] [,<i>number</i> mode=TG_NONE] [,<i>number</i> timeout=10] [,<i>array<i> send_strings]") ,JSDOCSTR("External Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).") ,310 }, {"rlogin_gate", js_rlogin_gate, 1, JSTYPE_BOOLEAN - ,JSDOCSTR("address[:port] [,<i>string</i> client-user-name=<i>user.alias</i>, <i>string</i> server-user-name=<i>user.name</i>, <i>string</i> terminal=<i>console.terminal</i>] [,<i>number</i> mode=TG_NONE] [,<i>number</i> timeout=10]") + ,JSDOCSTR("address[:port] [,<i>string</i> client-user-name=<i>user.alias</i>, <i>string</i> server-user-name=<i>user.name</i>, <i>string</i> terminal=<i>console.terminal</i>] [,<i>number</i> mode=TG_NONE] [,<i>number</i> timeout=10] [,<i>array<i> send_strings]") ,JSDOCSTR("External RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).") ,316 }, diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index cc409019c95093a2a2070a556efaf5f0614505ef..6082e80fd67254732b54e9ad4338d6f58003545f 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1337,7 +1337,8 @@ public: void catsyslog(int crash); /* telgate.cpp */ - bool telnet_gate(char* addr, uint mode, unsigned timeout=10, char* client_user_name=NULL, char* server_user_name=NULL, char* term_type=NULL); // See TG_* for mode bits + bool telnet_gate(char* addr, uint mode, unsigned timeout=10 // See TG_* for mode bits + ,str_list_t send_strings=NULL, char* client_user_name=NULL, char* server_user_name=NULL, char* term_type=NULL); /* sftp.cpp */ bool init_sftp(int channel_id); diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp index 109b454c958bf0eeb196788d7d35b79275f4cf2f..33cdbb8104b6ab323306a6b3b9088db4f2cdb585 100644 --- a/src/sbbs3/telgate.cpp +++ b/src/sbbs3/telgate.cpp @@ -216,7 +216,7 @@ struct TelnetProxy }; // struct TelnetProxy -bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, char* client_user_name, char* server_user_name, char* term_type) +bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, str_list_t send_strings, char* client_user_name, char* server_user_name, char* term_type) { char* p; uchar buf[512]; @@ -331,6 +331,11 @@ bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, char* clie if(!(telnet_mode&TELNET_MODE_OFF) && (mode&TG_PASSTHRU)) telnet_mode|=TELNET_MODE_GATE; // Pass-through telnet commands + if(send_strings != NULL) { + for(i = 0; send_strings[i] != NULL; ++i) + sendsocket(remote_socket, send_strings[i], strlen(send_strings[i])); + } + while(online) { if(!(mode&TG_NOCHKTIME)) gettimeleft();