Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Separate "nobody" and "anonymous" logins. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
9c952d247e5164a53ae2c24d5e0068d4 |
| User & Date: | drh 2007-07-31 22:59:31.000 |
Context
|
2007-07-31
| ||
| 23:33 | Add the new "history" permission. Merge in changes that require permissions to view the timeline. ... (check-in: fd36718ad9 user: drh tags: trunk) | |
| 22:59 | Separate "nobody" and "anonymous" logins. ... (check-in: 9c952d247e user: drh tags: trunk) | |
| 20:53 | Bug fix in the mlink table builder. Use the "rebuild" method to correct the problem in preexisting repositories. ... (check-in: 5b58559c0c user: drh tags: trunk) | |
Changes
Changes to src/login.c.
| ︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** ** This file contains code for generating the login and logout screens. */ #include "config.h" #include "login.h" #include <time.h> /* ** Return the name of the login cookie | > > > > > > > > > > > > > > > > > > > > | 19 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 45 46 47 48 49 50 51 52 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** ** This file contains code for generating the login and logout screens. ** ** Notes: ** ** There are two special-case user-ids: "anonymous" and "nobody". ** The capabilities of the nobody user are available to anyone, ** regardless of whether or not they are logged in. The capabilities ** of anonymous are only available after logging in, but the login ** screen displays the password for the anonymous login, so this ** should not prevent a human user from doing so. ** ** The nobody user has capabilities that you want spiders to have. ** The anonymous user has capabilities that you want people without ** logins to have. ** ** Of course, a sophisticated spider could easily circumvent the ** anonymous login requirement and walk the website. But that is ** not really the point. The anonymous login keeps search-engine ** crawlers and site download tools like wget from walking change ** logs and downloading diffs of very version of the archive that ** has ever existed, and things like that. */ #include "config.h" #include "login.h" #include <time.h> /* ** Return the name of the login cookie |
| ︙ | ︙ | |||
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
** WEBPAGE: /logout
**
** Generate the login page
*/
void login_page(void){
const char *zUsername, *zPasswd, *zGoto;
const char *zNew1, *zNew2;
char *zErrMsg = "";
login_check_credentials();
zUsername = P("u");
zPasswd = P("p");
zGoto = PD("g","index");
if( P("out")!=0 ){
const char *zCookieName = login_cookie_name();
cgi_set_cookie(zCookieName, "", 0, -86400);
cgi_redirect(zGoto);
}
| > | | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
** WEBPAGE: /logout
**
** Generate the login page
*/
void login_page(void){
const char *zUsername, *zPasswd, *zGoto;
const char *zNew1, *zNew2;
const char *zAnonPw;
char *zErrMsg = "";
login_check_credentials();
zUsername = P("u");
zPasswd = P("p");
zGoto = PD("g","index");
if( P("out")!=0 ){
const char *zCookieName = login_cookie_name();
cgi_set_cookie(zCookieName, "", 0, -86400);
cgi_redirect(zGoto);
}
if( g.okPassword && zPasswd && (zNew1 = P("n1"))!=0 && (zNew2 = P("n2"))!=0 ){
if( db_int(1, "SELECT 0 FROM user"
" WHERE uid=%d AND pw=%Q", g.userUid, zPasswd) ){
sleep(1);
zErrMsg =
@ <p><font color="red">
@ You entered an incorrect old password while attempting to change
@ your password. Your password is unchanged.
|
| ︙ | ︙ | |||
76 77 78 79 80 81 82 |
db_multi_exec(
"UPDATE user SET pw=%Q WHERE uid=%d", zNew1, g.userUid
);
cgi_redirect("index");
return;
}
}
| | | < | > | > > > | < | | | | | | > | 97 98 99 100 101 102 103 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 129 130 131 132 133 134 135 136 137 138 139 |
db_multi_exec(
"UPDATE user SET pw=%Q WHERE uid=%d", zNew1, g.userUid
);
cgi_redirect("index");
return;
}
}
if( zUsername!=0 && zPasswd!=0 ){
int uid = db_int(0,
"SELECT uid FROM user"
" WHERE login=%Q AND pw=%Q", zUsername, zPasswd);
if( uid<=0 || strcmp(zUsername,"nobody")==0 ){
sleep(1);
zErrMsg =
@ <p><font color="red">
@ You entered an unknown user or an incorrect password.
@ </font></p>
;
}else{
char *zCookie;
const char *zCookieName = login_cookie_name();
const char *zExpire = db_get("cookie-expire","8766");
int expires = atoi(zExpire)*3600;
const char *zIpAddr = PD("REMOTE_ADDR","nil");
if( strcmp(zUsername, "anonymous")==0 ){
cgi_set_cookie(zCookieName, "anonymous", 0, expires);
}else{
zCookie = db_text(0, "SELECT '%d/' || hex(randomblob(25))", uid);
cgi_set_cookie(zCookieName, zCookie, 0, expires);
db_multi_exec(
"UPDATE user SET cookie=%Q, ipaddr=%Q, "
" cexpire=julianday('now')+%d/86400.0 WHERE uid=%d",
zCookie, zIpAddr, expires, uid
);
}
cgi_redirect(zGoto);
}
}
style_header("Login/Logout");
@ %s(zErrMsg)
@ <form action="login" method="POST">
if( P("g") ){
|
| ︙ | ︙ | |||
125 126 127 128 129 130 131 | @ <td><input type="password" name="p" value="" size=30></td> @ </tr> @ <tr> @ <td></td> @ <td><input type="submit" name="in" value="Login"></td> @ </tr> @ </table> | | > > | < > > > | > > > | > | | | 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 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 190 191 192 |
@ <td><input type="password" name="p" value="" size=30></td>
@ </tr>
@ <tr>
@ <td></td>
@ <td><input type="submit" name="in" value="Login"></td>
@ </tr>
@ </table>
if( g.zLogin==0 ){
@ <p>To login
}else{
@ <p>You are current logged in as <b>%h(g.zLogin)</b></p>
@ <p>To change your login to a different user
}
@ enter the user-id and password at the left and press the
@ "Login" button. Your user name will be stored in a browser cookie.
@ You must configure your web browser to accept cookies in order for
@ the login to take.</p>
if( g.zLogin==0 ){
zAnonPw = db_text(0, "SELECT pw FROM user"
" WHERE login='anonymous'"
" AND cap!=''");
if( zAnonPw ){
@ <p>If you do not have a user-id, enter "<b>anonymous</b>" with a
@ password of "<b>%h(zAnonPw)</b>".</p>
}else{
@ <p>A valid user-id and password is required. Anonymous access
@ is not allowed on this installation.</p>
}
}
if( g.zLogin ){
@ <br clear="both"><hr>
@ <p>To log off the system (and delete your login cookie)
@ press the following button:<br>
@ <input type="submit" name="out" value="Logout"></p>
}
@ </form>
if( g.okPassword ){
@ <br clear="both"><hr>
@ <p>To change your password, enter your old password and your
@ new password twice below then press the "Change Password"
@ button.</p>
@ <form action="login" method="POST">
@ <table>
@ <tr><td align="right">Old Password:</td>
|
| ︙ | ︙ | |||
182 183 184 185 186 187 188 |
void login_check_credentials(void){
int uid = 0;
const char *zCookie;
const char *zRemoteAddr;
const char *zCap = 0;
/* Only run this check once. */
| | < < | > | | > | | > > | > | | | | | < | | > | | > > | 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
void login_check_credentials(void){
int uid = 0;
const char *zCookie;
const char *zRemoteAddr;
const char *zCap = 0;
/* Only run this check once. */
if( g.userUid!=0 ) return;
/* If the HTTP connection is coming over 127.0.0.1 and if
** local login is disabled, then there is no need to check
** user credentials.
*/
zRemoteAddr = PD("REMOTE_ADDR","nil");
if( strcmp(zRemoteAddr, "127.0.0.1")==0
&& db_get_int("authenticate-localhost",1)==0 ){
uid = db_int(0, "SELECT uid FROM user WHERE cap LIKE '%%s%%'");
g.zLogin = db_text("?", "SELECT login FROM user WHERE uid=%d", uid);
zCap = "s";
g.noPswd = 1;
}
/* Check the login cookie to see if it matches a known valid user.
*/
if( uid==0 && (zCookie = P(login_cookie_name()))!=0 ){
if( isdigit(zCookie[0]) ){
uid = db_int(0,
"SELECT uid FROM user"
" WHERE uid=%d"
" AND cookie=%Q"
" AND ipaddr=%Q"
" AND cexpire>julianday('now')",
atoi(zCookie), zCookie, zRemoteAddr
);
}else if( zCookie[0]=='a' ){
uid = db_int(0, "SELECT uid FROM user WHERE login='anonymous'");
}
}
if( uid==0 ){
uid = db_int(0, "SELECT uid FROM user WHERE login='nobody'");
if( uid==0 ){
uid = -1;
zCap = "";
}
}
if( zCap==0 ){
if( uid ){
Stmt s;
db_prepare(&s, "SELECT login, cap FROM user WHERE uid=%d", uid);
db_step(&s);
g.zLogin = db_column_malloc(&s, 0);
zCap = db_column_malloc(&s, 1);
db_finalize(&s);
}
if( zCap==0 ){
zCap = "";
}
}
g.userUid = uid;
login_set_capabilities(zCap);
}
/*
** Set the global capability flags based on a capability string.
*/
void login_set_capabilities(const char *zCap){
|
| ︙ | ︙ |
Changes to src/main.c.
| ︙ | ︙ | |||
72 73 74 75 76 77 78 | int urlPort; /* TCP port number for http: */ char *urlPath; /* Pathname for http: */ char *urlUser; /* User id for http: */ char *urlPasswd; /* Password for http: */ char *urlCanonical; /* Canonical representation of the URL */ const char *zLogin; /* Login name. "" if not logged in. */ | < | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | int urlPort; /* TCP port number for http: */ char *urlPath; /* Pathname for http: */ char *urlUser; /* User id for http: */ char *urlPasswd; /* Password for http: */ char *urlCanonical; /* Canonical representation of the URL */ const char *zLogin; /* Login name. "" if not logged in. */ int noPswd; /* Logged in without password (on 127.0.0.1) */ int userUid; /* Integer user id */ /* Information used to populate the RCVFROM table */ int rcvid; /* The rcvid. 0 if not yet defined. */ char *zIpAddr; /* The remote IP address */ char *zNonce; /* The nonce used for login */ |
| ︙ | ︙ |
Changes to src/setup.c.
| ︙ | ︙ | |||
79 80 81 82 83 84 85 |
** screen for that user.
*/
void setup_ulist(void){
Stmt s;
style_footer();
login_check_credentials();
| | | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
** screen for that user.
*/
void setup_ulist(void){
Stmt s;
style_footer();
login_check_credentials();
if( !g.okSetup ){
login_needed();
return;
}
style_submenu_element("Add", "Add User", "setup_uedit");
style_header("User List");
@ <table align="left" hspace="10" border="1" cellpadding="10"><tr><td>
|
| ︙ | ︙ | |||
369 370 371 372 373 374 375 | @ <li><p> @ An <b>Admin</b> user can add other users, create new ticket report @ formats, and change system defaults. But only the <b>Setup</b> user @ is able to change the repository to @ which this program is linked. @ </p></li> @ | < | | | | | > | | | | > > > | > | | < | 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 | @ <li><p> @ An <b>Admin</b> user can add other users, create new ticket report @ formats, and change system defaults. But only the <b>Setup</b> user @ is able to change the repository to @ which this program is linked. @ </p></li> @ @ <li><p> @ No login is required for user "<b>nobody</b>". The capabilities @ of this user are available to anyone without supplying a username or @ password. To disable nobody access, make sure there is no user @ with an ID of <b>nobody</b> or that the nobody user has no @ capabilities enabled. The password for the noloing user is ignore. @ </p></li> @ @ <li><p> @ Login is required for user "<b>anonymous</b>" but the password @ is displayed on the login screen beside the password entry box @ so anybody who can read should be able to login as anonymous. @ On the other hand, spiders and web-crawlers will typically not @ be able to login. Set the capabilities of the anonymous user @ to things that you want any human to be able to do, but no any @ spider. @ </p></li> @ </form> style_footer(); } /* ** Generate a checkbox for an attribute. |
| ︙ | ︙ |
Changes to src/style.c.
| ︙ | ︙ | |||
74 75 76 77 78 79 80 | login_check_credentials(); @ <html> @ <body bgcolor="white"> @ <hr size="1"> @ <table border="0" cellpadding="0" cellspacing="0" width="100%%"> @ <tr><td valign="top" align="left"> @ <big><big><b>%s(zTitle)</b></big></big><br> | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
login_check_credentials();
@ <html>
@ <body bgcolor="white">
@ <hr size="1">
@ <table border="0" cellpadding="0" cellspacing="0" width="100%%">
@ <tr><td valign="top" align="left">
@ <big><big><b>%s(zTitle)</b></big></big><br>
if( g.zLogin==0 ){
@ <small>not logged in</small>
zLogInOut = "Login";
}else{
@ <small>logged in as %h(g.zLogin)</small>
}
@ </td><td valign="top" align="right">
@ <a href="%s(g.zBaseURL)/index">Home</a>
|
| ︙ | ︙ |