@@ -378,10 +378,12 @@
378 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** schema for the ticketing system. Only allow
379 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
380 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CREATE TABLE
381 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CREATE INDEX
382 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CREATE VIEW
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** DROP INDEX
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** DROP VIEW
383 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
384 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** And for objects in "main" or "repository" whose names
385 387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** begin with "ticket" or "fx_". Also allow
386 388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
387 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** INSERT
@@ -393,10 +395,13 @@
393 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
394 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Of particular importance for security is that this routine
395 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** disallows data changes on the "config" table, as that could
396 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** allow a malicious server to modify settings in such a way as
397 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to cause a remote code execution.
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the "fossil test-db-prepare --auth-ticket SQL" command to perform
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** manual testing of this authorizer.
398 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
399 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int ticket_schema_auth(
400 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pNErr,
401 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eCode,
402 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z0,
@@ -403,10 +408,11 @@
403 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z1,
404 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z2,
405 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z3
406 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
407 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( eCode ){
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_DROP_VIEW:
408 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_CREATE_VIEW:
409 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_CREATE_TABLE: {
410 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3_stricmp(z2,"main")!=0
411 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& sqlite3_stricmp(z2,"repository")!=0
412 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -417,10 +423,11 @@
417 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
418 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto ticket_schema_error;
419 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
420 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
421 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_DROP_INDEX:
422 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_CREATE_INDEX: {
423 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3_stricmp(z2,"main")!=0
424 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& sqlite3_stricmp(z2,"repository")!=0
425 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
426 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto ticket_schema_error;
@@ -463,10 +470,24 @@
463 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ticket_schema_error:
464 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNErr ) *(int*)pNErr = 1;
465 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_DENY;
466 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
467 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Activate the ticket schema authorizer. Must be followed by
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an eventual call to ticket_unrestrict_sql().
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ticket_restrict_sql(int * pNErr){
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set_authorizer(ticket_schema_auth,(void*)pNErr,"Ticket-Schema");
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Deactivate the ticket schema authorizer.
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void ticket_unrestrict_sql(void){
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_clear_authorizer();
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
468 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
469 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
470 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Recreate the TICKET and TICKETCHNG tables.
471 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
472 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void ticket_create_table(int separateConnection){
@@ -475,18 +496,18 @@
475 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
476 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DROP TABLE IF EXISTS ticket;"
477 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DROP TABLE IF EXISTS ticketchng;"
478 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
479 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = ticket_table_schema();
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_set_authorizer(ticket_schema_auth,0,"Ticket-Schema");
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ticket_restrict_sql(0);
481 502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( separateConnection ){
482 503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_transaction_nesting_depth() ) db_end_transaction(0);
483 504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_init_database(g.zRepositoryName, zSql, 0);
484 505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
485 506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("%s", zSql/*safe-for-%s*/);
486 507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_clear_authorizer();
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ticket_unrestrict_sql();
488 509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zSql);
489 510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
490 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
491 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
492 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Repopulate the TICKET and TICKETCHNG tables from scratch using all
493 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!