Fossil SCM
Simple test cases for configuration sync are now working.
Commit
bef34a6940b916316d7d3a73a9383dd02b96e116
Parent
9d35e1dbf0a3ee6…
6 files changed
+10
-10
+39
-25
+1
-1
+4
-3
+9
-8
+3
-3
+10
-10
| --- src/configure.c | ||
| +++ src/configure.c | ||
| @@ -583,16 +583,16 @@ | ||
| 583 | 583 | blob_zero(&rec); |
| 584 | 584 | if( groupMask & CONFIGSET_SHUN ){ |
| 585 | 585 | db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun" |
| 586 | 586 | " WHERE mtime>=%lld", iStart); |
| 587 | 587 | while( db_step(&q)==SQLITE_ROW ){ |
| 588 | - blob_appendf(&rec,"%s %s scom %s\n", | |
| 588 | + blob_appendf(&rec,"%s %s scom %s", | |
| 589 | 589 | db_column_text(&q, 0), |
| 590 | 590 | db_column_text(&q, 1), |
| 591 | 591 | db_column_text(&q, 2) |
| 592 | 592 | ); |
| 593 | - blob_appendf(pOut, "config /shun %d\n%s", | |
| 593 | + blob_appendf(pOut, "config /shun %d\n%s\n", | |
| 594 | 594 | blob_size(&rec), blob_str(&rec)); |
| 595 | 595 | nCard++; |
| 596 | 596 | blob_reset(&rec); |
| 597 | 597 | } |
| 598 | 598 | db_finalize(&q); |
| @@ -600,19 +600,19 @@ | ||
| 600 | 600 | if( groupMask & CONFIGSET_USER ){ |
| 601 | 601 | db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap)," |
| 602 | 602 | " quote(info), quote(photo) FROM user" |
| 603 | 603 | " WHERE mtime>=%lld", iStart); |
| 604 | 604 | while( db_step(&q)==SQLITE_ROW ){ |
| 605 | - blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s\n", | |
| 605 | + blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s", | |
| 606 | 606 | db_column_text(&q, 0), |
| 607 | 607 | db_column_text(&q, 1), |
| 608 | 608 | db_column_text(&q, 2), |
| 609 | 609 | db_column_text(&q, 3), |
| 610 | 610 | db_column_text(&q, 4), |
| 611 | 611 | db_column_text(&q, 5) |
| 612 | 612 | ); |
| 613 | - blob_appendf(pOut, "config /user %d\n%s", | |
| 613 | + blob_appendf(pOut, "config /user %d\n%s\n", | |
| 614 | 614 | blob_size(&rec), blob_str(&rec)); |
| 615 | 615 | nCard++; |
| 616 | 616 | blob_reset(&rec); |
| 617 | 617 | } |
| 618 | 618 | db_finalize(&q); |
| @@ -620,18 +620,18 @@ | ||
| 620 | 620 | if( groupMask & CONFIGSET_TKT ){ |
| 621 | 621 | db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols)," |
| 622 | 622 | " quote(sqlcode) FROM reportfmt" |
| 623 | 623 | " WHERE mtime>=%lld", iStart); |
| 624 | 624 | while( db_step(&q)==SQLITE_ROW ){ |
| 625 | - blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s\n", | |
| 625 | + blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s", | |
| 626 | 626 | db_column_text(&q, 0), |
| 627 | 627 | db_column_text(&q, 1), |
| 628 | 628 | db_column_text(&q, 2), |
| 629 | 629 | db_column_text(&q, 3), |
| 630 | 630 | db_column_text(&q, 4) |
| 631 | 631 | ); |
| 632 | - blob_appendf(pOut, "config /reportfmt %d\n%s", | |
| 632 | + blob_appendf(pOut, "config /reportfmt %d\n%s\n", | |
| 633 | 633 | blob_size(&rec), blob_str(&rec)); |
| 634 | 634 | nCard++; |
| 635 | 635 | blob_reset(&rec); |
| 636 | 636 | } |
| 637 | 637 | db_finalize(&q); |
| @@ -638,16 +638,16 @@ | ||
| 638 | 638 | } |
| 639 | 639 | if( groupMask & CONFIGSET_ADDR ){ |
| 640 | 640 | db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed" |
| 641 | 641 | " WHERE mtime>=%lld", iStart); |
| 642 | 642 | while( db_step(&q)==SQLITE_ROW ){ |
| 643 | - blob_appendf(&rec,"%s %s content %s\n", | |
| 643 | + blob_appendf(&rec,"%s %s content %s", | |
| 644 | 644 | db_column_text(&q, 0), |
| 645 | 645 | db_column_text(&q, 1), |
| 646 | 646 | db_column_text(&q, 2) |
| 647 | 647 | ); |
| 648 | - blob_appendf(pOut, "config /concealed %d\n%s", | |
| 648 | + blob_appendf(pOut, "config /concealed %d\n%s\n", | |
| 649 | 649 | blob_size(&rec), blob_str(&rec)); |
| 650 | 650 | nCard++; |
| 651 | 651 | blob_reset(&rec); |
| 652 | 652 | } |
| 653 | 653 | db_finalize(&q); |
| @@ -656,16 +656,16 @@ | ||
| 656 | 656 | " WHERE name=:name AND mtime>=%lld", iStart); |
| 657 | 657 | for(ii=0; ii<count(aConfig); ii++){ |
| 658 | 658 | if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){ |
| 659 | 659 | db_bind_text(&q, ":name", aConfig[ii].zName); |
| 660 | 660 | while( db_step(&q)==SQLITE_ROW ){ |
| 661 | - blob_appendf(&rec,"%s %s value %s\n", | |
| 661 | + blob_appendf(&rec,"%s %s value %s", | |
| 662 | 662 | db_column_text(&q, 0), |
| 663 | 663 | db_column_text(&q, 1), |
| 664 | 664 | db_column_text(&q, 2) |
| 665 | 665 | ); |
| 666 | - blob_appendf(pOut, "config /config %d\n%s", | |
| 666 | + blob_appendf(pOut, "config /config %d\n%s\n", | |
| 667 | 667 | blob_size(&rec), blob_str(&rec)); |
| 668 | 668 | nCard++; |
| 669 | 669 | blob_reset(&rec); |
| 670 | 670 | } |
| 671 | 671 | db_reset(&q); |
| 672 | 672 |
| --- src/configure.c | |
| +++ src/configure.c | |
| @@ -583,16 +583,16 @@ | |
| 583 | blob_zero(&rec); |
| 584 | if( groupMask & CONFIGSET_SHUN ){ |
| 585 | db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun" |
| 586 | " WHERE mtime>=%lld", iStart); |
| 587 | while( db_step(&q)==SQLITE_ROW ){ |
| 588 | blob_appendf(&rec,"%s %s scom %s\n", |
| 589 | db_column_text(&q, 0), |
| 590 | db_column_text(&q, 1), |
| 591 | db_column_text(&q, 2) |
| 592 | ); |
| 593 | blob_appendf(pOut, "config /shun %d\n%s", |
| 594 | blob_size(&rec), blob_str(&rec)); |
| 595 | nCard++; |
| 596 | blob_reset(&rec); |
| 597 | } |
| 598 | db_finalize(&q); |
| @@ -600,19 +600,19 @@ | |
| 600 | if( groupMask & CONFIGSET_USER ){ |
| 601 | db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap)," |
| 602 | " quote(info), quote(photo) FROM user" |
| 603 | " WHERE mtime>=%lld", iStart); |
| 604 | while( db_step(&q)==SQLITE_ROW ){ |
| 605 | blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s\n", |
| 606 | db_column_text(&q, 0), |
| 607 | db_column_text(&q, 1), |
| 608 | db_column_text(&q, 2), |
| 609 | db_column_text(&q, 3), |
| 610 | db_column_text(&q, 4), |
| 611 | db_column_text(&q, 5) |
| 612 | ); |
| 613 | blob_appendf(pOut, "config /user %d\n%s", |
| 614 | blob_size(&rec), blob_str(&rec)); |
| 615 | nCard++; |
| 616 | blob_reset(&rec); |
| 617 | } |
| 618 | db_finalize(&q); |
| @@ -620,18 +620,18 @@ | |
| 620 | if( groupMask & CONFIGSET_TKT ){ |
| 621 | db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols)," |
| 622 | " quote(sqlcode) FROM reportfmt" |
| 623 | " WHERE mtime>=%lld", iStart); |
| 624 | while( db_step(&q)==SQLITE_ROW ){ |
| 625 | blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s\n", |
| 626 | db_column_text(&q, 0), |
| 627 | db_column_text(&q, 1), |
| 628 | db_column_text(&q, 2), |
| 629 | db_column_text(&q, 3), |
| 630 | db_column_text(&q, 4) |
| 631 | ); |
| 632 | blob_appendf(pOut, "config /reportfmt %d\n%s", |
| 633 | blob_size(&rec), blob_str(&rec)); |
| 634 | nCard++; |
| 635 | blob_reset(&rec); |
| 636 | } |
| 637 | db_finalize(&q); |
| @@ -638,16 +638,16 @@ | |
| 638 | } |
| 639 | if( groupMask & CONFIGSET_ADDR ){ |
| 640 | db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed" |
| 641 | " WHERE mtime>=%lld", iStart); |
| 642 | while( db_step(&q)==SQLITE_ROW ){ |
| 643 | blob_appendf(&rec,"%s %s content %s\n", |
| 644 | db_column_text(&q, 0), |
| 645 | db_column_text(&q, 1), |
| 646 | db_column_text(&q, 2) |
| 647 | ); |
| 648 | blob_appendf(pOut, "config /concealed %d\n%s", |
| 649 | blob_size(&rec), blob_str(&rec)); |
| 650 | nCard++; |
| 651 | blob_reset(&rec); |
| 652 | } |
| 653 | db_finalize(&q); |
| @@ -656,16 +656,16 @@ | |
| 656 | " WHERE name=:name AND mtime>=%lld", iStart); |
| 657 | for(ii=0; ii<count(aConfig); ii++){ |
| 658 | if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){ |
| 659 | db_bind_text(&q, ":name", aConfig[ii].zName); |
| 660 | while( db_step(&q)==SQLITE_ROW ){ |
| 661 | blob_appendf(&rec,"%s %s value %s\n", |
| 662 | db_column_text(&q, 0), |
| 663 | db_column_text(&q, 1), |
| 664 | db_column_text(&q, 2) |
| 665 | ); |
| 666 | blob_appendf(pOut, "config /config %d\n%s", |
| 667 | blob_size(&rec), blob_str(&rec)); |
| 668 | nCard++; |
| 669 | blob_reset(&rec); |
| 670 | } |
| 671 | db_reset(&q); |
| 672 |
| --- src/configure.c | |
| +++ src/configure.c | |
| @@ -583,16 +583,16 @@ | |
| 583 | blob_zero(&rec); |
| 584 | if( groupMask & CONFIGSET_SHUN ){ |
| 585 | db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun" |
| 586 | " WHERE mtime>=%lld", iStart); |
| 587 | while( db_step(&q)==SQLITE_ROW ){ |
| 588 | blob_appendf(&rec,"%s %s scom %s", |
| 589 | db_column_text(&q, 0), |
| 590 | db_column_text(&q, 1), |
| 591 | db_column_text(&q, 2) |
| 592 | ); |
| 593 | blob_appendf(pOut, "config /shun %d\n%s\n", |
| 594 | blob_size(&rec), blob_str(&rec)); |
| 595 | nCard++; |
| 596 | blob_reset(&rec); |
| 597 | } |
| 598 | db_finalize(&q); |
| @@ -600,19 +600,19 @@ | |
| 600 | if( groupMask & CONFIGSET_USER ){ |
| 601 | db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap)," |
| 602 | " quote(info), quote(photo) FROM user" |
| 603 | " WHERE mtime>=%lld", iStart); |
| 604 | while( db_step(&q)==SQLITE_ROW ){ |
| 605 | blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s", |
| 606 | db_column_text(&q, 0), |
| 607 | db_column_text(&q, 1), |
| 608 | db_column_text(&q, 2), |
| 609 | db_column_text(&q, 3), |
| 610 | db_column_text(&q, 4), |
| 611 | db_column_text(&q, 5) |
| 612 | ); |
| 613 | blob_appendf(pOut, "config /user %d\n%s\n", |
| 614 | blob_size(&rec), blob_str(&rec)); |
| 615 | nCard++; |
| 616 | blob_reset(&rec); |
| 617 | } |
| 618 | db_finalize(&q); |
| @@ -620,18 +620,18 @@ | |
| 620 | if( groupMask & CONFIGSET_TKT ){ |
| 621 | db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols)," |
| 622 | " quote(sqlcode) FROM reportfmt" |
| 623 | " WHERE mtime>=%lld", iStart); |
| 624 | while( db_step(&q)==SQLITE_ROW ){ |
| 625 | blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s", |
| 626 | db_column_text(&q, 0), |
| 627 | db_column_text(&q, 1), |
| 628 | db_column_text(&q, 2), |
| 629 | db_column_text(&q, 3), |
| 630 | db_column_text(&q, 4) |
| 631 | ); |
| 632 | blob_appendf(pOut, "config /reportfmt %d\n%s\n", |
| 633 | blob_size(&rec), blob_str(&rec)); |
| 634 | nCard++; |
| 635 | blob_reset(&rec); |
| 636 | } |
| 637 | db_finalize(&q); |
| @@ -638,16 +638,16 @@ | |
| 638 | } |
| 639 | if( groupMask & CONFIGSET_ADDR ){ |
| 640 | db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed" |
| 641 | " WHERE mtime>=%lld", iStart); |
| 642 | while( db_step(&q)==SQLITE_ROW ){ |
| 643 | blob_appendf(&rec,"%s %s content %s", |
| 644 | db_column_text(&q, 0), |
| 645 | db_column_text(&q, 1), |
| 646 | db_column_text(&q, 2) |
| 647 | ); |
| 648 | blob_appendf(pOut, "config /concealed %d\n%s\n", |
| 649 | blob_size(&rec), blob_str(&rec)); |
| 650 | nCard++; |
| 651 | blob_reset(&rec); |
| 652 | } |
| 653 | db_finalize(&q); |
| @@ -656,16 +656,16 @@ | |
| 656 | " WHERE name=:name AND mtime>=%lld", iStart); |
| 657 | for(ii=0; ii<count(aConfig); ii++){ |
| 658 | if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){ |
| 659 | db_bind_text(&q, ":name", aConfig[ii].zName); |
| 660 | while( db_step(&q)==SQLITE_ROW ){ |
| 661 | blob_appendf(&rec,"%s %s value %s", |
| 662 | db_column_text(&q, 0), |
| 663 | db_column_text(&q, 1), |
| 664 | db_column_text(&q, 2) |
| 665 | ); |
| 666 | blob_appendf(pOut, "config /config %d\n%s\n", |
| 667 | blob_size(&rec), blob_str(&rec)); |
| 668 | nCard++; |
| 669 | blob_reset(&rec); |
| 670 | } |
| 671 | db_reset(&q); |
| 672 |
+39
-25
| --- src/rebuild.c | ||
| +++ src/rebuild.c | ||
| @@ -82,66 +82,80 @@ | ||
| 82 | 82 | @ ); |
| 83 | 83 | ; |
| 84 | 84 | |
| 85 | 85 | static void rebuild_update_schema(void){ |
| 86 | 86 | int rc; |
| 87 | - sqlite3_stmt *pStmt; | |
| 88 | 87 | db_multi_exec(zSchemaUpdates1); |
| 89 | 88 | db_multi_exec(zSchemaUpdates2); |
| 90 | 89 | |
| 91 | - rc = sqlite3_prepare(g.db, "SELECT mtime FROM user", -1, &pStmt, 0); | |
| 92 | - sqlite3_finalize(pStmt); | |
| 93 | - if( rc==SQLITE_ERROR ){ | |
| 90 | + rc = db_exists("SELECT 1 FROM sqlite_master" | |
| 91 | + " WHERE name='user' AND sql GLOB '* mtime *'"); | |
| 92 | + if( rc==0 ){ | |
| 94 | 93 | db_multi_exec( |
| 95 | - "ALTER TABLE user ADD COLUMN mtime INTEGER;" | |
| 96 | - "UPDATE user SET mtime=(SELECT strftime('%%s','now'));" | |
| 94 | + "CREATE TEMP TABLE temp_user AS SELECT * FROM user;" | |
| 95 | + "DROP TABLE user;" | |
| 96 | + "CREATE TABLE user(\n" | |
| 97 | + " uid INTEGER PRIMARY KEY,\n" | |
| 98 | + " login TEXT UNIQUE,\n" | |
| 99 | + " pw TEXT,\n" | |
| 100 | + " cap TEXT,\n" | |
| 101 | + " cookie TEXT,\n" | |
| 102 | + " ipaddr TEXT,\n" | |
| 103 | + " cexpire DATETIME,\n" | |
| 104 | + " info TEXT,\n" | |
| 105 | + " mtime DATE,\n" | |
| 106 | + " photo BLOB\n" | |
| 107 | + ");" | |
| 108 | + "INSERT OR IGNORE INTO user" | |
| 109 | + " SELECT uid, login, pw, cap, cookie," | |
| 110 | + " ipaddr, cexpire, info, now(), photo FROM temp_user;" | |
| 111 | + "DROP TABLE temp_user;" | |
| 97 | 112 | ); |
| 98 | 113 | } |
| 99 | 114 | |
| 100 | - rc = sqlite3_prepare(g.db, "SELECT mtime FROM config", -1, &pStmt, 0); | |
| 101 | - sqlite3_finalize(pStmt); | |
| 102 | - if( rc==SQLITE_ERROR ){ | |
| 115 | + rc = db_exists("SELECT 1 FROM sqlite_master" | |
| 116 | + " WHERE name='config' AND sql GLOB '* mtime *'"); | |
| 117 | + if( rc==0 ){ | |
| 103 | 118 | db_multi_exec( |
| 104 | 119 | "ALTER TABLE config ADD COLUMN mtime INTEGER;" |
| 105 | - "UPDATE config SET mtime=(SELECT strftime('%%s','now'));" | |
| 120 | + "UPDATE config SET mtime=now();" | |
| 106 | 121 | ); |
| 107 | 122 | } |
| 108 | 123 | |
| 109 | - rc = sqlite3_prepare(g.db, "SELECT mtime FROM shun", -1, &pStmt, 0); | |
| 110 | - sqlite3_finalize(pStmt); | |
| 111 | - if( rc==SQLITE_ERROR ){ | |
| 124 | + rc = db_exists("SELECT 1 FROM sqlite_master" | |
| 125 | + " WHERE name='shun' AND sql GLOB '* mtime *'"); | |
| 126 | + if( rc==0 ){ | |
| 112 | 127 | db_multi_exec( |
| 113 | 128 | "ALTER TABLE shun ADD COLUMN mtime INTEGER;" |
| 114 | 129 | "ALTER TABLE shun ADD COLUMN scom TEXT;" |
| 115 | - "UPDATE shun SET mtime=(SELECT strftime('%%s','now'));" | |
| 130 | + "UPDATE shun SET mtime=now();" | |
| 116 | 131 | ); |
| 117 | 132 | } |
| 118 | 133 | |
| 119 | - rc = sqlite3_prepare(g.db, "SELECT mtime FROM reportfmt", -1, &pStmt, 0); | |
| 120 | - sqlite3_finalize(pStmt); | |
| 121 | - if( rc==SQLITE_ERROR ){ | |
| 134 | + rc = db_exists("SELECT 1 FROM sqlite_master" | |
| 135 | + " WHERE name='reportfmt' AND sql GLOB '* mtime *'"); | |
| 136 | + if( rc==0 ){ | |
| 122 | 137 | db_multi_exec( |
| 123 | 138 | "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;" |
| 124 | 139 | "DROP TABLE reportfmt;" |
| 125 | 140 | ); |
| 126 | 141 | db_multi_exec(zSchemaUpdates2); |
| 127 | 142 | db_multi_exec( |
| 128 | 143 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 129 | - " SELECT rn, owner, title, cols, sqlcode," | |
| 130 | - " (SELECT strftime('%%s','now')+0) FROM old_fmt;" | |
| 144 | + " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;" | |
| 131 | 145 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 132 | - " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode," | |
| 133 | - " (SELECT strftime('%%s','now')+0) FROM old_fmt;" | |
| 146 | + " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()" | |
| 147 | + " FROM old_fmt;" | |
| 134 | 148 | ); |
| 135 | 149 | } |
| 136 | 150 | |
| 137 | - rc = sqlite3_prepare(g.db, "SELECT mtime FROM concealed", -1, &pStmt, 0); | |
| 138 | - sqlite3_finalize(pStmt); | |
| 139 | - if( rc==SQLITE_ERROR ){ | |
| 151 | + rc = db_exists("SELECT 1 FROM sqlite_master" | |
| 152 | + " WHERE name='concealed' AND sql GLOB '* mtime *'"); | |
| 153 | + if( rc==0 ){ | |
| 140 | 154 | db_multi_exec( |
| 141 | 155 | "ALTER TABLE concealed ADD COLUMN mtime INTEGER;" |
| 142 | - "UPDATE concealed SET mtime=(SELECT strftime('%%s','now'));" | |
| 156 | + "UPDATE concealed SET mtime=now();" | |
| 143 | 157 | ); |
| 144 | 158 | } |
| 145 | 159 | } |
| 146 | 160 | |
| 147 | 161 | /* |
| 148 | 162 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -82,66 +82,80 @@ | |
| 82 | @ ); |
| 83 | ; |
| 84 | |
| 85 | static void rebuild_update_schema(void){ |
| 86 | int rc; |
| 87 | sqlite3_stmt *pStmt; |
| 88 | db_multi_exec(zSchemaUpdates1); |
| 89 | db_multi_exec(zSchemaUpdates2); |
| 90 | |
| 91 | rc = sqlite3_prepare(g.db, "SELECT mtime FROM user", -1, &pStmt, 0); |
| 92 | sqlite3_finalize(pStmt); |
| 93 | if( rc==SQLITE_ERROR ){ |
| 94 | db_multi_exec( |
| 95 | "ALTER TABLE user ADD COLUMN mtime INTEGER;" |
| 96 | "UPDATE user SET mtime=(SELECT strftime('%%s','now'));" |
| 97 | ); |
| 98 | } |
| 99 | |
| 100 | rc = sqlite3_prepare(g.db, "SELECT mtime FROM config", -1, &pStmt, 0); |
| 101 | sqlite3_finalize(pStmt); |
| 102 | if( rc==SQLITE_ERROR ){ |
| 103 | db_multi_exec( |
| 104 | "ALTER TABLE config ADD COLUMN mtime INTEGER;" |
| 105 | "UPDATE config SET mtime=(SELECT strftime('%%s','now'));" |
| 106 | ); |
| 107 | } |
| 108 | |
| 109 | rc = sqlite3_prepare(g.db, "SELECT mtime FROM shun", -1, &pStmt, 0); |
| 110 | sqlite3_finalize(pStmt); |
| 111 | if( rc==SQLITE_ERROR ){ |
| 112 | db_multi_exec( |
| 113 | "ALTER TABLE shun ADD COLUMN mtime INTEGER;" |
| 114 | "ALTER TABLE shun ADD COLUMN scom TEXT;" |
| 115 | "UPDATE shun SET mtime=(SELECT strftime('%%s','now'));" |
| 116 | ); |
| 117 | } |
| 118 | |
| 119 | rc = sqlite3_prepare(g.db, "SELECT mtime FROM reportfmt", -1, &pStmt, 0); |
| 120 | sqlite3_finalize(pStmt); |
| 121 | if( rc==SQLITE_ERROR ){ |
| 122 | db_multi_exec( |
| 123 | "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;" |
| 124 | "DROP TABLE reportfmt;" |
| 125 | ); |
| 126 | db_multi_exec(zSchemaUpdates2); |
| 127 | db_multi_exec( |
| 128 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 129 | " SELECT rn, owner, title, cols, sqlcode," |
| 130 | " (SELECT strftime('%%s','now')+0) FROM old_fmt;" |
| 131 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 132 | " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode," |
| 133 | " (SELECT strftime('%%s','now')+0) FROM old_fmt;" |
| 134 | ); |
| 135 | } |
| 136 | |
| 137 | rc = sqlite3_prepare(g.db, "SELECT mtime FROM concealed", -1, &pStmt, 0); |
| 138 | sqlite3_finalize(pStmt); |
| 139 | if( rc==SQLITE_ERROR ){ |
| 140 | db_multi_exec( |
| 141 | "ALTER TABLE concealed ADD COLUMN mtime INTEGER;" |
| 142 | "UPDATE concealed SET mtime=(SELECT strftime('%%s','now'));" |
| 143 | ); |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | /* |
| 148 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -82,66 +82,80 @@ | |
| 82 | @ ); |
| 83 | ; |
| 84 | |
| 85 | static void rebuild_update_schema(void){ |
| 86 | int rc; |
| 87 | db_multi_exec(zSchemaUpdates1); |
| 88 | db_multi_exec(zSchemaUpdates2); |
| 89 | |
| 90 | rc = db_exists("SELECT 1 FROM sqlite_master" |
| 91 | " WHERE name='user' AND sql GLOB '* mtime *'"); |
| 92 | if( rc==0 ){ |
| 93 | db_multi_exec( |
| 94 | "CREATE TEMP TABLE temp_user AS SELECT * FROM user;" |
| 95 | "DROP TABLE user;" |
| 96 | "CREATE TABLE user(\n" |
| 97 | " uid INTEGER PRIMARY KEY,\n" |
| 98 | " login TEXT UNIQUE,\n" |
| 99 | " pw TEXT,\n" |
| 100 | " cap TEXT,\n" |
| 101 | " cookie TEXT,\n" |
| 102 | " ipaddr TEXT,\n" |
| 103 | " cexpire DATETIME,\n" |
| 104 | " info TEXT,\n" |
| 105 | " mtime DATE,\n" |
| 106 | " photo BLOB\n" |
| 107 | ");" |
| 108 | "INSERT OR IGNORE INTO user" |
| 109 | " SELECT uid, login, pw, cap, cookie," |
| 110 | " ipaddr, cexpire, info, now(), photo FROM temp_user;" |
| 111 | "DROP TABLE temp_user;" |
| 112 | ); |
| 113 | } |
| 114 | |
| 115 | rc = db_exists("SELECT 1 FROM sqlite_master" |
| 116 | " WHERE name='config' AND sql GLOB '* mtime *'"); |
| 117 | if( rc==0 ){ |
| 118 | db_multi_exec( |
| 119 | "ALTER TABLE config ADD COLUMN mtime INTEGER;" |
| 120 | "UPDATE config SET mtime=now();" |
| 121 | ); |
| 122 | } |
| 123 | |
| 124 | rc = db_exists("SELECT 1 FROM sqlite_master" |
| 125 | " WHERE name='shun' AND sql GLOB '* mtime *'"); |
| 126 | if( rc==0 ){ |
| 127 | db_multi_exec( |
| 128 | "ALTER TABLE shun ADD COLUMN mtime INTEGER;" |
| 129 | "ALTER TABLE shun ADD COLUMN scom TEXT;" |
| 130 | "UPDATE shun SET mtime=now();" |
| 131 | ); |
| 132 | } |
| 133 | |
| 134 | rc = db_exists("SELECT 1 FROM sqlite_master" |
| 135 | " WHERE name='reportfmt' AND sql GLOB '* mtime *'"); |
| 136 | if( rc==0 ){ |
| 137 | db_multi_exec( |
| 138 | "CREATE TEMP TABLE old_fmt AS SELECT * FROM reportfmt;" |
| 139 | "DROP TABLE reportfmt;" |
| 140 | ); |
| 141 | db_multi_exec(zSchemaUpdates2); |
| 142 | db_multi_exec( |
| 143 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 144 | " SELECT rn, owner, title, cols, sqlcode, now() FROM old_fmt;" |
| 145 | "INSERT OR IGNORE INTO reportfmt(rn,owner,title,cols,sqlcode,mtime)" |
| 146 | " SELECT rn, owner, title || ' (' || rn || ')', cols, sqlcode, now()" |
| 147 | " FROM old_fmt;" |
| 148 | ); |
| 149 | } |
| 150 | |
| 151 | rc = db_exists("SELECT 1 FROM sqlite_master" |
| 152 | " WHERE name='concealed' AND sql GLOB '* mtime *'"); |
| 153 | if( rc==0 ){ |
| 154 | db_multi_exec( |
| 155 | "ALTER TABLE concealed ADD COLUMN mtime INTEGER;" |
| 156 | "UPDATE concealed SET mtime=now();" |
| 157 | ); |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | /* |
| 162 |
+1
-1
| --- src/schema.c | ||
| +++ src/schema.c | ||
| @@ -110,11 +110,11 @@ | ||
| 110 | 110 | @ -- hash based on the project-code, the user login, and the cleartext |
| 111 | 111 | @ -- password. |
| 112 | 112 | @ -- |
| 113 | 113 | @ CREATE TABLE user( |
| 114 | 114 | @ uid INTEGER PRIMARY KEY, -- User ID |
| 115 | -@ login TEXT, -- login name of the user | |
| 115 | +@ login TEXT UNIQUE, -- login name of the user | |
| 116 | 116 | @ pw TEXT, -- password |
| 117 | 117 | @ cap TEXT, -- Capabilities of this user |
| 118 | 118 | @ cookie TEXT, -- WWW login cookie |
| 119 | 119 | @ ipaddr TEXT, -- IP address for which cookie is valid |
| 120 | 120 | @ cexpire DATETIME, -- Time when cookie expires |
| 121 | 121 |
| --- src/schema.c | |
| +++ src/schema.c | |
| @@ -110,11 +110,11 @@ | |
| 110 | @ -- hash based on the project-code, the user login, and the cleartext |
| 111 | @ -- password. |
| 112 | @ -- |
| 113 | @ CREATE TABLE user( |
| 114 | @ uid INTEGER PRIMARY KEY, -- User ID |
| 115 | @ login TEXT, -- login name of the user |
| 116 | @ pw TEXT, -- password |
| 117 | @ cap TEXT, -- Capabilities of this user |
| 118 | @ cookie TEXT, -- WWW login cookie |
| 119 | @ ipaddr TEXT, -- IP address for which cookie is valid |
| 120 | @ cexpire DATETIME, -- Time when cookie expires |
| 121 |
| --- src/schema.c | |
| +++ src/schema.c | |
| @@ -110,11 +110,11 @@ | |
| 110 | @ -- hash based on the project-code, the user login, and the cleartext |
| 111 | @ -- password. |
| 112 | @ -- |
| 113 | @ CREATE TABLE user( |
| 114 | @ uid INTEGER PRIMARY KEY, -- User ID |
| 115 | @ login TEXT UNIQUE, -- login name of the user |
| 116 | @ pw TEXT, -- password |
| 117 | @ cap TEXT, -- Capabilities of this user |
| 118 | @ cookie TEXT, -- WWW login cookie |
| 119 | @ ipaddr TEXT, -- IP address for which cookie is valid |
| 120 | @ cexpire DATETIME, -- Time when cookie expires |
| 121 |
+4
-3
| --- src/setup.c | ||
| +++ src/setup.c | ||
| @@ -354,12 +354,12 @@ | ||
| 354 | 354 | style_footer(); |
| 355 | 355 | return; |
| 356 | 356 | } |
| 357 | 357 | login_verify_csrf_secret(); |
| 358 | 358 | db_multi_exec( |
| 359 | - "REPLACE INTO user(uid,login,info,pw,cap) " | |
| 360 | - "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s')", | |
| 359 | + "REPLACE INTO user(uid,login,info,pw,cap,mtime) " | |
| 360 | + "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())", | |
| 361 | 361 | uid, P("login"), P("info"), zPw, zCap |
| 362 | 362 | ); |
| 363 | 363 | if( atoi(PD("all","0"))>0 ){ |
| 364 | 364 | Blob sql; |
| 365 | 365 | char *zErr = 0; |
| @@ -375,11 +375,12 @@ | ||
| 375 | 375 | blob_appendf(&sql, |
| 376 | 376 | "UPDATE user SET login=%Q," |
| 377 | 377 | " pw=coalesce(shared_secret(%Q,%Q," |
| 378 | 378 | "(SELECT value FROM config WHERE name='project-code')),pw)," |
| 379 | 379 | " info=%Q," |
| 380 | - " cap=%Q" | |
| 380 | + " cap=%Q," | |
| 381 | + " mtime=now()" | |
| 381 | 382 | " WHERE login=%Q;", |
| 382 | 383 | zLogin, P("pw"), zLogin, P("info"), zCap, |
| 383 | 384 | zOldLogin |
| 384 | 385 | ); |
| 385 | 386 | login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr); |
| 386 | 387 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -354,12 +354,12 @@ | |
| 354 | style_footer(); |
| 355 | return; |
| 356 | } |
| 357 | login_verify_csrf_secret(); |
| 358 | db_multi_exec( |
| 359 | "REPLACE INTO user(uid,login,info,pw,cap) " |
| 360 | "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s')", |
| 361 | uid, P("login"), P("info"), zPw, zCap |
| 362 | ); |
| 363 | if( atoi(PD("all","0"))>0 ){ |
| 364 | Blob sql; |
| 365 | char *zErr = 0; |
| @@ -375,11 +375,12 @@ | |
| 375 | blob_appendf(&sql, |
| 376 | "UPDATE user SET login=%Q," |
| 377 | " pw=coalesce(shared_secret(%Q,%Q," |
| 378 | "(SELECT value FROM config WHERE name='project-code')),pw)," |
| 379 | " info=%Q," |
| 380 | " cap=%Q" |
| 381 | " WHERE login=%Q;", |
| 382 | zLogin, P("pw"), zLogin, P("info"), zCap, |
| 383 | zOldLogin |
| 384 | ); |
| 385 | login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr); |
| 386 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -354,12 +354,12 @@ | |
| 354 | style_footer(); |
| 355 | return; |
| 356 | } |
| 357 | login_verify_csrf_secret(); |
| 358 | db_multi_exec( |
| 359 | "REPLACE INTO user(uid,login,info,pw,cap,mtime) " |
| 360 | "VALUES(nullif(%d,0),%Q,%Q,%Q,'%s',now())", |
| 361 | uid, P("login"), P("info"), zPw, zCap |
| 362 | ); |
| 363 | if( atoi(PD("all","0"))>0 ){ |
| 364 | Blob sql; |
| 365 | char *zErr = 0; |
| @@ -375,11 +375,12 @@ | |
| 375 | blob_appendf(&sql, |
| 376 | "UPDATE user SET login=%Q," |
| 377 | " pw=coalesce(shared_secret(%Q,%Q," |
| 378 | "(SELECT value FROM config WHERE name='project-code')),pw)," |
| 379 | " info=%Q," |
| 380 | " cap=%Q," |
| 381 | " mtime=now()" |
| 382 | " WHERE login=%Q;", |
| 383 | zLogin, P("pw"), zLogin, P("info"), zCap, |
| 384 | zOldLogin |
| 385 | ); |
| 386 | login_group_sql(blob_str(&sql), "<li> ", " </li>\n", &zErr); |
| 387 |
+9
-8
| --- src/user.c | ||
| +++ src/user.c | ||
| @@ -204,12 +204,12 @@ | ||
| 204 | 204 | }else{ |
| 205 | 205 | prompt_for_password("password: ", &passwd, 1); |
| 206 | 206 | } |
| 207 | 207 | zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0); |
| 208 | 208 | db_multi_exec( |
| 209 | - "INSERT INTO user(login,pw,cap,info)" | |
| 210 | - "VALUES(%B,%Q,%B,%B)", | |
| 209 | + "INSERT INTO user(login,pw,cap,info,mtime)" | |
| 210 | + "VALUES(%B,%Q,%B,%B,now())", | |
| 211 | 211 | &login, zPw, &caps, &contact |
| 212 | 212 | ); |
| 213 | 213 | free(zPw); |
| 214 | 214 | }else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){ |
| 215 | 215 | user_select(); |
| @@ -249,11 +249,12 @@ | ||
| 249 | 249 | } |
| 250 | 250 | if( blob_size(&pw)==0 ){ |
| 251 | 251 | printf("password unchanged\n"); |
| 252 | 252 | }else{ |
| 253 | 253 | char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0); |
| 254 | - db_multi_exec("UPDATE user SET pw=%Q WHERE uid=%d", zSecret, uid); | |
| 254 | + db_multi_exec("UPDATE user SET pw=%Q, mtime=now() WHERE uid=%d", | |
| 255 | + zSecret, uid); | |
| 255 | 256 | free(zSecret); |
| 256 | 257 | } |
| 257 | 258 | }else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){ |
| 258 | 259 | int uid; |
| 259 | 260 | if( g.argc!=4 && g.argc!=5 ){ |
| @@ -263,12 +264,12 @@ | ||
| 263 | 264 | if( uid==0 ){ |
| 264 | 265 | fossil_fatal("no such user: %s", g.argv[3]); |
| 265 | 266 | } |
| 266 | 267 | if( g.argc==5 ){ |
| 267 | 268 | db_multi_exec( |
| 268 | - "UPDATE user SET cap=%Q WHERE uid=%d", g.argv[4], | |
| 269 | - uid | |
| 269 | + "UPDATE user SET cap=%Q, mtime=now() WHERE uid=%d", | |
| 270 | + g.argv[4], uid | |
| 270 | 271 | ); |
| 271 | 272 | } |
| 272 | 273 | printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid)); |
| 273 | 274 | }else{ |
| 274 | 275 | fossil_panic("user subcommand should be one of: " |
| @@ -340,12 +341,12 @@ | ||
| 340 | 341 | db_finalize(&s); |
| 341 | 342 | } |
| 342 | 343 | |
| 343 | 344 | if( g.userUid==0 ){ |
| 344 | 345 | db_multi_exec( |
| 345 | - "INSERT INTO user(login, pw, cap, info)" | |
| 346 | - "VALUES('anonymous', '', 'cfghjkmnoqw', '')" | |
| 346 | + "INSERT INTO user(login, pw, cap, info, mtime)" | |
| 347 | + "VALUES('anonymous', '', 'cfghjkmnoqw', '', now())" | |
| 347 | 348 | ); |
| 348 | 349 | g.userUid = db_last_insert_rowid(); |
| 349 | 350 | g.zLogin = "anonymous"; |
| 350 | 351 | } |
| 351 | 352 | } |
| @@ -364,11 +365,11 @@ | ||
| 364 | 365 | if( g.argc!=3 ) usage("REPOSITORY"); |
| 365 | 366 | db_open_repository(g.argv[2]); |
| 366 | 367 | sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0, |
| 367 | 368 | sha1_shared_secret_sql_function, 0, 0); |
| 368 | 369 | db_multi_exec( |
| 369 | - "UPDATE user SET pw=shared_secret(pw,login)" | |
| 370 | + "UPDATE user SET pw=shared_secret(pw,login), mtime=now()" | |
| 370 | 371 | " WHERE length(pw)>0 AND length(pw)!=40" |
| 371 | 372 | ); |
| 372 | 373 | } |
| 373 | 374 | |
| 374 | 375 | /* |
| 375 | 376 |
| --- src/user.c | |
| +++ src/user.c | |
| @@ -204,12 +204,12 @@ | |
| 204 | }else{ |
| 205 | prompt_for_password("password: ", &passwd, 1); |
| 206 | } |
| 207 | zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0); |
| 208 | db_multi_exec( |
| 209 | "INSERT INTO user(login,pw,cap,info)" |
| 210 | "VALUES(%B,%Q,%B,%B)", |
| 211 | &login, zPw, &caps, &contact |
| 212 | ); |
| 213 | free(zPw); |
| 214 | }else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){ |
| 215 | user_select(); |
| @@ -249,11 +249,12 @@ | |
| 249 | } |
| 250 | if( blob_size(&pw)==0 ){ |
| 251 | printf("password unchanged\n"); |
| 252 | }else{ |
| 253 | char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0); |
| 254 | db_multi_exec("UPDATE user SET pw=%Q WHERE uid=%d", zSecret, uid); |
| 255 | free(zSecret); |
| 256 | } |
| 257 | }else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){ |
| 258 | int uid; |
| 259 | if( g.argc!=4 && g.argc!=5 ){ |
| @@ -263,12 +264,12 @@ | |
| 263 | if( uid==0 ){ |
| 264 | fossil_fatal("no such user: %s", g.argv[3]); |
| 265 | } |
| 266 | if( g.argc==5 ){ |
| 267 | db_multi_exec( |
| 268 | "UPDATE user SET cap=%Q WHERE uid=%d", g.argv[4], |
| 269 | uid |
| 270 | ); |
| 271 | } |
| 272 | printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid)); |
| 273 | }else{ |
| 274 | fossil_panic("user subcommand should be one of: " |
| @@ -340,12 +341,12 @@ | |
| 340 | db_finalize(&s); |
| 341 | } |
| 342 | |
| 343 | if( g.userUid==0 ){ |
| 344 | db_multi_exec( |
| 345 | "INSERT INTO user(login, pw, cap, info)" |
| 346 | "VALUES('anonymous', '', 'cfghjkmnoqw', '')" |
| 347 | ); |
| 348 | g.userUid = db_last_insert_rowid(); |
| 349 | g.zLogin = "anonymous"; |
| 350 | } |
| 351 | } |
| @@ -364,11 +365,11 @@ | |
| 364 | if( g.argc!=3 ) usage("REPOSITORY"); |
| 365 | db_open_repository(g.argv[2]); |
| 366 | sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0, |
| 367 | sha1_shared_secret_sql_function, 0, 0); |
| 368 | db_multi_exec( |
| 369 | "UPDATE user SET pw=shared_secret(pw,login)" |
| 370 | " WHERE length(pw)>0 AND length(pw)!=40" |
| 371 | ); |
| 372 | } |
| 373 | |
| 374 | /* |
| 375 |
| --- src/user.c | |
| +++ src/user.c | |
| @@ -204,12 +204,12 @@ | |
| 204 | }else{ |
| 205 | prompt_for_password("password: ", &passwd, 1); |
| 206 | } |
| 207 | zPw = sha1_shared_secret(blob_str(&passwd), blob_str(&login), 0); |
| 208 | db_multi_exec( |
| 209 | "INSERT INTO user(login,pw,cap,info,mtime)" |
| 210 | "VALUES(%B,%Q,%B,%B,now())", |
| 211 | &login, zPw, &caps, &contact |
| 212 | ); |
| 213 | free(zPw); |
| 214 | }else if( n>=2 && strncmp(g.argv[2],"default",n)==0 ){ |
| 215 | user_select(); |
| @@ -249,11 +249,12 @@ | |
| 249 | } |
| 250 | if( blob_size(&pw)==0 ){ |
| 251 | printf("password unchanged\n"); |
| 252 | }else{ |
| 253 | char *zSecret = sha1_shared_secret(blob_str(&pw), g.argv[3], 0); |
| 254 | db_multi_exec("UPDATE user SET pw=%Q, mtime=now() WHERE uid=%d", |
| 255 | zSecret, uid); |
| 256 | free(zSecret); |
| 257 | } |
| 258 | }else if( n>=2 && strncmp(g.argv[2],"capabilities",2)==0 ){ |
| 259 | int uid; |
| 260 | if( g.argc!=4 && g.argc!=5 ){ |
| @@ -263,12 +264,12 @@ | |
| 264 | if( uid==0 ){ |
| 265 | fossil_fatal("no such user: %s", g.argv[3]); |
| 266 | } |
| 267 | if( g.argc==5 ){ |
| 268 | db_multi_exec( |
| 269 | "UPDATE user SET cap=%Q, mtime=now() WHERE uid=%d", |
| 270 | g.argv[4], uid |
| 271 | ); |
| 272 | } |
| 273 | printf("%s\n", db_text(0, "SELECT cap FROM user WHERE uid=%d", uid)); |
| 274 | }else{ |
| 275 | fossil_panic("user subcommand should be one of: " |
| @@ -340,12 +341,12 @@ | |
| 341 | db_finalize(&s); |
| 342 | } |
| 343 | |
| 344 | if( g.userUid==0 ){ |
| 345 | db_multi_exec( |
| 346 | "INSERT INTO user(login, pw, cap, info, mtime)" |
| 347 | "VALUES('anonymous', '', 'cfghjkmnoqw', '', now())" |
| 348 | ); |
| 349 | g.userUid = db_last_insert_rowid(); |
| 350 | g.zLogin = "anonymous"; |
| 351 | } |
| 352 | } |
| @@ -364,11 +365,11 @@ | |
| 365 | if( g.argc!=3 ) usage("REPOSITORY"); |
| 366 | db_open_repository(g.argv[2]); |
| 367 | sqlite3_create_function(g.db, "shared_secret", 2, SQLITE_UTF8, 0, |
| 368 | sha1_shared_secret_sql_function, 0, 0); |
| 369 | db_multi_exec( |
| 370 | "UPDATE user SET pw=shared_secret(pw,login), mtime=now()" |
| 371 | " WHERE length(pw)>0 AND length(pw)!=40" |
| 372 | ); |
| 373 | } |
| 374 | |
| 375 | /* |
| 376 |
+3
-3
| --- src/xfer.c | ||
| +++ src/xfer.c | ||
| @@ -1009,11 +1009,11 @@ | ||
| 1009 | 1009 | */ |
| 1010 | 1010 | if( blob_eq(&xfer.aToken[0], "login") |
| 1011 | 1011 | && xfer.nToken==4 |
| 1012 | 1012 | ){ |
| 1013 | 1013 | if( disableLogin ){ |
| 1014 | - g.okRead = g.okWrite = g.okPrivate = 1; | |
| 1014 | + g.okRead = g.okWrite = g.okPrivate = g.okAdmin = 1; | |
| 1015 | 1015 | }else{ |
| 1016 | 1016 | if( check_tail_hash(&xfer.aToken[2], xfer.pIn) |
| 1017 | 1017 | || check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]) |
| 1018 | 1018 | ){ |
| 1019 | 1019 | cgi_reset_content(); |
| @@ -1033,11 +1033,11 @@ | ||
| 1033 | 1033 | ){ |
| 1034 | 1034 | if( g.okRead ){ |
| 1035 | 1035 | char *zName = blob_str(&xfer.aToken[1]); |
| 1036 | 1036 | if( zName[0]=='/' ){ |
| 1037 | 1037 | /* New style configuration transfer */ |
| 1038 | - int groupMask = configure_name_to_mask(&zName[0], 0); | |
| 1038 | + int groupMask = configure_name_to_mask(&zName[1], 0); | |
| 1039 | 1039 | if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER; |
| 1040 | 1040 | if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR; |
| 1041 | 1041 | configure_send_group(xfer.pOut, groupMask, 0); |
| 1042 | 1042 | }else if( configure_is_exportable(zName) ){ |
| 1043 | 1043 | /* Old style configuration transfer */ |
| @@ -1194,14 +1194,14 @@ | ||
| 1194 | 1194 | ** gdb fossil |
| 1195 | 1195 | ** r test-xfer out.txt |
| 1196 | 1196 | */ |
| 1197 | 1197 | void cmd_test_xfer(void){ |
| 1198 | 1198 | int notUsed; |
| 1199 | + db_find_and_open_repository(0,0); | |
| 1199 | 1200 | if( g.argc!=2 && g.argc!=3 ){ |
| 1200 | 1201 | usage("?MESSAGEFILE?"); |
| 1201 | 1202 | } |
| 1202 | - db_must_be_within_tree(); | |
| 1203 | 1203 | blob_zero(&g.cgiIn); |
| 1204 | 1204 | blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]); |
| 1205 | 1205 | disableLogin = 1; |
| 1206 | 1206 | page_xfer(); |
| 1207 | 1207 | printf("%s\n", cgi_extract_content(¬Used)); |
| 1208 | 1208 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -1009,11 +1009,11 @@ | |
| 1009 | */ |
| 1010 | if( blob_eq(&xfer.aToken[0], "login") |
| 1011 | && xfer.nToken==4 |
| 1012 | ){ |
| 1013 | if( disableLogin ){ |
| 1014 | g.okRead = g.okWrite = g.okPrivate = 1; |
| 1015 | }else{ |
| 1016 | if( check_tail_hash(&xfer.aToken[2], xfer.pIn) |
| 1017 | || check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]) |
| 1018 | ){ |
| 1019 | cgi_reset_content(); |
| @@ -1033,11 +1033,11 @@ | |
| 1033 | ){ |
| 1034 | if( g.okRead ){ |
| 1035 | char *zName = blob_str(&xfer.aToken[1]); |
| 1036 | if( zName[0]=='/' ){ |
| 1037 | /* New style configuration transfer */ |
| 1038 | int groupMask = configure_name_to_mask(&zName[0], 0); |
| 1039 | if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER; |
| 1040 | if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR; |
| 1041 | configure_send_group(xfer.pOut, groupMask, 0); |
| 1042 | }else if( configure_is_exportable(zName) ){ |
| 1043 | /* Old style configuration transfer */ |
| @@ -1194,14 +1194,14 @@ | |
| 1194 | ** gdb fossil |
| 1195 | ** r test-xfer out.txt |
| 1196 | */ |
| 1197 | void cmd_test_xfer(void){ |
| 1198 | int notUsed; |
| 1199 | if( g.argc!=2 && g.argc!=3 ){ |
| 1200 | usage("?MESSAGEFILE?"); |
| 1201 | } |
| 1202 | db_must_be_within_tree(); |
| 1203 | blob_zero(&g.cgiIn); |
| 1204 | blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]); |
| 1205 | disableLogin = 1; |
| 1206 | page_xfer(); |
| 1207 | printf("%s\n", cgi_extract_content(¬Used)); |
| 1208 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -1009,11 +1009,11 @@ | |
| 1009 | */ |
| 1010 | if( blob_eq(&xfer.aToken[0], "login") |
| 1011 | && xfer.nToken==4 |
| 1012 | ){ |
| 1013 | if( disableLogin ){ |
| 1014 | g.okRead = g.okWrite = g.okPrivate = g.okAdmin = 1; |
| 1015 | }else{ |
| 1016 | if( check_tail_hash(&xfer.aToken[2], xfer.pIn) |
| 1017 | || check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]) |
| 1018 | ){ |
| 1019 | cgi_reset_content(); |
| @@ -1033,11 +1033,11 @@ | |
| 1033 | ){ |
| 1034 | if( g.okRead ){ |
| 1035 | char *zName = blob_str(&xfer.aToken[1]); |
| 1036 | if( zName[0]=='/' ){ |
| 1037 | /* New style configuration transfer */ |
| 1038 | int groupMask = configure_name_to_mask(&zName[1], 0); |
| 1039 | if( !g.okAdmin ) groupMask &= ~CONFIGSET_USER; |
| 1040 | if( !g.okRdAddr ) groupMask &= ~CONFIGSET_ADDR; |
| 1041 | configure_send_group(xfer.pOut, groupMask, 0); |
| 1042 | }else if( configure_is_exportable(zName) ){ |
| 1043 | /* Old style configuration transfer */ |
| @@ -1194,14 +1194,14 @@ | |
| 1194 | ** gdb fossil |
| 1195 | ** r test-xfer out.txt |
| 1196 | */ |
| 1197 | void cmd_test_xfer(void){ |
| 1198 | int notUsed; |
| 1199 | db_find_and_open_repository(0,0); |
| 1200 | if( g.argc!=2 && g.argc!=3 ){ |
| 1201 | usage("?MESSAGEFILE?"); |
| 1202 | } |
| 1203 | blob_zero(&g.cgiIn); |
| 1204 | blob_read_from_file(&g.cgiIn, g.argc==2 ? "-" : g.argv[2]); |
| 1205 | disableLogin = 1; |
| 1206 | page_xfer(); |
| 1207 | printf("%s\n", cgi_extract_content(¬Used)); |
| 1208 |