Fossil SCM
Restrict the TH1 "query" command to be read-only and to only be able to see a specific subset of tables in the repository database file.
Commit
2056f624c0f88985929afcc8683f34376b243672
Parent
8e31adafad2b883…
2 files changed
+1
+7
-2
+1
| --- src/report.c | ||
| +++ src/report.c | ||
| @@ -172,10 +172,11 @@ | ||
| 172 | 172 | break; |
| 173 | 173 | } |
| 174 | 174 | case SQLITE_READ: { |
| 175 | 175 | static const char *const azAllowed[] = { |
| 176 | 176 | "ticket", |
| 177 | + "ticketchng", | |
| 177 | 178 | "blob", |
| 178 | 179 | "filename", |
| 179 | 180 | "mlink", |
| 180 | 181 | "plink", |
| 181 | 182 | "event", |
| 182 | 183 |
| --- src/report.c | |
| +++ src/report.c | |
| @@ -172,10 +172,11 @@ | |
| 172 | break; |
| 173 | } |
| 174 | case SQLITE_READ: { |
| 175 | static const char *const azAllowed[] = { |
| 176 | "ticket", |
| 177 | "blob", |
| 178 | "filename", |
| 179 | "mlink", |
| 180 | "plink", |
| 181 | "event", |
| 182 |
| --- src/report.c | |
| +++ src/report.c | |
| @@ -172,10 +172,11 @@ | |
| 172 | break; |
| 173 | } |
| 174 | case SQLITE_READ: { |
| 175 | static const char *const azAllowed[] = { |
| 176 | "ticket", |
| 177 | "ticketchng", |
| 178 | "blob", |
| 179 | "filename", |
| 180 | "mlink", |
| 181 | "plink", |
| 182 | "event", |
| 183 |
+7
-2
| --- src/th_main.c | ||
| +++ src/th_main.c | ||
| @@ -607,10 +607,11 @@ | ||
| 607 | 607 | int nSql; |
| 608 | 608 | const char *zTail; |
| 609 | 609 | int n, i; |
| 610 | 610 | int res = TH_OK; |
| 611 | 611 | int nVar; |
| 612 | + char *zErr = 0; | |
| 612 | 613 | |
| 613 | 614 | if( argc!=3 ){ |
| 614 | 615 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 615 | 616 | } |
| 616 | 617 | if( g.db==0 ){ |
| @@ -618,13 +619,17 @@ | ||
| 618 | 619 | return TH_ERROR; |
| 619 | 620 | } |
| 620 | 621 | zSql = argv[1]; |
| 621 | 622 | nSql = argl[1]; |
| 622 | 623 | while( res==TH_OK && nSql>0 ){ |
| 624 | + zErr = 0; | |
| 625 | + sqlite3_set_authorizer(g.db, report_query_authorizer, (void*)&zErr); | |
| 623 | 626 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 624 | - if( rc!=0 ){ | |
| 625 | - Th_ErrorMessage(interp, "SQL error: ", sqlite3_errmsg(g.db), -1); | |
| 627 | + sqlite3_set_authorizer(g.db, 0, 0); | |
| 628 | + if( rc!=0 || zErr!=0 ){ | |
| 629 | + Th_ErrorMessage(interp, "SQL error: ", | |
| 630 | + zErr ? zErr : sqlite3_errmsg(g.db), -1); | |
| 626 | 631 | return TH_ERROR; |
| 627 | 632 | } |
| 628 | 633 | n = (int)(zTail - zSql); |
| 629 | 634 | zSql += n; |
| 630 | 635 | nSql -= n; |
| 631 | 636 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -607,10 +607,11 @@ | |
| 607 | int nSql; |
| 608 | const char *zTail; |
| 609 | int n, i; |
| 610 | int res = TH_OK; |
| 611 | int nVar; |
| 612 | |
| 613 | if( argc!=3 ){ |
| 614 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 615 | } |
| 616 | if( g.db==0 ){ |
| @@ -618,13 +619,17 @@ | |
| 618 | return TH_ERROR; |
| 619 | } |
| 620 | zSql = argv[1]; |
| 621 | nSql = argl[1]; |
| 622 | while( res==TH_OK && nSql>0 ){ |
| 623 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 624 | if( rc!=0 ){ |
| 625 | Th_ErrorMessage(interp, "SQL error: ", sqlite3_errmsg(g.db), -1); |
| 626 | return TH_ERROR; |
| 627 | } |
| 628 | n = (int)(zTail - zSql); |
| 629 | zSql += n; |
| 630 | nSql -= n; |
| 631 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -607,10 +607,11 @@ | |
| 607 | int nSql; |
| 608 | const char *zTail; |
| 609 | int n, i; |
| 610 | int res = TH_OK; |
| 611 | int nVar; |
| 612 | char *zErr = 0; |
| 613 | |
| 614 | if( argc!=3 ){ |
| 615 | return Th_WrongNumArgs(interp, "query SQL CODE"); |
| 616 | } |
| 617 | if( g.db==0 ){ |
| @@ -618,13 +619,17 @@ | |
| 619 | return TH_ERROR; |
| 620 | } |
| 621 | zSql = argv[1]; |
| 622 | nSql = argl[1]; |
| 623 | while( res==TH_OK && nSql>0 ){ |
| 624 | zErr = 0; |
| 625 | sqlite3_set_authorizer(g.db, report_query_authorizer, (void*)&zErr); |
| 626 | rc = sqlite3_prepare_v2(g.db, argv[1], argl[1], &pStmt, &zTail); |
| 627 | sqlite3_set_authorizer(g.db, 0, 0); |
| 628 | if( rc!=0 || zErr!=0 ){ |
| 629 | Th_ErrorMessage(interp, "SQL error: ", |
| 630 | zErr ? zErr : sqlite3_errmsg(g.db), -1); |
| 631 | return TH_ERROR; |
| 632 | } |
| 633 | n = (int)(zTail - zSql); |
| 634 | zSql += n; |
| 635 | nSql -= n; |
| 636 |