Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Code cleanup: Add a lot of "const" qualifiers for static (string) arrays, where appropriate. This allows the C compiler to optimize more |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
70a94d09720fc8a03aa7a02713c68047 |
| User & Date: | jan.nijtmans 2019-07-16 20:02:48.833 |
Context
|
2019-07-17
| ||
| 02:37 | Reworked several sections of the fossil-v-git.wiki doc as sub-sections of "Linux vs. SQLite", which now acts as a frame for those sections. Some of these sections are expanded while others disappear entirely, most especially the "BSD vs GPL" argument that we started off on the now-merged branch to try and refine. We replace a discussion of licensi... check-in: 69ec89b591 user: wyoung tags: trunk | |
|
2019-07-16
| ||
| 20:02 | Code cleanup: Add a lot of "const" qualifiers for static (string) arrays, where appropriate. This allows the C compiler to optimize more check-in: 70a94d0972 user: jan.nijtmans tags: trunk | |
| 15:42 | When committing without parent-id (additional "initial" commits), make sure the branch-name is set to "trunk" when not provided otherwise. check-in: 0fd6cf166c user: jan.nijtmans tags: trunk | |
Changes
Changes to src/capabilities.c.
| ︙ | ︙ | |||
89 90 91 92 93 94 95 |
** Delete a CapabilityString object.
*/
void capability_free(CapabilityString *p){
fossil_free(p);
}
/*
| | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
** Delete a CapabilityString object.
*/
void capability_free(CapabilityString *p){
fossil_free(p);
}
/*
** Expand the capability string by including all capabilities for
** special users "nobody" and "anonymous". Also include "reader"
** 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;
|
| ︙ | ︙ | |||
377 378 379 380 381 382 383 |
@ <tr><th> <th>Code<th>Forum<th>Tickets<th>Wiki\
@ <th>Unversioned Content</th></tr>
while( db_step(&q)==SQLITE_ROW ){
const char *zId = db_column_text(&q, 0);
const char *zCap = db_column_text(&q, 1);
int n = db_column_int(&q, 3);
int eType;
| | | | 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 |
@ <tr><th> <th>Code<th>Forum<th>Tickets<th>Wiki\
@ <th>Unversioned Content</th></tr>
while( db_step(&q)==SQLITE_ROW ){
const char *zId = db_column_text(&q, 0);
const char *zCap = db_column_text(&q, 1);
int n = db_column_int(&q, 3);
int eType;
static const char *const azType[] = { "off", "read", "write" };
static const char *const azClass[] = { "capsumOff", "capsumRead", "capsumWrite" };
if( n==0 ) continue;
/* Code */
if( db_column_int(&q,2)<10 ){
@ <tr><th align="right"><tt>"%h(zId)"</tt></th>
}else if( n>1 ){
|
| ︙ | ︙ |
Changes to src/cgi.c.
| ︙ | ︙ | |||
160 161 162 163 164 165 166 | cgi_combine_header_and_body(); return blob_buffer(&cgiContent[0]); } /* ** Additional information used to form the HTTP reply */ | | | | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
cgi_combine_header_and_body();
return blob_buffer(&cgiContent[0]);
}
/*
** Additional information used to form the HTTP reply
*/
static const char *zContentType = "text/html"; /* Content type of the reply */
static const char *zReplyStatus = "OK"; /* Reply status description */
static int iReplyStatus = 200; /* Reply status code */
static Blob extraHeader = BLOB_INITIALIZER; /* Extra header text */
/*
** Set the reply content type
*/
void cgi_set_content_type(const char *zType){
|
| ︙ | ︙ | |||
1941 1942 1943 1944 1945 1946 1947 |
if( x<=0 ) break;
if( WIFSIGNALED(iStatus) && g.fAnyTrace ){
fprintf(stderr, "/***** Child %d exited on signal %d (%s) *****/\n",
x, WTERMSIG(iStatus), strsignal(WTERMSIG(iStatus)));
}
nchildren--;
}
| | | 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 |
if( x<=0 ) break;
if( WIFSIGNALED(iStatus) && g.fAnyTrace ){
fprintf(stderr, "/***** Child %d exited on signal %d (%s) *****/\n",
x, WTERMSIG(iStatus), strsignal(WTERMSIG(iStatus)));
}
nchildren--;
}
}
}
/* NOT REACHED */
fossil_exit(1);
#endif
/* NOT REACHED */
return 0;
}
|
| ︙ | ︙ |
Changes to src/deltafunc.c.
| ︙ | ︙ | |||
173 174 175 176 177 178 179 | int eOp; /* Name of current operator */ unsigned int a1, a2; /* Arguments to current operator */ int iNext; /* Next cursor value */ }; /* Operator names: */ | | | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
int eOp; /* Name of current operator */
unsigned int a1, a2; /* Arguments to current operator */
int iNext; /* Next cursor value */
};
/* Operator names:
*/
static const char *const azOp[] = {
"SIZE", "COPY", "INSERT", "CHECKSUM", "ERROR", "EOF"
};
#define DELTAPARSE_OP_SIZE 0
#define DELTAPARSE_OP_COPY 1
#define DELTAPARSE_OP_INSERT 2
#define DELTAPARSE_OP_CHECKSUM 3
#define DELTAPARSE_OP_ERROR 4
|
| ︙ | ︙ | |||
387 388 389 390 391 392 393 | deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; return pCur->eOp==DELTAPARSE_OP_EOF; } /* ** This method is called to "rewind" the deltaparsevtab_cursor object back ** to the first row of output. This method is always called at least | | | | 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur;
return pCur->eOp==DELTAPARSE_OP_EOF;
}
/*
** This method is called to "rewind" the deltaparsevtab_cursor object back
** to the first row of output. This method is always called at least
** once prior to any call to deltaparsevtabColumn() or deltaparsevtabRowid() or
** deltaparsevtabEof().
*/
static int deltaparsevtabFilter(
sqlite3_vtab_cursor *pVtabCursor,
int idxNum, const char *idxStr,
int argc, sqlite3_value **argv
){
deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor *)pVtabCursor;
const char *a;
int i = 0;
pCur->eOp = DELTAPARSE_OP_ERROR;
|
| ︙ | ︙ | |||
457 458 459 460 461 462 463 | pIdxInfo->idxNum = 0; pIdxInfo->estimatedCost = (double)0x7fffffff; pIdxInfo->estimatedRows = 0x7fffffff; return SQLITE_CONSTRAINT; } /* | | | 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 |
pIdxInfo->idxNum = 0;
pIdxInfo->estimatedCost = (double)0x7fffffff;
pIdxInfo->estimatedRows = 0x7fffffff;
return SQLITE_CONSTRAINT;
}
/*
** This following structure defines all the methods for the
** virtual table.
*/
static sqlite3_module deltaparsevtabModule = {
/* iVersion */ 0,
/* xCreate */ 0,
/* xConnect */ deltaparsevtabConnect,
/* xBestIndex */ deltaparsevtabBestIndex,
|
| ︙ | ︙ |
Changes to src/file.c.
| ︙ | ︙ | |||
1743 1744 1745 1746 1747 1748 1749 |
/*
** Return non-NULL if zFilename contains pathname elements that
** are reserved on Windows. The returned string is the disallowed
** path element.
*/
const char *file_is_win_reserved(const char *zPath){
| | | 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 |
/*
** Return non-NULL if zFilename contains pathname elements that
** are reserved on Windows. The returned string is the disallowed
** path element.
*/
const char *file_is_win_reserved(const char *zPath){
static const char *const azRes[] = { "CON", "PRN", "AUX", "NUL", "COM", "LPT" };
static char zReturn[5];
int i;
while( zPath[0] ){
for(i=0; i<count(azRes); i++){
if( sqlite3_strnicmp(zPath, azRes[i], 3)==0
&& ((i>=4 && fossil_isdigit(zPath[3])
&& (zPath[4]=='/' || zPath[4]=='.' || zPath[4]==0))
|
| ︙ | ︙ | |||
1976 1977 1978 1979 1980 1981 1982 |
** As a special case, files currently undergoing an uncommitted merge
** might not get timestamped with --checkin because it may be
** impossible for fossil to choose between multiple potential
** timestamps. A non-fatal warning is emitted for such cases.
**
*/
void touch_cmd(){
| | | 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 |
** As a special case, files currently undergoing an uncommitted merge
** might not get timestamped with --checkin because it may be
** impossible for fossil to choose between multiple potential
** timestamps. A non-fatal warning is emitted for such cases.
**
*/
void touch_cmd(){
const char * zGlobList; /* -g List of glob patterns */
const char * zGlobFile; /* -G File of glob patterns */
Glob * pGlob = 0; /* List of glob patterns */
int verboseFlag;
int dryRunFlag;
int vid; /* Checkout version */
int changeCount = 0; /* Number of files touched */
int quietFlag = 0; /* -q|--quiet */
|
| ︙ | ︙ | |||
2143 2144 2145 2146 2147 2148 2149 |
}
}else{
assert(newMtime>0);
}
changeCount +=
touch_cmd_stamp_one_file( zAbs, zArg, newMtime, dryRunFlag,
verboseFlag, quietFlag );
| | | 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 |
}
}else{
assert(newMtime>0);
}
changeCount +=
touch_cmd_stamp_one_file( zAbs, zArg, newMtime, dryRunFlag,
verboseFlag, quietFlag );
}
}
db_end_transaction(0);
blob_reset(&absBuffer);
if( dryRunFlag!=0 ){
fossil_print("dry-run: would have touched %d file(s)\n",
changeCount);
}else{
fossil_print("Touched %d file(s)\n", changeCount);
}
}
|
Changes to src/hname.c.
| ︙ | ︙ | |||
214 215 216 217 218 219 220 |
return HPOLICY_AUTO;
}
}
/*
** Names of the hash policies.
*/
| | | 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
return HPOLICY_AUTO;
}
}
/*
** Names of the hash policies.
*/
static const char *const azPolicy[] = {
"sha1", "auto", "sha3", "sha3-only", "shun-sha1"
};
/* Return the name of the current hash policy.
*/
const char *hpolicy_name(void){
return azPolicy[g.eHashPolicy];
|
| ︙ | ︙ |
Changes to src/http_transport.c.
| ︙ | ︙ | |||
78 79 80 81 82 83 84 |
/*
** Check zFossil to see if it is a reasonable "fossil" command to
** run on the server. Do not allow an attacker to substitute something
** like "/bin/rm".
*/
static int is_safe_fossil_command(const char *zFossil){
| | | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/*
** Check zFossil to see if it is a reasonable "fossil" command to
** run on the server. Do not allow an attacker to substitute something
** like "/bin/rm".
*/
static int is_safe_fossil_command(const char *zFossil){
static const char *const azSafe[] = { "*/fossil", "*/echo" };
int i;
for(i=0; i<sizeof(azSafe)/sizeof(azSafe[0]); i++){
if( sqlite3_strglob(azSafe[i], zFossil)==0 ) return 1;
if( strcmp(azSafe[i]+2, zFossil)==0 ) return 1;
}
return 0;
}
|
| ︙ | ︙ |
Changes to src/manifest.c.
| ︙ | ︙ | |||
138 139 140 141 142 143 144 |
/* CFTYPE_EVENT 7 */ { "CDENPTUWZ", "DEWZ" },
/* CFTYPE_FORUM 8 */ { "DGHINPUWZ", "DUWZ" },
};
/*
** Names of manifest types
*/
| | | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
/* CFTYPE_EVENT 7 */ { "CDENPTUWZ", "DEWZ" },
/* CFTYPE_FORUM 8 */ { "DGHINPUWZ", "DUWZ" },
};
/*
** Names of manifest types
*/
static const char *const azNameOfMType[] = {
"manifest",
"cluster",
"tag",
"wiki",
"ticket",
"attachment",
"technote",
|
| ︙ | ︙ |
Changes to src/miniz.c.
| ︙ | ︙ | |||
1340 1341 1342 1343 1344 1345 1346 |
*pDest_len = stream.total_out;
return mz_inflateEnd(&stream);
}
const char *mz_error(int err)
{
| | | 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 |
*pDest_len = stream.total_out;
return mz_inflateEnd(&stream);
}
const char *mz_error(int err)
{
static const struct { int m_err; const char *m_pDesc; } s_error_descs[] =
{
{ MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" },
{ MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" }
};
mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;
return NULL;
}
|
| ︙ | ︙ |
Changes to src/search.c.
| ︙ | ︙ | |||
1108 1109 1110 1111 1112 1113 1114 |
if( zClass ){
@ <div class='searchForm searchForm%s(zClass)'>
}else{
@ <div class='searchForm'>
}
@ <input type="text" name="s" size="40" value="%h(zPattern)"%s(zDisable1)>
if( (mFlags & 0x01)!=0 && (srchFlags & (srchFlags-1))!=0 ){
| | | 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 |
if( zClass ){
@ <div class='searchForm searchForm%s(zClass)'>
}else{
@ <div class='searchForm'>
}
@ <input type="text" name="s" size="40" value="%h(zPattern)"%s(zDisable1)>
if( (mFlags & 0x01)!=0 && (srchFlags & (srchFlags-1))!=0 ){
static const struct { const char *z; const char *zNm; unsigned m; } aY[] = {
{ "all", "All", SRCH_ALL },
{ "c", "Check-ins", SRCH_CKIN },
{ "d", "Docs", SRCH_DOC },
{ "t", "Tickets", SRCH_TKT },
{ "w", "Wiki", SRCH_WIKI },
{ "e", "Tech Notes", SRCH_TECHNOTE },
{ "f", "Forum", SRCH_FORUM },
|
| ︙ | ︙ | |||
1840 1841 1842 1843 1844 1845 1846 |
static const struct { int iCmd; const char *z; } aCmd[] = {
{ 1, "reindex" },
{ 2, "index" },
{ 3, "disable" },
{ 4, "enable" },
{ 5, "stemmer" },
};
| | | 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 |
static const struct { int iCmd; const char *z; } aCmd[] = {
{ 1, "reindex" },
{ 2, "index" },
{ 3, "disable" },
{ 4, "enable" },
{ 5, "stemmer" },
};
static const struct { const char *zSetting; const char *zName; const char *zSw; } aSetng[] = {
{ "search-ci", "check-in search:", "c" },
{ "search-doc", "document search:", "d" },
{ "search-tkt", "ticket search:", "t" },
{ "search-wiki", "wiki search:", "w" },
{ "search-technote", "tech note search:", "e" },
{ "search-forum", "forum search:", "f" },
};
|
| ︙ | ︙ |
Changes to src/setup.c.
| ︙ | ︙ | |||
310 311 312 313 314 315 316 |
/*
** WEBPAGE: setup_access
**
** The access-control settings page. Requires Setup privileges.
*/
void setup_access(void){
| | | | 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
/*
** WEBPAGE: setup_access
**
** The access-control settings page. Requires Setup privileges.
*/
void setup_access(void){
static const char *const azRedirectOpts[] = {
"0", "Off",
"1", "Login Page Only",
"2", "All Pages"
};
login_check_credentials();
if( !g.perm.Setup ){
login_needed(0);
return;
}
style_header("Access Control Settings");
db_begin_transaction();
@ <form action="%s(g.zTop)/setup_access" method="post"><div>
login_insert_csrf_secret();
@ <input type="submit" name="submit" value="Apply Changes" /></p>
@ <hr />
multiple_choice_attribute("Redirect to HTTPS",
"redirect-to-https", "redirhttps", "0",
count(azRedirectOpts)/2, azRedirectOpts);
@ <p>Force the use of HTTPS by redirecting to HTTPS when an
@ unencrypted request is received. This feature can be enabled
@ for the Login page only, or for all pages.
@ <p>Further details: When enabled, this option causes the $secureurl TH1
@ variable is set to an "https:" variant of $baseurl. Otherwise,
@ $secureurl is just an alias for $baseurl.
@ (Property: "redirect-to-https". "0" for off, "1" for Login page only,
@ "2" otherwise.)
|
| ︙ | ︙ | |||
914 915 916 917 918 919 920 |
@ ZIP archive. For best results, keep this prefix brief and avoid special
@ characters such as "/" and "\".
@ If no tarball prefix is specified, then the full Project Name above is used.
@ (Property: "short-project-name")
@ </p>
@ <hr />
entry_attribute("Download Tag", 20, "download-tag", "dlt", "trunk", 0);
| | | 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 |
@ ZIP archive. For best results, keep this prefix brief and avoid special
@ characters such as "/" and "\".
@ If no tarball prefix is specified, then the full Project Name above is used.
@ (Property: "short-project-name")
@ </p>
@ <hr />
entry_attribute("Download Tag", 20, "download-tag", "dlt", "trunk", 0);
@ <p>The <a href='%R/download'>/download</a> page is designed to provide
@ a convenient place for newbies
@ to download a ZIP archive or a tarball of the project. By default,
@ the latest trunk check-in is downloaded. Change this tag to something
@ else (ex: release) to alter the behavior of the /download page.
@ (Property: "download-tag")
@ </p>
@ <hr />
|
| ︙ | ︙ | |||
945 946 947 948 949 950 951 | @ <p>Note: To avoid a redirect loop or other problems, this entry must @ begin with "/" and it must specify a valid page. For example, @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the @ leading "/".</p> @ <p>(Property: "index-page") @ <hr> @ <p>Extra links to appear on the <a href="%R/sitemap">/sitemap</a> page. | | | | 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 |
@ <p>Note: To avoid a redirect loop or other problems, this entry must
@ begin with "/" and it must specify a valid page. For example,
@ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the
@ leading "/".</p>
@ <p>(Property: "index-page")
@ <hr>
@ <p>Extra links to appear on the <a href="%R/sitemap">/sitemap</a> page.
@ Often these are filled in with links like
@ "/doc/trunk/doc/<i>filename</i>.md" so that they refer to
@ embedded documentation, or like "/wiki/<i>pagename</i>" to refer
@ to wiki pages.
@ Leave blank to omit.
@ <p>
entry_attribute("Documentation Index", 40, "sitemap-docidx", "smdocidx",
"", 0);
@ (Property: sitemap-docidx)<br>
|
| ︙ | ︙ |
Changes to src/shun.c.
| ︙ | ︙ | |||
379 380 381 382 383 384 385 |
while( db_step(&q)==SQLITE_ROW ){
int rcvid = db_column_int(&q, 0);
const char *zUser = db_column_text(&q, 1);
const char *zDate = db_column_text(&q, 2);
const char *zIpAddr = db_column_text(&q, 3);
int usesSha1 = db_column_int(&q, 5)!=0;
int usesSha3 = db_column_int(&q, 6)!=0;
| | | 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 |
while( db_step(&q)==SQLITE_ROW ){
int rcvid = db_column_int(&q, 0);
const char *zUser = db_column_text(&q, 1);
const char *zDate = db_column_text(&q, 2);
const char *zIpAddr = db_column_text(&q, 3);
int usesSha1 = db_column_int(&q, 5)!=0;
int usesSha3 = db_column_int(&q, 6)!=0;
static const char *const zHashType[] = { "", "sha1", "sha3", "both" };
const char *zHash = zHashType[usesSha1+usesSha3*2];
if( cnt==perScreen && !showAll ){
style_submenu_element("Older", "rcvfromlist?ofst=%d", ofst+perScreen);
}else{
cnt++;
@ <tr>
if( db_column_int(&q,4) ){
|
| ︙ | ︙ |
Changes to src/skins.c.
| ︙ | ︙ | |||
55 56 57 58 59 60 61 |
{ "Khaki, No Logo", "khaki", 0 },
{ "Ardoise", "ardoise", 0 },
};
/*
** A skin consists of five "files" named here:
*/
| | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
{ "Khaki, No Logo", "khaki", 0 },
{ "Ardoise", "ardoise", 0 },
};
/*
** A skin consists of five "files" named here:
*/
static const char *const azSkinFile[] = {
"css", "header", "footer", "details", "js"
};
/*
** Alternative skins can be specified in the CGI script or by options
** on the "http", "ui", and "server" commands. The alternative skin
** name must be one of the aBuiltinSkin[].zLabel names. If there is
|
| ︙ | ︙ | |||
496 497 498 499 500 501 502 |
db_multi_exec("DELETE FROM config WHERE name GLOB '%q-*'", zDraft);
}
}
if( skinRename() || skinSave(zCurrent) ){
db_end_transaction(0);
return;
}
| | | | 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 |
db_multi_exec("DELETE FROM config WHERE name GLOB '%q-*'", zDraft);
}
}
if( skinRename() || skinSave(zCurrent) ){
db_end_transaction(0);
return;
}
/* The user pressed one of the "Install" buttons. */
if( P("load") && (z = P("sn"))!=0 && z[0] ){
int seen = 0;
/* Check to see if the current skin is already saved. If it is, there
** is no need to create a backup */
zCurrent = getSkin(0);
for(i=0; i<count(aBuiltinSkin); i++){
if( fossil_strcmp(aBuiltinSkin[i].zSQL, zCurrent)==0 ){
seen = 1;
break;
|
| ︙ | ︙ | |||
537 538 539 540 541 542 543 |
if( !seen ){
zName = skinVarName(z,0);
zCurrent = db_get(zName, 0);
db_multi_exec("%s", zCurrent/*safe-for-%s*/);
}
}
}
| | | 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 |
if( !seen ){
zName = skinVarName(z,0);
zCurrent = db_get(zName, 0);
db_multi_exec("%s", zCurrent/*safe-for-%s*/);
}
}
}
style_header("Skins");
if( zErr ){
@ <p style="color:red">%h(zErr)</p>
}
@ <table border="0">
@ <tr><td colspan=4><h2>Built-in Skins:</h2></td></th>
for(i=0; i<count(aBuiltinSkin); i++){
|
| ︙ | ︙ | |||
879 880 881 882 883 884 885 |
void setup_skin(void){
int i; /* Loop counter */
int iSkin; /* Which draft skin is being edited */
int isSetup; /* True for an administrator */
int isEditor; /* Others authorized to make edits */
char *zAllowedEditors; /* Who may edit the draft skin */
char *zBase; /* Base URL for draft under test */
| | | 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 |
void setup_skin(void){
int i; /* Loop counter */
int iSkin; /* Which draft skin is being edited */
int isSetup; /* True for an administrator */
int isEditor; /* Others authorized to make edits */
char *zAllowedEditors; /* Who may edit the draft skin */
char *zBase; /* Base URL for draft under test */
static const char *const azTestPages[] = {
"home",
"timeline",
"dir?ci=tip",
"dir?ci=tip&type=tree",
"brlist",
"info/trunk",
};
|
| ︙ | ︙ |
Changes to src/smtp.c.
| ︙ | ︙ | |||
114 115 116 117 118 119 120 |
if( p->Data.MX.wPreference<iBestPriority ){
iBestPriority = p->Data.MX.wPreference;
pBest = p->Data.MX.pNameExchange;
}
p = p->pNext;
}
if( pBest ){
| | | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
if( p->Data.MX.wPreference<iBestPriority ){
iBestPriority = p->Data.MX.wPreference;
pBest = p->Data.MX.pNameExchange;
}
p = p->pNext;
}
if( pBest ){
pBest = fossil_strdup(pBest);
}
DnsRecordListFree(pDnsRecord, DnsFreeRecordListDeep);
return pBest;
#else
return 0;
#endif /* defined(FOSSIL_WINDOWS_STYLE_DNS) */
}
|
| ︙ | ︙ | |||
644 645 646 647 648 649 650 | /***************************************************************************** ** Server implementation *****************************************************************************/ /* ** Schema used by the email processing system. */ | | | 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 | /***************************************************************************** ** Server implementation *****************************************************************************/ /* ** Schema used by the email processing system. */ static const char zEmailSchema[] = @ -- bulk storage is in this table. This table can store either @ -- the body of email messages or transcripts of an smtp session. @ CREATE TABLE IF NOT EXISTS repository.emailblob( @ emailid INTEGER PRIMARY KEY AUTOINCREMENT, -- numeric idea for the entry @ enref INT, -- Number of references to this blob @ ets INT, -- Corresponding transcript, or NULL @ etime INT, -- insertion time, secs since 1970 |
| ︙ | ︙ | |||
901 902 903 904 905 906 907 | @ <td> @ <td><input type="submit" name="edit" value="Apply"> @ <input type="submit" name="cancel" value="Cancel"> @ </tr> @ </table> @ <hr> @ <h1>Instructions</h1> | | | | 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 | @ <td> @ <td><input type="submit" name="edit" value="Apply"> @ <input type="submit" name="cancel" value="Cancel"> @ </tr> @ </table> @ <hr> @ <h1>Instructions</h1> @ @ <p>The "Routing" field consists of zero or more lines where each @ line is an "action" followed by an "argument". Available actions: @ <ul> @ <li><p><b>forward</b> <i>email-address</i> @ <p>Forward the message to <i>email-address</i>. @ <li><p><b>mbox</b> <i>login-name</i> @ <p>Store the message in the local mailbox for the user @ with USER.LOGIN=<i>login-name</i>. @ </ul> @ @ <p>To delete a route → erase all text from the "Routing" field then @ press the "Apply" button. style_footer(); } #if LOCAL_INTERFACE /* |
| ︙ | ︙ | |||
949 950 951 952 953 954 955 | #define SMTPSRV_STDERR 0x002 /* Transcription written to stderr */ #define SMTPSRV_DRYRUN 0x004 /* Do not record anything in database */ #endif /* LOCAL_INTERFACE */ /* ** Clear the SmtpServer object. Deallocate resources. | | | 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 |
#define SMTPSRV_STDERR 0x002 /* Transcription written to stderr */
#define SMTPSRV_DRYRUN 0x004 /* Do not record anything in database */
#endif /* LOCAL_INTERFACE */
/*
** Clear the SmtpServer object. Deallocate resources.
** How much to clear depends on eHowMuch
*/
static void smtp_server_clear(SmtpServer *p, int eHowMuch){
int i;
if( eHowMuch>=SMTPSRV_CLEAR_MSG ){
fossil_free(p->zFrom);
p->zFrom = 0;
for(i=0; i<p->nTo; i++) fossil_free(p->aTo[i].z);
|
| ︙ | ︙ | |||
1093 1094 1095 1096 1097 1098 1099 |
SmtpServer *p, /* The current inbound email */
const char *zAddr, /* Who to forward this to */
int okRemote /* True if ok to foward to another domain */
){
char *zPolicy;
Blob policy, line, token, tail;
| | | 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 |
SmtpServer *p, /* The current inbound email */
const char *zAddr, /* Who to forward this to */
int okRemote /* True if ok to foward to another domain */
){
char *zPolicy;
Blob policy, line, token, tail;
zPolicy = db_text(0,
"SELECT epolicy FROM emailroute WHERE eaddr=%Q", zAddr);
if( zPolicy==0 ){
if( okRemote ){
int i;
for(i=0; zAddr[i] && zAddr[i]!='@'; i++){}
if( zAddr[i]=='@' && zAddr[i+1]!=0 ){
db_multi_exec(
|
| ︙ | ︙ | |||
1202 1203 1204 1205 1206 1207 1208 |
p->aTo[i].okRemote = 1;
smtp_server_send_one_user(p, p->aTo[i].z, okRemote);
}
/* Fix up the emailblob.enref field of the email message body */
if( p->nRef ){
db_multi_exec(
| | | 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 |
p->aTo[i].okRemote = 1;
smtp_server_send_one_user(p, p->aTo[i].z, okRemote);
}
/* Fix up the emailblob.enref field of the email message body */
if( p->nRef ){
db_multi_exec(
"UPDATE emailblob SET enref=%d WHERE emailid=%lld",
p->nRef, p->idMsg
);
}else{
db_multi_exec(
"DELETE FROM emailblob WHERE emailid=%lld", p->idMsg
);
p->nEts = nEtsStart;
|
| ︙ | ︙ | |||
1284 1285 1286 1287 1288 1289 1290 |
"UPDATE emailblob SET enref=(SELECT n FROM refcnt WHERE id=emailid)"
);
if( doClean ){
smtp_cleanup();
}
}
blob_init(&sql, 0, 0);
| | | 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 |
"UPDATE emailblob SET enref=(SELECT n FROM refcnt WHERE id=emailid)"
);
if( doClean ){
smtp_cleanup();
}
}
blob_init(&sql, 0, 0);
blob_append_sql(&sql,
"SELECT a.emailid, a.enref, b.n"
" FROM emailblob AS a JOIN refcnt AS b ON a.emailid=b.id"
);
if( !fullReport ){
blob_append_sql(&sql, " WHERE a.enref!=b.n");
}
db_prepare_blob(&q, &sql);
|
| ︙ | ︙ | |||
1512 1513 1514 1515 1516 1517 1518 |
" WHERE estate<2 AND ebid IN (SELECT ebid FROM pop3 WHERE isDel);"
);
}
pop3_print(pLog, "+OK");
break;
}
if( strcmp(zCmd,"capa")==0 ){
| | | 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 |
" WHERE estate<2 AND ebid IN (SELECT ebid FROM pop3 WHERE isDel);"
);
}
pop3_print(pLog, "+OK");
break;
}
if( strcmp(zCmd,"capa")==0 ){
static const char *const azCap[] = {
"TOP", "USER", "UIDL",
};
int i;
pop3_print(pLog, "+OK");
for(i=0; i<sizeof(azCap)/sizeof(azCap[0]); i++){
pop3_print(pLog, azCap[i]);
}
|
| ︙ | ︙ | |||
1550 1551 1552 1553 1554 1555 1556 |
"INSERT INTO pop3(id,emailid,ebid,isDel,esz)"
" SELECT NULL, emailid, ebid, 0, esz FROM emailblob, emailbox"
" WHERE emailid=emsgid AND euser=%Q AND estate<=1"
" ORDER BY edate;",
zUser
);
goto cmd_ok;
| | | 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 |
"INSERT INTO pop3(id,emailid,ebid,isDel,esz)"
" SELECT NULL, emailid, ebid, 0, esz FROM emailblob, emailbox"
" WHERE emailid=emsgid AND euser=%Q AND estate<=1"
" ORDER BY edate;",
zUser
);
goto cmd_ok;
}
}
/* Fossil cannot process APOP since the users clear-text password is
** unknown. */
goto cmd_error;
}else{
if( strcmp(zCmd,"stat")==0 ){
db_prepare(&q, "SELECT count(*), sum(esz) FROM pop3 WHERE NOT isDel");
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
1185 1186 1187 1188 1189 1190 1191 |
int tmFlags;
switch( cookie_value("ss","m")[0] ){
case 'c': tmFlags = TIMELINE_COMPACT; break;
case 'v': tmFlags = TIMELINE_VERBOSE; break;
case 'j': tmFlags = TIMELINE_COLUMNAR; break;
case 'x': tmFlags = TIMELINE_CLASSIC; break;
default: tmFlags = TIMELINE_MODERN; break;
| | | | 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 |
int tmFlags;
switch( cookie_value("ss","m")[0] ){
case 'c': tmFlags = TIMELINE_COMPACT; break;
case 'v': tmFlags = TIMELINE_VERBOSE; break;
case 'j': tmFlags = TIMELINE_COLUMNAR; break;
case 'x': tmFlags = TIMELINE_CLASSIC; break;
default: tmFlags = TIMELINE_MODERN; break;
}
return tmFlags;
}
/*
** Add the select/option box to the timeline submenu that is used to
** set the ss= parameter that determines the viewing mode.
**
** Return the TIMELINE_* value appropriate for the view-style.
*/
int timeline_ss_submenu(void){
static const char *const azViewStyles[] = {
"m", "Modern View",
"j", "Columnar View",
"c", "Compact View",
"v", "Verbose View",
"x", "Classic View",
};
cookie_link_parameter("ss","ss","m");
|
| ︙ | ︙ | |||
1625 1626 1627 1628 1629 1630 1631 |
}
}else{
z = "50";
nEntry = 50;
}
cgi_replace_query_parameter("n",z);
cookie_write_parameter("n","n",0);
| | | 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 |
}
}else{
z = "50";
nEntry = 50;
}
cgi_replace_query_parameter("n",z);
cookie_write_parameter("n","n",0);
tmFlags |= timeline_ss_submenu();
cookie_link_parameter("advm","advm","0");
advancedMenu = atoi(PD("advm","0"));
/* Omit all cherry-pick merge lines if the "ncp" query parameter is
** present or if this repository lacks a "cherrypick" table. */
if( PB("ncp") || !db_table_exists("repository","cherrypick") ){
showCherrypicks = 0;
|
| ︙ | ︙ | |||
2034 2035 2036 2037 2038 2039 2040 |
zYearWeek = timeline_expand_datetime(zYearWeek);
z = db_text(0, "SELECT strftime('%%Y-%%W',%Q)", zYearWeek);
if( z && z[0] ){
zYearWeekStart = db_text(0, "SELECT date(%Q,'-6 days','weekday 1')",
zYearWeek);
zYearWeek = z;
}else{
| | | 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 |
zYearWeek = timeline_expand_datetime(zYearWeek);
z = db_text(0, "SELECT strftime('%%Y-%%W',%Q)", zYearWeek);
if( z && z[0] ){
zYearWeekStart = db_text(0, "SELECT date(%Q,'-6 days','weekday 1')",
zYearWeek);
zYearWeek = z;
}else{
if( strlen(zYearWeek)==7 ){
zYearWeekStart = db_text(0,
"SELECT date('%.4q-01-01','+%d days','weekday 1')",
zYearWeek, atoi(zYearWeek+5)*7);
}else{
zYearWeekStart = 0;
}
if( zYearWeekStart==0 || zYearWeekStart[0]==0 ){
|
| ︙ | ︙ | |||
2242 2243 2244 2245 2246 2247 2248 |
db_multi_exec("%s", blob_sql_text(&sql));
n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
zPlural = n==1 ? "" : "s";
if( zYearMonth ){
blob_appendf(&desc, "%d %s%s for %h", n, zEType, zPlural, zYearMonth);
}else if( zYearWeek ){
| | | 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 |
db_multi_exec("%s", blob_sql_text(&sql));
n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
zPlural = n==1 ? "" : "s";
if( zYearMonth ){
blob_appendf(&desc, "%d %s%s for %h", n, zEType, zPlural, zYearMonth);
}else if( zYearWeek ){
blob_appendf(&desc, "%d %s%s for week %h beginning on %h",
n, zEType, zPlural, zYearWeek, zYearWeekStart);
}else if( zDay ){
blob_appendf(&desc, "%d %s%s occurring on %h", n, zEType, zPlural, zDay);
}else if( zNDays ){
blob_appendf(&desc, "%d %s%s within the past %d day%s",
n, zEType, zPlural, nDays, nDays>1 ? "s" : "");
}else if( zBefore==0 && zCirca==0 && n>=nEntry && nEntry>0 ){
|
| ︙ | ︙ | |||
2369 2370 2371 2372 2373 2374 2375 |
if( PB("showsql") ){
@ <pre>%h(blob_sql_text(&sql))</pre>
}
if( search_restrict(SRCH_CKIN)!=0 ){
style_submenu_element("Search", "%R/search?y=c");
}
if( advancedMenu ){
| | | 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 |
if( PB("showsql") ){
@ <pre>%h(blob_sql_text(&sql))</pre>
}
if( search_restrict(SRCH_CKIN)!=0 ){
style_submenu_element("Search", "%R/search?y=c");
}
if( advancedMenu ){
style_submenu_element("Basic", "%s",
url_render(&url, "advm", "0", "udc", "1"));
}else{
style_submenu_element("Advanced", "%s",
url_render(&url, "advm", "1", "udc", "1"));
}
if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID;
if( useDividers && zMark && zMark[0] ){
|
| ︙ | ︙ |
Changes to src/webmail.c.
| ︙ | ︙ | |||
118 119 120 121 122 123 124 |
for(i=0; z[i] && (z[i]!='\n' || z[i+1]==' ' || z[i+1]=='\t'); i++){}
if( z[i]=='\n' ) i++;
return i;
}
/*
** Look for a parameter of the form NAME=VALUE in the given email
| | | 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
for(i=0; z[i] && (z[i]!='\n' || z[i+1]==' ' || z[i+1]=='\t'); i++){}
if( z[i]=='\n' ) i++;
return i;
}
/*
** Look for a parameter of the form NAME=VALUE in the given email
** header line. Return a copy of VALUE in space obtained from
** fossil_malloc(). Or return NULL if there is no such parameter.
*/
static char *email_hdr_value(const char *z, const char *zName){
int nName = (int)strlen(zName);
int i;
const char *z2 = strstr(z, zName);
if( z2==0 ) return 0;
|
| ︙ | ︙ | |||
356 357 358 359 360 361 362 |
}
/*
** Add the select/option box to the timeline submenu that shows
** the various email message formats.
*/
static void webmail_f_submenu(void){
| | | | 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 |
}
/*
** Add the select/option box to the timeline submenu that shows
** the various email message formats.
*/
static void webmail_f_submenu(void){
static const char *const az[] = {
"0", "Normal",
"1", "Decoded",
"2", "Raw",
};
style_submenu_multichoice("f", sizeof(az)/(2*sizeof(az[0])), az, 0);
}
/*
** If the first N characters of z[] are the name of a header field
** that should be shown in "Normal" mode, then return 1.
*/
static int webmail_normal_header(const char *z, int N){
static const char *const az[] = {
"To", "Cc", "Bcc", "Date", "From", "Subject",
};
int i;
for(i=0; i<sizeof(az)/sizeof(az[0]); i++){
if( sqlite3_strnicmp(z, az[i], N)==0 ) return 1;
}
return 0;
|
| ︙ | ︙ | |||
413 414 415 416 417 418 419 |
if( db_step(&q)==SQLITE_ROW ){
Blob msg = db_column_text_as_blob(&q, 0);
int eFormat = atoi(PD("f","0"));
eState = db_column_int(&q, 1);
eTranscript = db_column_int(&q, 2);
if( eFormat==2 ){
@ <pre>%h(db_column_text(&q, 0))</pre>
| | | 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
if( db_step(&q)==SQLITE_ROW ){
Blob msg = db_column_text_as_blob(&q, 0);
int eFormat = atoi(PD("f","0"));
eState = db_column_int(&q, 1);
eTranscript = db_column_int(&q, 2);
if( eFormat==2 ){
@ <pre>%h(db_column_text(&q, 0))</pre>
}else{
EmailToc *p = emailtoc_from_email(&msg);
int i, j;
@ <p>
for(i=0; i<p->nHdr; i++){
char *z = p->azHdr[i];
email_hdr_unfold(z);
for(j=0; z[j] && z[j]!=':'; j++){}
|
| ︙ | ︙ | |||
561 562 563 564 565 566 567 |
/*
** Add the select/option box to the timeline submenu that shows
** which messages to include in the index.
*/
static void webmail_d_submenu(void){
| | | 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 |
/*
** Add the select/option box to the timeline submenu that shows
** which messages to include in the index.
*/
static void webmail_d_submenu(void){
static const char *const az[] = {
"0", "InBox",
"1", "Unread",
"2", "Trash",
"3", "Sent",
"4", "Everything",
};
style_submenu_multichoice("d", sizeof(az)/(2*sizeof(az[0])), az, 0);
|
| ︙ | ︙ | |||
588 589 590 591 592 593 594 | ** user=USER Show mailbox for USER (admin only). ** user=* Show mailbox for all users (admin only). ** d=N 0: inbox+unread 1: unread-only 2: trash 3: all ** eN Select email entry emailbox.ebid==N ** trash Move selected entries to trash (estate=2) ** read Mark selected entries as read (estate=1) ** unread Mark selected entries as unread (estate=0) | | | 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 |
** user=USER Show mailbox for USER (admin only).
** user=* Show mailbox for all users (admin only).
** d=N 0: inbox+unread 1: unread-only 2: trash 3: all
** eN Select email entry emailbox.ebid==N
** trash Move selected entries to trash (estate=2)
** read Mark selected entries as read (estate=1)
** unread Mark selected entries as unread (estate=0)
**
*/
void webmail_page(void){
int emailid;
Stmt q;
Blob sql;
int showAll = 0;
const char *zUser = 0;
|
| ︙ | ︙ | |||
767 768 769 770 771 772 773 | ** WEBPAGE: emailblob ** ** This page, accessible only to administrators, allows easy viewing of ** the emailblob table - the table that contains the text of email messages ** both inbound and outbound, and transcripts of SMTP sessions. ** ** id=N Show the text of emailblob with emailid==N | | | 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 |
** WEBPAGE: emailblob
**
** This page, accessible only to administrators, allows easy viewing of
** the emailblob table - the table that contains the text of email messages
** both inbound and outbound, and transcripts of SMTP sessions.
**
** id=N Show the text of emailblob with emailid==N
**
*/
void webmail_emailblob_page(void){
int id = atoi(PD("id","0"));
Stmt q;
login_check_credentials();
if( !g.perm.Setup ){
login_needed(0);
|
| ︙ | ︙ |