Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Pull in the latest changes from trunk. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | clear-title |
| Files: | files | file ages | folders |
| SHA1: |
1942d581bb18956ea34c7532fcb88363 |
| User & Date: | drh 2010-01-24 22:34:46.000 |
Context
|
2010-02-08
| ||
| 18:16 | Merge recent changes into the dual-license branch. ... (check-in: 14c19fbc1c user: drh tags: clear-title) | |
|
2010-01-24
| ||
| 22:34 | Pull in the latest changes from trunk. ... (check-in: 1942d581bb user: drh tags: clear-title) | |
| 17:55 | Fixes to the login processing for "clone". ... (check-in: c4c231069e user: drh tags: trunk, release) | |
|
2010-01-21
| ||
| 22:06 | Updated to include all the latest changes (for which we hold clear title) from the trunk. ... (check-in: 390b414605 user: drh tags: clear-title) | |
Changes
Changes to src/cgi.c.
| ︙ | ︙ | |||
302 303 304 305 306 307 308 309 310 311 312 313 |
** content changes is if someone breaks the SCM. And if that happens, a
** stale cache is the least of the problem. So we provide an Expires
** header set to a reasonable period (default: one week).
*/
/*time_t expires = time(0) + atoi(db_config("constant_expires","604800"));*/
time_t expires = time(0) + 604800;
fprintf(g.httpOut, "Expires: %s\r\n", cgi_rfc822_datestamp(expires));
}
/* Content intended for logged in users should only be cached in
** the browser, not some shared location.
*/
| > > < | 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
** content changes is if someone breaks the SCM. And if that happens, a
** stale cache is the least of the problem. So we provide an Expires
** header set to a reasonable period (default: one week).
*/
/*time_t expires = time(0) + atoi(db_config("constant_expires","604800"));*/
time_t expires = time(0) + 604800;
fprintf(g.httpOut, "Expires: %s\r\n", cgi_rfc822_datestamp(expires));
}else{
fprintf(g.httpOut, "Cache-control: no-cache, no-store\r\n");
}
/* Content intended for logged in users should only be cached in
** the browser, not some shared location.
*/
fprintf(g.httpOut, "Content-Type: %s; charset=utf-8\r\n", zContentType);
if( strcmp(zContentType,"application/x-fossil")==0 ){
cgi_combine_header_and_body();
blob_compress(&cgiContent[0], &cgiContent[0]);
}
if( iReplyStatus != 304 ) {
|
| ︙ | ︙ |
Changes to src/doc.c.
| ︙ | ︙ | |||
559 560 561 562 563 564 565 566 |
blob_zero(&logo);
db_blob(&logo, "SELECT value FROM config WHERE name='logo-image'");
if( blob_size(&logo)==0 ){
blob_init(&logo, (char*)aLogo, sizeof(aLogo));
}
cgi_set_content_type(zMime);
cgi_set_content(&logo);
}
| > | 559 560 561 562 563 564 565 566 567 |
blob_zero(&logo);
db_blob(&logo, "SELECT value FROM config WHERE name='logo-image'");
if( blob_size(&logo)==0 ){
blob_init(&logo, (char*)aLogo, sizeof(aLogo));
}
cgi_set_content_type(zMime);
cgi_set_content(&logo);
g.isConst = 1;
}
|
Changes to src/http.c.
| ︙ | ︙ | |||
123 124 125 126 127 128 129 | ** in pRecv. pRecv is assumed to be uninitialized when ** this routine is called - this routine will initialize it. ** ** The server address is contain in the "g" global structure. The ** url_parse() routine should have been called prior to this routine ** in order to fill this structure appropriately. */ | | > | | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
** in pRecv. pRecv is assumed to be uninitialized when
** this routine is called - this routine will initialize it.
**
** The server address is contain in the "g" global structure. The
** url_parse() routine should have been called prior to this routine
** in order to fill this structure appropriately.
*/
void http_exchange(Blob *pSend, Blob *pReply, int useLogin){
Blob login; /* The login card */
Blob payload; /* The complete payload including login card */
Blob hdr; /* The HTTP request header */
int closeConnection; /* True to close the connection when done */
int iLength; /* Length of the reply payload */
int rc; /* Result code */
int iHttpVersion; /* Which version of HTTP protocol server uses */
char *zLine; /* A single line of the reply header */
int i; /* Loop counter */
if( transport_open() ){
fossil_fatal(transport_errmsg());
}
/* Construct the login card and prepare the complete payload */
blob_zero(&login);
if( useLogin ) http_build_login_card(pSend, &login);
if( g.fHttpTrace ){
payload = login;
blob_append(&payload, blob_buffer(pSend), blob_size(pSend));
}else{
blob_compress2(&login, pSend, &payload);
blob_reset(&login);
}
|
| ︙ | ︙ |
Changes to src/login.c.
| ︙ | ︙ | |||
470 471 472 473 474 475 476 |
void login_set_capabilities(const char *zCap){
static char *zDev = 0;
static char *zUser = 0;
int i;
for(i=0; zCap[i]; i++){
switch( zCap[i] ){
case 's': g.okSetup = 1; /* Fall thru into Admin */
| | | 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 |
void login_set_capabilities(const char *zCap){
static char *zDev = 0;
static char *zUser = 0;
int i;
for(i=0; zCap[i]; i++){
switch( zCap[i] ){
case 's': g.okSetup = 1; /* Fall thru into Admin */
case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip =
g.okRdWiki = g.okWrWiki = g.okNewWiki =
g.okApndWiki = g.okHistory = g.okClone =
g.okNewTkt = g.okPassword = g.okRdAddr =
g.okTktFmt = 1; /* Fall thru into Read/Write */
case 'i': g.okRead = g.okWrite = 1; break;
case 'o': g.okRead = 1; break;
case 'z': g.okZip = 1; break;
|
| ︙ | ︙ |
Changes to src/manifest.c.
| ︙ | ︙ | |||
384 385 386 387 388 389 390 |
case 'L': {
md5sum_step_text(blob_buffer(&line), blob_size(&line));
if( p->zWikiTitle!=0 ) goto manifest_syntax_error;
if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error;
if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error;
p->zWikiTitle = blob_terminate(&a1);
defossilize(p->zWikiTitle);
| | | 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 |
case 'L': {
md5sum_step_text(blob_buffer(&line), blob_size(&line));
if( p->zWikiTitle!=0 ) goto manifest_syntax_error;
if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error;
if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error;
p->zWikiTitle = blob_terminate(&a1);
defossilize(p->zWikiTitle);
if( !wiki_name_is_wellformed((const unsigned char *)p->zWikiTitle) ){
goto manifest_syntax_error;
}
break;
}
/*
** M <uuid>
|
| ︙ | ︙ |
Changes to src/rss.c.
| ︙ | ︙ | |||
71 72 73 74 75 76 77 | } zPubDate = cgi_rfc822_datestamp(time(NULL)); @ <?xml version="1.0"?> @ <rss version="2.0"> @ <channel> | | | | 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
}
zPubDate = cgi_rfc822_datestamp(time(NULL));
@ <?xml version="1.0"?>
@ <rss version="2.0">
@ <channel>
@ <title>%h(zProjectName)</title>
@ <link>%s(g.zBaseURL)</link>
@ <description>%h(zProjectDescr)</description>
@ <pubDate>%s(zPubDate)</pubDate>
@ <generator>Fossil version %s(MANIFEST_VERSION) %s(MANIFEST_DATE)</generator>
db_prepare(&q, blob_buffer(&bSQL));
blob_reset( &bSQL );
while( db_step(&q)==SQLITE_ROW && nLine<=20 ){
const char *zId = db_column_text(&q, 1);
const char *zCom = db_column_text(&q, 3);
|
| ︙ | ︙ | |||
100 101 102 103 104 105 106 |
}else if( nParent>1 ){
zPrefix = "*MERGE* ";
}else if( nChild>1 ){
zPrefix = "*FORK* ";
}
@ <item>
| | | | | 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
}else if( nParent>1 ){
zPrefix = "*MERGE* ";
}else if( nChild>1 ){
zPrefix = "*FORK* ";
}
@ <item>
@ <title>%h(zPrefix)%s(zCom)</title>
@ <link>%s(g.zBaseURL)/ci/%s(zId)</link>
@ <description>%s(zPrefix)%h(zCom)</description>
@ <pubDate>%s(zDate)</pubDate>
@ <author>%h(zAuthor)</author>
@ <guid>%s(g.zBaseURL)/ci/%s(zId)</guid>
@ </item>
free(zDate);
nLine++;
}
db_finalize(&q);
|
| ︙ | ︙ |
Changes to src/setup.c.
| ︙ | ︙ | |||
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 |
if( !g.okSetup ){
login_needed();
}
db_begin_transaction();
if( P("clear")!=0 ){
db_multi_exec("DELETE FROM config WHERE name='css'");
cgi_replace_parameter("css", zDefaultCSS);
}else{
textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS);
}
style_header("Edit CSS");
@ <form action="%s(g.zBaseURL)/setup_editcss" method="POST">
login_insert_csrf_secret();
@ Edit the CSS below:<br />
textarea_attribute("", 40, 80, "css", "css", zDefaultCSS);
@ <br />
@ <input type="submit" name="submit" value="Apply Changes">
@ <input type="submit" name="clear" value="Revert To Default">
@ </form>
@ <hr>
@ The default CSS is shown below for reference. Other examples
@ of CSS files can be seen on the <a href="setup_skin">skins page</a>.
@ See also the <a href="setup_header">header</a> and
@ <a href="setup_footer">footer</a> editing screens.
@ <blockquote><pre>
@ %h(zDefaultCSS)
| > > > > > > > > | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 |
if( !g.okSetup ){
login_needed();
}
db_begin_transaction();
if( P("clear")!=0 ){
db_multi_exec("DELETE FROM config WHERE name='css'");
cgi_replace_parameter("css", zDefaultCSS);
db_end_transaction(0);
cgi_redirect("setup_editcss");
}else{
textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS);
}
if( P("submit")!=0 ){
db_end_transaction(0);
cgi_redirect("setup_editcss");
}
style_header("Edit CSS");
@ <form action="%s(g.zBaseURL)/setup_editcss" method="POST">
login_insert_csrf_secret();
@ Edit the CSS below:<br />
textarea_attribute("", 40, 80, "css", "css", zDefaultCSS);
@ <br />
@ <input type="submit" name="submit" value="Apply Changes">
@ <input type="submit" name="clear" value="Revert To Default">
@ </form>
@ <p><b>Note:</b> Press your browser Reload button after modifying the
@ CSS in order to pull in the modified CSS file.</p>
@ <hr>
@ The default CSS is shown below for reference. Other examples
@ of CSS files can be seen on the <a href="setup_skin">skins page</a>.
@ See also the <a href="setup_header">header</a> and
@ <a href="setup_footer">footer</a> editing screens.
@ <blockquote><pre>
@ %h(zDefaultCSS)
|
| ︙ | ︙ | |||
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 |
db_bind_blob(&ins, ":bytes", &img);
db_step(&ins);
db_finalize(&ins);
db_multi_exec(
"REPLACE INTO config(name, value) VALUES('logo-mimetype',%Q)",
zMime
);
}else if( P("clr")!=0 ){
db_multi_exec(
"DELETE FROM config WHERE name GLOB 'logo-*'"
);
}
style_header("Edit Project Logo");
@ <p>The current project logo has a MIME-Type of <b>%h(zMime)</b> and looks
@ like this:</p>
@ <blockquote><img src="%s(g.zTop)/logo" alt="logo"></blockquote>
@
@ <p>The logo is accessible to all users at this URL:
| > > > > | 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 |
db_bind_blob(&ins, ":bytes", &img);
db_step(&ins);
db_finalize(&ins);
db_multi_exec(
"REPLACE INTO config(name, value) VALUES('logo-mimetype',%Q)",
zMime
);
db_end_transaction(0);
cgi_redirect("setup_logo");
}else if( P("clr")!=0 ){
db_multi_exec(
"DELETE FROM config WHERE name GLOB 'logo-*'"
);
db_end_transaction(0);
cgi_redirect("setup_logo");
}
style_header("Edit Project Logo");
@ <p>The current project logo has a MIME-Type of <b>%h(zMime)</b> and looks
@ like this:</p>
@ <blockquote><img src="%s(g.zTop)/logo" alt="logo"></blockquote>
@
@ <p>The logo is accessible to all users at this URL:
|
| ︙ | ︙ | |||
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 | @ the entry box below and then press the "Change Logo" button.</p> login_insert_csrf_secret(); @ Logo Image file: @ <input type="file" name="im" size="60" accepts="image/*"><br> @ <input type="submit" name="set" value="Change Logo"> @ <input type="submit" name="clr" value="Revert To Default"> @ </form> style_footer(); db_end_transaction(0); } | > > > > > | 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | @ the entry box below and then press the "Change Logo" button.</p> login_insert_csrf_secret(); @ Logo Image file: @ <input type="file" name="im" size="60" accepts="image/*"><br> @ <input type="submit" name="set" value="Change Logo"> @ <input type="submit" name="clr" value="Revert To Default"> @ </form> @ @ <p><b>Note:</b> Your browser has probably cached the logo image, so @ you will probably need to press the Reload button on your browser after @ changing the logo to provoke your browser to reload the new logo image. @ </p> style_footer(); db_end_transaction(0); } |
Changes to src/style.c.
| ︙ | ︙ | |||
389 390 391 392 393 394 395 396 397 398 399 400 401 402 |
*/
void page_style_css(void){
char *zCSS = 0;
cgi_set_content_type("text/css");
zCSS = db_get("css",(char*)zDefaultCSS);
cgi_append_content(zCSS, -1);
}
/*
** WEBPAGE: test_env
*/
void page_test_env(void){
style_header("Environment Test");
| > | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
*/
void page_style_css(void){
char *zCSS = 0;
cgi_set_content_type("text/css");
zCSS = db_get("css",(char*)zDefaultCSS);
cgi_append_content(zCSS, -1);
g.isConst = 1;
}
/*
** WEBPAGE: test_env
*/
void page_test_env(void){
style_header("Environment Test");
|
| ︙ | ︙ |
Changes to src/vfile.c.
| ︙ | ︙ | |||
165 166 167 168 169 170 171 |
id = db_column_int(&q, 0);
zName = db_column_text(&q, 1);
rid = db_column_int(&q, 2);
isDeleted = db_column_int(&q, 3);
oldChnged = db_column_int(&q, 4);
oldMtime = db_column_int64(&q, 6);
| > > | | | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
id = db_column_int(&q, 0);
zName = db_column_text(&q, 1);
rid = db_column_int(&q, 2);
isDeleted = db_column_int(&q, 3);
oldChnged = db_column_int(&q, 4);
oldMtime = db_column_int64(&q, 6);
if( isDeleted ){
chnged = 1;
}else if( !file_isfile(zName) && file_size(0)>=0 ){
if( notFileIsFatal ){
fossil_warning("not an ordinary file: %s", zName);
nErr++;
}
chnged = 1;
}else if( oldChnged>=2 ){
chnged = oldChnged;
}else if( rid==0 ){
chnged = 1;
}
if( chnged!=1 ){
currentMtime = file_mtime(0);
assert( currentMtime>0 );
}
if( chnged!=1 && (checkMtime==0 || currentMtime!=oldMtime) ){
|
| ︙ | ︙ |
Changes to src/wiki.c.
| ︙ | ︙ | |||
33 34 35 36 37 38 39 | ** Return true if the input string is a well-formed wiki page name. ** ** Well-formed wiki page names do not begin or end with whitespace, ** and do not contain tabs or other control characters and do not ** contain more than a single space character in a row. Well-formed ** names must be between 3 and 100 chracters in length, inclusive. */ | | | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
** Return true if the input string is a well-formed wiki page name.
**
** Well-formed wiki page names do not begin or end with whitespace,
** and do not contain tabs or other control characters and do not
** contain more than a single space character in a row. Well-formed
** names must be between 3 and 100 chracters in length, inclusive.
*/
int wiki_name_is_wellformed(const unsigned char *z){
int i;
if( z[0]<=0x20 ){
return 0;
}
for(i=1; z[i]; i++){
if( z[i]<0x20 ) return 0;
if( z[i]==0x20 && z[i-1]==0x20 ) return 0;
|
| ︙ | ︙ | |||
65 66 67 68 69 70 71 |
}
/*
** Check a wiki name. If it is not well-formed, then issue an error
** and return true. If it is well-formed, return false.
*/
static int check_name(const char *z){
| | | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
}
/*
** Check a wiki name. If it is not well-formed, then issue an error
** and return true. If it is well-formed, return false.
*/
static int check_name(const char *z){
if( !wiki_name_is_wellformed((const unsigned char *)z) ){
style_header("Wiki Page Name Error");
@ The wiki name "<b>%h(z)</b>" is not well-formed. Rules for
@ wiki page names:
well_formed_wiki_name_rules();
style_footer();
return 1;
}
|
| ︙ | ︙ | |||
343 344 345 346 347 348 349 |
const char *zName;
login_check_credentials();
if( !g.okNewWiki ){
login_needed();
return;
}
zName = PD("name","");
| | | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
const char *zName;
login_check_credentials();
if( !g.okNewWiki ){
login_needed();
return;
}
zName = PD("name","");
if( zName[0] && wiki_name_is_wellformed((const unsigned char *)zName) ){
cgi_redirectf("wikiedit?name=%T", zName);
}
style_header("Create A New Wiki Page");
@ <p>Rules for wiki page names:
well_formed_wiki_name_rules();
@ </p>
@ <form method="POST" action="%s(g.zBaseURL)/wikinew">
|
| ︙ | ︙ |
Changes to src/wikiformat.c.
| ︙ | ︙ | |||
1013 1014 1015 1016 1017 1018 1019 |
}else{
zTerm = "";
}
}
}else if( g.okHistory ){
blob_appendf(p->pOut, "<a href=\"%s/info/%s\">", g.zBaseURL, zTarget);
}
| | | 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 |
}else{
zTerm = "";
}
}
}else if( g.okHistory ){
blob_appendf(p->pOut, "<a href=\"%s/info/%s\">", g.zBaseURL, zTarget);
}
}else if( wiki_name_is_wellformed((const unsigned char *)zTarget) ){
blob_appendf(p->pOut, "<a href=\"%s/wiki?name=%T\">", g.zBaseURL, zTarget);
}else{
blob_appendf(p->pOut, "[bad-link: %h]", zTarget);
zTerm = "";
}
assert( strlen(zTerm)<nClose );
strcpy(zClose, zTerm);
|
| ︙ | ︙ |
Changes to src/xfer.c.
| ︙ | ︙ | |||
384 385 386 387 388 389 390 391 392 393 394 395 396 397 |
*/
int check_login(Blob *pLogin, Blob *pNonce, Blob *pSig){
Stmt q;
int rc = -1;
char *zLogin = blob_terminate(pLogin);
defossilize(zLogin);
db_prepare(&q,
"SELECT pw, cap, uid FROM user"
" WHERE login=%Q"
" AND login NOT IN ('anonymous','nobody','developer','reader')"
" AND length(pw)>0",
zLogin
);
| > > > | 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
*/
int check_login(Blob *pLogin, Blob *pNonce, Blob *pSig){
Stmt q;
int rc = -1;
char *zLogin = blob_terminate(pLogin);
defossilize(zLogin);
if( strcmp(zLogin, "nobody")==0 || strcmp(zLogin,"anonymous")==0 ){
return 0; /* Anybody is allowed to sync as "nobody" or "anonymous" */
}
db_prepare(&q,
"SELECT pw, cap, uid FROM user"
" WHERE login=%Q"
" AND login NOT IN ('anonymous','nobody','developer','reader')"
" AND length(pw)>0",
zLogin
);
|
| ︙ | ︙ | |||
1060 1061 1062 1063 1064 1065 1066 |
xfer.nFileSent, xfer.nDeltaSent);
nCardSent = 0;
nCardRcvd = 0;
xfer.nFileSent = 0;
xfer.nDeltaSent = 0;
xfer.nGimmeSent = 0;
fflush(stdout);
| | | 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 |
xfer.nFileSent, xfer.nDeltaSent);
nCardSent = 0;
nCardRcvd = 0;
xfer.nFileSent = 0;
xfer.nDeltaSent = 0;
xfer.nGimmeSent = 0;
fflush(stdout);
http_exchange(&send, &recv, cloneFlag==0 || nCycle>0);
blob_reset(&send);
/* Begin constructing the next message (which might never be
** sent) by beginning with the pull or push cards
*/
if( pullFlag ){
blob_appendf(&send, "pull %s %s\n", zSCode, zPCode);
|
| ︙ | ︙ |
Changes to www/branching.wiki.
| ︙ | ︙ | |||
171 172 173 174 175 176 177 | A <i>tag</i> is a name that is attached to a check-in. A <i>property</i> is a name/value pair. Internally, fossil implements tags as properties with a NULL value. So, tags and properties really are much the same thing, and henceforth we will use the word "tag" to mean either a tag or a property. | | | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | A <i>tag</i> is a name that is attached to a check-in. A <i>property</i> is a name/value pair. Internally, fossil implements tags as properties with a NULL value. So, tags and properties really are much the same thing, and henceforth we will use the word "tag" to mean either a tag or a property. A tag can be a one-time tag, a propagating tag or a cancellation tag. A one-time tag only applies to the check-in to which it is attached. A propagating tag applies to the check-in to which it is attached and also to all direct descendants of that check-in. A <i>direct descendant</i> is a descendant through direct children. Tags propagation does not cross merges. Tag propagation also stops as soon as it encounters another check-in with the same tag. A cancellation tag is attached to a single check-in in order to either override a one-time |
| ︙ | ︙ |