Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Change default headers to show menu-bar items that would be available to user "anonymous" even if the current user is not logged in. |
|---|---|
| Timelines: | family | ancestors | descendants | both | login-enhancements |
| Files: | files | file ages | folders |
| SHA1: |
72cddddbcc2e4b19ae173ff568ded585 |
| User & Date: | drh 2015-02-14 14:05:05.766 |
References
|
2015-03-25
| ||
| 22:13 |
Updates to the Xekri skin to match the changes in the other skins
| |
Context
|
2015-02-14
| ||
| 14:55 | Added the referred_from_login() function and use it to enhance the /zip and /tarball pages so that they show a download button to click if the referrer page was /login. Closed-Leaf check-in: bcebe55e91 user: drh tags: login-enhancements | |
| 14:05 | Change default headers to show menu-bar items that would be available to user "anonymous" even if the current user is not logged in. check-in: 72cddddbcc user: drh tags: login-enhancements | |
| 12:24 | When the user is "nobody", make the g.anon permission vector for "anonymous" available in addition to g.perm. Hyperlinks to pages that would be available to anonymous are shown rather than suppressed. When permission is denied and control jumps to login_needed() a new flag shows whether or not logging in as "anonymous" would help. Work in progre... check-in: 2f50d427a9 user: drh tags: login-enhancements | |
Changes
Changes to skins/black_and_white/header.txt.
| ︙ | ︙ | |||
24 25 26 27 28 29 30 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/default/header.txt.
| ︙ | ︙ | |||
23 24 25 26 27 28 29 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/eagle/header.txt.
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
html "<a href='$home/help'>Help</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
html "<a href='$home/help'>Help</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/enhanced1/header.txt.
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
html "<a href='$home/help'>Help</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
html "<a href='$home/help'>Help</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/etienne1/header.txt.
| ︙ | ︙ | |||
63 64 65 66 67 68 69 |
}
menulink "home" $index_page Home
if {[anycap jor]} {
menulink "timeline" "/timeline" Timeline
}
| | | | | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
}
menulink "home" $index_page Home
if {[anycap jor]} {
menulink "timeline" "/timeline" Timeline
}
if {[anoncap oh]} {
menulink "dir" "/dir?ci=tip" Files
}
if {[anoncap o]} {
menulink "brlist" "/brlist" Branches
menulink "taglist" "/taglist" Tags
}
if {[anoncap r]} {
menulink "ticket" "/ticket" Tickets
}
if {[anoncap j]} {
menulink "wiki" "/wiki" Wiki
}
if {[hascap s]} {
menulink "setup" "/setup" Admin
} elseif {[hascap a]} {
menulink "setup_ulist" "/setup_ulist" Users
}
|
| ︙ | ︙ |
Changes to skins/khaki/header.txt.
| ︙ | ︙ | |||
22 23 24 25 26 27 28 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/plain_gray/header.txt.
| ︙ | ︙ | |||
20 21 22 23 24 25 26 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to skins/rounded1/header.txt.
| ︙ | ︙ | |||
24 25 26 27 28 29 30 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
| | | | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
</div>
<div class="mainmenu">
<th1>
html "<a href='$home$index_page'>Home</a>\n"
if {[anycap jor]} {
html "<a href='$home/timeline'>Timeline</a>\n"
}
if {[anoncap oh]} {
html "<a href='$home/tree?ci=tip'>Files</a>\n"
}
if {[anoncap o]} {
html "<a href='$home/brlist'>Branches</a>\n"
html "<a href='$home/taglist'>Tags</a>\n"
}
if {[anoncap r]} {
html "<a href='$home/ticket'>Tickets</a>\n"
}
if {[anoncap j]} {
html "<a href='$home/wiki'>Wiki</a>\n"
}
if {[hascap s]} {
html "<a href='$home/setup'>Admin</a>\n"
} elseif {[hascap a]} {
html "<a href='$home/setup_ulist'>Users</a>\n"
}
|
| ︙ | ︙ |
Changes to src/info.c.
| ︙ | ︙ | |||
655 656 657 658 659 660 661 |
const char *zTagName = db_column_text(&q2, 0);
@ | %z(href("%R/timeline?r=%T&unhide",zTagName))%h(zTagName)</a>
}
db_finalize(&q2);
/* The Download: line */
| | | | 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 |
const char *zTagName = db_column_text(&q2, 0);
@ | %z(href("%R/timeline?r=%T&unhide",zTagName))%h(zTagName)</a>
}
db_finalize(&q2);
/* The Download: line */
if( g.anon.Zip ){
char *zUrl = mprintf("%R/tarball/%t-%S.tar.gz?uuid=%s",
zPJ, zUuid, zUuid);
@ </td></tr>
@ <tr><th>Downloads:</th><td>
@ %z(href("%s",zUrl))Tarball</a>
@ | %z(href("%R/zip/%t-%S.zip?uuid=%!S",zPJ,zUuid,zUuid))
@ ZIP archive</a>
fossil_free(zUrl);
}
@ </td></tr>
@ <tr><th>Other Links:</th>
@ <td>
@ %z(href("%R/tree?ci=%!S",zUuid))files</a>
@ | %z(href("%R/fileage?name=%!S",zUuid))file ages</a>
@ | %z(href("%R/tree?nofiles&type=tree&ci=%!S",zUuid))folders</a>
@ | %z(href("%R/artifact/%!S",zUuid))manifest</a>
if( g.anon.Write ){
@ | %z(href("%R/ci_edit?r=%!S",zUuid))edit</a>
}
@ </td>
@ </tr>
blob_reset(&projName);
}
@ </table>
|
| ︙ | ︙ | |||
1361 1362 1363 1364 1365 1366 1367 |
if( cnt>0 ){
@ Also attachment "%h(zFilename)" to
}else{
@ Attachment "%h(zFilename)" to
}
objType |= OBJTYPE_ATTACHMENT;
if( strlen(zTarget)==UUID_SIZE && validate16(zTarget,UUID_SIZE) ){
| | | | 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 |
if( cnt>0 ){
@ Also attachment "%h(zFilename)" to
}else{
@ Attachment "%h(zFilename)" to
}
objType |= OBJTYPE_ATTACHMENT;
if( strlen(zTarget)==UUID_SIZE && validate16(zTarget,UUID_SIZE) ){
if( g.perm.Hyperlink && g.anon.RdTkt ){
@ ticket [%z(href("%R/tktview?name=%!S",zTarget))%S(zTarget)</a>]
}else{
@ ticket [%S(zTarget)]
}
}else{
if( g.perm.Hyperlink && g.anon.RdWiki ){
@ wiki page [%z(href("%R/wiki?name=%t",zTarget))%h(zTarget)</a>]
}else{
@ wiki page [%h(zTarget)]
}
}
@ added by
hyperlink_to_user(zUser,zDate," on");
|
| ︙ | ︙ |
Changes to src/login.c.
| ︙ | ︙ | |||
445 446 447 448 449 450 451 452 453 454 455 |
rc = rc | (buf1[i] ^ buf2[i]);
}
}
sqlite3_result_int(context, rc);
}
/*
** WEBPAGE: login
** WEBPAGE: logout
** WEBPAGE: my
**
| > > > > > | | | | < | | 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 |
rc = rc | (buf1[i] ^ buf2[i]);
}
}
sqlite3_result_int(context, rc);
}
/*
** There used to be a page named "my" that was designed to show information
** about a specific user. The "my" page was linked from the "Logged in as USER"
** line on the title bar. The "my" page was never completed so it is now
** removed. Use this page as a placeholder in older installations.
**
** WEBPAGE: login
** WEBPAGE: logout
** WEBPAGE: my
**
** The login/logout page. Parameters:
**
** g=URL Jump back to this URL after login completes
** anon The g=URL is not accessible by "nobody" but is
** accessible by "anonymous"
*/
void login_page(void){
const char *zUsername, *zPasswd;
const char *zNew1, *zNew2;
const char *zAnonPw = 0;
const char *zGoto = P("g");
int anonFlag; /* Login as "anonymous" would be useful */
char *zErrMsg = "";
int uid; /* User id logged in user */
char *zSha1Pw;
const char *zIpAddr; /* IP address of requestor */
const char *zReferer;
login_check_credentials();
|
| ︙ | ︙ | |||
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 |
cgi_redirectf("%s%s%s", g.zHttpsURL, P("PATH_INFO"), zQS);
return;
}
sqlite3_create_function(g.db, "constant_time_cmp", 2, SQLITE_UTF8, 0,
constant_time_cmp_function, 0, 0);
zUsername = P("u");
zPasswd = P("p");
if( P("out") ){
login_clear_login_data();
redirect_to_g();
return;
}
if( g.perm.Password && zPasswd
&& (zNew1 = P("n1"))!=0 && (zNew2 = P("n2"))!=0
){
/* The user requests a password change */
zSha1Pw = sha1_shared_secret(zPasswd, g.zLogin, 0);
if( db_int(1, "SELECT 0 FROM user"
" WHERE uid=%d"
| > > > > > | 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 |
cgi_redirectf("%s%s%s", g.zHttpsURL, P("PATH_INFO"), zQS);
return;
}
sqlite3_create_function(g.db, "constant_time_cmp", 2, SQLITE_UTF8, 0,
constant_time_cmp_function, 0, 0);
zUsername = P("u");
zPasswd = P("p");
anonFlag = g.zLogin==0 && PB("anon");
/* Handle log-out requests */
if( P("out") ){
login_clear_login_data();
redirect_to_g();
return;
}
/* Deal with password-change requests */
if( g.perm.Password && zPasswd
&& (zNew1 = P("n1"))!=0 && (zNew2 = P("n2"))!=0
){
/* The user requests a password change */
zSha1Pw = sha1_shared_secret(zPasswd, g.zLogin, 0);
if( db_int(1, "SELECT 0 FROM user"
" WHERE uid=%d"
|
| ︙ | ︙ | |||
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 |
}
form_begin(0, "%R/login");
if( zGoto ){
@ <input type="hidden" name="g" value="%h(zGoto)" />
}else if( zReferer && strncmp(g.zBaseURL, zReferer, strlen(g.zBaseURL))==0 ){
@ <input type="hidden" name="g" value="%h(zReferer)" />
}
@ <table class="login_out">
@ <tr>
@ <td class="login_out_label">User ID:</td>
if( anonFlag ){
@ <td><input type="text" id="u" name="u" value="anonymous" size="30" /></td>
}else{
@ <td><input type="text" id="u" name="u" value="" size="30" /></td>
}
@ </tr>
@ <tr>
@ <td class="login_out_label">Password:</td>
@ <td><input type="password" id="p" name="p" value="" size="30" /></td>
@ </tr>
| > > > > > > > > > | | 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 |
}
form_begin(0, "%R/login");
if( zGoto ){
@ <input type="hidden" name="g" value="%h(zGoto)" />
}else if( zReferer && strncmp(g.zBaseURL, zReferer, strlen(g.zBaseURL))==0 ){
@ <input type="hidden" name="g" value="%h(zReferer)" />
}
if( anonFlag ){
@ <input type="hidden" name="anon" value="1" />
}
if( g.zLogin ){
@ <p>Currently logged in as <b>%h(g.zLogin)</b>.
@ <input type="submit" name="out" value="Logout"></p>
@ <hr />
@ <p>Change user:
}
@ <table class="login_out">
@ <tr>
@ <td class="login_out_label">User ID:</td>
if( anonFlag ){
@ <td><input type="text" id="u" name="u" value="anonymous" size="30" /></td>
}else{
@ <td><input type="text" id="u" name="u" value="" size="30" /></td>
}
@ </tr>
@ <tr>
@ <td class="login_out_label">Password:</td>
@ <td><input type="password" id="p" name="p" value="" size="30" /></td>
@ </tr>
if( g.zLogin==0 && (anonFlag || zGoto==0) ){
zAnonPw = db_text(0, "SELECT pw FROM user"
" WHERE login='anonymous'"
" AND cap!=''");
}
@ <tr>
@ <td></td>
@ <td><input type="submit" name="in" value="Login"
|
| ︙ | ︙ | |||
630 631 632 633 634 635 636 |
char *zSSL = mprintf("https:%s", &g.zBaseURL[5]);
@ if( form.u.value!="anonymous" ){
@ form.action = "%h(zSSL)/login";
@ }
}
@ }
@ </script>
| < < < | < | 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 |
char *zSSL = mprintf("https:%s", &g.zBaseURL[5]);
@ if( form.u.value!="anonymous" ){
@ form.action = "%h(zSSL)/login";
@ }
}
@ }
@ </script>
@ <p>Pressing the Login button grants permission to store a cookie.</p>
if( db_get_boolean("self-register", 0) ){
@ <p>If you do not have an account, you can
@ <a href="%R/register?g=%T(P("G"))">create one</a>.
}
if( zAnonPw ){
unsigned int uSeed = captcha_seed();
const char *zDecoded = captcha_decode(uSeed);
|
| ︙ | ︙ | |||
658 659 660 661 662 663 664 |
if( bAutoCaptcha ) {
@ <input type="button" value="Fill out captcha"
@ onclick="gebi('u').value='anonymous'; gebi('p').value='%s(zDecoded)';" />
}
@ </div>
free(zCaptcha);
}
| < < < < < < < | < | 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 |
if( bAutoCaptcha ) {
@ <input type="button" value="Fill out captcha"
@ onclick="gebi('u').value='anonymous'; gebi('p').value='%s(zDecoded)';" />
}
@ </div>
free(zCaptcha);
}
@ </form>
if( g.perm.Password ){
@ <hr />
@ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
form_begin(0, "%R/login");
@ <table>
@ <tr><td class="login_out_label">Old Password:</td>
@ <td><input type="password" name="p" size="30" /></td></tr>
@ <tr><td class="login_out_label">New Password:</td>
@ <td><input type="password" name="n1" size="30" /></td></tr>
@ <tr><td class="login_out_label">Repeat New Password:</td>
|
| ︙ | ︙ | |||
1004 1005 1006 1007 1008 1009 1010 | /* ** Memory of settings */ static int login_anon_once = 1; /* | | | > > > > > > | 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 |
/*
** Memory of settings
*/
static int login_anon_once = 1;
/*
** Add to g.perm the default privileges of users "nobody" and/or "anonymous"
** as appropriate for the user g.zLogin.
**
** This routine also sets up g.anon to be either a copy of g.perm for
** all logged in uses, or the privileges that would be available to "anonymous"
** if g.zLogin==0 (meaning that the user is "nobody").
*/
void login_set_anon_nobody_capabilities(void){
if( login_anon_once ){
const char *zCap;
/* All users get privileges from "nobody" */
zCap = db_text("", "SELECT cap FROM user WHERE login = 'nobody'");
login_set_capabilities(zCap, 0);
zCap = db_text("", "SELECT cap FROM user WHERE login = 'anonymous'");
if( g.zLogin && fossil_strcmp(g.zLogin, "nobody")!=0 ){
/* All logged-in users inherit privileges from "anonymous" */
login_set_capabilities(zCap, 0);
g.anon = g.perm;
}else{
/* Record the privileges of anonymous in g.anon */
g.anon = g.perm;
login_set_capabilities(zCap, LOGIN_ANON);
}
login_anon_once = 0;
}
}
/*
|
| ︙ | ︙ | |||
1223 1224 1225 1226 1227 1228 1229 |
blob_init(&redir, 0, 0);
if( login_wants_https_redirect() ){
blob_appendf(&redir, "%s/login?g=%T", g.zHttpsURL, zUrl);
}else{
blob_appendf(&redir, "%R/login?g=%T", zUrl);
}
if( anonOk ) blob_append(&redir, "&anon", 5);
| | | 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 |
blob_init(&redir, 0, 0);
if( login_wants_https_redirect() ){
blob_appendf(&redir, "%s/login?g=%T", g.zHttpsURL, zUrl);
}else{
blob_appendf(&redir, "%R/login?g=%T", zUrl);
}
if( anonOk ) blob_append(&redir, "&anon", 5);
if( zQS && zQS[0] ){
blob_appendf(&redir, "&%s", zQS);
}
cgi_redirect(blob_str(&redir));
/* NOTREACHED */
assert(0);
}
}
|
| ︙ | ︙ |
Changes to src/main.c.
| ︙ | ︙ | |||
194 195 196 197 198 199 200 | int rcvid; /* The rcvid. 0 if not yet defined. */ char *zIpAddr; /* The remote IP address */ char *zNonce; /* The nonce used for login */ /* permissions available to current user */ struct FossilUserPerms perm; | | > > | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | int rcvid; /* The rcvid. 0 if not yet defined. */ char *zIpAddr; /* The remote IP address */ char *zNonce; /* The nonce used for login */ /* permissions available to current user */ struct FossilUserPerms perm; /* permissions available to current user or to "anonymous". ** This is the logical union of perm permissions above with ** the value that perm would take if g.zLogin were "anonymous". */ struct FossilUserPerms anon; #ifdef FOSSIL_ENABLE_TCL /* all Tcl related context necessary for integration */ struct TclContext tcl; #endif |
| ︙ | ︙ |
Changes to src/tkt.c.
| ︙ | ︙ | |||
448 449 450 451 452 453 454 |
void tktview_page(void){
const char *zScript;
char *zFullName;
const char *zUuid = PD("name","");
login_check_credentials();
if( !g.perm.RdTkt ){ login_needed(g.anon.RdTkt); return; }
| | | | | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 |
void tktview_page(void){
const char *zScript;
char *zFullName;
const char *zUuid = PD("name","");
login_check_credentials();
if( !g.perm.RdTkt ){ login_needed(g.anon.RdTkt); return; }
if( g.anon.WrTkt || g.anon.ApndTkt ){
style_submenu_element("Edit", "Edit The Ticket", "%s/tktedit?name=%T",
g.zTop, PD("name",""));
}
if( g.perm.Hyperlink ){
style_submenu_element("History", "History Of This Ticket",
"%s/tkthistory/%T", g.zTop, zUuid);
style_submenu_element("Timeline", "Timeline Of This Ticket",
"%s/tkttimeline/%T", g.zTop, zUuid);
style_submenu_element("Check-ins", "Check-ins Of This Ticket",
"%s/tkttimeline/%T?y=ci", g.zTop, zUuid);
}
if( g.anon.NewTkt ){
style_submenu_element("New Ticket", "Create a new ticket",
"%s/tktnew", g.zTop);
}
if( g.anon.ApndTkt && g.anon.Attach ){
style_submenu_element("Attach", "Add An Attachment",
"%s/attachadd?tkt=%T&from=%s/tktview/%t",
g.zTop, zUuid, g.zTop, zUuid);
}
if( P("plaintext") ){
style_submenu_element("Formatted", "Formatted", "%R/tktview/%s", zUuid);
}else{
|
| ︙ | ︙ | |||
1410 1411 1412 1413 1414 1415 1416 |
void ticket_standard_submenu(unsigned int ok){
if( (ok & T_SRCH)!=0 && search_restrict(SRCH_TKT)!=0 ){
style_submenu_element("Search","Search","%R/tktsrch");
}
if( (ok & T_REPLIST)!=0 ){
style_submenu_element("Reports","Reports","%R/reportlist");
}
| | | 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 |
void ticket_standard_submenu(unsigned int ok){
if( (ok & T_SRCH)!=0 && search_restrict(SRCH_TKT)!=0 ){
style_submenu_element("Search","Search","%R/tktsrch");
}
if( (ok & T_REPLIST)!=0 ){
style_submenu_element("Reports","Reports","%R/reportlist");
}
if( (ok & T_NEW)!=0 && g.anon.NewTkt ){
style_submenu_element("New","New","%R/tktnew");
}
}
/*
** WEBPAGE: ticket
**
|
| ︙ | ︙ |
Changes to src/tktsetup.c.
| ︙ | ︙ | |||
713 714 715 716 717 718 719 | } /* ** The default report list page */ static const char zDefaultReportList[] = @ <th1> | | | | | | 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 |
}
/*
** The default report list page
*/
static const char zDefaultReportList[] =
@ <th1>
@ if {[anoncap n]} {
@ html "<p>Enter a new ticket:</p>"
@ html "<ul><li><a href='tktnew'>New ticket</a></li></ul>"
@ }
@ </th1>
@
@ <p>Choose a report format from the following list:</p>
@ <ol>
@ <th1>html $report_items</th1>
@ </ol>
@
@ <th1>
@ if {[anoncap t q]} {
@ html "<p>Other options:</p>\n<ul>\n"
@ if {[anoncap t]} {
@ html "<li><a href='rptnew'>New report format</a></li>\n"
@ }
@ if {[anoncap q]} {
@ html "<li><a href='modreq'>Tend to pending moderation requests</a></li>\n"
@ }
@ }
@ </th1>
;
/*
|
| ︙ | ︙ |
Changes to src/wiki.c.
| ︙ | ︙ | |||
220 221 222 223 224 225 226 |
}
if( (ok & W_LIST)!=0 ){
style_submenu_element("List","List","%R/wcontent");
}
if( (ok & W_HELP)!=0 ){
style_submenu_element("Help","Help","%R/wikihelp");
}
| | | 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
}
if( (ok & W_LIST)!=0 ){
style_submenu_element("List","List","%R/wcontent");
}
if( (ok & W_HELP)!=0 ){
style_submenu_element("Help","Help","%R/wikihelp");
}
if( (ok & W_NEW)!=0 && g.anon.NewWiki ){
style_submenu_element("New","New","%R/wikinew");
}
#if 0
if( (ok & W_BLOG)!=0
#endif
if( (ok & W_SANDBOX)!=0 ){
style_submenu_element("Sandbox", "Sandbox", "%R/wiki?name=Sandbox");
|
| ︙ | ︙ | |||
259 260 261 262 263 264 265 |
}
}
@ <li> %z(href("%R/timeline?y=w"))Recent changes</a> to wiki pages.</li>
@ <li> Formatting rules for %z(href("%R/wiki_rules"))Fossil Wiki</a> and for
@ %z(href("%R/md_rules"))Markdown Wiki</a>.</li>
@ <li> Use the %z(href("%R/wiki?name=Sandbox"))Sandbox</a>
@ to experiment.</li>
| | | | | | 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
}
}
@ <li> %z(href("%R/timeline?y=w"))Recent changes</a> to wiki pages.</li>
@ <li> Formatting rules for %z(href("%R/wiki_rules"))Fossil Wiki</a> and for
@ %z(href("%R/md_rules"))Markdown Wiki</a>.</li>
@ <li> Use the %z(href("%R/wiki?name=Sandbox"))Sandbox</a>
@ to experiment.</li>
if( g.anon.NewWiki ){
@ <li> Create a %z(href("%R/wikinew"))new wiki page</a>.</li>
if( g.anon.Write ){
@ <li> Create a %z(href("%R/eventedit"))new tech-note</a>.</li>
}
}
@ <li> %z(href("%R/wcontent"))List of All Wiki Pages</a>
@ available on this server.</li>
if( g.anon.ModWiki ){
@ <li> %z(href("%R/modreq"))Tend to pending moderation requests</a></li>
}
if( search_restrict(SRCH_WIKI)!=0 ){
@ <li> %z(href("%R/wikisrch"))Search</a> for wiki pages containing key
@ words</li>
}
@ </ul>
|
| ︙ | ︙ | |||
353 354 355 356 357 358 359 |
if( rid ){
style_submenu_element("Diff", "Last change",
"%R/wdiff?name=%T&a=%d", zPageName, rid);
zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
style_submenu_element("Details", "Details",
"%R/info/%s", zUuid);
}
| | | | | 353 354 355 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 |
if( rid ){
style_submenu_element("Diff", "Last change",
"%R/wdiff?name=%T&a=%d", zPageName, rid);
zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
style_submenu_element("Details", "Details",
"%R/info/%s", zUuid);
}
if( (rid && g.anon.WrWiki) || (!rid && g.anon.NewWiki) ){
if( db_get_boolean("wysiwyg-wiki", 0) ){
style_submenu_element("Edit", "Edit Wiki Page",
"%s/wikiedit?name=%T&wysiwyg=1",
g.zTop, zPageName);
}else{
style_submenu_element("Edit", "Edit Wiki Page",
"%s/wikiedit?name=%T",
g.zTop, zPageName);
}
}
if( rid && g.anon.ApndWiki && g.anon.Attach ){
style_submenu_element("Attach", "Add An Attachment",
"%s/attachadd?page=%T&from=%s/wiki%%3fname=%T",
g.zTop, zPageName, g.zTop, zPageName);
}
if( rid && g.anon.ApndWiki ){
style_submenu_element("Append", "Add A Comment",
"%s/wikiappend?name=%T&mimetype=%s",
g.zTop, zPageName, zMimetype);
}
if( g.perm.Hyperlink ){
style_submenu_element("History", "History", "%s/whistory?name=%T",
g.zTop, zPageName);
|
| ︙ | ︙ |