@@ -226,10 +226,56 @@
226 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
227 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int json_setenv( char const * zKey, cson_value * v ){
228 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cson_object_set( g.json.param.o, zKey, v );
229 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
230 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Guesses a RESPONSE Content-Type value based (primarily) on the
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HTTP_ACCEPT header.
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It will try to figure out if the client can support
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** application/json or application/javascript, and will fall back to
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** text/plain if it cannot figure out anything more specific.
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returned memory is static and immutable.
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * json_guess_content_type(){
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * cset;
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char doUtf8;
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cset = PD("HTTP_ACCEPT_CHARSET",NULL);
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doUtf8 = ((NULL == cset) || (NULL!=strstr("utf-8",cset)))
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? 1 : 0;
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.json.jsonp ){
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return doUtf8
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? "application/javascript; charset=utf-8"
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : "application/javascript";
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Content-type
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If the browser does not sent an ACCEPT for application/json
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ then we fall back to text/plain.
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * cstr;
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cstr = PD("HTTP_ACCEPT",NULL);
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( NULL == cstr ){
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return doUtf8
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? "application/json; charset=utf-8"
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : "application/json";
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strstr( cstr, "application/json" )
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || strstr( cstr, "*/*" ) ){
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return doUtf8
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? "application/json; charset=utf-8"
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : "application/json";
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "text/plain";
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
231 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
232 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
233 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns the current request's JSON authentication token, or NULL if
234 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** none is found. The token's memory is owned by (or shared with)
235 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** g.json.
@@ -320,11 +366,10 @@
320 366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
321 367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void json_mode_bootstrap(){
322 368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char once = 0 /* guard against multiple runs */;
323 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * zPath = P("PATH_INFO");
324 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * pathSplit = NULL;
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array * ar = NULL;
326 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (0==once) && "json_mode_bootstrap() called too many times!");
327 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( once ){
328 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
329 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
330 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
once = 1;
@@ -334,17 +379,24 @@
334 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.cmd.offset = -1;
335 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.isCGI && g.fullHttpReply ){
336 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* workaround for server mode, so we see it as CGI mode. */
337 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.isCGI = 1;
338 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(! g.json.post.v ){
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If cgi_init() reads POSTed JSON then it sets the content type.
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If it did not then we need to set it.
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_set_content_type(json_guess_content_type());
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
339 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(NDEBUG)
340 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* avoids debug messages on stderr in JSON mode */
341 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_config(SQLITE_CONFIG_LOG, NULL, 0);
342 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
343 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
344 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.cmd.v = cson_value_new_array();
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ar = g.json.cmd.a = cson_value_get_array(g.json.cmd.v);
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.cmd.a = cson_value_get_array(g.json.cmd.v);
346 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_gc_add( FossilJsonKeys.commandPath, g.json.cmd.v, 1 );
347 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
348 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
The following if/else block translates the PATH_INFO path (in
349 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CLI/server modes) or g.argv (CLI mode) into an internal list so
350 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that we can simplify command dispatching later on.
@@ -351,20 +403,17 @@
351 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
352 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Note that translating g.argv this way is overkill but allows us to
353 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
avoid CLI-only special-case handling in other code, e.g.
354 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_command_arg().
355 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zPath ){/* either CLI or server mode... */
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Translate fossil's PATH_INFO into cson_cgi for later
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- convenience, to help consolidate how we handle CGI/server
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- modes. This block is hit when running in plain server mode.
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zPath ){/* Either CGI or server mode... */
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Translate PATH_INFO into JSON for later convenience. */
361 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * p = zPath /* current byte */;
362 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * head = p /* current start-of-token */;
363 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int len = 0 /* current token's lengh */;
364 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( g.isCGI && "g.isCGI should have been set by now." );
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for( ;*p!='?'; ++p){
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( ; ; ++p){
366 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !*p || ('/' == *p) ){
367 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( len ){
368 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * part;
369 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char * zPart;
370 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( head != p );
@@ -373,11 +422,11 @@
373 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(zPart, head, len);
374 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPart[len] = 0;
375 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dehttpize(zPart);
376 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
part = cson_value_new_string(zPart, strlen(zPart));
377 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zPart);
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array_append( ar, part );
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array_append( g.json.cmd.a, part );
379 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
len = 0;
380 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
381 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !*p ){
382 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
383 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -394,11 +443,11 @@
394 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
arg = g.argv[i];
395 444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !arg || !*arg ){
396 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
397 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
398 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
part = cson_value_new_string(arg,strlen(arg));
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array_append(ar, part);
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array_append(g.json.cmd.a, part);
400 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
401 450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
402 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
403 452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* g.json.reqPayload exists only to simplify some of our access to
404 453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the request payload. We currently only use this in the context of
@@ -408,10 +457,31 @@
408 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.reqPayload.o = cson_value_get_object( g.json.reqPayload.v )
409 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* g.json.reqPayload.o may legally be NULL, which means only that
410 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.reqPayload.v is-not-a Object.
411 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/;
412 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do{/* set up JSON out formatting options. */
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned char indent = g.isCGI ? 0 : 1;
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value const * indentV = json_getenv("indent");
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(indentV){
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cson_value_is_string(indentV)){
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = atoi(cson_string_cstr(cson_value_get_string(indentV)));
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ indent = (n>0)
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? (unsigned char)n
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : 0;
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(cson_value_is_number(indentV)){
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double n = cson_value_get_integer(indentV);
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ indent = (n>0)
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? (unsigned char)n
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : 0;
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.outOpt.indentation = indent;
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.outOpt.addNewline = g.isCGI ? 0 : 1;
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while(0);
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
413 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_auth_token()/* will copy our auth token, if any, to fossil's core. */;
414 484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.isCGI ){
415 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials()/* populates g.perm */;
416 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
417 487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else{
@@ -930,20 +1000,21 @@
930 1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
931 1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * json_page_stat(void){
932 1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 t, fsize;
933 1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n, m;
934 1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zDb;
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- enum { BufLen = 200 };
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ enum { BufLen = 1000 };
936 1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zBuf[BufLen];
937 1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * jv = NULL;
938 1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_object * jo = NULL;
939 1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * jv2 = NULL;
940 1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_object * jo2 = NULL;
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0 /* FIXME: credentials */
942 1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !g.okRead ){ login_needed(); return NULL; }
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.perm.Read ){
1013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.resultCode = FSL_JSON_E_DENIED;
1014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return NULL;
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
945 1016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SETBUF(O,K) cson_object_set(O, K, cson_value_new_string(zBuf, strlen(zBuf)));
946 1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
947 1018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jv = cson_value_new_object();
948 1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jo = cson_value_get_object(jv);
949 1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -1116,10 +1187,19 @@
1116 1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void json_cmd_top(void){
1117 1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * cmd = NULL;
1118 1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 1002;
1119 1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * payload = NULL;
1120 1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
JsonPageDef const * pageDef;
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset( &g.perm, 0xff, sizeof(g.perm) )
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* In CLI mode fossil does not use permissions
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and they all default to false. We enable them
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ here because (A) fossil doesn't use them in local
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mode but (B) having them set gives us one less
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ difference in the CLI/CGI/Server-mode JSON
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ handling.
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
1121 1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_main_bootstrap();
1122 1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_mode_bootstrap();
1123 1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc<3 ){
1124 1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto usage;
1125 1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1126 1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!