diff options
-rw-r--r-- | jsonrpc/json.esp | 4 | ||||
-rw-r--r-- | jsonrpc/jsondate.esp | 21 | ||||
-rw-r--r-- | jsonrpc/qooxdoo/test.esp | 8 | ||||
-rw-r--r-- | jsonrpc/request.esp | 15 | ||||
-rw-r--r-- | source4/scripting/ejs/literal.c | 323 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls.c | 34 |
6 files changed, 258 insertions, 147 deletions
diff --git a/jsonrpc/json.esp b/jsonrpc/json.esp index 32f0fa776a..8234ad7be3 100644 --- a/jsonrpc/json.esp +++ b/jsonrpc/json.esp @@ -112,6 +112,10 @@ function _encode(o) } buf = buf + "]"; } + else if (o["__type"] == "_JSON_Date") + { + buf = "" + o.encoding(); + } else { /* No length field, so it must be an ordinary object */ diff --git a/jsonrpc/jsondate.esp b/jsonrpc/jsondate.esp index b2f2b9ec11..42418eaef2 100644 --- a/jsonrpc/jsondate.esp +++ b/jsonrpc/jsondate.esp @@ -16,6 +16,7 @@ function _JSON_Date_create(secondsSinceEpoch) { var o = new Object(); + o.__type = "_JSON_Date"; function _setUtcDateTimeFields(year, month, day, hour, minute, second, millisecond) { @@ -137,7 +138,7 @@ function _JSON_Date_create(secondsSinceEpoch) } o.getUtcMillisecond = _getUtcMillisecond; - function getEpochTime() + function _getEpochTime() { var tm = new Object(); tm.tm_sec = this.second; @@ -151,8 +152,9 @@ function _JSON_Date_create(secondsSinceEpoch) tm.isdst = 0; return gmmktime(tm); } + o.getEpochTime = _getEpochTime; - function encoding() + function _encoding() { /* Encode the date in a well-documented fashion */ return sprintf("new Date(Date.UTC(%d,%d,%d,%d,%d,%d,%d))", @@ -164,6 +166,7 @@ function _JSON_Date_create(secondsSinceEpoch) this.second, this.millisecond); } + o.encoding = _encoding; if (! secondsSinceEpoch) { @@ -174,13 +177,13 @@ function _JSON_Date_create(secondsSinceEpoch) { o.setEpochTime(secondsSinceEpoch); } - o.year = null; - o.month = null; - o.day = null; - o.hour = null; - o.minute = null; - o.second = null; - o.millisecond = null; + o.year = 0; + o.month = 0; + o.day = 0; + o.hour = 0; + o.minute = 0; + o.second = 0; + o.millisecond = 0; return o; } diff --git a/jsonrpc/qooxdoo/test.esp b/jsonrpc/qooxdoo/test.esp index 5fd893c217..03c2d824ba 100644 --- a/jsonrpc/qooxdoo/test.esp +++ b/jsonrpc/qooxdoo/test.esp @@ -31,7 +31,7 @@ function _echo(params, error) { if (params.length != 1) { - error.SetError(JsonRpcError_ParameterMismatch, + error.setError(JsonRpcError_ParameterMismatch, "Expected 1 parameter; got " + params.length); return error; } @@ -75,9 +75,9 @@ function _sleep(params, error) { if (params.length != 1) { - error.SetError(JsonRpcError_ParameterMismatch, + error.setError(JsonRpcError_ParameterMismatch, "Expected 1 parameter; got " + params.length); - return null; + return error; } sleep(params[0]); @@ -222,7 +222,7 @@ jsonrpc.method.getCurrentTimestamp = _getCurrentTimestamp; function _getError(params, error) { - error.SetError(23, "This is an application-provided error"); + error.setError(23, "This is an application-provided error"); return error; } jsonrpc.method.getError = _getError; diff --git a/jsonrpc/request.esp b/jsonrpc/request.esp index 984ee4663e..5a1408df62 100644 --- a/jsonrpc/request.esp +++ b/jsonrpc/request.esp @@ -209,14 +209,14 @@ function _JsonRpcError_create(origin, code, message) function _origin(origin) { - this.origin = origin; + this.data.origin = origin; } o.setOrigin = _origin; function _setError(code, message) { - this.code = code; - this.message = message; + this.data.code = code; + this.data.message = message; } o.setError = _setError; @@ -236,7 +236,7 @@ function _JsonRpcError_create(origin, code, message) { var error = this; var id = this.id; - var ret = new Array(2); + var ret = new Object(); ret.error = this.data; ret.id = this.id; sendReply(Json.encode(ret), this.scriptTransportId); @@ -444,12 +444,7 @@ error.setOrigin(jsonrpc.Constant.ErrorOrigin.Application); var retval = method(jsonInput.params, error); /* See if the result of the function was actually an error object */ -var wasError = (retval["__type"] != undefined); -if (wasError) -{ - wasError = retval.__type == "_JsonRpcError"; -} -if (wasError) +if (retval["__type"] == "_JsonRpcError") { /* Yup, it was. Return the error */ retval.Send(); diff --git a/source4/scripting/ejs/literal.c b/source4/scripting/ejs/literal.c index 4eeb35c423..d50e5afdb9 100644 --- a/source4/scripting/ejs/literal.c +++ b/source4/scripting/ejs/literal.c @@ -20,6 +20,7 @@ enum json_tokener_error { json_tokener_error_oom, /* out of memory */ json_tokener_error_parse_unexpected, json_tokener_error_parse_null, + json_tokener_error_parse_date, json_tokener_error_parse_boolean, json_tokener_error_parse_number, json_tokener_error_parse_array, @@ -30,27 +31,40 @@ enum json_tokener_error { }; enum json_tokener_state { - json_tokener_state_eatws, /* 0 */ - json_tokener_state_start, /* 1 */ - json_tokener_state_finish, /* 2 */ - json_tokener_state_null, /* 3 */ - json_tokener_state_comment_start, /* 4 */ - json_tokener_state_comment, /* 5 */ - json_tokener_state_comment_eol, /* 6 */ - json_tokener_state_comment_end, /* 7 */ - json_tokener_state_string, /* 8 */ - json_tokener_state_string_escape, /* 9 */ - json_tokener_state_escape_unicode, /* 10 */ - json_tokener_state_boolean, /* 11 */ - json_tokener_state_number, /* 12 */ - json_tokener_state_array, /* 13 */ - json_tokener_state_array_sep, /* 14 */ - json_tokener_state_object, /* 15 */ - json_tokener_state_object_field_start, /* 16 */ - json_tokener_state_object_field, /* 17 */ - json_tokener_state_object_field_end, /* 18 */ - json_tokener_state_object_value, /* 19 */ - json_tokener_state_object_sep /* 20 */ + json_tokener_state_eatws, + json_tokener_state_start, + json_tokener_state_finish, + json_tokener_state_null, + json_tokener_state_date, + json_tokener_state_comment_start, + json_tokener_state_comment, + json_tokener_state_comment_eol, + json_tokener_state_comment_end, + json_tokener_state_string, + json_tokener_state_string_escape, + json_tokener_state_escape_unicode, + json_tokener_state_boolean, + json_tokener_state_number, + json_tokener_state_array, + json_tokener_state_datelist, + json_tokener_state_array_sep, + json_tokener_state_datelist_sep, + json_tokener_state_object, + json_tokener_state_object_field_start, + json_tokener_state_object_field, + json_tokener_state_object_field_end, + json_tokener_state_object_value, + json_tokener_state_object_sep +}; + +enum date_field { + date_field_year, + date_field_month, + date_field_day, + date_field_hour, + date_field_minute, + date_field_second, + date_field_millisecond }; struct json_tokener @@ -145,11 +159,16 @@ static void *append_string(void *ctx, static struct MprVar json_tokener_do_parse(struct json_tokener *this, enum json_tokener_error *err_p) { - enum json_tokener_state state, saved_state; + enum json_tokener_state state; + enum json_tokener_state saved_state; + enum date_field date_field; struct MprVar current = mprCreateUndefinedVar(); + struct MprVar tempObj; struct MprVar obj; enum json_tokener_error err = json_tokener_success; + char date_script[] = "JSON_Date.create(0);"; char *obj_field_name = NULL; + char *emsg = NULL; char quote_char; int deemed_double; int start_offset; @@ -190,8 +209,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, break; case 'N': case 'n': - state = json_tokener_state_null; start_offset = this->pos++; + if (this->source[this->pos] == 'e') { + state = json_tokener_state_date; + } else { + state = json_tokener_state_null; + } break; case '"': case '\'': @@ -241,7 +264,8 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, goto out; case json_tokener_state_null: - if(strncasecmp("null", this->source + start_offset, + if(strncasecmp("null", + this->source + start_offset, this->pos - start_offset)) { *err_p = json_tokener_error_parse_null; mprDestroyVar(¤t); @@ -258,6 +282,38 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, } break; + case json_tokener_state_date: + if (this->pos - start_offset <= 18) { + if (strncasecmp("new Date(Date.UTC(", + this->source + start_offset, + this->pos - start_offset)) { + *err_p = json_tokener_error_parse_date; + mprDestroyVar(¤t); + return mprCreateUndefinedVar(); + } else { + this->pos++; + break; + } + } + + this->pos--; /* we went one too far */ + state = json_tokener_state_eatws; + saved_state = json_tokener_state_datelist; + + /* Create a JsonDate object */ + if (ejsEvalScript(0, + date_script, + &tempObj, + &emsg) != 0) { + *err_p = json_tokener_error_parse_date; + mprDestroyVar(¤t); + return mprCreateUndefinedVar(); + } + mprDestroyVar(¤t); + mprCopyVar(¤t, &tempObj, MPR_DEEP_COPY); + date_field = date_field_year; + break; + case json_tokener_state_comment_start: if(c == '*') { state = json_tokener_state_comment; @@ -293,11 +349,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, case json_tokener_state_string: if(c == quote_char) { - if ((this->pb = append_string( - this->ctx, - this->pb, - this->source + start_offset, - this->pos - start_offset)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + this->source + start_offset, + this->pos - start_offset); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -315,11 +372,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, switch(c) { case '"': case '\\': - if ((this->pb = append_string( - this->ctx, - this->pb, - this->source + start_offset, - this->pos - start_offset - 1)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + this->source + start_offset, + this->pos - start_offset - 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -330,11 +388,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, case 'n': case 'r': case 't': - if ((this->pb = append_string( - this->ctx, - this->pb, - this->source + start_offset, - this->pos - start_offset - 1)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + this->source + start_offset, + this->pos - start_offset - 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -345,41 +404,41 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, * pass string constant. */ char buf[] = "\b"; - if ((this->pb = append_string( - this->ctx, - this->pb, - buf, - 1)) == NULL) { + this->pb = append_string(this->ctx, + this->pb, + buf, + 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } } else if (c == 'n') { char buf[] = "\n"; - if ((this->pb = append_string( - this->ctx, - this->pb, - buf, - 1)) == NULL) { + this->pb = append_string(this->ctx, + this->pb, + buf, + 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } } else if (c == 'r') { char buf[] = "\r"; - if ((this->pb = append_string( - this->ctx, - this->pb, - buf, - 1)) == NULL) { + this->pb = append_string(this->ctx, + this->pb, + buf, + 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } } else if (c == 't') { char buf[] = "\t"; - if ((this->pb = append_string( - this->ctx, - this->pb, - buf, - 1)) == NULL) { + this->pb = append_string(this->ctx, + this->pb, + buf, + 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -388,11 +447,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, state = saved_state; break; case 'u': - if ((this->pb = append_string( - this->ctx, - this->pb, - this->source + start_offset, - this->pos - start_offset - 1)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + this->source + start_offset, + this->pos - start_offset - 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -417,22 +477,24 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, hexdigit(*(this->source + start_offset + 3)); if (ucs_char < 0x80) { utf_out[0] = ucs_char; - if ((this->pb = append_string( - this->ctx, - this->pb, - (char *) utf_out, - 1)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + (char *) utf_out, + 1); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } } else if (ucs_char < 0x800) { utf_out[0] = 0xc0 | (ucs_char >> 6); utf_out[1] = 0x80 | (ucs_char & 0x3f); - if ((this->pb = append_string( - this->ctx, - this->pb, - (char *) utf_out, - 2)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + (char *) utf_out, + 2); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -440,11 +502,12 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, utf_out[0] = 0xe0 | (ucs_char >> 12); utf_out[1] = 0x80 | ((ucs_char >> 6) & 0x3f); utf_out[2] = 0x80 | (ucs_char & 0x3f); - if ((this->pb = append_string( - this->ctx, - this->pb, - (char *) utf_out, - 3)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + (char *) utf_out, + 3); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } @@ -536,6 +599,63 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, } break; + case json_tokener_state_datelist: + if(c == ')') { + if (this->source[this->pos+1] == ')') { + this->pos += 2; + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else { + err = json_tokener_error_parse_date; + goto out; + } + } else { + obj = json_tokener_do_parse(this, &err); + if (err != json_tokener_success) { + goto out; + } + + /* date list items must be integers */ + if (obj.type != MPR_TYPE_INT) { + err = json_tokener_error_parse_date; + goto out; + } + + switch(date_field) { + case date_field_year: + mprSetVar(¤t, "year", obj); + break; + case date_field_month: + mprSetVar(¤t, "month", obj); + break; + case date_field_day: + mprSetVar(¤t, "day", obj); + break; + case date_field_hour: + mprSetVar(¤t, "hour", obj); + break; + case date_field_minute: + mprSetVar(¤t, "minute", obj); + break; + case date_field_second: + mprSetVar(¤t, "second", obj); + break; + case date_field_millisecond: + mprSetVar(¤t, "millisecond", obj); + break; + default: + err = json_tokener_error_parse_date; + goto out; + } + + /* advance to the next date field */ + date_field++; + + saved_state = json_tokener_state_datelist_sep; + state = json_tokener_state_eatws; + } + break; + case json_tokener_state_array_sep: if(c == ']') { this->pos++; @@ -552,6 +672,27 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, } break; + case json_tokener_state_datelist_sep: + if(c == ')') { + if (this->source[this->pos+1] == ')') { + this->pos += 2; + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else { + err = json_tokener_error_parse_date; + goto out; + } + } else if(c == ',') { + this->pos++; + saved_state = json_tokener_state_datelist; + state = json_tokener_state_eatws; + } else { + *err_p = json_tokener_error_parse_date; + mprDestroyVar(¤t); + return mprCreateUndefinedVar(); + } + break; + case json_tokener_state_object: state = json_tokener_state_object_field_start; start_offset = this->pos; @@ -580,17 +721,18 @@ static struct MprVar json_tokener_do_parse(struct json_tokener *this, case json_tokener_state_object_field: if(c == quote_char) { - if ((this->pb = append_string( - this->ctx, - this->pb, - this->source + start_offset, - this->pos - start_offset)) == NULL) { + this->pb = append_string( + this->ctx, + this->pb, + this->source + start_offset, + this->pos - start_offset); + if (this->pb == NULL) { err = json_tokener_error_oom; goto out; } - if ((obj_field_name = - talloc_strdup(this->ctx, - this->pb)) == NULL) { + obj_field_name = talloc_strdup(this->ctx, + this->pb); + if (obj_field_name == NULL) { err = json_tokener_error_oom; goto out; } @@ -653,10 +795,11 @@ out: talloc_free(obj_field_name); if(err == json_tokener_success) { return current; + } else { + mprDestroyVar(¤t); + *err_p = err; + return mprCreateUndefinedVar(); } - mprDestroyVar(¤t); - *err_p = err; - return mprCreateUndefinedVar(); } diff --git a/source4/scripting/ejs/smbcalls.c b/source4/scripting/ejs/smbcalls.c index 815b3e2b5d..b0df390427 100644 --- a/source4/scripting/ejs/smbcalls.c +++ b/source4/scripting/ejs/smbcalls.c @@ -203,39 +203,6 @@ static int jsonrpc_include(int eid, int argc, char **argv) } -static int ejs_debug(int eid, int argc, char **argv) -{ - int i; - int level; - void *ctx = mprMemCtx(); - char *msg; - - - if (argc < 2) { - return -1; - } - - level = atoi(argv[0]); - - msg = talloc_zero_size(ctx, 1); - if (msg == NULL) { - DEBUG(0, ("out of memory in debug()\n")); - return 0; - } - - for (i = 1; i < argc; i++) { - msg = talloc_append_string(ctx, msg, argv[i]); - if (msg == NULL) { - DEBUG(0, ("out of memory in debug()\n")); - return 0; - } - } - - DEBUG(level, ("%s", msg)); - talloc_free(msg); - return 0; -} - static void (*ejs_exception_handler) (const char *) = NULL; _PUBLIC_ void ejs_exception(const char *reason) @@ -273,6 +240,5 @@ void smb_setup_ejs_functions(void (*exception_handler)(const char *)) ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE); ejsDefineCFunction(-1, "version", ejs_version, NULL, MPR_VAR_SCRIPT_HANDLE); ejsDefineStringCFunction(-1, "jsonrpc_include", jsonrpc_include, NULL, MPR_VAR_SCRIPT_HANDLE); - ejsDefineStringCFunction(-1, "debug", ejs_debug, NULL, MPR_VAR_SCRIPT_HANDLE); } |