--- parser3/src/classes/op.C 2010/08/01 14:49:33 1.202 +++ parser3/src/classes/op.C 2010/11/15 23:31:08 1.205 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_OP_C="$Date: 2010/08/01 14:49:33 $"; +static const char * const IDENT_OP_C="$Date: 2010/11/15 23:31:08 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -81,6 +81,7 @@ public: ULN("optimized-html", HTML|String::L_OPTIMIZE_BIT); ULN("regex", REGEX); ULN("parser-code", PARSER_CODE); + ULN("json", JSON); #undef ULN } } untaint_lang_name2enum; @@ -144,6 +145,13 @@ static void _taint(Request& r, MethodPar } } +static void _apply_taint(Request& r, MethodParams& params) { + String::Language lang=params.count()==1 ? String::L_AS_IS : get_untaint_lang(params, 0); + const String &sbody=params.as_string(params.count()-1, "body must be string"); + String::Body result_body=sbody.cstr_to_string_body_untaint(lang, 0, &r.charsets); + r.write_pass_lang(*new String(result_body, String::L_AS_IS)); +} + static void _process(Request& r, MethodParams& params) { Method* main_method; @@ -222,7 +230,8 @@ static void _process(Request& r, MethodP if(main_method) { VMethodFrame frame(*main_method, r.get_method_frame()->caller(), *target_self); frame.empty_params(); - r.op_call_write(frame); + r.op_call(frame); + r.write_pass_lang(frame.result()); } } @@ -898,6 +907,9 @@ VClassMAIN::VClassMAIN(): VClass() { // ^taint[as-is|uri|sql|js|html|html-typo|regex|parser-code]{code} add_native_method("taint", Method::CT_ANY, _taint, 1, 2, Method::CO_WITHOUT_FRAME); + // ^apply-taint[untaint lang][string] + add_native_method("apply-taint", Method::CT_ANY, _apply_taint, 1, 2, Method::CO_WITHOUT_FRAME); + // ^process[code] add_native_method("process", Method::CT_ANY, _process, 1, 3);