diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c index 5fd8ce21f1f84c60fd98f18a41d7eaeae46c6ac5..9346aaab11ee708b6dcd3fa7e0746f482dfd0c8e 100644 --- a/src/sbbs3/js_global.c +++ b/src/sbbs3/js_global.c @@ -36,6 +36,7 @@ ****************************************************************************/ #include "sbbs.h" +#include "base64.h" #ifdef JAVASCRIPT @@ -879,6 +880,73 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva return(JS_TRUE); } +static JSBool +js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + int res; + size_t len; + uchar* inbuf; + uchar* outbuf; + JSString* js_str; + + *rval = JSVAL_NULL; + + if((inbuf=JS_GetStringBytes(JS_ValueToString(cx, argv[0])))==NULL) + return(JS_FALSE); + + len=(strlen(inbuf)*10)+1; + if((outbuf=(char*)malloc(len))==NULL) + return(JS_FALSE); + + res=b64_encode(outbuf,len,inbuf,strlen(inbuf)); + + if(res<1) { + free(outbuf); + return(JS_TRUE); + } + + js_str = JS_NewStringCopyZ(cx, outbuf); + free(outbuf); + if(js_str==NULL) + return(JS_FALSE); + + *rval = STRING_TO_JSVAL(js_str); + return(JS_TRUE); +} + +static JSBool +js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + int res; + size_t len; + uchar* inbuf; + uchar* outbuf; + JSString* js_str; + + *rval = JSVAL_NULL; + + if((inbuf=JS_GetStringBytes(JS_ValueToString(cx, argv[0])))==NULL) + return(JS_FALSE); + + len=strlen(inbuf)+1; + if((outbuf=(char*)malloc(len))==NULL) + return(JS_FALSE); + + res=b64_decode(outbuf,len,inbuf,strlen(inbuf)); + + if(res<1) { + free(outbuf); + return(JS_TRUE); + } + + js_str = JS_NewStringCopyZ(cx, outbuf); + free(outbuf); + if(js_str==NULL) + return(JS_FALSE); + + *rval = STRING_TO_JSVAL(js_str); + return(JS_TRUE); +} static JSBool js_truncsp(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) @@ -1255,6 +1323,12 @@ static jsMethodSpec js_global_functions[] = { ,JSDOCSTR("returns a quoted version of the message text string argumnet, <i>line_length</i> defaults to <i>79</i>, " "<i>prefix</i> defaults to <tt>\" > \"</tt>") }, + {"base64_encode", js_b64_encode, 1, JSTYPE_STRING, JSDOCSTR("string text") + ,JSDOCSTR("returns base64-encoded version of text string or <i>null</i> on error") + }, + {"base64_decode", js_b64_decode, 1, JSTYPE_STRING, JSDOCSTR("string text") + ,JSDOCSTR("returns base64-decoded string or <i>null</i> on error") + }, {0} };