Artifact bef38b39f73e07c6caa2828f8770014068ec172d:
File src/login.c part of check-in [fa6e993017] - New Zip permission. This permission allow someone to download a zipped artifact via the wiki's /zip URL. It can given the user nobody to allow automatic package builder to download the sources they know from fossil-scm.org or other servers without any intervening login necessary.As the /zip page do not expose anything, a spider should have a hard time to crawl thru the project using this URL. So IMO it does not open a break-in hole for spiders.
by cle on 2008-08-12 03:27:54.
0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright 0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich 0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T 0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f 0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo 0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu 0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.** 0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under 0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the 0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub 00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 lic.** License a 00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74 s published by t 00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 he Free Software 00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74 Foundation; eit 00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32 her.** version 2 00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c of the License, 0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74 or (at your opt 0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76 ion) any later v 0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 ersion..**.** Th 0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di 0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the 0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi 0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a ll be useful,.** 0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 but WITHOUT ANY 0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f WARRANTY; witho 0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c ut even the impl 01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a ied warranty of. 01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 ** MERCHANTABILI 01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f TY or FITNESS FO 01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 R A PARTICULAR P 01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 URPOSE. See the 01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 GNU.** General 0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 Public License f 0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e or more details. 0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 .** .** You shou 0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 ld have received 0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 a copy of the G 0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 NU General Publi 0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f c.** License alo 0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 ng with this lib 0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 rary; if not, wr 0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 ite to the.** Fr 02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e ee Software Foun 02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 dation, Inc., 59 02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 Temple Place - 02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f Suite 330,.** Bo 02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d ston, MA 02111- 02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 1307, USA..**.** 0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 Author contact 0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 information:.** 0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a drh@hwaci.com. 0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e ** http://www. 0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a hwaci.com/drh/.* 0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *.************** 0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **************** 0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **************** 0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **************** 0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **************** 03a0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c *.**.** This fil 03b0: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 e contains code 03c0: 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 for generating t 03d0: 68 65 20 6c 6f 67 69 6e 20 61 6e 64 20 6c 6f 67 he login and log 03e0: 6f 75 74 20 73 63 72 65 65 6e 73 2e 0a 2a 2a 0a out screens..**. 03f0: 2a 2a 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 ** Notes:.**.** 0400: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 70 There are two sp 0410: 65 63 69 61 6c 2d 63 61 73 65 20 75 73 65 72 2d ecial-case user- 0420: 69 64 73 3a 20 22 61 6e 6f 6e 79 6d 6f 75 73 22 ids: "anonymous" 0430: 20 61 6e 64 20 22 6e 6f 62 6f 64 79 22 2e 0a 2a and "nobody"..* 0440: 2a 20 54 68 65 20 63 61 70 61 62 69 6c 69 74 69 * The capabiliti 0450: 65 73 20 6f 66 20 74 68 65 20 6e 6f 62 6f 64 79 es of the nobody 0460: 20 75 73 65 72 20 61 72 65 20 61 76 61 69 6c 61 user are availa 0470: 62 6c 65 20 74 6f 20 61 6e 79 6f 6e 65 2c 0a 2a ble to anyone,.* 0480: 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 * regardless of 0490: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 whether or not t 04a0: 68 65 79 20 61 72 65 20 6c 6f 67 67 65 64 20 69 hey are logged i 04b0: 6e 2e 20 20 54 68 65 20 63 61 70 61 62 69 6c 69 n. The capabili 04c0: 74 69 65 73 0a 2a 2a 20 6f 66 20 61 6e 6f 6e 79 ties.** of anony 04d0: 6d 6f 75 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 mous are only av 04e0: 61 69 6c 61 62 6c 65 20 61 66 74 65 72 20 6c 6f ailable after lo 04f0: 67 67 69 6e 67 20 69 6e 2c 20 62 75 74 20 74 68 gging in, but th 0500: 65 20 6c 6f 67 69 6e 0a 2a 2a 20 73 63 72 65 65 e login.** scree 0510: 6e 20 64 69 73 70 6c 61 79 73 20 74 68 65 20 70 n displays the p 0520: 61 73 73 77 6f 72 64 20 66 6f 72 20 74 68 65 20 assword for the 0530: 61 6e 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e 2c anonymous login, 0540: 20 73 6f 20 74 68 69 73 0a 2a 2a 20 73 68 6f 75 so this.** shou 0550: 6c 64 20 6e 6f 74 20 70 72 65 76 65 6e 74 20 61 ld not prevent a 0560: 20 68 75 6d 61 6e 20 75 73 65 72 20 66 72 6f 6d human user from 0570: 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a doing so..**.** 0580: 20 54 68 65 20 6e 6f 62 6f 64 79 20 75 73 65 72 The nobody user 0590: 20 68 61 73 20 63 61 70 61 62 69 6c 69 74 69 65 has capabilitie 05a0: 73 20 74 68 61 74 20 79 6f 75 20 77 61 6e 74 20 s that you want 05b0: 73 70 69 64 65 72 73 20 74 6f 20 68 61 76 65 2e spiders to have. 05c0: 0a 2a 2a 20 54 68 65 20 61 6e 6f 6e 79 6d 6f 75 .** The anonymou 05d0: 73 20 75 73 65 72 20 68 61 73 20 63 61 70 61 62 s user has capab 05e0: 69 6c 69 74 69 65 73 20 74 68 61 74 20 79 6f 75 ilities that you 05f0: 20 77 61 6e 74 20 70 65 6f 70 6c 65 20 77 69 74 want people wit 0600: 68 6f 75 74 0a 2a 2a 20 6c 6f 67 69 6e 73 20 74 hout.** logins t 0610: 6f 20 68 61 76 65 2e 0a 2a 2a 0a 2a 2a 20 4f 66 o have..**.** Of 0620: 20 63 6f 75 72 73 65 2c 20 61 20 73 6f 70 68 69 course, a sophi 0630: 73 74 69 63 61 74 65 64 20 73 70 69 64 65 72 20 sticated spider 0640: 63 6f 75 6c 64 20 65 61 73 69 6c 79 20 63 69 72 could easily cir 0650: 63 75 6d 76 65 6e 74 20 74 68 65 0a 2a 2a 20 61 cumvent the.** a 0660: 6e 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e 20 72 nonymous login r 0670: 65 71 75 69 72 65 6d 65 6e 74 20 61 6e 64 20 77 equirement and w 0680: 61 6c 6b 20 74 68 65 20 77 65 62 73 69 74 65 2e alk the website. 0690: 20 20 42 75 74 20 74 68 61 74 20 69 73 0a 2a 2a But that is.** 06a0: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 74 68 65 20 not really the 06b0: 70 6f 69 6e 74 2e 20 20 54 68 65 20 61 6e 6f 6e point. The anon 06c0: 79 6d 6f 75 73 20 6c 6f 67 69 6e 20 6b 65 65 70 ymous login keep 06d0: 73 20 73 65 61 72 63 68 2d 65 6e 67 69 6e 65 0a s search-engine. 06e0: 2a 2a 20 63 72 61 77 6c 65 72 73 20 61 6e 64 20 ** crawlers and 06f0: 73 69 74 65 20 64 6f 77 6e 6c 6f 61 64 20 74 6f site download to 0700: 6f 6c 73 20 6c 69 6b 65 20 77 67 65 74 20 66 72 ols like wget fr 0710: 6f 6d 20 77 61 6c 6b 69 6e 67 20 63 68 61 6e 67 om walking chang 0720: 65 0a 2a 2a 20 6c 6f 67 73 20 61 6e 64 20 64 6f e.** logs and do 0730: 77 6e 6c 6f 61 64 69 6e 67 20 64 69 66 66 73 20 wnloading diffs 0740: 6f 66 20 76 65 72 79 20 76 65 72 73 69 6f 6e 20 of very version 0750: 6f 66 20 74 68 65 20 61 72 63 68 69 76 65 20 74 of the archive t 0760: 68 61 74 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 hat.** has ever 0770: 65 78 69 73 74 65 64 2c 20 61 6e 64 20 74 68 69 existed, and thi 0780: 6e 67 73 20 6c 69 6b 65 20 74 68 61 74 2e 0a 2a ngs like that..* 0790: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 /.#include "conf 07a0: 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 ig.h".#include " 07b0: 6c 6f 67 69 6e 2e 68 22 0a 23 69 66 64 65 66 20 login.h".#ifdef 07c0: 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 23 20 20 69 __MINGW32__.# i 07d0: 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e nclude <windows. 07e0: 68 3e 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 h> /* 07f0: 66 6f 72 20 53 6c 65 65 70 20 2a 2f 0a 23 20 20 for Sleep */.# 0800: 64 65 66 69 6e 65 20 73 6c 65 65 70 20 53 6c 65 define sleep Sle 0810: 65 70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ep /* 0820: 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f windows does no 0830: 74 20 68 61 76 65 20 73 6c 65 65 70 2c 20 62 75 t have sleep, bu 0840: 74 20 53 6c 65 65 70 20 2a 2f 0a 23 65 6e 64 69 t Sleep */.#endi 0850: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 f.#include <time 0860: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 .h>../*.** Retur 0870: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 n the name of th 0880: 65 20 6c 6f 67 69 6e 20 63 6f 6f 6b 69 65 0a 2a e login cookie.* 0890: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c /.static char *l 08a0: 6f 67 69 6e 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 ogin_cookie_name 08b0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 (void){. static 08c0: 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 4e 61 char *zCookieNa 08d0: 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 43 me = 0;. if( zC 08e0: 6f 6f 6b 69 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a ookieName==0 ){. 08f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c int n = strl 0900: 65 6e 28 67 2e 7a 54 6f 70 29 3b 0a 20 20 20 20 en(g.zTop);. 0910: 7a 43 6f 6f 6b 69 65 4e 61 6d 65 20 3d 20 6d 61 zCookieName = ma 0920: 6c 6c 6f 63 28 20 6e 2a 32 2b 31 36 20 29 3b 0a lloc( n*2+16 );. 0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0940: 20 20 20 20 20 20 2f 2a 20 30 31 32 33 34 35 36 /* 0123456 0950: 37 38 39 20 31 32 33 34 35 20 2a 2f 0a 20 20 20 789 12345 */. 0960: 20 73 74 72 63 70 79 28 7a 43 6f 6f 6b 69 65 4e strcpy(zCookieN 0970: 61 6d 65 2c 20 22 66 6f 73 73 69 6c 5f 6c 6f 67 ame, "fossil_log 0980: 69 6e 5f 22 29 3b 0a 20 20 20 20 65 6e 63 6f 64 in_");. encod 0990: 65 31 36 28 28 75 6e 73 69 67 6e 65 64 20 63 68 e16((unsigned ch 09a0: 61 72 2a 29 67 2e 7a 54 6f 70 2c 20 28 75 6e 73 ar*)g.zTop, (uns 09b0: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 7a 43 6f igned char*)&zCo 09c0: 6f 6b 69 65 4e 61 6d 65 5b 31 33 5d 2c 20 6e 29 okieName[13], n) 09d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a ;. }. return z 09e0: 43 6f 6f 6b 69 65 4e 61 6d 65 3b 0a 7d 0a 0a 2f CookieName;.}../ 09f0: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 2f 6c *.** WEBPAGE: /l 0a00: 6f 67 69 6e 0a 2a 2a 20 57 45 42 50 41 47 45 3a ogin.** WEBPAGE: 0a10: 20 2f 6c 6f 67 6f 75 74 0a 2a 2a 0a 2a 2a 20 47 /logout.**.** G 0a20: 65 6e 65 72 61 74 65 20 74 68 65 20 6c 6f 67 69 enerate the logi 0a30: 6e 20 70 61 67 65 0a 2a 2f 0a 76 6f 69 64 20 6c n page.*/.void l 0a40: 6f 67 69 6e 5f 70 61 67 65 28 76 6f 69 64 29 7b ogin_page(void){ 0a50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z 0a60: 55 73 65 72 6e 61 6d 65 2c 20 2a 7a 50 61 73 73 Username, *zPass 0a70: 77 64 2c 20 2a 7a 47 6f 74 6f 3b 0a 20 20 63 6f wd, *zGoto;. co 0a80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 31 2c nst char *zNew1, 0a90: 20 2a 7a 4e 65 77 32 3b 0a 20 20 63 6f 6e 73 74 *zNew2;. const 0aa0: 20 63 68 61 72 20 2a 7a 41 6e 6f 6e 50 77 20 3d char *zAnonPw = 0ab0: 20 30 3b 0a 20 20 69 6e 74 20 61 6e 6f 6e 46 6c 0;. int anonFl 0ac0: 61 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 ag;. char *zErr 0ad0: 4d 73 67 20 3d 20 22 22 3b 0a 0a 20 20 6c 6f 67 Msg = "";.. log 0ae0: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 in_check_credent 0af0: 69 61 6c 73 28 29 3b 0a 20 20 7a 55 73 65 72 6e ials();. zUsern 0b00: 61 6d 65 20 3d 20 50 28 22 75 22 29 3b 0a 20 20 ame = P("u");. 0b10: 7a 50 61 73 73 77 64 20 3d 20 50 28 22 70 22 29 zPasswd = P("p") 0b20: 3b 0a 20 20 7a 47 6f 74 6f 20 3d 20 50 44 28 22 ;. zGoto = PD(" 0b30: 67 22 2c 22 69 6e 64 65 78 22 29 3b 0a 20 20 61 g","index");. a 0b40: 6e 6f 6e 46 6c 61 67 20 3d 20 50 28 22 61 6e 6f nonFlag = P("ano 0b50: 6e 22 29 21 3d 30 3b 0a 20 20 69 66 28 20 50 28 n")!=0;. if( P( 0b60: 22 6f 75 74 22 29 21 3d 30 20 29 7b 0a 20 20 20 "out")!=0 ){. 0b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f const char *zCo 0b80: 6f 6b 69 65 4e 61 6d 65 20 3d 20 6c 6f 67 69 6e okieName = login 0b90: 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 28 29 3b 0a _cookie_name();. 0ba0: 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6f 6b cgi_set_cook 0bb0: 69 65 28 7a 43 6f 6f 6b 69 65 4e 61 6d 65 2c 20 ie(zCookieName, 0bc0: 22 22 2c 20 30 2c 20 2d 38 36 34 30 30 29 3b 0a "", 0, -86400);. 0bd0: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 cgi_redirect 0be0: 28 7a 47 6f 74 6f 29 3b 0a 20 20 7d 0a 20 20 69 (zGoto);. }. i 0bf0: 66 28 20 67 2e 6f 6b 50 61 73 73 77 6f 72 64 20 f( g.okPassword 0c00: 26 26 20 7a 50 61 73 73 77 64 20 26 26 20 28 7a && zPasswd && (z 0c10: 4e 65 77 31 20 3d 20 50 28 22 6e 31 22 29 29 21 New1 = P("n1"))! 0c20: 3d 30 20 26 26 20 28 7a 4e 65 77 32 20 3d 20 50 =0 && (zNew2 = P 0c30: 28 22 6e 32 22 29 29 21 3d 30 20 29 7b 0a 20 20 ("n2"))!=0 ){. 0c40: 20 20 69 66 28 20 64 62 5f 69 6e 74 28 31 2c 20 if( db_int(1, 0c50: 22 53 45 4c 45 43 54 20 30 20 46 52 4f 4d 20 75 "SELECT 0 FROM u 0c60: 73 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 ser". 0c70: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 75 " WHERE u 0c80: 69 64 3d 25 64 20 41 4e 44 20 70 77 3d 25 51 22 id=%d AND pw=%Q" 0c90: 2c 20 67 2e 75 73 65 72 55 69 64 2c 20 7a 50 61 , g.userUid, zPa 0ca0: 73 73 77 64 29 20 29 7b 0a 20 20 20 20 20 20 73 sswd) ){. s 0cb0: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 20 20 7a leep(1);. z 0cc0: 45 72 72 4d 73 67 20 3d 20 0a 20 20 20 20 20 20 ErrMsg = . 0cd0: 20 20 20 40 20 3c 70 3e 3c 66 6f 6e 74 20 63 6f @ <p><font co 0ce0: 6c 6f 72 3d 22 72 65 64 22 3e 0a 20 20 20 20 20 lor="red">. 0cf0: 20 20 20 20 40 20 59 6f 75 20 65 6e 74 65 72 65 @ You entere 0d00: 64 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f d an incorrect o 0d10: 6c 64 20 70 61 73 73 77 6f 72 64 20 77 68 69 6c ld password whil 0d20: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 e attempting to 0d30: 63 68 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 change. 0d40: 40 20 79 6f 75 72 20 70 61 73 73 77 6f 72 64 2e @ your password. 0d50: 20 20 59 6f 75 72 20 70 61 73 73 77 6f 72 64 20 Your password 0d60: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 is unchanged.. 0d70: 20 20 20 20 20 20 20 40 20 3c 2f 66 6f 6e 74 3e @ </font> 0d80: 3c 2f 70 3e 0a 20 20 20 20 20 20 3b 0a 20 20 20 </p>. ;. 0d90: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d }else if( strcm 0da0: 70 28 7a 4e 65 77 31 2c 7a 4e 65 77 32 29 21 3d p(zNew1,zNew2)!= 0db0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 4d 0 ){. zErrM 0dc0: 73 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 40 sg = . @ 0dd0: 20 3c 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d <p><font color= 0de0: 22 72 65 64 22 3e 0a 20 20 20 20 20 20 20 20 20 "red">. 0df0: 40 20 54 68 65 20 74 77 6f 20 63 6f 70 69 65 73 @ The two copies 0e00: 20 6f 66 20 79 6f 75 72 20 6e 65 77 20 70 61 73 of your new pas 0e10: 73 77 6f 72 64 73 20 64 6f 20 6e 6f 74 20 6d 61 swords do not ma 0e20: 74 63 68 2e 0a 20 20 20 20 20 20 20 20 20 40 20 tch.. @ 0e30: 59 6f 75 72 20 70 61 73 73 77 6f 72 64 20 69 73 Your password is 0e40: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 unchanged.. 0e50: 20 20 20 20 20 40 20 3c 2f 66 6f 6e 74 3e 3c 2f @ </font></ 0e60: 70 3e 0a 20 20 20 20 20 20 3b 0a 20 20 20 20 7d p>. ;. } 0e70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 5f 6d else{. db_m 0e80: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 ulti_exec(. 0e90: 20 20 20 20 22 55 50 44 41 54 45 20 75 73 65 72 "UPDATE user 0ea0: 20 53 45 54 20 70 77 3d 25 51 20 57 48 45 52 45 SET pw=%Q WHERE 0eb0: 20 75 69 64 3d 25 64 22 2c 20 7a 4e 65 77 31 2c uid=%d", zNew1, 0ec0: 20 67 2e 75 73 65 72 55 69 64 0a 20 20 20 20 20 g.userUid. 0ed0: 20 29 3b 0a 20 20 20 20 20 20 63 67 69 5f 72 65 );. cgi_re 0ee0: 64 69 72 65 63 74 28 7a 47 6f 74 6f 29 3b 0a 20 direct(zGoto);. 0ef0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 return;. 0f00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 73 }. }. if( zUs 0f10: 65 72 6e 61 6d 65 21 3d 30 20 26 26 20 7a 50 61 ername!=0 && zPa 0f20: 73 73 77 64 21 3d 30 20 26 26 20 7a 50 61 73 73 sswd!=0 && zPass 0f30: 77 64 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 wd[0]!=0 ){. 0f40: 69 6e 74 20 75 69 64 20 3d 20 64 62 5f 69 6e 74 int uid = db_int 0f50: 28 30 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c (0,. "SEL 0f60: 45 43 54 20 75 69 64 20 46 52 4f 4d 20 75 73 65 ECT uid FROM use 0f70: 72 22 0a 20 20 20 20 20 20 20 20 22 20 57 48 45 r". " WHE 0f80: 52 45 20 6c 6f 67 69 6e 3d 25 51 20 41 4e 44 20 RE login=%Q AND 0f90: 70 77 3d 25 51 22 2c 20 7a 55 73 65 72 6e 61 6d pw=%Q", zUsernam 0fa0: 65 2c 20 7a 50 61 73 73 77 64 29 3b 0a 20 20 20 e, zPasswd);. 0fb0: 20 69 66 28 20 75 69 64 3c 3d 30 20 7c 7c 20 73 if( uid<=0 || s 0fc0: 74 72 63 6d 70 28 7a 55 73 65 72 6e 61 6d 65 2c trcmp(zUsername, 0fd0: 22 6e 6f 62 6f 64 79 22 29 3d 3d 30 20 29 7b 0a "nobody")==0 ){. 0fe0: 20 20 20 20 20 20 73 6c 65 65 70 28 31 29 3b 0a sleep(1);. 0ff0: 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 zErrMsg = 1000: 0a 20 20 20 20 20 20 20 20 20 40 20 3c 70 3e 3c . @ <p>< 1010: 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 font color="red" 1020: 3e 0a 20 20 20 20 20 20 20 20 20 40 20 59 6f 75 >. @ You 1030: 20 65 6e 74 65 72 65 64 20 61 6e 20 75 6e 6b 6e entered an unkn 1040: 6f 77 6e 20 75 73 65 72 20 6f 72 20 61 6e 20 69 own user or an i 1050: 6e 63 6f 72 72 65 63 74 20 70 61 73 73 77 6f 72 ncorrect passwor 1060: 64 2e 0a 20 20 20 20 20 20 20 20 20 40 20 3c 2f d.. @ </ 1070: 66 6f 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20 20 20 font></p>. 1080: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{. 1090: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 char *zCookie 10a0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 ;. const ch 10b0: 61 72 20 2a 7a 43 6f 6f 6b 69 65 4e 61 6d 65 20 ar *zCookieName 10c0: 3d 20 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65 5f 6e = login_cookie_n 10d0: 61 6d 65 28 29 3b 0a 20 20 20 20 20 20 63 6f 6e ame();. con 10e0: 73 74 20 63 68 61 72 20 2a 7a 45 78 70 69 72 65 st char *zExpire 10f0: 20 3d 20 64 62 5f 67 65 74 28 22 63 6f 6f 6b 69 = db_get("cooki 1100: 65 2d 65 78 70 69 72 65 22 2c 22 38 37 36 36 22 e-expire","8766" 1110: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 );. int exp 1120: 69 72 65 73 20 3d 20 61 74 6f 69 28 7a 45 78 70 ires = atoi(zExp 1130: 69 72 65 29 2a 33 36 30 30 3b 0a 20 20 20 20 20 ire)*3600;. 1140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 70 const char *zIp 1150: 41 64 64 72 20 3d 20 50 44 28 22 52 45 4d 4f 54 Addr = PD("REMOT 1160: 45 5f 41 44 44 52 22 2c 22 6e 69 6c 22 29 3b 0a E_ADDR","nil");. 1170: 20 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 . if( strc 1180: 6d 70 28 7a 55 73 65 72 6e 61 6d 65 2c 20 22 61 mp(zUsername, "a 1190: 6e 6f 6e 79 6d 6f 75 73 22 29 3d 3d 30 20 29 7b nonymous")==0 ){ 11a0: 0a 20 20 20 20 20 20 20 20 63 67 69 5f 73 65 74 . cgi_set 11b0: 5f 63 6f 6f 6b 69 65 28 7a 43 6f 6f 6b 69 65 4e _cookie(zCookieN 11c0: 61 6d 65 2c 20 22 61 6e 6f 6e 79 6d 6f 75 73 22 ame, "anonymous" 11d0: 2c 20 30 2c 20 65 78 70 69 72 65 73 29 3b 0a 20 , 0, expires);. 11e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{. 11f0: 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 64 62 zCookie = db 1200: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 _text(0, "SELECT 1210: 20 27 25 64 2f 27 20 7c 7c 20 68 65 78 28 72 61 '%d/' || hex(ra 1220: 6e 64 6f 6d 62 6c 6f 62 28 32 35 29 29 22 2c 20 ndomblob(25))", 1230: 75 69 64 29 3b 0a 20 20 20 20 20 20 20 20 63 67 uid);. cg 1240: 69 5f 73 65 74 5f 63 6f 6f 6b 69 65 28 7a 43 6f i_set_cookie(zCo 1250: 6f 6b 69 65 4e 61 6d 65 2c 20 7a 43 6f 6f 6b 69 okieName, zCooki 1260: 65 2c 20 30 2c 20 65 78 70 69 72 65 73 29 3b 0a e, 0, expires);. 1270: 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 db_multi 1280: 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 20 20 _exec(. 1290: 20 22 55 50 44 41 54 45 20 75 73 65 72 20 53 45 "UPDATE user SE 12a0: 54 20 63 6f 6f 6b 69 65 3d 25 51 2c 20 69 70 61 T cookie=%Q, ipa 12b0: 64 64 72 3d 25 51 2c 20 22 0a 20 20 20 20 20 20 ddr=%Q, ". 12c0: 20 20 20 20 22 20 20 63 65 78 70 69 72 65 3d 6a " cexpire=j 12d0: 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27 29 2b ulianday('now')+ 12e0: 25 64 2f 38 36 34 30 30 2e 30 20 57 48 45 52 45 %d/86400.0 WHERE 12f0: 20 75 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 uid=%d",. 1300: 20 20 20 20 7a 43 6f 6f 6b 69 65 2c 20 7a 49 70 zCookie, zIp 1310: 41 64 64 72 2c 20 65 78 70 69 72 65 73 2c 20 75 Addr, expires, u 1320: 69 64 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 id. );. 1330: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 67 69 5f }. cgi_ 1340: 72 65 64 69 72 65 63 74 28 7a 47 6f 74 6f 29 3b redirect(zGoto); 1350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 . }. }. sty 1360: 6c 65 5f 68 65 61 64 65 72 28 22 4c 6f 67 69 6e le_header("Login 1370: 2f 4c 6f 67 6f 75 74 22 29 3b 0a 20 20 40 20 25 /Logout");. @ % 1380: 73 28 7a 45 72 72 4d 73 67 29 0a 20 20 40 20 3c s(zErrMsg). @ < 1390: 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 6c 6f 67 form action="log 13a0: 69 6e 22 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 in" method="POST 13b0: 22 3e 0a 20 20 69 66 28 20 50 28 22 67 22 29 20 ">. if( P("g") 13c0: 29 7b 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 ){. @ <input 13d0: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 type="hidden" na 13e0: 6d 65 3d 22 67 22 20 76 61 6c 75 65 3d 22 25 68 me="g" value="%h 13f0: 28 50 28 22 67 22 29 29 22 3e 0a 20 20 7d 0a 20 (P("g"))">. }. 1400: 20 40 20 3c 74 61 62 6c 65 20 61 6c 69 67 6e 3d @ <table align= 1410: 22 6c 65 66 74 22 20 68 73 70 61 63 65 3d 22 31 "left" hspace="1 1420: 30 22 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 0">. @ <tr>. @ 1430: 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 <td align="ri 1440: 67 68 74 22 3e 55 73 65 72 20 49 44 3a 3c 2f 74 ght">User ID:</t 1450: 64 3e 0a 20 20 69 66 28 20 61 6e 6f 6e 46 6c 61 d>. if( anonFla 1460: 67 20 29 7b 0a 20 20 20 20 40 20 20 20 3c 74 64 g ){. @ <td 1470: 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 ><input type="te 1480: 78 74 22 20 6e 61 6d 65 3d 22 75 22 20 76 61 6c xt" name="u" val 1490: 75 65 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 20 73 ue="anonymous" s 14a0: 69 7a 65 3d 33 30 3e 3c 2f 74 64 3e 0a 20 20 7d ize=30></td>. } 14b0: 65 6c 73 65 7b 0a 20 20 20 20 40 20 20 20 3c 74 else{. @ <t 14c0: 64 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 d><input type="t 14d0: 65 78 74 22 20 6e 61 6d 65 3d 22 75 22 20 76 61 ext" name="u" va 14e0: 6c 75 65 3d 22 22 20 73 69 7a 65 3d 33 30 3e 3c lue="" size=30>< 14f0: 2f 74 64 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 /td>. }. @ </t 1500: 72 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 20 r>. @ <tr>. @ 1510: 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 <td align="righ 1520: 74 22 3e 50 61 73 73 77 6f 72 64 3a 3c 2f 74 64 t">Password:</td 1530: 3e 0a 20 20 40 20 20 20 3c 74 64 3e 3c 69 6e 70 >. @ <td><inp 1540: 75 74 20 74 79 70 65 3d 22 70 61 73 73 77 6f 72 ut type="passwor 1550: 64 22 20 6e 61 6d 65 3d 22 70 22 20 76 61 6c 75 d" name="p" valu 1560: 65 3d 22 22 20 73 69 7a 65 3d 33 30 3e 3c 2f 74 e="" size=30></t 1570: 64 3e 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20 69 d>. @ </tr>. i 1580: 66 28 20 67 2e 7a 4c 6f 67 69 6e 3d 3d 30 20 29 f( g.zLogin==0 ) 1590: 7b 0a 20 20 20 20 7a 41 6e 6f 6e 50 77 20 3d 20 {. zAnonPw = 15a0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 db_text(0, "SELE 15b0: 43 54 20 70 77 20 46 52 4f 4d 20 75 73 65 72 22 CT pw FROM user" 15c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 . 15d0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 " WHER 15e0: 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 6d 6f E login='anonymo 15f0: 75 73 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 us'". 1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 " 1610: 20 20 41 4e 44 20 63 61 70 21 3d 27 27 22 29 3b AND cap!=''"); 1620: 0a 20 20 20 20 69 66 28 20 7a 41 6e 6f 6e 50 77 . if( zAnonPw 1630: 20 26 26 20 61 6e 6f 6e 46 6c 61 67 20 29 7b 0a && anonFlag ){. 1640: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e @ <tr><td> 1650: 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40 20 3c 74 </td>. @ <t 1660: 64 3e 54 68 65 20 61 6e 6f 6e 79 6d 6f 75 73 20 d>The anonymous 1670: 70 61 73 73 77 6f 72 64 20 69 73 20 22 3c 62 3e password is "<b> 1680: 25 68 28 7a 41 6e 6f 6e 50 77 29 3c 2f 62 3e 22 %h(zAnonPw)</b>" 1690: 2e 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40 20 3c .</td>. @ < 16a0: 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 /tr>. }. }. 16b0: 20 40 20 3c 74 72 3e 0a 20 20 40 20 20 20 3c 74 @ <tr>. @ <t 16c0: 64 3e 3c 2f 74 64 3e 0a 20 20 40 20 20 20 3c 74 d></td>. @ <t 16d0: 64 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 d><input type="s 16e0: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 69 6e 22 ubmit" name="in" 16f0: 20 76 61 6c 75 65 3d 22 4c 6f 67 69 6e 22 3e 3c value="Login">< 1700: 2f 74 64 3e 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 /td>. @ </tr>. 1710: 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 69 66 @ </table>. if 1720: 28 20 67 2e 7a 4c 6f 67 69 6e 3d 3d 30 20 29 7b ( g.zLogin==0 ){ 1730: 0a 20 20 20 20 40 20 3c 70 3e 54 6f 20 6c 6f 67 . @ <p>To log 1740: 69 6e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 in. }else{. 1750: 40 20 3c 70 3e 59 6f 75 20 61 72 65 20 63 75 72 @ <p>You are cur 1760: 72 65 6e 74 20 6c 6f 67 67 65 64 20 69 6e 20 61 rent logged in a 1770: 73 20 3c 62 3e 25 68 28 67 2e 7a 4c 6f 67 69 6e s <b>%h(g.zLogin 1780: 29 3c 2f 62 3e 3c 2f 70 3e 0a 20 20 20 20 40 20 )</b></p>. @ 1790: 3c 70 3e 54 6f 20 63 68 61 6e 67 65 20 79 6f 75 <p>To change you 17a0: 72 20 6c 6f 67 69 6e 20 74 6f 20 61 20 64 69 66 r login to a dif 17b0: 66 65 72 65 6e 74 20 75 73 65 72 0a 20 20 7d 0a ferent user. }. 17c0: 20 20 40 20 65 6e 74 65 72 20 74 68 65 20 75 73 @ enter the us 17d0: 65 72 2d 69 64 20 61 6e 64 20 70 61 73 73 77 6f er-id and passwo 17e0: 72 64 20 61 74 20 74 68 65 20 6c 65 66 74 20 61 rd at the left a 17f0: 6e 64 20 70 72 65 73 73 20 74 68 65 0a 20 20 40 nd press the. @ 1800: 20 22 4c 6f 67 69 6e 22 20 62 75 74 74 6f 6e 2e "Login" button. 1810: 20 20 59 6f 75 72 20 75 73 65 72 20 6e 61 6d 65 Your user name 1820: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 will be stored 1830: 69 6e 20 61 20 62 72 6f 77 73 65 72 20 63 6f 6f in a browser coo 1840: 6b 69 65 2e 0a 20 20 40 20 59 6f 75 20 6d 75 73 kie.. @ You mus 1850: 74 20 63 6f 6e 66 69 67 75 72 65 20 79 6f 75 72 t configure your 1860: 20 77 65 62 20 62 72 6f 77 73 65 72 20 74 6f 20 web browser to 1870: 61 63 63 65 70 74 20 63 6f 6f 6b 69 65 73 20 69 accept cookies i 1880: 6e 20 6f 72 64 65 72 20 66 6f 72 0a 20 20 40 20 n order for. @ 1890: 74 68 65 20 6c 6f 67 69 6e 20 74 6f 20 74 61 6b the login to tak 18a0: 65 2e 3c 2f 70 3e 0a 20 20 69 66 28 20 67 2e 7a e.</p>. if( g.z 18b0: 4c 6f 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 Login==0 ){. 18c0: 69 66 28 20 7a 41 6e 6f 6e 50 77 20 26 26 20 21 if( zAnonPw && ! 18d0: 61 6e 6f 6e 46 6c 61 67 20 29 7b 0a 20 20 20 20 anonFlag ){. 18e0: 20 20 40 20 3c 70 3e 54 68 65 20 70 61 73 73 77 @ <p>The passw 18f0: 6f 72 64 20 66 6f 72 20 75 73 65 72 20 22 61 6e ord for user "an 1900: 6f 6e 79 6d 6f 75 73 22 20 69 73 20 22 3c 62 3e onymous" is "<b> 1910: 25 68 28 7a 41 6e 6f 6e 50 77 29 3c 2f 62 3e 22 %h(zAnonPw)</b>" 1920: 2e 3c 2f 70 3e 0a 20 20 20 20 20 20 40 20 3c 70 .</p>. @ <p 1930: 3e 26 6e 62 73 70 3b 3c 2f 70 3e 0a 20 20 20 20 > </p>. 1940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c }else{. @ < 1950: 70 3e 26 6e 62 73 70 3b 3c 2f 70 3e 3c 70 3e 26 p> </p><p>& 1960: 6e 62 73 70 3b 3c 2f 70 3e 0a 20 20 20 20 7d 0a nbsp;</p>. }. 1970: 20 20 7d 0a 20 20 69 66 28 20 67 2e 7a 4c 6f 67 }. if( g.zLog 1980: 69 6e 20 29 7b 0a 20 20 20 20 40 20 3c 62 72 20 in ){. @ <br 1990: 63 6c 65 61 72 3d 22 62 6f 74 68 22 3e 3c 68 72 clear="both"><hr 19a0: 3e 0a 20 20 20 20 40 20 3c 70 3e 54 6f 20 6c 6f >. @ <p>To lo 19b0: 67 20 6f 66 66 20 74 68 65 20 73 79 73 74 65 6d g off the system 19c0: 20 28 61 6e 64 20 64 65 6c 65 74 65 20 79 6f 75 (and delete you 19d0: 72 20 6c 6f 67 69 6e 20 63 6f 6f 6b 69 65 29 0a r login cookie). 19e0: 20 20 20 20 40 20 20 70 72 65 73 73 20 74 68 65 @ press the 19f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 74 74 6f following butto 1a00: 6e 3a 3c 62 72 3e 0a 20 20 20 20 40 20 3c 69 6e n:<br>. @ <in 1a10: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 put type="submit 1a20: 22 20 6e 61 6d 65 3d 22 6f 75 74 22 20 76 61 6c " name="out" val 1a30: 75 65 3d 22 4c 6f 67 6f 75 74 22 3e 3c 2f 70 3e ue="Logout"></p> 1a40: 0a 20 20 7d 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e . }. @ </form> 1a50: 0a 20 20 69 66 28 20 67 2e 6f 6b 50 61 73 73 77 . if( g.okPassw 1a60: 6f 72 64 20 29 7b 0a 20 20 20 20 40 20 3c 62 72 ord ){. @ <br 1a70: 20 63 6c 65 61 72 3d 22 62 6f 74 68 22 3e 3c 68 clear="both"><h 1a80: 72 3e 0a 20 20 20 20 40 20 3c 70 3e 54 6f 20 63 r>. @ <p>To c 1a90: 68 61 6e 67 65 20 79 6f 75 72 20 70 61 73 73 77 hange your passw 1aa0: 6f 72 64 2c 20 65 6e 74 65 72 20 79 6f 75 72 20 ord, enter your 1ab0: 6f 6c 64 20 70 61 73 73 77 6f 72 64 20 61 6e 64 old password and 1ac0: 20 79 6f 75 72 0a 20 20 20 20 40 20 6e 65 77 20 your. @ new 1ad0: 70 61 73 73 77 6f 72 64 20 74 77 69 63 65 20 62 password twice b 1ae0: 65 6c 6f 77 20 74 68 65 6e 20 70 72 65 73 73 20 elow then press 1af0: 74 68 65 20 22 43 68 61 6e 67 65 20 50 61 73 73 the "Change Pass 1b00: 77 6f 72 64 22 0a 20 20 20 20 40 20 62 75 74 74 word". @ butt 1b10: 6f 6e 2e 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 66 on.</p>. @ <f 1b20: 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 6c 6f 67 69 orm action="logi 1b30: 6e 22 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 n" method="POST" 1b40: 3e 0a 20 20 20 20 40 20 3c 74 61 62 6c 65 3e 0a >. @ <table>. 1b50: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c @ <tr><td al 1b60: 69 67 6e 3d 22 72 69 67 68 74 22 3e 4f 6c 64 20 ign="right">Old 1b70: 50 61 73 73 77 6f 72 64 3a 3c 2f 74 64 3e 0a 20 Password:</td>. 1b80: 20 20 20 40 20 3c 74 64 3e 3c 69 6e 70 75 74 20 @ <td><input 1b90: 74 79 70 65 3d 22 70 61 73 73 77 6f 72 64 22 20 type="password" 1ba0: 6e 61 6d 65 3d 22 70 22 20 73 69 7a 65 3d 33 30 name="p" size=30 1bb0: 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 ></td></tr>. 1bc0: 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d @ <tr><td align= 1bd0: 22 72 69 67 68 74 22 3e 4e 65 77 20 50 61 73 73 "right">New Pass 1be0: 77 6f 72 64 3a 3c 2f 74 64 3e 0a 20 20 20 20 40 word:</td>. @ 1bf0: 20 3c 74 64 3e 3c 69 6e 70 75 74 20 74 79 70 65 <td><input type 1c00: 3d 22 70 61 73 73 77 6f 72 64 22 20 6e 61 6d 65 ="password" name 1c10: 3d 22 6e 31 22 20 73 69 7a 65 3d 33 30 3e 3c 2f ="n1" size=30></ 1c20: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 40 20 3c td></tr>. @ < 1c30: 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 tr><td align="ri 1c40: 67 68 74 22 3e 52 65 70 65 61 74 20 4e 65 77 20 ght">Repeat New 1c50: 50 61 73 73 77 6f 72 64 3a 3c 2f 74 64 3e 0a 20 Password:</td>. 1c60: 20 20 20 40 20 3c 74 64 3e 3c 69 6e 70 75 74 20 @ <td><input 1c70: 74 79 70 65 3d 22 70 61 73 73 77 6f 72 64 22 20 type="password" 1c80: 6e 61 6d 65 3d 22 6e 32 22 20 73 69 7a 65 3d 33 name="n2" size=3 1c90: 30 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 0></td></tr>. 1ca0: 20 40 20 3c 74 72 3e 3c 74 64 3e 3c 2f 74 64 3e @ <tr><td></td> 1cb0: 0a 20 20 20 20 40 20 3c 74 64 3e 3c 69 6e 70 75 . @ <td><inpu 1cc0: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 t type="submit" 1cd0: 76 61 6c 75 65 3d 22 43 68 61 6e 67 65 20 50 61 value="Change Pa 1ce0: 73 73 77 6f 72 64 22 3e 3c 2f 74 64 3e 3c 2f 74 ssword"></td></t 1cf0: 72 3e 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 r>. @ </table 1d00: 3e 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a >. @ </form>. 1d10: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 }. style_foot 1d20: 65 72 28 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a er();.}..../*.** 1d30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 This routine ex 1d40: 61 6d 69 6e 65 73 20 74 68 65 20 6c 6f 67 69 6e amines the login 1d50: 20 63 6f 6f 6b 69 65 20 74 6f 20 73 65 65 20 69 cookie to see i 1d60: 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 0a f it exists and. 1d70: 2a 2a 20 61 6e 64 20 69 73 20 76 61 6c 69 64 2e ** and is valid. 1d80: 20 20 49 66 20 74 68 65 20 6c 6f 67 69 6e 20 63 If the login c 1d90: 6f 6f 6b 69 65 20 63 68 65 63 6b 73 20 6f 75 74 ookie checks out 1da0: 2c 20 69 74 20 74 68 65 6e 20 73 65 74 73 20 0a , it then sets . 1db0: 2a 2a 20 67 2e 7a 55 73 65 72 55 75 69 64 20 61 ** g.zUserUuid a 1dc0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a ppropriately..** 1dd0: 0a 2a 2f 0a 76 6f 69 64 20 6c 6f 67 69 6e 5f 63 .*/.void login_c 1de0: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 heck_credentials 1df0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 75 69 (void){. int ui 1e00: 64 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 d = 0;. const c 1e10: 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 3b 0a 20 20 har *zCookie;. 1e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6d const char *zRem 1e30: 6f 74 65 41 64 64 72 3b 0a 20 20 63 6f 6e 73 74 oteAddr;. const 1e40: 20 63 68 61 72 20 2a 7a 43 61 70 20 3d 20 30 3b char *zCap = 0; 1e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z 1e60: 4e 63 61 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 Ncap;. const ch 1e70: 61 72 20 2a 7a 41 63 61 70 3b 0a 0a 20 20 2f 2a ar *zAcap;.. /* 1e80: 20 4f 6e 6c 79 20 72 75 6e 20 74 68 69 73 20 63 Only run this c 1e90: 68 65 63 6b 20 6f 6e 63 65 2e 20 20 2a 2f 0a 20 heck once. */. 1ea0: 20 69 66 28 20 67 2e 75 73 65 72 55 69 64 21 3d if( g.userUid!= 1eb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 0 ) return;... 1ec0: 2f 2a 20 49 66 20 74 68 65 20 48 54 54 50 20 63 /* If the HTTP c 1ed0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f 6d onnection is com 1ee0: 69 6e 67 20 6f 76 65 72 20 31 32 37 2e 30 2e 30 ing over 127.0.0 1ef0: 2e 31 20 61 6e 64 20 69 66 0a 20 20 2a 2a 20 6c .1 and if. ** l 1f00: 6f 63 61 6c 20 6c 6f 67 69 6e 20 69 73 20 64 69 ocal login is di 1f10: 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 sabled, then the 1f20: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f re is no need to 1f30: 20 63 68 65 63 6b 0a 20 20 2a 2a 20 75 73 65 72 check. ** user 1f40: 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 20 20 credentials.. 1f50: 2a 2f 0a 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 */. zRemoteAddr 1f60: 20 3d 20 50 44 28 22 52 45 4d 4f 54 45 5f 41 44 = PD("REMOTE_AD 1f70: 44 52 22 2c 22 6e 69 6c 22 29 3b 0a 20 20 69 66 DR","nil");. if 1f80: 28 20 73 74 72 63 6d 70 28 7a 52 65 6d 6f 74 65 ( strcmp(zRemote 1f90: 41 64 64 72 2c 20 22 31 32 37 2e 30 2e 30 2e 31 Addr, "127.0.0.1 1fa0: 22 29 3d 3d 30 20 26 26 20 64 62 5f 67 65 74 5f ")==0 && db_get_ 1fb0: 69 6e 74 28 22 6c 6f 63 61 6c 61 75 74 68 22 2c int("localauth", 1fc0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 69 64 0)==0 ){. uid 1fd0: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 = db_int(0, "SE 1fe0: 4c 45 43 54 20 75 69 64 20 46 52 4f 4d 20 75 73 LECT uid FROM us 1ff0: 65 72 20 57 48 45 52 45 20 63 61 70 20 4c 49 4b er WHERE cap LIK 2000: 45 20 27 25 25 73 25 25 27 22 29 3b 0a 20 20 20 E '%%s%%'");. 2010: 20 67 2e 7a 4c 6f 67 69 6e 20 3d 20 64 62 5f 74 g.zLogin = db_t 2020: 65 78 74 28 22 3f 22 2c 20 22 53 45 4c 45 43 54 ext("?", "SELECT 2030: 20 6c 6f 67 69 6e 20 46 52 4f 4d 20 75 73 65 72 login FROM user 2040: 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c 20 WHERE uid=%d", 2050: 75 69 64 29 3b 0a 20 20 20 20 7a 43 61 70 20 3d uid);. zCap = 2060: 20 22 73 22 3b 0a 20 20 20 20 67 2e 6e 6f 50 73 "s";. g.noPs 2070: 77 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f wd = 1;. }.. / 2080: 2a 20 43 68 65 63 6b 20 74 68 65 20 6c 6f 67 69 * Check the logi 2090: 6e 20 63 6f 6f 6b 69 65 20 74 6f 20 73 65 65 20 n cookie to see 20a0: 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 61 20 if it matches a 20b0: 6b 6e 6f 77 6e 20 76 61 6c 69 64 20 75 73 65 72 known valid user 20c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 75 69 64 .. */. if( uid 20d0: 3d 3d 30 20 26 26 20 28 7a 43 6f 6f 6b 69 65 20 ==0 && (zCookie 20e0: 3d 20 50 28 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65 = P(login_cookie 20f0: 5f 6e 61 6d 65 28 29 29 29 21 3d 30 20 29 7b 0a _name()))!=0 ){. 2100: 20 20 20 20 69 66 28 20 69 73 64 69 67 69 74 28 if( isdigit( 2110: 7a 43 6f 6f 6b 69 65 5b 30 5d 29 20 29 7b 0a 20 zCookie[0]) ){. 2120: 20 20 20 20 20 75 69 64 20 3d 20 64 62 5f 69 6e uid = db_in 2130: 74 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 t(0, . 2140: 20 20 22 53 45 4c 45 43 54 20 75 69 64 20 46 52 "SELECT uid FR 2150: 4f 4d 20 75 73 65 72 22 0a 20 20 20 20 20 20 20 OM user". 2160: 20 20 20 20 20 22 20 57 48 45 52 45 20 75 69 64 " WHERE uid 2170: 3d 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 =%d". 2180: 20 22 20 20 20 41 4e 44 20 63 6f 6f 6b 69 65 3d " AND cookie= 2190: 25 51 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 %Q". 21a0: 22 20 20 20 41 4e 44 20 69 70 61 64 64 72 3d 25 " AND ipaddr=% 21b0: 51 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 Q". " 21c0: 20 20 20 41 4e 44 20 63 65 78 70 69 72 65 3e 6a AND cexpire>j 21d0: 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27 29 22 ulianday('now')" 21e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 74 ,. at 21f0: 6f 69 28 7a 43 6f 6f 6b 69 65 29 2c 20 7a 43 6f oi(zCookie), zCo 2200: 6f 6b 69 65 2c 20 7a 52 65 6d 6f 74 65 41 64 64 okie, zRemoteAdd 2210: 72 0a 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 r. );. 2220: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 43 6f 6f }else if( zCoo 2230: 6b 69 65 5b 30 5d 3d 3d 27 61 27 20 29 7b 0a 20 kie[0]=='a' ){. 2240: 20 20 20 20 20 75 69 64 20 3d 20 64 62 5f 69 6e uid = db_in 2250: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75 69 64 t(0, "SELECT uid 2260: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45 FROM user WHERE 2270: 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 6d 6f 75 login='anonymou 2280: 73 27 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a s'");. }. }. 2290: 0a 20 20 69 66 28 20 75 69 64 3d 3d 30 20 29 7b . if( uid==0 ){ 22a0: 0a 20 20 20 20 75 69 64 20 3d 20 64 62 5f 69 6e . uid = db_in 22b0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75 69 64 t(0, "SELECT uid 22c0: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45 FROM user WHERE 22d0: 20 6c 6f 67 69 6e 3d 27 6e 6f 62 6f 64 79 27 22 login='nobody'" 22e0: 29 3b 0a 20 20 20 20 69 66 28 20 75 69 64 3d 3d );. if( uid== 22f0: 30 20 29 7b 0a 20 20 20 20 20 20 75 69 64 20 3d 0 ){. uid = 2300: 20 2d 31 3b 0a 20 20 20 20 20 20 7a 43 61 70 20 -1;. zCap 2310: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = "";. }. }. 2320: 20 20 69 66 28 20 7a 43 61 70 3d 3d 30 20 29 7b if( zCap==0 ){ 2330: 0a 20 20 20 20 69 66 28 20 75 69 64 20 29 7b 0a . if( uid ){. 2340: 20 20 20 20 20 20 53 74 6d 74 20 73 3b 0a 20 20 Stmt s;. 2350: 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 db_prepare(& 2360: 73 2c 20 22 53 45 4c 45 43 54 20 6c 6f 67 69 6e s, "SELECT login 2370: 2c 20 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20 , cap FROM user 2380: 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c 20 75 WHERE uid=%d", u 2390: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 id);. if( d 23a0: 62 5f 73 74 65 70 28 26 73 29 3d 3d 53 51 4c 49 b_step(&s)==SQLI 23b0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 TE_ROW ){. 23c0: 20 20 67 2e 7a 4c 6f 67 69 6e 20 3d 20 64 62 5f g.zLogin = db_ 23d0: 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 73 column_malloc(&s 23e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 , 0);. zC 23f0: 61 70 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d ap = db_column_m 2400: 61 6c 6c 6f 63 28 26 73 2c 20 31 29 3b 0a 20 20 alloc(&s, 1);. 2410: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 }. db_f 2420: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 20 inalize(&s);. 2430: 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 61 70 3d }. if( zCap= 2440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 61 70 =0 ){. zCap 2450: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d = "";. }. } 2460: 0a 20 20 67 2e 75 73 65 72 55 69 64 20 3d 20 75 . g.userUid = u 2470: 69 64 3b 0a 20 20 69 66 28 20 67 2e 7a 4c 6f 67 id;. if( g.zLog 2480: 69 6e 20 26 26 20 73 74 72 63 6d 70 28 67 2e 7a in && strcmp(g.z 2490: 4c 6f 67 69 6e 2c 22 6e 6f 62 6f 64 79 22 29 3d Login,"nobody")= 24a0: 3d 30 20 29 7b 0a 20 20 20 20 67 2e 7a 4c 6f 67 =0 ){. g.zLog 24b0: 69 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 in = 0;. }. if 24c0: 28 20 75 69 64 20 26 26 20 67 2e 7a 4c 6f 67 69 ( uid && g.zLogi 24d0: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 n ){. /* All 24e0: 6c 6f 67 67 65 64 2d 69 6e 20 75 73 65 72 73 20 logged-in users 24f0: 69 6e 68 65 72 69 74 20 70 72 69 76 69 6c 65 67 inherit privileg 2500: 65 73 20 66 72 6f 6d 20 22 6e 6f 62 6f 64 79 22 es from "nobody" 2510: 20 2a 2f 0a 20 20 20 20 7a 4e 63 61 70 20 3d 20 */. zNcap = 2520: 64 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c db_text("", "SEL 2530: 45 43 54 20 63 61 70 20 46 52 4f 4d 20 75 73 65 ECT cap FROM use 2540: 72 20 57 48 45 52 45 20 6c 6f 67 69 6e 20 3d 20 r WHERE login = 2550: 27 6e 6f 62 6f 64 79 27 22 29 3b 0a 20 20 20 20 'nobody'");. 2560: 6c 6f 67 69 6e 5f 73 65 74 5f 63 61 70 61 62 69 login_set_capabi 2570: 6c 69 74 69 65 73 28 7a 4e 63 61 70 29 3b 0a 20 lities(zNcap);. 2580: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 67 2e if( strcmp(g. 2590: 7a 4c 6f 67 69 6e 2c 20 22 61 6e 6f 6e 79 6d 6f zLogin, "anonymo 25a0: 75 73 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 us")!=0 ){. 25b0: 20 2f 2a 20 41 6c 6c 20 6c 6f 67 67 65 64 2d 69 /* All logged-i 25c0: 6e 20 75 73 65 72 73 20 69 6e 68 65 72 69 74 20 n users inherit 25d0: 70 72 69 76 69 6c 65 67 65 73 20 66 72 6f 6d 20 privileges from 25e0: 22 61 6e 6f 6e 79 6d 6f 75 73 22 20 2a 2f 0a 20 "anonymous" */. 25f0: 20 20 20 20 20 7a 41 63 61 70 20 3d 20 64 62 5f zAcap = db_ 2600: 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 text("", "SELECT 2610: 20 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20 57 cap FROM user W 2620: 48 45 52 45 20 6c 6f 67 69 6e 20 3d 20 27 61 6e HERE login = 'an 2630: 6f 6e 79 6d 6f 75 73 27 22 29 3b 0a 20 20 20 20 onymous'");. 2640: 20 20 6c 6f 67 69 6e 5f 73 65 74 5f 63 61 70 61 login_set_capa 2650: 62 69 6c 69 74 69 65 73 28 7a 41 63 61 70 29 3b bilities(zAcap); 2660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 6f 67 . }. }. log 2670: 69 6e 5f 73 65 74 5f 63 61 70 61 62 69 6c 69 74 in_set_capabilit 2680: 69 65 73 28 7a 43 61 70 29 3b 0a 7d 0a 0a 2f 2a ies(zCap);.}../* 2690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 67 6c 6f 62 .** Set the glob 26a0: 61 6c 20 63 61 70 61 62 69 6c 69 74 79 20 66 6c al capability fl 26b0: 61 67 73 20 62 61 73 65 64 20 6f 6e 20 61 20 63 ags based on a c 26c0: 61 70 61 62 69 6c 69 74 79 20 73 74 72 69 6e 67 apability string 26d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 6f 67 69 6e 5f ..*/.void login_ 26e0: 73 65 74 5f 63 61 70 61 62 69 6c 69 74 69 65 73 set_capabilities 26f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 (const char *zCa 2700: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 p){. static cha 2710: 72 20 2a 7a 44 65 76 20 3d 20 30 3b 0a 20 20 69 r *zDev = 0;. i 2720: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b nt i;. for(i=0; 2730: 20 7a 43 61 70 5b 69 5d 3b 20 69 2b 2b 29 7b 0a zCap[i]; i++){. 2740: 20 20 20 20 73 77 69 74 63 68 28 20 7a 43 61 70 switch( zCap 2750: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 [i] ){. cas 2760: 65 20 27 73 27 3a 20 20 20 67 2e 6f 6b 53 65 74 e 's': g.okSet 2770: 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 61 up = 1;. ca 2780: 73 65 20 27 61 27 3a 20 20 20 67 2e 6f 6b 41 64 se 'a': g.okAd 2790: 6d 69 6e 20 3d 20 67 2e 6f 6b 52 64 54 6b 74 20 min = g.okRdTkt 27a0: 3d 20 67 2e 6f 6b 57 72 54 6b 74 20 3d 20 0a 20 = g.okWrTkt = . 27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 6f g.o 27d0: 6b 52 64 57 69 6b 69 20 3d 20 67 2e 6f 6b 57 72 kRdWiki = g.okWr 27e0: 57 69 6b 69 20 3d 20 67 2e 6f 6b 4e 65 77 57 69 Wiki = g.okNewWi 27f0: 6b 69 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 ki =. 2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2810: 20 20 20 67 2e 6f 6b 41 70 6e 64 57 69 6b 69 20 g.okApndWiki 2820: 3d 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 3d 20 = g.okHistory = 2830: 67 2e 6f 6b 43 6c 6f 6e 65 20 3d 20 0a 20 20 20 g.okClone = . 2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2850: 20 20 20 20 20 20 20 20 20 20 20 67 2e 6f 6b 4e g.okN 2860: 65 77 54 6b 74 20 3d 20 67 2e 6f 6b 50 61 73 73 ewTkt = g.okPass 2870: 77 6f 72 64 20 3d 20 67 2e 6f 6b 52 64 41 64 64 word = g.okRdAdd 2880: 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 r =. 2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28a0: 20 20 67 2e 6f 6b 54 6b 74 46 6d 74 20 3d 20 31 g.okTktFmt = 1 28b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 69 27 ;. case 'i' 28c0: 3a 20 20 20 67 2e 6f 6b 52 65 61 64 20 3d 20 67 : g.okRead = g 28d0: 2e 6f 6b 57 72 69 74 65 20 3d 20 31 3b 20 20 20 .okWrite = 1; 28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c 2900: 61 73 65 20 27 6f 27 3a 20 20 20 67 2e 6f 6b 52 ase 'o': g.okR 2910: 65 61 64 20 3d 20 31 3b 20 20 20 20 20 20 20 20 ead = 1; 2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2930: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;. 2940: 20 20 20 20 20 20 63 61 73 65 20 27 7a 27 3a 20 case 'z': 2950: 20 20 67 2e 6f 6b 5a 69 70 20 3d 20 31 3b 20 20 g.okZip = 1; 2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2980: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 break;.. ca 2990: 73 65 20 27 64 27 3a 20 20 20 67 2e 6f 6b 44 65 se 'd': g.okDe 29a0: 6c 65 74 65 20 3d 20 31 3b 20 20 20 20 20 20 20 lete = 1; 29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;. 29d0: 20 20 20 20 20 63 61 73 65 20 27 68 27 3a 20 20 case 'h': 29e0: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 3d 20 31 g.okHistory = 1 29f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ; 2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 b 2a10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case 2a20: 20 27 67 27 3a 20 20 20 67 2e 6f 6b 43 6c 6f 6e 'g': g.okClon 2a30: 65 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 e = 1; 2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;. 2a60: 20 20 20 63 61 73 65 20 27 70 27 3a 20 20 20 67 case 'p': g 2a70: 2e 6f 6b 50 61 73 73 77 6f 72 64 20 3d 20 31 3b .okPassword = 1; 2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 bre 2aa0: 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 ak;.. case 2ab0: 27 6a 27 3a 20 20 20 67 2e 6f 6b 52 64 57 69 6b 'j': g.okRdWik 2ac0: 69 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 i = 1; 2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;. 2af0: 20 20 63 61 73 65 20 27 6b 27 3a 20 20 20 67 2e case 'k': g. 2b00: 6f 6b 57 72 57 69 6b 69 20 3d 20 67 2e 6f 6b 52 okWrWiki = g.okR 2b10: 64 57 69 6b 69 20 3d 20 67 2e 6f 6b 41 70 6e 64 dWiki = g.okApnd 2b20: 57 69 6b 69 20 3d 31 3b 20 20 20 20 62 72 65 61 Wiki =1; brea 2b30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 6d k;. case 'm 2b40: 27 3a 20 20 20 67 2e 6f 6b 41 70 6e 64 57 69 6b ': g.okApndWik 2b50: 69 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 i = 1; 2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;. 2b80: 63 61 73 65 20 27 66 27 3a 20 20 20 67 2e 6f 6b case 'f': g.ok 2b90: 4e 65 77 57 69 6b 69 20 3d 20 31 3b 20 20 20 20 NewWiki = 1; 2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2bb0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break; 2bc0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 27 65 27 .. case 'e' 2bd0: 3a 20 20 20 67 2e 6f 6b 52 64 41 64 64 72 20 3d : g.okRdAddr = 2be0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 1; 2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c 2c10: 61 73 65 20 27 72 27 3a 20 20 20 67 2e 6f 6b 52 ase 'r': g.okR 2c20: 64 54 6b 74 20 3d 20 31 3b 20 20 20 20 20 20 20 dTkt = 1; 2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2c40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;. 2c50: 20 20 20 20 20 20 63 61 73 65 20 27 6e 27 3a 20 case 'n': 2c60: 20 20 67 2e 6f 6b 4e 65 77 54 6b 74 20 3d 20 31 g.okNewTkt = 1 2c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ; 2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2c90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas 2ca0: 65 20 27 77 27 3a 20 20 20 67 2e 6f 6b 57 72 54 e 'w': g.okWrT 2cb0: 6b 74 20 3d 20 67 2e 6f 6b 52 64 54 6b 74 20 3d kt = g.okRdTkt = 2cc0: 20 67 2e 6f 6b 4e 65 77 54 6b 74 20 3d 20 0a 20 g.okNewTkt = . 2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2ce0: 20 67 2e 6f 6b 41 70 6e 64 54 6b 74 20 3d 20 31 g.okApndTkt = 1 2cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ; 2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 b 2d10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case 2d20: 20 27 63 27 3a 20 20 20 67 2e 6f 6b 41 70 6e 64 'c': g.okApnd 2d30: 54 6b 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 Tkt = 1; 2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;. 2d60: 20 20 20 63 61 73 65 20 27 74 27 3a 20 20 20 67 case 't': g 2d70: 2e 6f 6b 54 6b 74 46 6d 74 20 3d 20 31 3b 20 20 .okTktFmt = 1; 2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 bre 2da0: 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 ak;.. /* Th 2db0: 65 20 22 76 22 20 70 72 69 76 69 6c 65 67 65 73 e "v" privileges 2dc0: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 64 69 66 is a little dif 2dd0: 66 65 72 65 6e 74 2e 20 20 49 74 20 72 65 63 75 ferent. It recu 2de0: 72 73 69 76 65 6c 79 20 0a 20 20 20 20 20 20 2a rsively . * 2df0: 2a 20 69 6e 68 65 72 69 74 73 20 61 6c 6c 20 70 * inherits all p 2e00: 72 69 76 69 6c 65 67 65 73 20 6f 66 20 74 68 65 rivileges of the 2e10: 20 75 73 65 72 20 6e 61 6d 65 64 20 22 64 65 76 user named "dev 2e20: 65 6c 6f 70 65 72 22 20 2a 2f 0a 20 20 20 20 20 eloper" */. 2e30: 20 63 61 73 65 20 27 76 27 3a 20 7b 0a 20 20 20 case 'v': {. 2e40: 20 20 20 20 20 69 66 28 20 7a 44 65 76 3d 3d 30 if( zDev==0 2e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 44 ){. zD 2e60: 65 76 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c ev = db_text("", 2e70: 20 22 53 45 4c 45 43 54 20 63 61 70 20 46 52 4f "SELECT cap FRO 2e80: 4d 20 75 73 65 72 20 57 48 45 52 45 20 6c 6f 67 M user WHERE log 2e90: 69 6e 3d 27 64 65 76 65 6c 6f 70 65 72 27 22 29 in='developer'") 2ea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 67 69 ;. logi 2eb0: 6e 5f 73 65 74 5f 63 61 70 61 62 69 6c 69 74 69 n_set_capabiliti 2ec0: 65 73 28 7a 44 65 76 29 3b 0a 20 20 20 20 20 20 es(zDev);. 2ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 }. brea 2ee0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d k;. }. } 2ef0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 . }.}../*.** If 2f00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 67 the current log 2f10: 69 6e 20 6c 61 63 6b 73 20 61 6e 79 20 6f 66 20 in lacks any of 2f20: 74 68 65 20 63 61 70 61 62 69 6c 69 74 69 65 73 the capabilities 2f30: 20 6c 69 73 74 65 64 20 69 6e 0a 2a 2a 20 74 68 listed in.** th 2f40: 65 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 72 65 e input, then re 2f50: 74 75 72 6e 20 30 2e 20 20 49 66 20 61 6c 6c 20 turn 0. If all 2f60: 63 61 70 61 62 69 6c 69 74 69 65 73 20 61 72 65 capabilities are 2f70: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 0a 2a present, then.* 2f80: 2a 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 * return 1..*/.i 2f90: 6e 74 20 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 nt login_has_cap 2fa0: 61 62 69 6c 69 74 79 28 63 6f 6e 73 74 20 63 68 ability(const ch 2fb0: 61 72 20 2a 7a 43 61 70 2c 20 69 6e 74 20 6e 43 ar *zCap, int nC 2fc0: 61 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 ap){. int i;. 2fd0: 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 66 int rc = 1;. if 2fe0: 28 20 6e 43 61 70 3c 30 20 29 20 6e 43 61 70 20 ( nCap<0 ) nCap 2ff0: 3d 20 73 74 72 6c 65 6e 28 7a 43 61 70 29 3b 0a = strlen(zCap);. 3000: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 61 for(i=0; i<nCa 3010: 70 20 26 26 20 72 63 20 26 26 20 7a 43 61 70 5b p && rc && zCap[ 3020: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 i]; i++){. sw 3030: 69 74 63 68 28 20 7a 43 61 70 5b 69 5d 20 29 7b itch( zCap[i] ){ 3040: 0a 20 20 20 20 20 20 63 61 73 65 20 27 61 27 3a . case 'a': 3050: 20 20 72 63 20 3d 20 67 2e 6f 6b 41 64 6d 69 6e rc = g.okAdmin 3060: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ; break;. 3070: 20 20 20 2f 2a 20 63 61 73 65 20 27 62 27 3a 20 /* case 'b': 3080: 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 27 63 */. case 'c 3090: 27 3a 20 20 72 63 20 3d 20 67 2e 6f 6b 41 70 6e ': rc = g.okApn 30a0: 64 54 6b 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 dTkt; break;. 30b0: 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20 20 case 'd': 30c0: 72 63 20 3d 20 67 2e 6f 6b 44 65 6c 65 74 65 3b rc = g.okDelete; 30d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;. 30e0: 20 63 61 73 65 20 27 65 27 3a 20 20 72 63 20 3d case 'e': rc = 30f0: 20 67 2e 6f 6b 52 64 41 64 64 72 3b 20 20 20 20 g.okRdAddr; 3100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas 3110: 65 20 27 66 27 3a 20 20 72 63 20 3d 20 67 2e 6f e 'f': rc = g.o 3120: 6b 4e 65 77 57 69 6b 69 3b 20 20 20 62 72 65 61 kNewWiki; brea 3130: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 67 k;. case 'g 3140: 27 3a 20 20 72 63 20 3d 20 67 2e 6f 6b 43 6c 6f ': rc = g.okClo 3150: 6e 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ne; break;. 3160: 20 20 20 20 20 63 61 73 65 20 27 68 27 3a 20 20 case 'h': 3170: 72 63 20 3d 20 67 2e 6f 6b 48 69 73 74 6f 72 79 rc = g.okHistory 3180: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 ; break;. 3190: 20 63 61 73 65 20 27 69 27 3a 20 20 72 63 20 3d case 'i': rc = 31a0: 20 67 2e 6f 6b 57 72 69 74 65 3b 20 20 20 20 20 g.okWrite; 31b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas 31c0: 65 20 27 6a 27 3a 20 20 72 63 20 3d 20 67 2e 6f e 'j': rc = g.o 31d0: 6b 52 64 57 69 6b 69 3b 20 20 20 20 62 72 65 61 kRdWiki; brea 31e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b k;. case 'k 31f0: 27 3a 20 20 72 63 20 3d 20 67 2e 6f 6b 57 72 57 ': rc = g.okWrW 3200: 69 6b 69 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 iki; break;. 3210: 20 20 20 20 20 2f 2a 20 63 61 73 65 20 27 6c 27 /* case 'l' 3220: 3a 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20 : */. case 3230: 27 6d 27 3a 20 20 72 63 20 3d 20 67 2e 6f 6b 41 'm': rc = g.okA 3240: 70 6e 64 57 69 6b 69 3b 20 20 62 72 65 61 6b 3b pndWiki; break; 3250: 0a 20 20 20 20 20 20 63 61 73 65 20 27 6e 27 3a . case 'n': 3260: 20 20 72 63 20 3d 20 67 2e 6f 6b 4e 65 77 54 6b rc = g.okNewTk 3270: 74 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 t; break;. 3280: 20 20 20 63 61 73 65 20 27 6f 27 3a 20 20 72 63 case 'o': rc 3290: 20 3d 20 67 2e 6f 6b 52 65 61 64 3b 20 20 20 20 = g.okRead; 32a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c 32b0: 61 73 65 20 27 70 27 3a 20 20 72 63 20 3d 20 67 ase 'p': rc = g 32c0: 2e 6f 6b 50 61 73 73 77 6f 72 64 3b 20 20 62 72 .okPassword; br 32d0: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 63 61 eak;. /* ca 32e0: 73 65 20 27 71 27 3a 20 2a 2f 0a 20 20 20 20 20 se 'q': */. 32f0: 20 63 61 73 65 20 27 72 27 3a 20 20 72 63 20 3d case 'r': rc = 3300: 20 67 2e 6f 6b 52 64 54 6b 74 3b 20 20 20 20 20 g.okRdTkt; 3310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas 3320: 65 20 27 73 27 3a 20 20 72 63 20 3d 20 67 2e 6f e 's': rc = g.o 3330: 6b 53 65 74 75 70 3b 20 20 20 20 20 62 72 65 61 kSetup; brea 3340: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 74 k;. case 't 3350: 27 3a 20 20 72 63 20 3d 20 67 2e 6f 6b 54 6b 74 ': rc = g.okTkt 3360: 46 6d 74 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 Fmt; break;. 3370: 20 20 20 20 20 2f 2a 20 63 61 73 65 20 27 75 27 /* case 'u' 3380: 3a 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 63 61 : */. /* ca 3390: 73 65 20 27 76 27 3a 20 2a 2f 0a 20 20 20 20 20 se 'v': */. 33a0: 20 63 61 73 65 20 27 77 27 3a 20 20 72 63 20 3d case 'w': rc = 33b0: 20 67 2e 6f 6b 57 72 54 6b 74 3b 20 20 20 20 20 g.okWrTkt; 33c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 break;. /* 33d0: 63 61 73 65 20 27 78 27 3a 20 2a 2f 0a 20 20 20 case 'x': */. 33e0: 20 20 20 2f 2a 20 63 61 73 65 20 27 79 27 3a 20 /* case 'y': 33f0: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 63 61 73 65 */. /* case 3400: 20 27 7a 27 3a 20 2a 2f 0a 20 20 20 20 20 20 64 'z': */. d 3410: 65 66 61 75 6c 74 3a 20 20 20 72 63 20 3d 20 30 efault: rc = 0 3420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 ; br 3430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 eak;. }. }. 3440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../ 3450: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 *.** Call this r 3460: 6f 75 74 69 6e 65 20 77 68 65 6e 20 74 68 65 20 outine when the 3470: 63 72 65 64 65 6e 74 69 61 6c 20 63 68 65 63 6b credential check 3480: 20 66 61 69 6c 73 2e 20 20 49 74 20 63 61 75 73 fails. It caus 3490: 65 73 0a 2a 2a 20 61 20 72 65 64 69 72 65 63 74 es.** a redirect 34a0: 20 74 6f 20 74 68 65 20 22 6c 6f 67 69 6e 22 20 to the "login" 34b0: 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 6f page..*/.void lo 34c0: 67 69 6e 5f 6e 65 65 64 65 64 28 76 6f 69 64 29 gin_needed(void) 34d0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char * 34e0: 7a 55 72 6c 20 3d 20 50 44 28 22 52 45 51 55 45 zUrl = PD("REQUE 34f0: 53 54 5f 55 52 49 22 2c 20 22 69 6e 64 65 78 22 ST_URI", "index" 3500: 29 3b 0a 20 20 63 67 69 5f 72 65 64 69 72 65 63 );. cgi_redirec 3510: 74 28 6d 70 72 69 6e 74 66 28 22 6c 6f 67 69 6e t(mprintf("login 3520: 3f 67 3d 25 54 22 2c 20 7a 55 72 6c 29 29 3b 0a ?g=%T", zUrl));. 3530: 20 20 2f 2a 20 4e 4f 54 52 45 41 43 48 45 44 20 /* NOTREACHED 3540: 2a 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a */. assert(0);. 3550: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 }../*.** Call th 3560: 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 74 68 is routine if th 3570: 65 20 75 73 65 72 20 6c 61 63 6b 73 20 6f 6b 48 e user lacks okH 3580: 69 73 74 6f 72 79 20 70 65 72 6d 69 73 73 69 6f istory permissio 3590: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 61 6e n. If.** the an 35a0: 6f 6e 79 6d 6f 75 73 20 75 73 65 72 20 68 61 73 onymous user has 35b0: 20 6f 6b 48 69 73 74 6f 72 79 20 70 65 72 6d 69 okHistory permi 35c0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 70 61 69 6e ssion, then pain 35d0: 74 20 61 20 6d 65 73 61 67 65 0a 2a 2a 20 74 6f t a mesage.** to 35e0: 20 69 6e 66 6f 72 6d 20 74 68 65 20 75 73 65 72 inform the user 35f0: 20 74 68 61 74 20 6d 75 63 68 20 6d 6f 72 65 20 that much more 3600: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 information is a 3610: 76 61 69 6c 61 62 6c 65 20 62 79 0a 2a 2a 20 6c vailable by.** l 3620: 6f 67 67 69 6e 67 20 69 6e 20 61 73 20 61 6e 6f ogging in as ano 3630: 6e 79 6d 6f 75 73 2e 0a 2a 2f 0a 76 6f 69 64 20 nymous..*/.void 3640: 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f login_anonymous_ 3650: 61 76 61 69 6c 61 62 6c 65 28 76 6f 69 64 29 7b available(void){ 3660: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 48 69 73 74 . if( !g.okHist 3670: 6f 72 79 20 26 26 0a 20 20 20 20 20 20 64 62 5f ory &&. db_ 3680: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 exists("SELECT 1 3690: 20 46 52 4f 4d 20 75 73 65 72 22 0a 20 20 20 20 FROM user". 36a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 " WH 36b0: 45 52 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 ERE login='anony 36c0: 6d 6f 75 73 27 22 0a 20 20 20 20 20 20 20 20 20 mous'". 36d0: 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 63 " AND c 36e0: 61 70 20 4c 49 4b 45 20 27 25 25 68 25 25 27 22 ap LIKE '%%h%%'" 36f0: 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 ) ){. const c 3700: 68 61 72 20 2a 7a 55 72 6c 20 3d 20 50 44 28 22 har *zUrl = PD(" 3710: 52 45 51 55 45 53 54 5f 55 52 49 22 2c 20 22 69 REQUEST_URI", "i 3720: 6e 64 65 78 22 29 3b 0a 20 20 20 20 40 20 3c 70 ndex");. @ <p 3730: 3e 4d 61 6e 79 20 3c 66 6f 6e 74 20 63 6f 6c 6f >Many <font colo 3740: 72 3d 22 72 65 64 22 3e 68 79 70 65 72 6c 69 6e r="red">hyperlin 3750: 6b 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 2e ks are disabled. 3760: 3c 2f 66 6f 6e 74 3e 3c 62 72 20 2f 3e 0a 20 20 </font><br />. 3770: 20 20 40 20 55 73 65 20 3c 61 20 68 72 65 66 3d @ Use <a href= 3780: 22 25 73 28 67 2e 7a 54 6f 70 29 2f 6c 6f 67 69 "%s(g.zTop)/logi 3790: 6e 3f 61 6e 6f 6e 3d 31 26 67 3d 25 54 28 7a 55 n?anon=1&g=%T(zU 37a0: 72 6c 29 22 3e 61 6e 6f 6e 79 6d 6f 75 73 20 6c rl)">anonymous l 37b0: 6f 67 69 6e 3c 2f 61 3e 0a 20 20 20 20 40 20 74 ogin</a>. @ t 37c0: 6f 20 65 6e 61 62 6c 65 20 68 79 70 65 72 6c 69 o enable hyperli 37d0: 6e 6b 73 2e 3c 2f 70 3e 0a 20 20 7d 0a 7d 0a nks.</p>. }.}.