Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add the "E" and "F" capability letters to control reading and writing to the synclog. |
|---|---|
| Timelines: | family | ancestors | descendants | both | synclog |
| Files: | files | file ages | folders |
| SHA3-256: |
06b3ace4ce190c5f7d95e0b5a220eafc |
| User & Date: | drh 2021-12-19 18:10:04.715 |
Context
|
2021-12-19
| ||
| 18:22 | Remove the synclog table when doing a "fossil scrub --verily". check-in: 94709e8ed2 user: drh tags: synclog | |
| 18:10 | Add the "E" and "F" capability letters to control reading and writing to the synclog. check-in: 06b3ace4ce user: drh tags: synclog | |
| 17:50 | Record sync operations in the new synclog table. check-in: 42a6191e93 user: drh tags: synclog | |
Changes
Changes to src/capabilities.c.
| ︙ | ︙ | |||
98 99 100 101 102 103 104 |
** if "u" is present and "developer" if "v" is present.
*/
void capability_expand(CapabilityString *pIn){
static char *zNobody = 0;
static char *zAnon = 0;
static char *zReader = 0;
static char *zDev = 0;
| | | 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
** if "u" is present and "developer" if "v" is present.
*/
void capability_expand(CapabilityString *pIn){
static char *zNobody = 0;
static char *zAnon = 0;
static char *zReader = 0;
static char *zDev = 0;
static char *zAdmin = "bcdefghijklmnopqrtwz234567ADEF";
int doneV = 0;
if( pIn==0 ){
fossil_free(zNobody); zNobody = 0;
fossil_free(zAnon); zAnon = 0;
fossil_free(zReader); zReader = 0;
fossil_free(zDev); zDev = 0;
|
| ︙ | ︙ | |||
306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
"Alerts", "Sign up for email alerts" },
{ 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0,
"Announce", "Send announcements to all subscribers" },
{ 'C', CAPCLASS_FORUM, 0,
"Chat", "Read and/or writes messages in the chatroom" },
{ 'D', CAPCLASS_OTHER, 0,
"Debug", "Enable debugging features" },
};
/*
** Populate the aCap[].nUser values based on the current content
** of the USER table.
*/
void capabilities_count(void){
| > > > > | 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
"Alerts", "Sign up for email alerts" },
{ 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0,
"Announce", "Send announcements to all subscribers" },
{ 'C', CAPCLASS_FORUM, 0,
"Chat", "Read and/or writes messages in the chatroom" },
{ 'D', CAPCLASS_OTHER, 0,
"Debug", "Enable debugging features" },
{ 'E', CAPCLASS_SUPER, 0,
"Read SyncLog", "Read the SyncLog" },
{ 'F', CAPCLASS_SUPER, 0,
"Update SyncLog", "Add or modify entries in the SyncLog" },
};
/*
** Populate the aCap[].nUser values based on the current content
** of the USER table.
*/
void capabilities_count(void){
|
| ︙ | ︙ |
Changes to src/login.c.
| ︙ | ︙ | |||
1272 1273 1274 1275 1276 1277 1278 |
p->RdWiki = p->WrWiki = p->NewWiki =
p->ApndWiki = p->Hyperlink = p->Clone =
p->NewTkt = p->Password = p->RdAddr =
p->TktFmt = p->Attach = p->ApndTkt =
p->ModWiki = p->ModTkt =
p->RdForum = p->WrForum = p->ModForum =
p->WrTForum = p->AdminForum = p->Chat =
| | > | 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 |
p->RdWiki = p->WrWiki = p->NewWiki =
p->ApndWiki = p->Hyperlink = p->Clone =
p->NewTkt = p->Password = p->RdAddr =
p->TktFmt = p->Attach = p->ApndTkt =
p->ModWiki = p->ModTkt =
p->RdForum = p->WrForum = p->ModForum =
p->WrTForum = p->AdminForum = p->Chat =
p->EmailAlert = p->Announce = p->Debug =
p->RdSLog = p->WrSLog = 1;
/* Fall thru into Read/Write */
case 'i': p->Read = p->Write = 1; break;
case 'o': p->Read = 1; break;
case 'z': p->Zip = 1; break;
case 'h': p->Hyperlink = 1; break;
case 'g': p->Clone = 1; break;
|
| ︙ | ︙ | |||
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 |
case '3': p->WrForum = 1;
case '2': p->RdForum = 1; break;
case '7': p->EmailAlert = 1; break;
case 'A': p->Announce = 1; break;
case 'C': p->Chat = 1; break;
case 'D': p->Debug = 1; break;
/* The "u" privilege recursively
** inherits all privileges of the user named "reader" */
case 'u': {
if( p->XReader==0 ){
const char *zUser;
p->XReader = 1;
| > > | 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 |
case '3': p->WrForum = 1;
case '2': p->RdForum = 1; break;
case '7': p->EmailAlert = 1; break;
case 'A': p->Announce = 1; break;
case 'C': p->Chat = 1; break;
case 'D': p->Debug = 1; break;
case 'E': p->RdSLog = 1; break;
case 'F': p->WrSLog = 1; break;
/* The "u" privilege recursively
** inherits all privileges of the user named "reader" */
case 'u': {
if( p->XReader==0 ){
const char *zUser;
p->XReader = 1;
|
| ︙ | ︙ | |||
1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 |
case '4': rc = p->WrTForum; break;
case '5': rc = p->ModForum; break;
case '6': rc = p->AdminForum;break;
case '7': rc = p->EmailAlert;break;
case 'A': rc = p->Announce; break;
case 'C': rc = p->Chat; break;
case 'D': rc = p->Debug; break;
case 'L': rc = g.zLogin && *g.zLogin; break;
/* Mainenance reminder: '@' should not be used because
it would semantically collide with the @ in the
capexpr TH1 command. */
default: rc = 0; break;
}
}
| > > | 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 |
case '4': rc = p->WrTForum; break;
case '5': rc = p->ModForum; break;
case '6': rc = p->AdminForum;break;
case '7': rc = p->EmailAlert;break;
case 'A': rc = p->Announce; break;
case 'C': rc = p->Chat; break;
case 'D': rc = p->Debug; break;
case 'E': rc = p->RdSLog; break;
case 'F': rc = p->WrSLog; break;
case 'L': rc = g.zLogin && *g.zLogin; break;
/* Mainenance reminder: '@' should not be used because
it would semantically collide with the @ in the
capexpr TH1 command. */
default: rc = 0; break;
}
}
|
| ︙ | ︙ |
Changes to src/main.c.
| ︙ | ︙ | |||
107 108 109 110 111 112 113 114 115 116 117 118 119 120 | char WrTForum; /* 4: Post to forums not subject to moderation */ char ModForum; /* 5: Moderate (approve or reject) forum posts */ char AdminForum; /* 6: Grant capability 4 to other users */ char EmailAlert; /* 7: Sign up for email notifications */ char Announce; /* A: Send announcements */ char Chat; /* C: read or write the chatroom */ char Debug; /* D: show extra Fossil debugging features */ /* These last two are included to block infinite recursion */ char XReader; /* u: Inherit all privileges of "reader" */ char XDeveloper; /* v: Inherit all privileges of "developer" */ }; #ifdef FOSSIL_ENABLE_TCL /* | > > | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | char WrTForum; /* 4: Post to forums not subject to moderation */ char ModForum; /* 5: Moderate (approve or reject) forum posts */ char AdminForum; /* 6: Grant capability 4 to other users */ char EmailAlert; /* 7: Sign up for email notifications */ char Announce; /* A: Send announcements */ char Chat; /* C: read or write the chatroom */ char Debug; /* D: show extra Fossil debugging features */ char RdSLog; /* E: read the synclog */ char WrSLog; /* F: add to the synclog */ /* These last two are included to block infinite recursion */ char XReader; /* u: Inherit all privileges of "reader" */ char XDeveloper; /* v: Inherit all privileges of "developer" */ }; #ifdef FOSSIL_ENABLE_TCL /* |
| ︙ | ︙ |
Changes to src/setupuser.c.
| ︙ | ︙ | |||
689 690 691 692 693 694 695 696 697 698 699 700 701 702 |
@ Email Alerts%s(B('7'))</label>
@ <li><label><input type="checkbox" name="aA"%s(oa['A']) />
@ Send Announcements%s(B('A'))</label>
@ <li><label><input type="checkbox" name="aC"%s(oa['C']) />
@ Chatroom%s(B('C'))</label>
@ <li><label><input type="checkbox" name="aD"%s(oa['D']) />
@ Enable Debug%s(B('D'))</label>
@ </ul></div>
@ </td>
@ </tr>
@ <tr>
@ <td class="usetupEditLabel">Selected Cap:</td>
@ <td>
@ <span id="usetupEditCapability">(missing JS?)</span>
| > > > > | 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 |
@ Email Alerts%s(B('7'))</label>
@ <li><label><input type="checkbox" name="aA"%s(oa['A']) />
@ Send Announcements%s(B('A'))</label>
@ <li><label><input type="checkbox" name="aC"%s(oa['C']) />
@ Chatroom%s(B('C'))</label>
@ <li><label><input type="checkbox" name="aD"%s(oa['D']) />
@ Enable Debug%s(B('D'))</label>
@ <li><label><input type="checkbox" name="aE"%s(oa['E']) />
@ Read SyncLog%s(B('E'))</label>
@ <li><label><input type="checkbox" name="aF"%s(oa['F']) />
@ Update SyncLog%s(B('F'))</label>
@ </ul></div>
@ </td>
@ </tr>
@ <tr>
@ <td class="usetupEditLabel">Selected Cap:</td>
@ <td>
@ <span id="usetupEditCapability">(missing JS?)</span>
|
| ︙ | ︙ |