Hex Artifact Content
Not logged in

Artifact 1c7a1834ca6e4d60f1cfce689860a260c4584626:

File src/setup.c part of check-in [1f1d96529c] - Users unconditionally inherit capabilities of "anonymous". New capability "v" means to inherit capabilities of user "developer". Login is prohibited if the password is empty. by drh on 2008-08-03 16:47:43.

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 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  .**.** You shoul
0230: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0240: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0250: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0260: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0270: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0280: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0290: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
02a0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
02b0: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
02c0: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
02d0: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02e0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02f0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
0300: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
0310: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
0320: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
0330: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0340: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0350: 0a 2a 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: 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
03b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 65 74  ation of the Set
03c0: 75 70 20 70 61 67 65 0a 2a 2f 0a 23 69 6e 63 6c  up page.*/.#incl
03d0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
03e0: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
03f0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 65 74  h".#include "set
0400: 75 70 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 75  up.h".../*.** Ou
0410: 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20 65 6e  tput a single en
0420: 74 72 79 20 66 6f 72 20 61 20 6d 65 6e 75 20 67  try for a menu g
0430: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
0440: 6e 20 48 54 4d 4c 20 74 61 62 6c 65 2e 0a 2a 2a  n HTML table..**
0450: 20 49 66 20 7a 4c 69 6e 6b 20 69 73 20 6e 6f 74   If zLink is not
0460: 20 4e 55 4c 4c 20 6f 72 20 61 6e 20 65 6d 70 74   NULL or an empt
0470: 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 69  y string, then i
0480: 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
0490: 61 74 0a 2a 2a 20 74 68 65 20 6d 65 6e 75 20 65  at.** the menu e
04a0: 6e 74 72 79 20 77 69 6c 6c 20 68 79 70 65 72 6c  ntry will hyperl
04b0: 69 6e 6b 20 74 6f 2e 20 20 49 66 20 7a 4c 69 6e  ink to.  If zLin
04c0: 6b 20 69 73 20 4e 55 4c 4c 20 6f 72 20 22 22 2c  k is NULL or "",
04d0: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6d 65 6e   then.** the men
04e0: 75 20 65 6e 74 72 79 20 68 61 73 20 6e 6f 20 68  u entry has no h
04f0: 79 70 65 72 6c 69 6e 6b 20 2d 20 69 74 20 69 73  yperlink - it is
0500: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 76 6f   disabled..*/.vo
0510: 69 64 20 73 65 74 75 70 5f 6d 65 6e 75 5f 65 6e  id setup_menu_en
0520: 74 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  try(.  const cha
0530: 72 20 2a 7a 54 69 74 6c 65 2c 0a 20 20 63 6f 6e  r *zTitle,.  con
0540: 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b 2c 0a  st char *zLink,.
0550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
0560: 65 73 63 0a 29 7b 0a 20 20 40 20 3c 74 72 3e 3c  esc.){.  @ <tr><
0570: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20  td valign="top" 
0580: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 0a 20  align="right">. 
0590: 20 69 66 28 20 7a 4c 69 6e 6b 20 26 26 20 7a 4c   if( zLink && zL
05a0: 69 6e 6b 5b 30 5d 20 29 7b 0a 20 20 20 20 40 20  ink[0] ){.    @ 
05b0: 3c 61 20 68 72 65 66 3d 22 25 73 28 7a 4c 69 6e  <a href="%s(zLin
05c0: 6b 29 22 3e 25 68 28 7a 54 69 74 6c 65 29 3c 2f  k)">%h(zTitle)</
05d0: 61 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a>.  }else{.    
05e0: 40 20 25 68 28 7a 54 69 74 6c 65 29 0a 20 20 7d  @ %h(zTitle).  }
05f0: 0a 20 20 40 20 3c 2f 74 64 3e 3c 74 64 20 76 61  .  @ </td><td va
0600: 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 68 28 7a 44  lign="top">%h(zD
0610: 65 73 63 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 7d  esc)</td></tr>.}
0620: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
0630: 20 2f 73 65 74 75 70 0a 2a 2f 0a 76 6f 69 64 20   /setup.*/.void 
0640: 73 65 74 75 70 5f 70 61 67 65 28 76 6f 69 64 29  setup_page(void)
0650: 7b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  {.  login_check_
0660: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
0670: 20 69 66 28 20 21 67 2e 6f 6b 53 65 74 75 70 20   if( !g.okSetup 
0680: 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65  ){.    login_nee
0690: 64 65 64 28 29 3b 0a 20 20 7d 0a 0a 20 20 73 74  ded();.  }..  st
06a0: 79 6c 65 5f 68 65 61 64 65 72 28 22 53 65 74 75  yle_header("Setu
06b0: 70 22 29 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20  p");.  @ <table 
06c0: 62 6f 72 64 65 72 3d 22 30 22 20 63 65 6c 6c 73  border="0" cells
06d0: 70 61 63 69 6e 67 3d 22 32 30 22 3e 0a 20 20 73  pacing="20">.  s
06e0: 65 74 75 70 5f 6d 65 6e 75 5f 65 6e 74 72 79 28  etup_menu_entry(
06f0: 22 55 73 65 72 73 22 2c 20 22 73 65 74 75 70 5f  "Users", "setup_
0700: 75 6c 69 73 74 22 2c 0a 20 20 20 20 22 47 72 61  ulist",.    "Gra
0710: 6e 74 20 70 72 69 76 69 6c 65 67 65 73 20 74 6f  nt privileges to
0720: 20 69 6e 64 69 76 69 64 75 61 6c 20 75 73 65 72   individual user
0730: 73 2e 22 29 3b 0a 20 20 73 65 74 75 70 5f 6d 65  s.");.  setup_me
0740: 6e 75 5f 65 6e 74 72 79 28 22 41 63 63 65 73 73  nu_entry("Access
0750: 22 2c 20 22 73 65 74 75 70 5f 61 63 63 65 73 73  ", "setup_access
0760: 22 2c 0a 20 20 20 20 22 43 6f 6e 74 72 6f 6c 20  ",.    "Control 
0770: 61 63 63 65 73 73 20 73 65 74 74 69 6e 67 73 2e  access settings.
0780: 22 29 3b 0a 20 20 73 65 74 75 70 5f 6d 65 6e 75  ");.  setup_menu
0790: 5f 65 6e 74 72 79 28 22 43 6f 6e 66 69 67 75 72  _entry("Configur
07a0: 61 74 69 6f 6e 22 2c 20 22 73 65 74 75 70 5f 63  ation", "setup_c
07b0: 6f 6e 66 69 67 22 2c 0a 20 20 20 20 22 43 6f 6e  onfig",.    "Con
07c0: 66 69 67 75 72 65 20 74 68 65 20 57 57 57 20 63  figure the WWW c
07d0: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65  omponents of the
07e0: 20 72 65 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20   repository");. 
07f0: 20 73 65 74 75 70 5f 6d 65 6e 75 5f 65 6e 74 72   setup_menu_entr
0800: 79 28 22 54 69 6d 65 6c 69 6e 65 22 2c 20 22 73  y("Timeline", "s
0810: 65 74 75 70 5f 74 69 6d 65 6c 69 6e 65 22 2c 0a  etup_timeline",.
0820: 20 20 20 20 22 54 69 6d 65 6c 69 6e 65 20 64 69      "Timeline di
0830: 73 70 6c 61 79 20 70 72 65 66 65 72 65 6e 63 65  splay preference
0840: 73 22 29 3b 0a 20 20 73 65 74 75 70 5f 6d 65 6e  s");.  setup_men
0850: 75 5f 65 6e 74 72 79 28 22 54 69 63 6b 65 74 73  u_entry("Tickets
0860: 22 2c 20 22 74 6b 74 73 65 74 75 70 22 2c 0a 20  ", "tktsetup",. 
0870: 20 20 20 22 43 6f 6e 66 69 67 75 72 65 20 74 68     "Configure th
0880: 65 20 74 72 6f 75 62 6c 65 2d 74 69 63 6b 65 74  e trouble-ticket
0890: 69 6e 67 20 73 79 73 74 65 6d 20 66 6f 72 20 74  ing system for t
08a0: 68 69 73 20 72 65 70 6f 73 69 74 6f 72 79 22 29  his repository")
08b0: 3b 0a 20 20 73 65 74 75 70 5f 6d 65 6e 75 5f 65  ;.  setup_menu_e
08c0: 6e 74 72 79 28 22 43 53 53 22 2c 20 22 73 65 74  ntry("CSS", "set
08d0: 75 70 5f 65 64 69 74 63 73 73 22 2c 0a 20 20 20  up_editcss",.   
08e0: 20 22 45 64 69 74 20 74 68 65 20 43 61 73 63 61   "Edit the Casca
08f0: 64 69 6e 67 20 53 74 79 6c 65 20 53 68 65 65 74  ding Style Sheet
0900: 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 61 67   used by all pag
0910: 65 73 20 6f 66 20 74 68 69 73 20 72 65 70 6f 73  es of this repos
0920: 69 74 6f 72 79 22 29 3b 0a 20 20 73 65 74 75 70  itory");.  setup
0930: 5f 6d 65 6e 75 5f 65 6e 74 72 79 28 22 48 65 61  _menu_entry("Hea
0940: 64 65 72 22 2c 20 22 73 65 74 75 70 5f 68 65 61  der", "setup_hea
0950: 64 65 72 22 2c 0a 20 20 20 20 22 45 64 69 74 20  der",.    "Edit 
0960: 48 54 4d 4c 20 74 65 78 74 20 69 6e 73 65 72 74  HTML text insert
0970: 65 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ed at the top of
0980: 20 65 76 65 72 79 20 70 61 67 65 22 29 3b 0a 20   every page");. 
0990: 20 73 65 74 75 70 5f 6d 65 6e 75 5f 65 6e 74 72   setup_menu_entr
09a0: 79 28 22 46 6f 6f 74 65 72 22 2c 20 22 73 65 74  y("Footer", "set
09b0: 75 70 5f 66 6f 6f 74 65 72 22 2c 0a 20 20 20 20  up_footer",.    
09c0: 22 45 64 69 74 20 48 54 4d 4c 20 74 65 78 74 20  "Edit HTML text 
09d0: 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65 20  inserted at the 
09e0: 62 6f 74 74 6f 6d 20 6f 66 20 65 76 65 72 79 20  bottom of every 
09f0: 70 61 67 65 22 29 3b 0a 20 20 73 65 74 75 70 5f  page");.  setup_
0a00: 6d 65 6e 75 5f 65 6e 74 72 79 28 22 53 68 75 6e  menu_entry("Shun
0a10: 6e 65 64 22 2c 20 22 73 68 75 6e 22 2c 0a 20 20  ned", "shun",.  
0a20: 20 20 22 53 68 6f 77 20 61 72 74 69 66 61 63 74    "Show artifact
0a30: 73 20 74 68 61 74 20 61 72 65 20 73 68 75 6e 6e  s that are shunn
0a40: 65 64 20 62 79 20 74 68 69 73 20 72 65 70 6f 73  ed by this repos
0a50: 69 74 6f 72 79 22 29 3b 0a 20 20 73 65 74 75 70  itory");.  setup
0a60: 5f 6d 65 6e 75 5f 65 6e 74 72 79 28 22 53 74 61  _menu_entry("Sta
0a70: 74 73 22 2c 20 22 73 74 61 74 22 2c 0a 20 20 20  ts", "stat",.   
0a80: 20 22 44 69 73 70 6c 61 79 20 72 65 70 6f 73 69   "Display reposi
0a90: 74 6f 72 79 20 73 74 61 74 69 73 74 69 63 73 22  tory statistics"
0aa0: 29 3b 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a  );.  @ </table>.
0ab0: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
0ac0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
0ad0: 41 47 45 3a 20 73 65 74 75 70 5f 75 6c 69 73 74  AGE: setup_ulist
0ae0: 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 61 20 6c 69  .**.** Show a li
0af0: 73 74 20 6f 66 20 75 73 65 72 73 2e 20 20 43 6c  st of users.  Cl
0b00: 69 63 6b 69 6e 67 20 6f 6e 20 61 6e 79 20 75 73  icking on any us
0b10: 65 72 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  er jumps to the 
0b20: 65 64 69 74 0a 2a 2a 20 73 63 72 65 65 6e 20 66  edit.** screen f
0b30: 6f 72 20 74 68 61 74 20 75 73 65 72 2e 0a 2a 2f  or that user..*/
0b40: 0a 76 6f 69 64 20 73 65 74 75 70 5f 75 6c 69 73  .void setup_ulis
0b50: 74 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20  t(void){.  Stmt 
0b60: 73 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  s;..  login_chec
0b70: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
0b80: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 41 64 6d 69  .  if( !g.okAdmi
0b90: 6e 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e  n ){.    login_n
0ba0: 65 65 64 65 64 28 29 3b 0a 20 20 20 20 72 65 74  eeded();.    ret
0bb0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 74 79 6c  urn;.  }..  styl
0bc0: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
0bd0: 74 28 22 41 64 64 22 2c 20 22 41 64 64 20 55 73  t("Add", "Add Us
0be0: 65 72 22 2c 20 22 73 65 74 75 70 5f 75 65 64 69  er", "setup_uedi
0bf0: 74 22 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  t");.  style_hea
0c00: 64 65 72 28 22 55 73 65 72 20 4c 69 73 74 22 29  der("User List")
0c10: 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72  ;.  @ <table bor
0c20: 64 65 72 3d 22 30 22 20 63 65 6c 6c 70 61 64 64  der="0" cellpadd
0c30: 69 6e 67 3d 22 30 22 20 63 65 6c 6c 73 70 61 63  ing="0" cellspac
0c40: 69 6e 67 3d 22 32 35 22 3e 0a 20 20 40 20 3c 74  ing="25">.  @ <t
0c50: 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  r><td valign="to
0c60: 70 22 3e 0a 20 20 40 20 3c 62 3e 55 73 65 72 73  p">.  @ <b>Users
0c70: 3a 3c 2f 62 3e 0a 20 20 40 20 3c 74 61 62 6c 65  :</b>.  @ <table
0c80: 20 62 6f 72 64 65 72 3d 22 31 22 20 63 65 6c 6c   border="1" cell
0c90: 70 61 64 64 69 6e 67 3d 22 31 30 22 3e 3c 74 72  padding="10"><tr
0ca0: 3e 3c 74 64 3e 0a 20 20 40 20 3c 74 61 62 6c 65  ><td>.  @ <table
0cb0: 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 63   cellspacing=0 c
0cc0: 65 6c 6c 70 61 64 64 69 6e 67 3d 30 20 62 6f 72  ellpadding=0 bor
0cd0: 64 65 72 3d 30 3e 0a 20 20 40 20 3c 74 72 3e 0a  der=0>.  @ <tr>.
0ce0: 20 20 40 20 20 20 3c 74 68 20 61 6c 69 67 6e 3d    @   <th align=
0cf0: 22 72 69 67 68 74 22 3e 55 73 65 72 26 6e 62 73  "right">User&nbs
0d00: 70 3b 49 44 3c 2f 74 68 3e 3c 74 64 20 77 69 64  p;ID</th><td wid
0d10: 74 68 3d 22 32 30 22 3e 26 6e 62 73 70 3b 3c 2f  th="20">&nbsp;</
0d20: 74 64 3e 0a 20 20 40 20 20 20 3c 74 68 3e 43 61  td>.  @   <th>Ca
0d30: 70 61 62 69 6c 69 74 69 65 73 3c 2f 74 68 3e 3c  pabilities</th><
0d40: 74 64 20 77 69 64 74 68 3d 22 31 35 22 3e 26 6e  td width="15">&n
0d50: 62 73 70 3b 3c 2f 74 64 3e 0a 20 20 40 20 20 20  bsp;</td>.  @   
0d60: 3c 74 68 3e 43 6f 6e 74 61 63 74 26 6e 62 73 70  <th>Contact&nbsp
0d70: 3b 49 6e 66 6f 3c 2f 74 68 3e 0a 20 20 40 20 3c  ;Info</th>.  @ <
0d80: 2f 74 72 3e 0a 20 20 64 62 5f 70 72 65 70 61 72  /tr>.  db_prepar
0d90: 65 28 26 73 2c 20 22 53 45 4c 45 43 54 20 75 69  e(&s, "SELECT ui
0da0: 64 2c 20 6c 6f 67 69 6e 2c 20 63 61 70 2c 20 69  d, login, cap, i
0db0: 6e 66 6f 20 46 52 4f 4d 20 75 73 65 72 20 4f 52  nfo FROM user OR
0dc0: 44 45 52 20 42 59 20 6c 6f 67 69 6e 22 29 3b 0a  DER BY login");.
0dd0: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
0de0: 28 26 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&s)==SQLITE_ROW
0df0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
0e00: 61 72 20 2a 7a 43 61 70 20 3d 20 64 62 5f 63 6f  ar *zCap = db_co
0e10: 6c 75 6d 6e 5f 74 65 78 74 28 26 73 2c 20 32 29  lumn_text(&s, 2)
0e20: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 73 74 72  ;.    if( strstr
0e30: 28 7a 43 61 70 2c 20 22 73 22 29 20 29 20 7a 43  (zCap, "s") ) zC
0e40: 61 70 20 3d 20 22 73 22 3b 0a 20 20 20 20 40 20  ap = "s";.    @ 
0e50: 3c 74 72 3e 0a 20 20 20 20 40 20 3c 74 64 20 61  <tr>.    @ <td a
0e60: 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 0a 20 20  lign="right">.  
0e70: 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20    if( g.okAdmin 
0e80: 26 26 20 28 7a 43 61 70 5b 30 5d 21 3d 27 73 27  && (zCap[0]!='s'
0e90: 20 7c 7c 20 67 2e 6f 6b 53 65 74 75 70 29 20 29   || g.okSetup) )
0ea0: 7b 0a 20 20 20 20 20 20 40 20 3c 61 20 68 72 65  {.      @ <a hre
0eb0: 66 3d 22 73 65 74 75 70 5f 75 65 64 69 74 3f 69  f="setup_uedit?i
0ec0: 64 3d 25 64 28 64 62 5f 63 6f 6c 75 6d 6e 5f 69  d=%d(db_column_i
0ed0: 6e 74 28 26 73 2c 30 29 29 22 3e 0a 20 20 20 20  nt(&s,0))">.    
0ee0: 7d 0a 20 20 20 20 40 20 3c 6e 6f 62 72 3e 25 68  }.    @ <nobr>%h
0ef0: 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  (db_column_text(
0f00: 26 73 2c 31 29 29 3c 2f 6e 6f 62 72 3e 0a 20 20  &s,1))</nobr>.  
0f10: 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20    if( g.okAdmin 
0f20: 29 7b 0a 20 20 20 20 20 20 40 20 3c 2f 61 3e 0a  ){.      @ </a>.
0f30: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 64      }.    @ </td
0f40: 3e 3c 74 64 3e 26 6e 62 73 70 3b 26 6e 62 73 70  ><td>&nbsp;&nbsp
0f50: 3b 26 6e 62 73 70 3b 3c 2f 74 64 3e 0a 20 20 20  ;&nbsp;</td>.   
0f60: 20 40 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65   @ <td align="ce
0f70: 6e 74 65 72 22 3e 25 73 28 7a 43 61 70 29 3c 2f  nter">%s(zCap)</
0f80: 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 3e 26 6e  td>.    @ <td>&n
0f90: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0fa0: 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20  </td>.    @ <td 
0fb0: 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 25 73 28  align="left">%s(
0fc0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
0fd0: 73 2c 33 29 29 3c 2f 74 64 3e 0a 20 20 20 20 40  s,3))</td>.    @
0fe0: 20 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c   </tr>.  }.  @ <
0ff0: 2f 74 61 62 6c 65 3e 3c 2f 74 64 3e 3c 2f 74 72  /table></td></tr
1000: 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 74  ></table>.  @ <t
1010: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a  d valign="top">.
1020: 20 20 40 20 3c 62 3e 4e 6f 74 65 73 3a 3c 2f 62    @ <b>Notes:</b
1030: 3e 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 40 20 3c  >.  @ <ol>.  @ <
1040: 6c 69 3e 3c 70 3e 54 68 65 20 70 65 72 6d 69 73  li><p>The permis
1050: 73 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 61  sion flags are a
1060: 73 20 66 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 20  s follows:</p>. 
1070: 20 40 20 3c 6f 6c 20 74 79 70 65 3d 22 61 22 3e   @ <ol type="a">
1080: 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22  .  @ <li value="
1090: 31 22 3e 3c 62 3e 41 64 6d 69 6e 3c 2f 62 3e 3a  1"><b>Admin</b>:
10a0: 20 43 72 65 61 74 65 20 61 6e 64 20 64 65 6c 65   Create and dele
10b0: 74 65 20 75 73 65 72 73 3c 2f 6c 69 3e 0a 20 20  te users</li>.  
10c0: 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 33 22 3e  @ <li value="3">
10d0: 3c 62 3e 41 70 70 65 6e 64 2d 54 6b 74 3c 2f 62  <b>Append-Tkt</b
10e0: 3e 3a 20 41 70 70 65 6e 64 20 74 6f 20 74 69 63  >: Append to tic
10f0: 6b 65 74 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c  kets</li>.  @ <l
1100: 69 20 76 61 6c 75 65 3d 22 34 22 3e 3c 62 3e 44  i value="4"><b>D
1110: 65 6c 65 74 65 3c 2f 62 3e 3a 20 44 65 6c 65 74  elete</b>: Delet
1120: 65 20 77 69 6b 69 20 61 6e 64 20 74 69 63 6b 65  e wiki and ticke
1130: 74 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20  ts</li>.  @ <li 
1140: 76 61 6c 75 65 3d 22 35 22 3e 3c 62 3e 45 6d 61  value="5"><b>Ema
1150: 69 6c 3c 2f 62 3e 3a 20 56 69 65 77 20 73 65 6e  il</b>: View sen
1160: 73 69 74 69 76 65 20 64 61 74 61 20 73 75 63 68  sitive data such
1170: 20 61 73 20 45 4d 61 69 6c 20 61 64 64 72 65 73   as EMail addres
1180: 73 65 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69  ses</li>.  @ <li
1190: 20 76 61 6c 75 65 3d 22 36 22 3e 3c 62 3e 4e 65   value="6"><b>Ne
11a0: 77 2d 57 69 6b 69 3c 2f 62 3e 3a 20 43 72 65 61  w-Wiki</b>: Crea
11b0: 74 65 20 6e 65 77 20 77 69 6b 69 20 70 61 67 65  te new wiki page
11c0: 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76  s</li>.  @ <li v
11d0: 61 6c 75 65 3d 22 37 22 3e 3c 62 3e 43 6c 6f 6e  alue="7"><b>Clon
11e0: 65 3c 2f 62 3e 3a 20 43 6c 6f 6e 65 20 74 68 65  e</b>: Clone the
11f0: 20 72 65 70 6f 73 69 74 6f 72 79 3c 2f 6c 69 3e   repository</li>
1200: 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22  .  @ <li value="
1210: 38 22 3e 3c 62 3e 48 69 73 74 6f 72 79 3c 2f 62  8"><b>History</b
1220: 3e 3a 20 56 69 65 77 20 64 65 74 61 69 6c 20 72  >: View detail r
1230: 65 70 6f 73 69 74 6f 72 79 20 68 69 73 74 6f 72  epository histor
1240: 79 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76  y</li>.  @ <li v
1250: 61 6c 75 65 3d 22 39 22 3e 3c 62 3e 43 68 65 63  alue="9"><b>Chec
1260: 6b 2d 49 6e 3c 2f 62 3e 3a 20 43 6f 6d 6d 69 74  k-In</b>: Commit
1270: 20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 69 6e   new versions in
1280: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 3c   the repository<
1290: 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c  /li>.  @ <li val
12a0: 75 65 3d 22 31 30 22 3e 3c 62 3e 52 65 61 64 2d  ue="10"><b>Read-
12b0: 57 69 6b 69 3c 2f 62 3e 3a 20 56 69 65 77 20 77  Wiki</b>: View w
12c0: 69 6b 69 20 70 61 67 65 73 3c 2f 6c 69 3e 0a 20  iki pages</li>. 
12d0: 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 31   @ <li value="11
12e0: 22 3e 3c 62 3e 57 72 69 74 65 2d 57 69 6b 69 3c  "><b>Write-Wiki<
12f0: 2f 62 3e 3a 20 45 64 69 74 20 77 69 6b 69 20 70  /b>: Edit wiki p
1300: 61 67 65 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c  ages</li>.  @ <l
1310: 69 20 76 61 6c 75 65 3d 22 31 33 22 3e 3c 62 3e  i value="13"><b>
1320: 41 70 70 65 6e 64 2d 57 69 6b 69 3c 2f 62 3e 3a  Append-Wiki</b>:
1330: 20 41 70 70 65 6e 64 20 74 6f 20 77 69 6b 69 20   Append to wiki 
1340: 70 61 67 65 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c  pages</li>.  @ <
1350: 6c 69 20 76 61 6c 75 65 3d 22 31 34 22 3e 3c 62  li value="14"><b
1360: 3e 4e 65 77 2d 54 6b 74 3c 2f 62 3e 3a 20 43 72  >New-Tkt</b>: Cr
1370: 65 61 74 65 20 6e 65 77 20 74 69 63 6b 65 74 73  eate new tickets
1380: 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61  </li>.  @ <li va
1390: 6c 75 65 3d 22 31 35 22 3e 3c 62 3e 43 68 65 63  lue="15"><b>Chec
13a0: 6b 2d 4f 75 74 3c 2f 62 3e 3a 20 43 68 65 63 6b  k-Out</b>: Check
13b0: 20 6f 75 74 20 76 65 72 73 69 6f 6e 73 3c 2f 6c   out versions</l
13c0: 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65  i>.  @ <li value
13d0: 3d 22 31 36 22 3e 3c 62 3e 50 61 73 73 77 6f 72  ="16"><b>Passwor
13e0: 64 3c 2f 62 3e 3a 20 43 68 61 6e 67 65 20 79 6f  d</b>: Change yo
13f0: 75 72 20 6f 77 6e 20 70 61 73 73 77 6f 72 64 3c  ur own password<
1400: 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c  /li>.  @ <li val
1410: 75 65 3d 22 31 38 22 3e 3c 62 3e 52 65 61 64 2d  ue="18"><b>Read-
1420: 54 6b 74 3c 2f 62 3e 3a 20 56 69 65 77 20 74 69  Tkt</b>: View ti
1430: 63 6b 65 74 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c  ckets</li>.  @ <
1440: 6c 69 20 76 61 6c 75 65 3d 22 31 39 22 3e 3c 62  li value="19"><b
1450: 3e 53 65 74 75 70 3a 3c 2f 62 3e 20 53 65 74 75  >Setup:</b> Setu
1460: 70 20 61 6e 64 20 63 6f 6e 66 69 67 75 72 65 20  p and configure 
1470: 74 68 69 73 20 77 65 62 73 69 74 65 3c 2f 6c 69  this website</li
1480: 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d  >.  @ <li value=
1490: 22 32 30 22 3e 3c 62 3e 54 6b 74 2d 52 65 70 6f  "20"><b>Tkt-Repo
14a0: 72 74 3a 3c 2f 62 3e 20 43 72 65 61 74 65 20 6e  rt:</b> Create n
14b0: 65 77 20 62 75 67 20 73 75 6d 6d 61 72 79 20 72  ew bug summary r
14c0: 65 70 6f 72 74 73 3c 2f 6c 69 3e 0a 20 20 40 20  eports</li>.  @ 
14d0: 3c 6c 69 20 76 61 6c 75 65 3d 22 32 32 22 3e 3c  <li value="22"><
14e0: 62 3e 44 65 76 65 6c 6f 70 65 72 3a 3c 2f 62 3e  b>Developer:</b>
14f0: 20 49 6e 68 65 72 69 74 20 70 72 69 76 69 6c 65   Inherit privile
1500: 67 65 73 20 6f 66 20 75 73 65 72 20 22 64 65 76  ges of user "dev
1510: 65 6c 6f 70 65 72 22 3c 2f 6c 69 3e 0a 20 20 40  eloper"</li>.  @
1520: 20 3c 6c 69 20 76 61 6c 75 65 3d 22 32 33 22 3e   <li value="23">
1530: 3c 62 3e 57 72 69 74 65 2d 54 6b 74 3c 2f 62 3e  <b>Write-Tkt</b>
1540: 3a 20 45 64 69 74 20 74 69 63 6b 65 74 73 3c 2f  : Edit tickets</
1550: 6c 69 3e 0a 20 20 40 20 3c 2f 6f 6c 3e 0a 20 20  li>.  @ </ol>.  
1560: 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  @ </p></li>.  @.
1570: 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20    @ <li><p>.  @ 
1580: 45 76 65 72 79 20 75 73 65 72 2c 20 6c 6f 67 67  Every user, logg
1590: 65 64 20 69 6e 20 6f 72 20 6e 6f 74 2c 20 69 6e  ed in or not, in
15a0: 68 65 72 69 74 73 20 74 68 65 20 70 72 69 76 69  herits the privi
15b0: 6c 65 67 65 73 20 6f 66 20 3c 62 3e 6e 6f 62 6f  leges of <b>nobo
15c0: 64 79 3c 2f 62 3e 2e 0a 20 20 40 20 41 6e 79 20  dy</b>..  @ Any 
15d0: 68 75 6d 61 6e 20 63 61 6e 20 6c 6f 67 69 6e 20  human can login 
15e0: 61 73 20 3c 62 3e 61 6e 6f 6e 79 6d 6f 75 73 3c  as <b>anonymous<
15f0: 2f 62 3e 20 73 69 6e 63 65 20 74 68 65 20 70 61  /b> since the pa
1600: 73 73 77 6f 72 64 20 69 73 0a 20 20 40 20 63 6c  ssword is.  @ cl
1610: 65 61 72 6c 79 20 64 69 73 70 6c 61 79 65 64 20  early displayed 
1620: 6f 6e 20 74 68 65 20 6c 6f 67 69 6e 20 70 61 67  on the login pag
1630: 65 20 66 6f 72 20 74 68 65 6d 20 74 6f 20 74 79  e for them to ty
1640: 70 65 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  pe.  The purpose
1650: 0a 20 20 40 20 6f 66 20 72 65 71 75 69 72 69 6e  .  @ of requirin
1660: 67 20 61 6e 6f 6e 79 6d 6f 75 73 20 74 6f 20 6c  g anonymous to l
1670: 6f 67 20 69 6e 20 69 73 20 74 6f 20 70 72 65 76  og in is to prev
1680: 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 73 70  ent access by sp
1690: 69 64 65 72 73 2e 0a 20 20 40 20 45 76 65 72 79  iders..  @ Every
16a0: 20 6c 6f 67 67 65 64 2d 69 6e 20 75 73 65 72 20   logged-in user 
16b0: 69 6e 68 65 72 69 74 73 20 74 68 65 20 70 72 69  inherits the pri
16c0: 76 69 6c 65 67 65 73 20 6f 66 20 3c 62 3e 61 6e  vileges of <b>an
16d0: 6f 6e 79 6d 6f 75 73 3c 2f 62 3e 2e 0a 20 20 40  onymous</b>..  @
16e0: 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20   </p></li>.  @. 
16f0: 20 40 20 3c 2f 6f 6c 3e 0a 20 20 40 20 3c 2f 74   @ </ol>.  @ </t
1700: 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a  d></tr></table>.
1710: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
1720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1730: 6e 20 74 72 75 65 20 69 66 20 7a 50 77 20 69 73  n true if zPw is
1740: 20 61 20 76 61 6c 69 64 20 70 61 73 73 77 6f 72   a valid passwor
1750: 64 20 73 74 72 69 6e 67 2e 20 20 41 20 76 61 6c  d string.  A val
1760: 69 64 0a 2a 2a 20 70 61 73 73 77 6f 72 64 20 73  id.** password s
1770: 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  tring is:.**.** 
1780: 20 28 31 29 20 20 41 20 7a 65 72 6f 2d 6c 65 6e   (1)  A zero-len
1790: 67 74 68 20 73 74 72 69 6e 67 2c 20 6f 72 0a 2a  gth string, or.*
17a0: 2a 20 20 28 32 29 20 20 61 20 73 74 72 69 6e 67  *  (2)  a string
17b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
17c0: 20 63 68 61 72 61 63 74 65 72 20 6f 74 68 65 72   character other
17d0: 20 74 68 61 6e 20 27 2a 27 2e 0a 2a 2f 0a 73 74   than '*'..*/.st
17e0: 61 74 69 63 20 69 6e 74 20 69 73 56 61 6c 69 64  atic int isValid
17f0: 50 77 53 74 72 69 6e 67 28 63 6f 6e 73 74 20 63  PwString(const c
1800: 68 61 72 20 2a 7a 50 77 29 7b 0a 20 20 69 66 28  har *zPw){.  if(
1810: 20 7a 50 77 3d 3d 30 20 29 20 72 65 74 75 72 6e   zPw==0 ) return
1820: 20 30 3b 0a 20 20 69 66 28 20 7a 50 77 5b 30 5d   0;.  if( zPw[0]
1830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1840: 20 20 77 68 69 6c 65 28 20 7a 50 77 5b 30 5d 3d    while( zPw[0]=
1850: 3d 27 2a 27 20 29 7b 20 7a 50 77 2b 2b 3b 20 7d  ='*' ){ zPw++; }
1860: 0a 20 20 72 65 74 75 72 6e 20 7a 50 77 5b 30 5d  .  return zPw[0]
1870: 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  !=0;.}../*.** WE
1880: 42 50 41 47 45 3a 20 2f 73 65 74 75 70 5f 75 65  BPAGE: /setup_ue
1890: 64 69 74 0a 2a 2f 0a 76 6f 69 64 20 75 73 65 72  dit.*/.void user
18a0: 5f 65 64 69 74 28 76 6f 69 64 29 7b 0a 20 20 63  _edit(void){.  c
18b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 2c 20  onst char *zId, 
18c0: 2a 7a 4c 6f 67 69 6e 2c 20 2a 7a 49 6e 66 6f 2c  *zLogin, *zInfo,
18d0: 20 2a 7a 43 61 70 2c 20 2a 7a 50 77 3b 0a 20 20   *zCap, *zPw;.  
18e0: 63 68 61 72 20 2a 6f 61 61 2c 20 2a 6f 61 73 2c  char *oaa, *oas,
18f0: 20 2a 6f 61 72 2c 20 2a 6f 61 77 2c 20 2a 6f 61   *oar, *oaw, *oa
1900: 6e 2c 20 2a 6f 61 69 2c 20 2a 6f 61 6a 2c 20 2a  n, *oai, *oaj, *
1910: 6f 61 6f 2c 20 2a 6f 61 70 3b 0a 20 20 63 68 61  oao, *oap;.  cha
1920: 72 20 2a 6f 61 6b 2c 20 2a 6f 61 64 2c 20 2a 6f  r *oak, *oad, *o
1930: 61 63 2c 20 2a 6f 61 66 2c 20 2a 6f 61 6d 2c 20  ac, *oaf, *oam, 
1940: 2a 6f 61 68 2c 20 2a 6f 61 67 2c 20 2a 6f 61 65  *oah, *oag, *oae
1950: 3b 0a 20 20 63 68 61 72 20 2a 6f 61 74 2c 20 2a  ;.  char *oat, *
1960: 6f 61 76 3b 0a 20 20 69 6e 74 20 64 6f 57 72 69  oav;.  int doWri
1970: 74 65 3b 0a 20 20 69 6e 74 20 75 69 64 3b 0a 20  te;.  int uid;. 
1980: 20 69 6e 74 20 68 69 67 68 65 72 55 73 65 72 20   int higherUser 
1990: 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66  = 0;  /* True if
19a0: 20 75 73 65 72 20 62 65 69 6e 67 20 65 64 69 74   user being edit
19b0: 65 64 20 69 73 20 53 45 54 55 50 20 61 6e 64 20  ed is SETUP and 
19c0: 74 68 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  the */.         
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e0: 20 75 73 65 72 20 64 6f 69 6e 67 20 74 68 65 20   user doing the 
19f0: 65 64 69 74 69 6e 67 20 69 73 20 41 44 4d 49 4e  editing is ADMIN
1a00: 2e 20 20 44 69 73 61 6c 6c 6f 77 20 65 64 69 74  .  Disallow edit
1a10: 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 75 73  ing */..  /* Mus
1a20: 74 20 68 61 76 65 20 41 44 4d 49 4e 20 70 72 69  t have ADMIN pri
1a30: 76 6c 65 67 65 73 20 74 6f 20 61 63 63 65 73 73  vleges to access
1a40: 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
1a50: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
1a60: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
1a70: 66 28 20 21 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b  f( !g.okAdmin ){
1a80: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
1a90: 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20 20 2f 2a   return; }..  /*
1aa0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1ab0: 20 61 6e 20 41 44 4d 49 4e 20 75 73 65 72 20 69   an ADMIN user i
1ac0: 73 20 74 72 79 69 6e 67 20 74 6f 20 65 64 69 74  s trying to edit
1ad0: 20 61 20 53 45 54 55 50 20 61 63 63 6f 75 6e 74   a SETUP account
1ae0: 2e 0a 20 20 2a 2a 20 44 6f 6e 27 74 20 61 6c 6c  ..  ** Don't all
1af0: 6f 77 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20 20  ow that..  */.  
1b00: 7a 49 64 20 3d 20 50 44 28 22 69 64 22 2c 20 22  zId = PD("id", "
1b10: 30 22 29 3b 0a 20 20 75 69 64 20 3d 20 61 74 6f  0");.  uid = ato
1b20: 69 28 7a 49 64 29 3b 0a 20 20 69 66 28 20 7a 49  i(zId);.  if( zI
1b30: 64 20 26 26 20 21 67 2e 6f 6b 53 65 74 75 70 20  d && !g.okSetup 
1b40: 26 26 20 75 69 64 3e 30 20 29 7b 0a 20 20 20 20  && uid>0 ){.    
1b50: 63 68 61 72 20 2a 7a 4f 6c 64 43 61 70 73 3b 0a  char *zOldCaps;.
1b60: 20 20 20 20 7a 4f 6c 64 43 61 70 73 20 3d 20 64      zOldCaps = d
1b70: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
1b80: 54 20 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20  T cap FROM user 
1b90: 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c 75 69  WHERE uid=%d",ui
1ba0: 64 29 3b 0a 20 20 20 20 68 69 67 68 65 72 55 73  d);.    higherUs
1bb0: 65 72 20 3d 20 7a 4f 6c 64 43 61 70 73 20 26 26  er = zOldCaps &&
1bc0: 20 73 74 72 63 68 72 28 7a 4f 6c 64 43 61 70 73   strchr(zOldCaps
1bd0: 2c 27 73 27 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ,'s');.  }..  if
1be0: 28 20 50 28 22 63 61 6e 22 29 20 29 7b 0a 20 20  ( P("can") ){.  
1bf0: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22    cgi_redirect("
1c00: 73 65 74 75 70 5f 75 6c 69 73 74 22 29 3b 0a 20  setup_ulist");. 
1c10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1c20: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
1c30: 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72  all the necessar
1c40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 77  y information, w
1c50: 72 69 74 65 20 74 68 65 20 6e 65 77 20 6f 72 0a  rite the new or.
1c60: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 75 73    ** modified us
1c70: 65 72 20 72 65 63 6f 72 64 2e 20 20 41 66 74 65  er record.  Afte
1c80: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 75 73  r writing the us
1c90: 65 72 20 72 65 63 6f 72 64 2c 20 72 65 64 69 72  er record, redir
1ca0: 65 63 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ect.  ** to the 
1cb0: 70 61 67 65 20 74 68 61 74 20 64 69 73 70 6c 61  page that displa
1cc0: 79 73 20 61 20 6c 69 73 74 20 6f 66 20 75 73 65  ys a list of use
1cd0: 72 73 2e 0a 20 20 2a 2f 0a 20 20 64 6f 57 72 69  rs..  */.  doWri
1ce0: 74 65 20 3d 20 63 67 69 5f 61 6c 6c 28 22 6c 6f  te = cgi_all("lo
1cf0: 67 69 6e 22 2c 22 69 6e 66 6f 22 2c 22 70 77 22  gin","info","pw"
1d00: 29 20 26 26 20 21 68 69 67 68 65 72 55 73 65 72  ) && !higherUser
1d10: 3b 0a 20 20 69 66 28 20 64 6f 57 72 69 74 65 20  ;.  if( doWrite 
1d20: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 43 61 70  ){.    char zCap
1d30: 5b 35 30 5d 3b 0a 20 20 20 20 69 6e 74 20 69 20  [50];.    int i 
1d40: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 61 61 20  = 0;.    int aa 
1d50: 3d 20 50 28 22 61 61 22 29 21 3d 30 3b 0a 20 20  = P("aa")!=0;.  
1d60: 20 20 69 6e 74 20 61 64 20 3d 20 50 28 22 61 64    int ad = P("ad
1d70: 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61  ")!=0;.    int a
1d80: 65 20 3d 20 50 28 22 61 65 22 29 21 3d 30 3b 0a  e = P("ae")!=0;.
1d90: 20 20 20 20 69 6e 74 20 61 69 20 3d 20 50 28 22      int ai = P("
1da0: 61 69 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74  ai")!=0;.    int
1db0: 20 61 6a 20 3d 20 50 28 22 61 6a 22 29 21 3d 30   aj = P("aj")!=0
1dc0: 3b 0a 20 20 20 20 69 6e 74 20 61 6b 20 3d 20 50  ;.    int ak = P
1dd0: 28 22 61 6b 22 29 21 3d 30 3b 0a 20 20 20 20 69  ("ak")!=0;.    i
1de0: 6e 74 20 61 6e 20 3d 20 50 28 22 61 6e 22 29 21  nt an = P("an")!
1df0: 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 6f 20 3d  =0;.    int ao =
1e00: 20 50 28 22 61 6f 22 29 21 3d 30 3b 0a 20 20 20   P("ao")!=0;.   
1e10: 20 69 6e 74 20 61 70 20 3d 20 50 28 22 61 70 22   int ap = P("ap"
1e20: 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 72  )!=0;.    int ar
1e30: 20 3d 20 50 28 22 61 72 22 29 21 3d 30 3b 0a 20   = P("ar")!=0;. 
1e40: 20 20 20 69 6e 74 20 61 73 20 3d 20 67 2e 6f 6b     int as = g.ok
1e50: 53 65 74 75 70 20 26 26 20 50 28 22 61 73 22 29  Setup && P("as")
1e60: 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 77 20  !=0;.    int aw 
1e70: 3d 20 50 28 22 61 77 22 29 21 3d 30 3b 0a 20 20  = P("aw")!=0;.  
1e80: 20 20 69 6e 74 20 61 63 20 3d 20 50 28 22 61 63    int ac = P("ac
1e90: 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61  ")!=0;.    int a
1ea0: 66 20 3d 20 50 28 22 61 66 22 29 21 3d 30 3b 0a  f = P("af")!=0;.
1eb0: 20 20 20 20 69 6e 74 20 61 6d 20 3d 20 50 28 22      int am = P("
1ec0: 61 6d 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74  am")!=0;.    int
1ed0: 20 61 68 20 3d 20 50 28 22 61 68 22 29 21 3d 30   ah = P("ah")!=0
1ee0: 3b 0a 20 20 20 20 69 6e 74 20 61 67 20 3d 20 50  ;.    int ag = P
1ef0: 28 22 61 67 22 29 21 3d 30 3b 0a 20 20 20 20 69  ("ag")!=0;.    i
1f00: 6e 74 20 61 74 20 3d 20 50 28 22 61 74 22 29 21  nt at = P("at")!
1f10: 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 76 20 3d  =0;.    int av =
1f20: 20 50 28 22 61 76 22 29 21 3d 30 3b 0a 20 20 20   P("av")!=0;.   
1f30: 20 69 66 28 20 61 61 20 29 7b 20 7a 43 61 70 5b   if( aa ){ zCap[
1f40: 69 2b 2b 5d 20 3d 20 27 61 27 3b 20 7d 0a 20 20  i++] = 'a'; }.  
1f50: 20 20 69 66 28 20 61 63 20 29 7b 20 7a 43 61 70    if( ac ){ zCap
1f60: 5b 69 2b 2b 5d 20 3d 20 27 63 27 3b 20 7d 0a 20  [i++] = 'c'; }. 
1f70: 20 20 20 69 66 28 20 61 64 20 29 7b 20 7a 43 61     if( ad ){ zCa
1f80: 70 5b 69 2b 2b 5d 20 3d 20 27 64 27 3b 20 7d 0a  p[i++] = 'd'; }.
1f90: 20 20 20 20 69 66 28 20 61 65 20 29 7b 20 7a 43      if( ae ){ zC
1fa0: 61 70 5b 69 2b 2b 5d 20 3d 20 27 65 27 3b 20 7d  ap[i++] = 'e'; }
1fb0: 0a 20 20 20 20 69 66 28 20 61 66 20 29 7b 20 7a  .    if( af ){ z
1fc0: 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 66 27 3b 20  Cap[i++] = 'f'; 
1fd0: 7d 0a 20 20 20 20 69 66 28 20 61 68 20 29 7b 20  }.    if( ah ){ 
1fe0: 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 68 27 3b  zCap[i++] = 'h';
1ff0: 20 7d 0a 20 20 20 20 69 66 28 20 61 67 20 29 7b   }.    if( ag ){
2000: 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 67 27   zCap[i++] = 'g'
2010: 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 69 20 29  ; }.    if( ai )
2020: 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 69  { zCap[i++] = 'i
2030: 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 6a 20  '; }.    if( aj 
2040: 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27  ){ zCap[i++] = '
2050: 6a 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 6b  j'; }.    if( ak
2060: 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20   ){ zCap[i++] = 
2070: 27 6b 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61  'k'; }.    if( a
2080: 6d 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d  m ){ zCap[i++] =
2090: 20 27 6d 27 3b 20 7d 0a 20 20 20 20 69 66 28 20   'm'; }.    if( 
20a0: 61 6e 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20  an ){ zCap[i++] 
20b0: 3d 20 27 6e 27 3b 20 7d 0a 20 20 20 20 69 66 28  = 'n'; }.    if(
20c0: 20 61 6f 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d   ao ){ zCap[i++]
20d0: 20 3d 20 27 6f 27 3b 20 7d 0a 20 20 20 20 69 66   = 'o'; }.    if
20e0: 28 20 61 70 20 29 7b 20 7a 43 61 70 5b 69 2b 2b  ( ap ){ zCap[i++
20f0: 5d 20 3d 20 27 70 27 3b 20 7d 0a 20 20 20 20 69  ] = 'p'; }.    i
2100: 66 28 20 61 72 20 29 7b 20 7a 43 61 70 5b 69 2b  f( ar ){ zCap[i+
2110: 2b 5d 20 3d 20 27 72 27 3b 20 7d 0a 20 20 20 20  +] = 'r'; }.    
2120: 69 66 28 20 61 73 20 29 7b 20 7a 43 61 70 5b 69  if( as ){ zCap[i
2130: 2b 2b 5d 20 3d 20 27 73 27 3b 20 7d 0a 20 20 20  ++] = 's'; }.   
2140: 20 69 66 28 20 61 74 20 29 7b 20 7a 43 61 70 5b   if( at ){ zCap[
2150: 69 2b 2b 5d 20 3d 20 27 74 27 3b 20 7d 0a 20 20  i++] = 't'; }.  
2160: 20 20 69 66 28 20 61 76 20 29 7b 20 7a 43 61 70    if( av ){ zCap
2170: 5b 69 2b 2b 5d 20 3d 20 27 76 27 3b 20 7d 0a 20  [i++] = 'v'; }. 
2180: 20 20 20 69 66 28 20 61 77 20 29 7b 20 7a 43 61     if( aw ){ zCa
2190: 70 5b 69 2b 2b 5d 20 3d 20 27 77 27 3b 20 7d 0a  p[i++] = 'w'; }.
21a0: 0a 20 20 20 20 7a 43 61 70 5b 69 5d 20 3d 20 30  .    zCap[i] = 0
21b0: 3b 0a 20 20 20 20 7a 50 77 20 3d 20 50 28 22 70  ;.    zPw = P("p
21c0: 77 22 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  w");.    if( !is
21d0: 56 61 6c 69 64 50 77 53 74 72 69 6e 67 28 7a 50  ValidPwString(zP
21e0: 77 29 20 29 7b 0a 20 20 20 20 20 20 7a 50 77 20  w) ){.      zPw 
21f0: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
2200: 4c 45 43 54 20 70 77 20 46 52 4f 4d 20 75 73 65  LECT pw FROM use
2210: 72 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c  r WHERE uid=%d",
2220: 20 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20   uid);.    }.   
2230: 20 7a 4c 6f 67 69 6e 20 3d 20 50 28 22 6c 6f 67   zLogin = P("log
2240: 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 75 69  in");.    if( ui
2250: 64 3e 30 20 26 26 0a 20 20 20 20 20 20 20 20 64  d>0 &&.        d
2260: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
2270: 20 31 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45   1 FROM user WHE
2280: 52 45 20 6c 6f 67 69 6e 3d 25 51 20 41 4e 44 20  RE login=%Q AND 
2290: 75 69 64 21 3d 25 64 22 2c 20 7a 4c 6f 67 69 6e  uid!=%d", zLogin
22a0: 2c 20 75 69 64 29 0a 20 20 20 20 29 7b 0a 20 20  , uid).    ){.  
22b0: 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72      style_header
22c0: 28 22 55 73 65 72 20 43 72 65 61 74 69 6f 6e 20  ("User Creation 
22d0: 45 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 40  Error");.      @
22e0: 20 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65   <font color="re
22f0: 64 22 3e 4c 6f 67 69 6e 20 22 25 68 28 7a 4c 6f  d">Login "%h(zLo
2300: 67 69 6e 29 22 20 69 73 20 61 6c 72 65 61 64 79  gin)" is already
2310: 20 75 73 65 64 20 62 79 20 61 20 64 69 66 66 65   used by a diffe
2320: 72 65 6e 74 0a 20 20 20 20 20 20 40 20 75 73 65  rent.      @ use
2330: 72 2e 3c 2f 66 6f 6e 74 3e 0a 20 20 20 20 20 20  r.</font>.      
2340: 40 0a 20 20 20 20 20 20 40 20 3c 70 3e 3c 61 20  @.      @ <p><a 
2350: 68 72 65 66 3d 22 73 65 74 75 70 5f 75 65 64 69  href="setup_uedi
2360: 74 3f 69 64 3d 25 64 28 75 69 64 29 29 3e 5b 42  t?id=%d(uid))>[B
2370: 75 6d 6d 65 72 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20  ummer]</a></p>. 
2380: 20 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65       style_foote
2390: 72 28 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r();.      retur
23a0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  n;.    }.    db_
23b0: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
23c0: 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
23d0: 20 75 73 65 72 28 75 69 64 2c 6c 6f 67 69 6e 2c   user(uid,login,
23e0: 69 6e 66 6f 2c 70 77 2c 63 61 70 29 20 22 0a 20  info,pw,cap) ". 
23f0: 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 6e 75        "VALUES(nu
2400: 6c 6c 69 66 28 25 64 2c 30 29 2c 25 51 2c 25 51  llif(%d,0),%Q,%Q
2410: 2c 25 51 2c 27 25 73 27 29 22 2c 0a 20 20 20 20  ,%Q,'%s')",.    
2420: 20 20 75 69 64 2c 20 50 28 22 6c 6f 67 69 6e 22    uid, P("login"
2430: 29 2c 20 50 28 22 69 6e 66 6f 22 29 2c 20 7a 50  ), P("info"), zP
2440: 77 2c 20 7a 43 61 70 0a 20 20 20 20 29 3b 0a 20  w, zCap.    );. 
2450: 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28     cgi_redirect(
2460: 22 73 65 74 75 70 5f 75 6c 69 73 74 22 29 3b 0a  "setup_ulist");.
2470: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2480: 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65  .  /* Load the e
2490: 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  xisting informat
24a0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73  ion about the us
24b0: 65 72 2c 20 69 66 20 61 6e 79 0a 20 20 2a 2f 0a  er, if any.  */.
24c0: 20 20 7a 4c 6f 67 69 6e 20 3d 20 22 22 3b 0a 20    zLogin = "";. 
24d0: 20 7a 49 6e 66 6f 20 3d 20 22 22 3b 0a 20 20 7a   zInfo = "";.  z
24e0: 43 61 70 20 3d 20 22 22 3b 0a 20 20 7a 50 77 20  Cap = "";.  zPw 
24f0: 3d 20 22 22 3b 0a 20 20 6f 61 61 20 3d 20 6f 61  = "";.  oaa = oa
2500: 63 20 3d 20 6f 61 64 20 3d 20 6f 61 65 20 3d 20  c = oad = oae = 
2510: 6f 61 66 20 3d 20 6f 61 67 20 3d 20 6f 61 68 20  oaf = oag = oah 
2520: 3d 20 6f 61 69 20 3d 20 6f 61 6a 20 3d 20 6f 61  = oai = oaj = oa
2530: 6b 20 3d 20 6f 61 6d 20 3d 0a 20 20 20 20 20 20  k = oam =.      
2540: 20 20 6f 61 6e 20 3d 20 6f 61 6f 20 3d 20 6f 61    oan = oao = oa
2550: 70 20 3d 20 6f 61 72 20 3d 20 6f 61 73 20 3d 20  p = oar = oas = 
2560: 6f 61 74 20 3d 20 6f 61 76 20 3d 20 6f 61 77 20  oat = oav = oaw 
2570: 3d 20 22 22 3b 0a 20 20 69 66 28 20 75 69 64 20  = "";.  if( uid 
2580: 29 7b 0a 20 20 20 20 7a 4c 6f 67 69 6e 20 3d 20  ){.    zLogin = 
2590: 64 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c  db_text("", "SEL
25a0: 45 43 54 20 6c 6f 67 69 6e 20 46 52 4f 4d 20 75  ECT login FROM u
25b0: 73 65 72 20 57 48 45 52 45 20 75 69 64 3d 25 64  ser WHERE uid=%d
25c0: 22 2c 20 75 69 64 29 3b 0a 20 20 20 20 7a 49 6e  ", uid);.    zIn
25d0: 66 6f 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c  fo = db_text("",
25e0: 20 22 53 45 4c 45 43 54 20 69 6e 66 6f 20 46 52   "SELECT info FR
25f0: 4f 4d 20 75 73 65 72 20 57 48 45 52 45 20 75 69  OM user WHERE ui
2600: 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a 20 20 20  d=%d", uid);.   
2610: 20 7a 43 61 70 20 3d 20 64 62 5f 74 65 78 74 28   zCap = db_text(
2620: 22 22 2c 20 22 53 45 4c 45 43 54 20 63 61 70 20  "", "SELECT cap 
2630: 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45 20  FROM user WHERE 
2640: 75 69 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a 20  uid=%d", uid);. 
2650: 20 20 20 7a 50 77 20 3d 20 64 62 5f 74 65 78 74     zPw = db_text
2660: 28 22 22 2c 20 22 53 45 4c 45 43 54 20 70 77 20  ("", "SELECT pw 
2670: 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45 20  FROM user WHERE 
2680: 75 69 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a 20  uid=%d", uid);. 
2690: 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 43     if( strchr(zC
26a0: 61 70 2c 20 27 61 27 29 20 29 20 6f 61 61 20 3d  ap, 'a') ) oaa =
26b0: 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20   " checked";.   
26c0: 20 69 66 28 20 73 74 72 63 68 72 28 7a 43 61 70   if( strchr(zCap
26d0: 2c 20 27 63 27 29 20 29 20 6f 61 63 20 3d 20 22  , 'c') ) oac = "
26e0: 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69   checked";.    i
26f0: 66 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20  f( strchr(zCap, 
2700: 27 64 27 29 20 29 20 6f 61 64 20 3d 20 22 20 63  'd') ) oad = " c
2710: 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28  hecked";.    if(
2720: 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27 65   strchr(zCap, 'e
2730: 27 29 20 29 20 6f 61 65 20 3d 20 22 20 63 68 65  ') ) oae = " che
2740: 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73  cked";.    if( s
2750: 74 72 63 68 72 28 7a 43 61 70 2c 20 27 66 27 29  trchr(zCap, 'f')
2760: 20 29 20 6f 61 66 20 3d 20 22 20 63 68 65 63 6b   ) oaf = " check
2770: 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72  ed";.    if( str
2780: 63 68 72 28 7a 43 61 70 2c 20 27 67 27 29 20 29  chr(zCap, 'g') )
2790: 20 6f 61 67 20 3d 20 22 20 63 68 65 63 6b 65 64   oag = " checked
27a0: 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68  ";.    if( strch
27b0: 72 28 7a 43 61 70 2c 20 27 68 27 29 20 29 20 6f  r(zCap, 'h') ) o
27c0: 61 68 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b  ah = " checked";
27d0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28  .    if( strchr(
27e0: 7a 43 61 70 2c 20 27 69 27 29 20 29 20 6f 61 69  zCap, 'i') ) oai
27f0: 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20   = " checked";. 
2800: 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 43     if( strchr(zC
2810: 61 70 2c 20 27 6a 27 29 20 29 20 6f 61 6a 20 3d  ap, 'j') ) oaj =
2820: 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20   " checked";.   
2830: 20 69 66 28 20 73 74 72 63 68 72 28 7a 43 61 70   if( strchr(zCap
2840: 2c 20 27 6b 27 29 20 29 20 6f 61 6b 20 3d 20 22  , 'k') ) oak = "
2850: 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69   checked";.    i
2860: 66 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20  f( strchr(zCap, 
2870: 27 6d 27 29 20 29 20 6f 61 6d 20 3d 20 22 20 63  'm') ) oam = " c
2880: 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28  hecked";.    if(
2890: 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27 6e   strchr(zCap, 'n
28a0: 27 29 20 29 20 6f 61 6e 20 3d 20 22 20 63 68 65  ') ) oan = " che
28b0: 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73  cked";.    if( s
28c0: 74 72 63 68 72 28 7a 43 61 70 2c 20 27 6f 27 29  trchr(zCap, 'o')
28d0: 20 29 20 6f 61 6f 20 3d 20 22 20 63 68 65 63 6b   ) oao = " check
28e0: 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72  ed";.    if( str
28f0: 63 68 72 28 7a 43 61 70 2c 20 27 70 27 29 20 29  chr(zCap, 'p') )
2900: 20 6f 61 70 20 3d 20 22 20 63 68 65 63 6b 65 64   oap = " checked
2910: 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68  ";.    if( strch
2920: 72 28 7a 43 61 70 2c 20 27 72 27 29 20 29 20 6f  r(zCap, 'r') ) o
2930: 61 72 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b  ar = " checked";
2940: 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28  .    if( strchr(
2950: 7a 43 61 70 2c 20 27 73 27 29 20 29 20 6f 61 73  zCap, 's') ) oas
2960: 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20   = " checked";. 
2970: 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 43     if( strchr(zC
2980: 61 70 2c 20 27 74 27 29 20 29 20 6f 61 74 20 3d  ap, 't') ) oat =
2990: 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20   " checked";.   
29a0: 20 69 66 28 20 73 74 72 63 68 72 28 7a 43 61 70   if( strchr(zCap
29b0: 2c 20 27 76 27 29 20 29 20 6f 61 76 20 3d 20 22  , 'v') ) oav = "
29c0: 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69   checked";.    i
29d0: 66 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20  f( strchr(zCap, 
29e0: 27 77 27 29 20 29 20 6f 61 77 20 3d 20 22 20 63  'w') ) oaw = " c
29f0: 68 65 63 6b 65 64 22 3b 0a 20 20 7d 0a 0a 20 20  hecked";.  }..  
2a00: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
2a10: 69 6e 67 20 74 68 65 20 70 61 67 65 0a 20 20 2a  ing the page.  *
2a20: 2f 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e  /.  style_submen
2a30: 75 5f 65 6c 65 6d 65 6e 74 28 22 43 61 6e 63 65  u_element("Cance
2a40: 6c 22 2c 20 22 43 61 6e 63 65 6c 22 2c 20 22 73  l", "Cancel", "s
2a50: 65 74 75 70 5f 75 6c 69 73 74 22 29 3b 0a 20 20  etup_ulist");.  
2a60: 69 66 28 20 75 69 64 20 29 7b 0a 20 20 20 20 73  if( uid ){.    s
2a70: 74 79 6c 65 5f 68 65 61 64 65 72 28 6d 70 72 69  tyle_header(mpri
2a80: 6e 74 66 28 22 45 64 69 74 20 55 73 65 72 20 25  ntf("Edit User %
2a90: 68 22 2c 20 7a 4c 6f 67 69 6e 29 29 3b 0a 20 20  h", zLogin));.  
2aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c 65  }else{.    style
2ab0: 5f 68 65 61 64 65 72 28 22 41 64 64 20 41 20 4e  _header("Add A N
2ac0: 65 77 20 55 73 65 72 22 29 3b 0a 20 20 7d 0a 20  ew User");.  }. 
2ad0: 20 40 20 3c 74 61 62 6c 65 20 61 6c 69 67 6e 3d   @ <table align=
2ae0: 22 6c 65 66 74 22 20 68 73 70 61 63 65 3d 22 32  "left" hspace="2
2af0: 30 22 20 76 73 70 61 63 65 3d 22 31 30 22 3e 3c  0" vspace="10"><
2b00: 74 72 3e 3c 74 64 3e 0a 20 20 40 20 3c 66 6f 72  tr><td>.  @ <for
2b10: 6d 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a  m action="%s(g.z
2b20: 50 61 74 68 29 22 20 6d 65 74 68 6f 64 3d 22 50  Path)" method="P
2b30: 4f 53 54 22 3e 0a 20 20 40 20 3c 74 61 62 6c 65  OST">.  @ <table
2b40: 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 20 20  >.  @ <tr>.  @  
2b50: 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68   <td align="righ
2b60: 74 22 3e 3c 6e 6f 62 72 3e 55 73 65 72 20 49 44  t"><nobr>User ID
2b70: 3a 3c 2f 6e 6f 62 72 3e 3c 2f 74 64 3e 0a 20 20  :</nobr></td>.  
2b80: 69 66 28 20 75 69 64 20 29 7b 0a 20 20 20 20 40  if( uid ){.    @
2b90: 20 20 20 3c 74 64 3e 25 64 28 75 69 64 29 20 3c     <td>%d(uid) <
2ba0: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
2bb0: 65 6e 22 20 6e 61 6d 65 3d 22 69 64 22 20 76 61  en" name="id" va
2bc0: 6c 75 65 3d 22 25 64 28 75 69 64 29 22 3e 3c 2f  lue="%d(uid)"></
2bd0: 74 64 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  td>.  }else{.   
2be0: 20 40 20 20 20 3c 74 64 3e 28 6e 65 77 20 75 73   @   <td>(new us
2bf0: 65 72 29 3c 69 6e 70 75 74 20 74 79 70 65 3d 22  er)<input type="
2c00: 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 69 64  hidden" name="id
2c10: 22 20 76 61 6c 75 65 3d 30 3e 3c 2f 74 64 3e 0a  " value=0></td>.
2c20: 20 20 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20    }.  @ </tr>.  
2c30: 40 20 3c 74 72 3e 0a 20 20 40 20 20 20 3c 74 64  @ <tr>.  @   <td
2c40: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 3c   align="right"><
2c50: 6e 6f 62 72 3e 4c 6f 67 69 6e 3a 3c 2f 6e 6f 62  nobr>Login:</nob
2c60: 72 3e 3c 2f 74 64 3e 0a 20 20 40 20 20 20 3c 74  r></td>.  @   <t
2c70: 64 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74  d><input type="t
2c80: 65 78 74 22 20 6e 61 6d 65 3d 22 6c 6f 67 69 6e  ext" name="login
2c90: 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4c 6f 67  " value="%h(zLog
2ca0: 69 6e 29 22 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c  in)"></td>.  @ <
2cb0: 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20  /tr>.  @ <tr>.  
2cc0: 40 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72  @   <td align="r
2cd0: 69 67 68 74 22 3e 3c 6e 6f 62 72 3e 43 6f 6e 74  ight"><nobr>Cont
2ce0: 61 63 74 26 6e 62 73 70 3b 49 6e 66 6f 3a 3c 2f  act&nbsp;Info:</
2cf0: 6e 6f 62 72 3e 3c 2f 74 64 3e 0a 20 20 40 20 20  nobr></td>.  @  
2d00: 20 3c 74 64 3e 3c 69 6e 70 75 74 20 74 79 70 65   <td><input type
2d10: 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 69 6e  ="text" name="in
2d20: 66 6f 22 20 73 69 7a 65 3d 34 30 20 76 61 6c 75  fo" size=40 valu
2d30: 65 3d 22 25 68 28 7a 49 6e 66 6f 29 22 3e 3c 2f  e="%h(zInfo)"></
2d40: 74 64 3e 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20  td>.  @ </tr>.  
2d50: 40 20 3c 74 72 3e 0a 20 20 40 20 20 20 3c 74 64  @ <tr>.  @   <td
2d60: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76   align="right" v
2d70: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 43 61 70 61  align="top">Capa
2d80: 62 69 6c 69 74 69 65 73 3a 3c 2f 74 64 3e 0a 20  bilities:</td>. 
2d90: 20 40 20 20 20 3c 74 64 3e 0a 20 20 69 66 28 20   @   <td>.  if( 
2da0: 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a 20 20 20  g.okSetup ){.   
2db0: 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79   @     <input ty
2dc0: 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61  pe="checkbox" na
2dd0: 6d 65 3d 22 61 73 22 25 73 28 6f 61 73 29 3e 53  me="as"%s(oas)>S
2de0: 65 74 75 70 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e  etup</input><br>
2df0: 0a 20 20 7d 0a 20 20 40 20 20 20 20 20 3c 69 6e  .  }.  @     <in
2e00: 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62  put type="checkb
2e10: 6f 78 22 20 6e 61 6d 65 3d 22 61 61 22 25 73 28  ox" name="aa"%s(
2e20: 6f 61 61 29 3e 41 64 6d 69 6e 3c 2f 69 6e 70 75  oaa)>Admin</inpu
2e30: 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c  t><br>.  @     <
2e40: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
2e50: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61 64 22 25  kbox" name="ad"%
2e60: 73 28 6f 61 64 29 3e 44 65 6c 65 74 65 3c 2f 69  s(oad)>Delete</i
2e70: 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20  nput><br>.  @   
2e80: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63    <input type="c
2e90: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61  heckbox" name="a
2ea0: 65 22 25 73 28 6f 61 64 29 3e 45 6d 61 69 6c 3c  e"%s(oad)>Email<
2eb0: 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20  /input><br>.  @ 
2ec0: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
2ed0: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
2ee0: 22 61 70 22 25 73 28 6f 61 70 29 3e 50 61 73 73  "ap"%s(oap)>Pass
2ef0: 77 6f 72 64 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e  word</input><br>
2f00: 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20  .  @     <input 
2f10: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
2f20: 6e 61 6d 65 3d 22 61 69 22 25 73 28 6f 61 69 29  name="ai"%s(oai)
2f30: 3e 43 68 65 63 6b 2d 49 6e 3c 2f 69 6e 70 75 74  >Check-In</input
2f40: 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69  ><br>.  @     <i
2f50: 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b  nput type="check
2f60: 62 6f 78 22 20 6e 61 6d 65 3d 22 61 6f 22 25 73  box" name="ao"%s
2f70: 28 6f 61 6f 29 3e 43 68 65 63 6b 2d 4f 75 74 3c  (oao)>Check-Out<
2f80: 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20  /input><br>.  @ 
2f90: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
2fa0: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
2fb0: 22 61 68 22 25 73 28 6f 61 68 29 3e 48 69 73 74  "ah"%s(oah)>Hist
2fc0: 6f 72 79 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a  ory</input><br>.
2fd0: 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20 74    @     <input t
2fe0: 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e  ype="checkbox" n
2ff0: 61 6d 65 3d 22 61 76 22 25 73 28 6f 61 76 29 3e  ame="av"%s(oav)>
3000: 44 65 76 65 6c 6f 70 65 72 3c 2f 69 6e 70 75 74  Developer</input
3010: 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69  ><br>.  @     <i
3020: 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b  nput type="check
3030: 62 6f 78 22 20 6e 61 6d 65 3d 22 61 67 22 25 73  box" name="ag"%s
3040: 28 6f 61 67 29 3e 43 6c 6f 6e 65 3c 2f 69 6e 70  (oag)>Clone</inp
3050: 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20  ut><br>.  @     
3060: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65  <input type="che
3070: 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61 6a 22  ckbox" name="aj"
3080: 25 73 28 6f 61 6a 29 3e 52 65 61 64 20 57 69 6b  %s(oaj)>Read Wik
3090: 69 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20  i</input><br>.  
30a0: 40 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70  @     <input typ
30b0: 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d  e="checkbox" nam
30c0: 65 3d 22 61 66 22 25 73 28 6f 61 66 29 3e 4e 65  e="af"%s(oaf)>Ne
30d0: 77 20 57 69 6b 69 3c 2f 69 6e 70 75 74 3e 3c 62  w Wiki</input><b
30e0: 72 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75  r>.  @     <inpu
30f0: 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78  t type="checkbox
3100: 22 20 6e 61 6d 65 3d 22 61 6d 22 25 73 28 6f 61  " name="am"%s(oa
3110: 6d 29 3e 41 70 70 65 6e 64 20 57 69 6b 69 3c 2f  m)>Append Wiki</
3120: 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20  input><br>.  @  
3130: 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22     <input type="
3140: 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22  checkbox" name="
3150: 61 6b 22 25 73 28 6f 61 6b 29 3e 57 72 69 74 65  ak"%s(oak)>Write
3160: 20 57 69 6b 69 3c 2f 69 6e 70 75 74 3e 3c 62 72   Wiki</input><br
3170: 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74  >.  @     <input
3180: 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
3190: 20 6e 61 6d 65 3d 22 61 72 22 25 73 28 6f 61 72   name="ar"%s(oar
31a0: 29 3e 52 65 61 64 20 54 6b 74 3c 2f 69 6e 70 75  )>Read Tkt</inpu
31b0: 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c  t><br>.  @     <
31c0: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
31d0: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61 6e 22 25  kbox" name="an"%
31e0: 73 28 6f 61 6e 29 3e 4e 65 77 20 54 6b 74 3c 2f  s(oan)>New Tkt</
31f0: 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20  input><br>.  @  
3200: 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22     <input type="
3210: 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22  checkbox" name="
3220: 61 63 22 25 73 28 6f 61 63 29 3e 41 70 70 65 6e  ac"%s(oac)>Appen
3230: 64 20 54 6b 74 3c 2f 69 6e 70 75 74 3e 3c 62 72  d Tkt</input><br
3240: 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74  >.  @     <input
3250: 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
3260: 20 6e 61 6d 65 3d 22 61 77 22 25 73 28 6f 61 77   name="aw"%s(oaw
3270: 29 3e 57 72 69 74 65 20 54 6b 74 3c 2f 69 6e 70  )>Write Tkt</inp
3280: 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20  ut><br>.  @     
3290: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65  <input type="che
32a0: 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61 74 22  ckbox" name="at"
32b0: 25 73 28 6f 61 74 29 3e 54 6b 74 20 52 65 70 6f  %s(oat)>Tkt Repo
32c0: 72 74 3c 2f 69 6e 70 75 74 3e 0a 20 20 40 20 20  rt</input>.  @  
32d0: 20 3c 2f 74 64 3e 0a 20 20 40 20 3c 2f 74 72 3e   </td>.  @ </tr>
32e0: 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 20 20 20  .  @ <tr>.  @   
32f0: 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  <td align="right
3300: 22 3e 50 61 73 73 77 6f 72 64 3a 3c 2f 74 64 3e  ">Password:</td>
3310: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4c  .  if( strcmp(zL
3320: 6f 67 69 6e 2c 20 22 61 6e 6f 6e 79 6d 6f 75 73  ogin, "anonymous
3330: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ")==0 ){.    /* 
3340: 55 73 65 72 20 74 68 65 20 70 61 73 73 77 6f 72  User the passwor
3350: 64 20 66 6f 72 20 22 61 6e 6f 6e 79 6d 6f 75 73  d for "anonymous
3360: 22 20 61 73 20 63 6c 65 61 72 74 65 78 74 20 2a  " as cleartext *
3370: 2f 0a 20 20 20 20 40 20 20 20 3c 74 64 3e 3c 69  /.    @   <td><i
3380: 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22  nput type="text"
3390: 20 6e 61 6d 65 3d 22 70 77 22 20 76 61 6c 75 65   name="pw" value
33a0: 3d 22 25 68 28 7a 50 77 29 22 3e 3c 2f 74 64 3e  ="%h(zPw)"></td>
33b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 77  .  }else if( zPw
33c0: 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 62  [0] ){.    /* Ob
33d0: 73 63 75 72 65 20 74 68 65 20 70 61 73 73 77 6f  scure the passwo
33e0: 72 64 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  rd for all other
33f0: 20 75 73 65 72 73 20 2a 2f 0a 20 20 20 20 40 20   users */.    @ 
3400: 20 20 3c 74 64 3e 3c 69 6e 70 75 74 20 74 79 70    <td><input typ
3410: 65 3d 22 70 61 73 73 77 6f 72 64 22 20 6e 61 6d  e="password" nam
3420: 65 3d 22 70 77 22 20 76 61 6c 75 65 3d 22 2a 2a  e="pw" value="**
3430: 2a 2a 2a 2a 2a 2a 2a 2a 22 3e 3c 2f 74 64 3e 0a  ********"></td>.
3440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
3450: 53 68 6f 77 20 61 6e 20 65 6d 70 74 79 20 70 61  Show an empty pa
3460: 73 73 77 6f 72 64 20 61 73 20 61 6e 20 65 6d 70  ssword as an emp
3470: 74 79 20 69 6e 70 75 74 20 66 69 65 6c 64 20 2a  ty input field *
3480: 2f 0a 20 20 20 20 40 20 20 20 3c 74 64 3e 3c 69  /.    @   <td><i
3490: 6e 70 75 74 20 74 79 70 65 3d 22 70 61 73 73 77  nput type="passw
34a0: 6f 72 64 22 20 6e 61 6d 65 3d 22 70 77 22 20 76  ord" name="pw" v
34b0: 61 6c 75 65 3d 22 22 3e 3c 2f 74 64 3e 0a 20 20  alue=""></td>.  
34c0: 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20 69 66  }.  @ </tr>.  if
34d0: 28 20 21 68 69 67 68 65 72 55 73 65 72 20 29 7b  ( !higherUser ){
34e0: 0a 20 20 20 20 40 20 3c 74 72 3e 0a 20 20 20 20  .    @ <tr>.    
34f0: 40 20 20 20 3c 74 64 3e 26 6e 62 73 70 3c 2f 74  @   <td>&nbsp</t
3500: 64 3e 0a 20 20 20 20 40 20 20 20 3c 74 64 3e 3c  d>.    @   <td><
3510: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
3520: 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d 69 74  it" name="submit
3530: 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 43  " value="Apply C
3540: 68 61 6e 67 65 73 22 3e 0a 20 20 20 20 40 20 3c  hanges">.    @ <
3550: 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /tr>.  }.  @ </t
3560: 61 62 6c 65 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c  able></td></tr><
3570: 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 68 32 3e  /table>.  @ <h2>
3580: 50 72 69 76 69 6c 65 67 65 73 20 41 6e 64 20 43  Privileges And C
3590: 61 70 61 62 69 6c 69 74 69 65 73 3a 3c 2f 68 32  apabilities:</h2
35a0: 3e 0a 20 20 40 20 3c 75 6c 3e 0a 20 20 69 66 28  >.  @ <ul>.  if(
35b0: 20 68 69 67 68 65 72 55 73 65 72 20 29 7b 0a 20   higherUser ){. 
35c0: 20 20 20 40 20 3c 6c 69 3e 3c 70 3e 3c 66 6f 6e     @ <li><p><fon
35d0: 74 20 63 6f 6c 6f 72 3d 22 62 6c 75 65 22 3e 3c  t color="blue"><
35e0: 62 3e 0a 20 20 20 20 40 20 55 73 65 72 20 25 68  b>.    @ User %h
35f0: 28 7a 4c 6f 67 69 6e 29 20 68 61 73 20 53 65 74  (zLogin) has Set
3600: 75 70 20 70 72 69 76 69 6c 65 67 65 73 20 61 6e  up privileges an
3610: 64 20 79 6f 75 20 6f 6e 6c 79 20 68 61 76 65 20  d you only have 
3620: 41 64 6d 69 6e 20 70 72 69 76 69 6c 65 67 65 73  Admin privileges
3630: 0a 20 20 20 20 40 20 73 6f 20 79 6f 75 20 61 72  .    @ so you ar
3640: 65 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 20  e not permitted 
3650: 74 6f 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20  to make changes 
3660: 74 6f 20 25 68 28 7a 4c 6f 67 69 6e 29 2e 0a 20  to %h(zLogin).. 
3670: 20 20 20 40 20 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e     @ </b></font>
3680: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 20 20 40 0a  </p></li>.    @.
3690: 20 20 7d 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e    }.  @.  @ <li>
36a0: 3c 70 3e 0a 20 20 40 20 54 68 65 20 3c 62 3e 53  <p>.  @ The <b>S
36b0: 65 74 75 70 3c 2f 62 3e 20 75 73 65 72 20 63 61  etup</b> user ca
36c0: 6e 20 6d 61 6b 65 20 61 72 62 69 74 72 61 72 79  n make arbitrary
36d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
36e0: 68 61 6e 67 65 73 2e 0a 20 20 40 20 41 6e 20 3c  hanges..  @ An <
36f0: 62 3e 41 64 6d 69 6e 3c 2f 62 3e 20 75 73 65 72  b>Admin</b> user
3700: 20 63 61 6e 20 61 64 64 20 6f 74 68 65 72 20 75   can add other u
3710: 73 65 72 73 20 61 6e 64 20 63 68 61 6e 67 65 20  sers and change 
3720: 75 73 65 72 20 70 72 69 76 69 6c 65 67 65 73 0a  user privileges.
3730: 20 20 40 20 61 6e 64 20 72 65 73 65 74 20 75 73    @ and reset us
3740: 65 72 20 70 61 73 73 77 6f 72 64 73 2e 20 20 42  er passwords.  B
3750: 6f 74 68 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  oth automaticall
3760: 79 20 67 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  y get all other 
3770: 70 72 69 76 69 6c 65 67 65 73 0a 20 20 40 20 6c  privileges.  @ l
3780: 69 73 74 65 64 20 62 65 6c 6f 77 2e 20 20 55 73  isted below.  Us
3790: 65 20 74 68 65 73 65 20 74 77 6f 20 73 65 74 74  e these two sett
37a0: 69 6e 67 73 20 77 69 74 68 20 64 69 73 63 72 65  ings with discre
37b0: 74 69 6f 6e 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f  tion..  @ </p></
37c0: 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e  li>.  @.  @ <li>
37d0: 3c 70 3e 0a 20 20 40 20 54 68 65 20 3c 62 3e 44  <p>.  @ The <b>D
37e0: 65 6c 65 74 65 3c 2f 62 3e 20 70 72 69 76 69 6c  elete</b> privil
37f0: 65 67 65 20 67 69 76 65 20 74 68 65 20 75 73 65  ege give the use
3800: 72 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  r the ability to
3810: 20 65 72 61 73 65 0a 20 20 40 20 77 69 6b 69 2c   erase.  @ wiki,
3820: 20 74 69 63 6b 65 74 73 2c 20 61 6e 64 20 61 74   tickets, and at
3830: 74 61 63 68 6d 65 6e 74 73 20 74 68 61 74 20 68  tachments that h
3840: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 62  ave been added b
3850: 79 20 61 6e 6f 6e 79 6d 6f 75 73 0a 20 20 40 20  y anonymous.  @ 
3860: 75 73 65 72 73 2e 20 20 54 68 69 73 20 63 61 70  users.  This cap
3870: 61 62 69 6c 69 74 79 20 69 73 20 69 6e 74 65 6e  ability is inten
3880: 64 65 64 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e  ded for deletion
3890: 20 6f 66 20 73 70 61 6d 2e 20 20 54 68 65 0a 20   of spam.  The. 
38a0: 20 40 20 64 65 6c 65 74 65 20 63 61 70 61 62 69   @ delete capabi
38b0: 6c 69 74 79 20 69 73 20 6f 6e 6c 79 20 69 6e 20  lity is only in 
38c0: 65 66 66 65 63 74 20 66 6f 72 20 32 34 20 68 6f  effect for 24 ho
38d0: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 69 74  urs after the it
38e0: 65 6d 0a 20 20 40 20 69 73 20 66 69 72 73 74 20  em.  @ is first 
38f0: 70 6f 73 74 65 64 2e 20 20 54 68 65 20 53 65 74  posted.  The Set
3900: 75 70 20 75 73 65 72 20 63 61 6e 20 64 65 6c 65  up user can dele
3910: 74 65 20 61 6e 79 74 68 69 6e 67 20 61 74 20 61  te anything at a
3920: 6e 79 20 74 69 6d 65 2e 0a 20 20 40 20 3c 2f 70  ny time..  @ </p
3930: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3940: 6c 69 3e 3c 70 3e 0a 20 20 40 20 54 68 65 20 3c  li><p>.  @ The <
3950: 62 3e 48 69 73 74 6f 72 79 3c 2f 62 3e 20 70 72  b>History</b> pr
3960: 69 76 69 6c 65 67 65 20 61 6c 6c 6f 77 73 20 61  ivilege allows a
3970: 20 75 73 65 72 20 74 6f 20 73 65 65 20 6d 6f 73   user to see mos
3980: 74 20 68 79 70 65 72 6c 69 6e 6b 73 2e 0a 20 20  t hyperlinks..  
3990: 40 20 54 68 69 73 20 69 73 20 72 65 63 6f 6d 6d  @ This is recomm
39a0: 65 6e 64 65 64 20 4f 4e 20 66 6f 72 20 6d 6f 73  ended ON for mos
39b0: 74 20 6c 6f 67 67 65 64 2d 69 6e 20 75 73 65 72  t logged-in user
39c0: 73 20 62 75 74 20 4f 46 46 20 66 6f 72 0a 20 20  s but OFF for.  
39d0: 40 20 75 73 65 72 20 22 6e 6f 62 6f 64 79 22 20  @ user "nobody" 
39e0: 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
39f0: 73 20 77 69 74 68 20 73 70 69 64 65 72 73 20 74  s with spiders t
3a00: 72 79 69 6e 67 20 74 6f 20 77 61 6c 6b 20 65 76  rying to walk ev
3a10: 65 72 79 0a 20 20 40 20 68 69 73 74 6f 72 69 63  ery.  @ historic
3a20: 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 65 76  al version of ev
3a30: 65 72 79 20 62 61 73 65 6c 69 6e 65 20 61 6e 64  ery baseline and
3a40: 20 66 69 6c 65 2e 0a 20 20 40 20 3c 2f 70 3e 3c   file..  @ </p><
3a50: 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69  /li>.  @.  @ <li
3a60: 3e 3c 70 3e 0a 20 20 40 20 54 68 65 20 3c 62 3e  ><p>.  @ The <b>
3a70: 44 65 76 65 6c 6f 70 65 72 3c 2f 62 3e 20 70 72  Developer</b> pr
3a80: 69 76 69 6c 65 67 65 20 63 61 75 73 65 73 20 61  ivilege causes a
3a90: 6c 6c 20 70 72 69 76 69 6c 65 67 65 73 20 6f 66  ll privileges of
3aa0: 20 74 68 65 20 75 73 65 72 0a 20 20 40 20 6e 61   the user.  @ na
3ab0: 6d 65 64 20 22 64 65 76 65 6c 6f 70 65 72 22 20  med "developer" 
3ac0: 74 6f 20 62 65 20 69 6e 68 65 72 69 74 65 64 20  to be inherited 
3ad0: 62 79 20 74 68 69 73 20 75 73 65 72 2e 0a 20 20  by this user..  
3ae0: 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  @ </p></li>.  @.
3af0: 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20    @ <li><p>.  @ 
3b00: 54 68 65 20 3c 62 3e 43 68 65 63 6b 2d 69 6e 3c  The <b>Check-in<
3b10: 2f 62 3e 20 70 72 69 76 69 6c 65 67 65 20 61 6c  /b> privilege al
3b20: 6c 6f 77 73 20 72 65 6d 6f 74 65 20 75 73 65 72  lows remote user
3b30: 73 20 74 6f 20 22 70 75 73 68 22 2e 0a 20 20 40  s to "push"..  @
3b40: 20 54 68 65 20 3c 62 3e 43 68 65 63 6b 2d 6f 75   The <b>Check-ou
3b50: 74 3c 2f 62 3e 20 70 72 69 76 69 6c 65 67 65 20  t</b> privilege 
3b60: 61 6c 6c 6f 77 73 20 72 65 6d 6f 74 65 20 75 73  allows remote us
3b70: 65 72 73 20 74 6f 20 22 70 75 6c 6c 22 2e 0a 20  ers to "pull".. 
3b80: 20 40 20 54 68 65 20 3c 62 3e 43 6c 6f 6e 65 3c   @ The <b>Clone<
3b90: 2f 62 3e 20 70 72 69 76 69 6c 65 67 65 20 61 6c  /b> privilege al
3ba0: 6c 6f 77 73 20 72 65 6d 6f 74 65 20 75 73 65 72  lows remote user
3bb0: 73 20 74 6f 20 22 63 6c 6f 6e 65 22 2e 0a 20 20  s to "clone"..  
3bc0: 40 20 3c 2f 6c 69 3e 3c 70 3e 0a 20 20 40 0a 20  @ </li><p>.  @. 
3bd0: 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20 54   @ <li><p>.  @ T
3be0: 68 65 20 3c 62 3e 52 65 61 64 20 57 69 6b 69 3c  he <b>Read Wiki<
3bf0: 2f 62 3e 2c 20 3c 62 3e 4e 65 77 20 57 69 6b 69  /b>, <b>New Wiki
3c00: 3c 2f 62 3e 2c 20 3c 62 3e 41 70 70 65 6e 64 20  </b>, <b>Append 
3c10: 57 69 6b 69 3c 2f 62 3e 2c 20 61 6e 64 0a 20 20  Wiki</b>, and.  
3c20: 40 20 3c 62 3e 57 72 69 74 65 20 57 69 6b 69 3c  @ <b>Write Wiki<
3c30: 2f 62 3e 20 70 72 69 76 69 6c 65 67 65 73 20 63  /b> privileges c
3c40: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
3c50: 20 77 69 6b 69 20 70 61 67 65 73 2e 20 20 54 68   wiki pages.  Th
3c60: 65 0a 20 20 40 20 3c 62 3e 52 65 61 64 20 54 6b  e.  @ <b>Read Tk
3c70: 74 3c 2f 62 3e 2c 20 3c 62 3e 4e 65 77 20 54 6b  t</b>, <b>New Tk
3c80: 74 3c 2f 62 3e 2c 20 3c 62 3e 41 70 70 65 6e 64  t</b>, <b>Append
3c90: 20 54 6b 74 3c 2f 62 3e 2c 20 61 6e 64 0a 20 20   Tkt</b>, and.  
3ca0: 40 20 3c 62 3e 57 72 69 74 65 20 54 6b 74 3c 2f  @ <b>Write Tkt</
3cb0: 62 3e 20 70 72 69 76 69 6c 65 67 65 73 20 63 6f  b> privileges co
3cc0: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
3cd0: 74 72 6f 75 62 6c 65 20 74 69 63 6b 65 74 73 2e  trouble tickets.
3ce0: 0a 20 20 40 20 54 68 65 20 3c 62 3e 54 6b 74 20  .  @ The <b>Tkt 
3cf0: 52 65 70 6f 72 74 3c 2f 62 3e 20 70 72 69 76 69  Report</b> privi
3d00: 6c 65 67 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  lege allows the 
3d10: 75 73 65 72 20 74 6f 20 63 72 65 61 74 65 20 6f  user to create o
3d20: 72 20 65 64 69 74 0a 20 20 40 20 74 69 63 6b 65  r edit.  @ ticke
3d30: 74 20 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 73  t report formats
3d40: 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a  ..  @ </p></li>.
3d50: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a    @.  @ <li><p>.
3d60: 20 20 40 20 55 73 65 72 73 20 77 69 74 68 20 74    @ Users with t
3d70: 68 65 20 3c 62 3e 50 61 73 73 77 6f 72 64 3c 2f  he <b>Password</
3d80: 62 3e 20 70 72 69 76 69 6c 65 67 65 20 61 72 65  b> privilege are
3d90: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 63 68 61 6e   allowed to chan
3da0: 67 65 20 74 68 65 69 72 0a 20 20 40 20 6f 77 6e  ge their.  @ own
3db0: 20 70 61 73 73 77 6f 72 64 2e 20 20 52 65 63 6f   password.  Reco
3dc0: 6d 6d 65 6e 64 65 64 20 4f 4e 20 66 6f 72 20 6d  mmended ON for m
3dd0: 6f 73 74 20 75 73 65 72 73 20 62 75 74 20 4f 46  ost users but OF
3de0: 46 20 66 6f 72 20 73 70 65 63 69 61 6c 0a 20 20  F for special.  
3df0: 40 20 75 73 65 72 73 20 22 64 65 76 65 6c 6f 70  @ users "develop
3e00: 65 72 2c 20 22 61 6e 6f 6e 79 6e 6d 6f 75 73 22  er, "anonynmous"
3e10: 2c 20 61 6e 64 20 22 6e 6f 62 6f 64 79 22 2e 0a  , and "nobody"..
3e20: 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20    @ </p></li>.  
3e30: 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20  @.  @ <li><p>.  
3e40: 40 20 54 68 65 20 3c 62 3e 45 4d 61 69 6c 3c 2f  @ The <b>EMail</
3e50: 62 3e 20 70 72 69 76 69 6c 65 67 65 20 61 6c 6c  b> privilege all
3e60: 6f 77 73 20 74 68 65 20 64 69 73 70 6c 61 79 20  ows the display 
3e70: 6f 66 20 73 65 6e 73 69 74 69 76 65 20 69 6e 66  of sensitive inf
3e80: 6f 72 6d 61 74 69 6f 6e 0a 20 20 40 20 73 75 63  ormation.  @ suc
3e90: 68 20 61 73 20 74 68 65 20 65 6d 61 69 6c 20 61  h as the email a
3ea0: 64 64 72 65 73 73 20 6f 66 20 75 73 65 72 73 20  ddress of users 
3eb0: 61 6e 64 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f  and contact info
3ec0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 69 63 6b 65  rmation on ticke
3ed0: 74 73 2e 0a 20 20 40 20 52 65 63 6f 6d 6d 65 6e  ts..  @ Recommen
3ee0: 64 65 64 20 4f 46 46 20 66 6f 72 20 22 61 6e 6f  ded OFF for "ano
3ef0: 6e 79 6d 6f 75 73 22 20 61 6e 64 20 66 6f 72 20  nymous" and for 
3f00: 22 6e 6f 62 6f 64 79 22 2e 0a 20 20 40 20 3c 2f  "nobody"..  @ </
3f10: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
3f20: 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20 4c 6f 67 69  <li><p>.  @ Logi
3f30: 6e 20 69 73 20 70 72 6f 68 69 62 69 74 65 64 20  n is prohibited 
3f40: 69 66 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  if the password 
3f50: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
3f60: 6e 67 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69  ng..  @ </p></li
3f70: 3e 0a 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 40 0a  >.  @ </ul>.  @.
3f80: 20 20 40 20 3c 68 32 3e 53 70 65 63 69 61 6c 20    @ <h2>Special 
3f90: 4c 6f 67 69 6e 73 3c 2f 68 32 3e 0a 20 20 40 20  Logins</h2>.  @ 
3fa0: 0a 20 20 40 20 3c 75 6c 3e 0a 20 20 40 20 3c 6c  .  @ <ul>.  @ <l
3fb0: 69 3e 3c 70 3e 0a 20 20 40 20 4e 6f 20 6c 6f 67  i><p>.  @ No log
3fc0: 69 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 66  in is required f
3fd0: 6f 72 20 75 73 65 72 20 22 3c 62 3e 6e 6f 62 6f  or user "<b>nobo
3fe0: 64 79 3c 2f 62 3e 22 2e 20 20 54 68 65 20 63 61  dy</b>".  The ca
3ff0: 70 61 62 69 6c 69 74 69 65 73 0a 20 20 40 20 6f  pabilities.  @ o
4000: 66 20 74 68 65 20 3c 62 3e 6e 6f 62 6f 64 79 3c  f the <b>nobody<
4010: 2f 62 3e 20 75 73 65 72 20 61 72 65 20 69 6e 68  /b> user are inh
4020: 65 72 69 74 65 64 20 62 79 20 61 6c 6c 20 75 73  erited by all us
4030: 65 72 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ers, regardless 
4040: 6f 66 0a 20 20 40 20 77 68 65 74 68 65 72 20 6f  of.  @ whether o
4050: 72 20 6e 6f 74 20 74 68 65 79 20 61 72 65 20 6c  r not they are l
4060: 6f 67 67 65 64 20 69 6e 2e 20 20 54 6f 20 64 69  ogged in.  To di
4070: 73 61 62 6c 65 20 75 6e 69 76 65 72 73 61 6c 20  sable universal 
4080: 61 63 63 65 73 73 0a 20 20 40 20 74 6f 20 74 68  access.  @ to th
4090: 65 20 72 65 70 6f 73 69 74 6f 72 79 2c 20 6d 61  e repository, ma
40a0: 6b 65 20 73 75 72 65 20 6e 6f 20 75 73 65 72 20  ke sure no user 
40b0: 6e 61 6d 65 64 20 22 3c 62 3e 6e 6f 62 6f 64 79  named "<b>nobody
40c0: 3c 2f 62 3e 22 20 65 78 69 73 74 73 20 6f 72 0a  </b>" exists or.
40d0: 20 20 40 20 74 68 61 74 20 74 68 65 20 3c 62 3e    @ that the <b>
40e0: 6e 6f 62 6f 64 79 3c 2f 62 3e 20 75 73 65 72 20  nobody</b> user 
40f0: 68 61 73 20 6e 6f 20 63 61 70 61 62 69 6c 69 74  has no capabilit
4100: 69 65 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 40  ies enabled..  @
4110: 20 54 68 65 20 70 61 73 73 77 6f 72 64 20 66 6f   The password fo
4120: 72 20 3c 62 3e 6e 6f 62 6f 64 79 3c 2f 62 3e 20  r <b>nobody</b> 
4130: 69 73 20 69 67 6e 6f 72 65 2e 20 20 54 6f 20 61  is ignore.  To a
4140: 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
4150: 74 68 0a 20 20 40 20 73 70 69 64 65 72 73 20 6f  th.  @ spiders o
4160: 76 65 72 6c 6f 61 64 69 6e 67 20 74 68 65 20 73  verloading the s
4170: 65 72 76 65 72 2c 20 69 74 20 69 73 20 72 65 63  erver, it is rec
4180: 6f 6d 6d 65 6e 64 65 64 0a 20 20 40 20 74 68 61  ommended.  @ tha
4190: 74 20 74 68 65 20 27 68 27 20 28 48 69 73 74 6f  t the 'h' (Histo
41a0: 72 79 29 20 63 61 70 61 62 69 6c 69 74 79 20 62  ry) capability b
41b0: 65 20 74 75 72 6e 65 64 20 6f 66 66 20 66 6f 72  e turned off for
41c0: 20 74 68 65 20 3c 62 3e 6e 6f 62 6f 64 79 3c 2f   the <b>nobody</
41d0: 62 3e 0a 20 20 40 20 75 73 65 72 2e 0a 20 20 40  b>.  @ user..  @
41e0: 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20   </p></li>.  @. 
41f0: 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20 4c   @ <li><p>.  @ L
4200: 6f 67 69 6e 20 69 73 20 72 65 71 75 69 72 65 64  ogin is required
4210: 20 66 6f 72 20 75 73 65 72 20 22 3c 62 3e 61 6e   for user "<b>an
4220: 6f 6e 79 6d 6f 75 73 3c 2f 62 3e 22 20 62 75 74  onymous</b>" but
4230: 20 74 68 65 20 70 61 73 73 77 6f 72 64 0a 20 20   the password.  
4240: 40 20 69 73 20 64 69 73 70 6c 61 79 65 64 20 6f  @ is displayed o
4250: 6e 20 74 68 65 20 6c 6f 67 69 6e 20 73 63 72 65  n the login scre
4260: 65 6e 20 62 65 73 69 64 65 20 74 68 65 20 70 61  en beside the pa
4270: 73 73 77 6f 72 64 20 65 6e 74 72 79 20 62 6f 78  ssword entry box
4280: 0a 20 20 40 20 73 6f 20 61 6e 79 62 6f 64 79 20  .  @ so anybody 
4290: 77 68 6f 20 63 61 6e 20 72 65 61 64 20 73 68 6f  who can read sho
42a0: 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f 20 6c  uld be able to l
42b0: 6f 67 69 6e 20 61 73 20 61 6e 6f 6e 79 6d 6f 75  ogin as anonymou
42c0: 73 2e 0a 20 20 40 20 4f 6e 20 74 68 65 20 6f 74  s..  @ On the ot
42d0: 68 65 72 20 68 61 6e 64 2c 20 73 70 69 64 65 72  her hand, spider
42e0: 73 20 61 6e 64 20 77 65 62 2d 63 72 61 77 6c 65  s and web-crawle
42f0: 72 73 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  rs will typicall
4300: 79 20 6e 6f 74 0a 20 20 40 20 62 65 20 61 62 6c  y not.  @ be abl
4310: 65 20 74 6f 20 6c 6f 67 69 6e 2e 20 20 53 65 74  e to login.  Set
4320: 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 69 65   the capabilitie
4330: 73 20 6f 66 20 74 68 65 20 61 6e 6f 6e 79 6d 6f  s of the anonymo
4340: 75 73 20 75 73 65 72 0a 20 20 40 20 74 6f 20 74  us user.  @ to t
4350: 68 69 6e 67 73 20 74 68 61 74 20 79 6f 75 20 77  hings that you w
4360: 61 6e 74 20 61 6e 79 20 68 75 6d 61 6e 20 74 6f  ant any human to
4370: 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2c 20   be able to do, 
4380: 62 75 74 20 6e 6f 74 20 61 6e 79 0a 20 20 40 20  but not any.  @ 
4390: 73 70 69 64 65 72 2e 20 20 45 76 65 72 79 20 6f  spider.  Every o
43a0: 74 68 65 72 20 6c 6f 67 67 65 64 2d 69 6e 20 75  ther logged-in u
43b0: 73 65 72 20 69 6e 68 65 72 69 74 73 20 74 68 65  ser inherits the
43c0: 20 70 72 69 76 69 6c 65 67 65 73 20 6f 66 0a 20   privileges of. 
43d0: 20 40 20 3c 62 3e 61 6e 6f 6e 79 6d 6f 75 73 3c   @ <b>anonymous<
43e0: 2f 62 3e 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c  /b>..  @ </p></l
43f0: 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c  i>.  @.  @ <li><
4400: 70 3e 0a 20 20 40 20 54 68 65 20 22 3c 62 3e 64  p>.  @ The "<b>d
4410: 65 76 65 6c 6f 70 65 72 3c 2f 62 3e 22 20 75 73  eveloper</b>" us
4420: 65 72 20 69 73 20 69 6e 74 65 6e 64 65 64 20 61  er is intended a
4430: 73 20 61 20 74 65 6d 70 6c 61 74 65 20 66 6f 72  s a template for
4440: 20 74 72 75 73 74 65 64 20 75 73 65 72 73 0a 20   trusted users. 
4450: 20 40 20 77 69 74 68 20 63 68 65 63 6b 2d 69 6e   @ with check-in
4460: 20 70 72 69 76 69 6c 65 67 65 73 2e 20 20 57 68   privileges.  Wh
4470: 65 6e 20 61 64 64 69 6e 67 20 6e 65 77 20 74 72  en adding new tr
4480: 75 73 74 65 64 20 75 73 65 72 73 2c 20 73 69 6d  usted users, sim
4490: 70 6c 79 0a 20 20 40 20 73 65 6c 65 63 74 20 74  ply.  @ select t
44a0: 68 65 20 3c 62 3e 44 65 76 65 6c 6f 70 65 72 3c  he <b>Developer<
44b0: 2f 62 3e 20 70 72 69 76 69 6c 65 67 65 20 74 6f  /b> privilege to
44c0: 20 63 61 75 73 65 20 74 68 65 20 6e 65 77 20 75   cause the new u
44d0: 73 65 72 20 74 6f 20 69 6e 68 65 72 69 74 0a 20  ser to inherit. 
44e0: 20 40 20 61 6c 6c 20 70 72 69 76 69 6c 65 67 65   @ all privilege
44f0: 73 20 6f 66 20 74 68 65 20 22 64 65 76 65 6c 6f  s of the "develo
4500: 70 65 72 22 20 75 73 65 72 2e 0a 20 20 40 20 3c  per" user..  @ <
4510: 2f 6c 69 3e 3c 2f 70 3e 0a 20 20 40 20 3c 2f 75  /li></p>.  @ </u
4520: 6c 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  l>.  @ </form>. 
4530: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
4540: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
4550: 61 74 65 20 61 20 63 68 65 63 6b 62 6f 78 20 66  ate a checkbox f
4560: 6f 72 20 61 6e 20 61 74 74 72 69 62 75 74 65 2e  or an attribute.
4570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4580: 6f 6e 6f 66 66 5f 61 74 74 72 69 62 75 74 65 28  onoff_attribute(
4590: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
45a0: 4c 61 62 65 6c 2c 20 20 20 2f 2a 20 54 68 65 20  Label,   /* The 
45b0: 74 65 78 74 20 6c 61 62 65 6c 20 6f 6e 20 74 68  text label on th
45c0: 65 20 63 68 65 63 6b 62 6f 78 20 2a 2f 0a 20 20  e checkbox */.  
45d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
45e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 72  ,     /* The cor
45f0: 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 20 69  responding row i
4600: 6e 20 74 68 65 20 56 41 52 20 74 61 62 6c 65 20  n the VAR table 
4610: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4620: 2a 7a 51 50 61 72 6d 2c 20 20 20 2f 2a 20 54 68  *zQParm,   /* Th
4630: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
4640: 72 20 2a 2f 0a 20 20 69 6e 74 20 64 66 6c 74 56  r */.  int dfltV
4650: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
4660: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69 66  Default value if
4670: 20 56 41 52 20 74 61 62 6c 65 20 65 6e 74 72 79   VAR table entry
4680: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
4690: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
46a0: 61 72 20 2a 7a 56 61 6c 20 3d 20 64 62 5f 67 65  ar *zVal = db_ge
46b0: 74 28 7a 56 61 72 2c 20 30 29 3b 0a 20 20 63 6f  t(zVar, 0);.  co
46c0: 6e 73 74 20 63 68 61 72 20 2a 7a 51 20 3d 20 50  nst char *zQ = P
46d0: 28 7a 51 50 61 72 6d 29 3b 0a 20 20 69 6e 74 20  (zQParm);.  int 
46e0: 69 56 61 6c 3b 0a 20 20 69 66 28 20 7a 56 61 6c  iVal;.  if( zVal
46f0: 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 61   ){.    iVal = a
4700: 74 6f 69 28 7a 56 61 6c 29 3b 0a 20 20 7d 65 6c  toi(zVal);.  }el
4710: 73 65 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 64  se{.    iVal = d
4720: 66 6c 74 56 61 6c 3b 0a 20 20 7d 0a 20 20 69 66  fltVal;.  }.  if
4730: 28 20 7a 51 3d 3d 30 20 26 26 20 50 28 22 73 75  ( zQ==0 && P("su
4740: 62 6d 69 74 22 29 20 29 7b 0a 20 20 20 20 7a 51  bmit") ){.    zQ
4750: 20 3d 20 22 6f 66 66 22 3b 0a 20 20 7d 0a 20 20   = "off";.  }.  
4760: 69 66 28 20 7a 51 20 29 7b 0a 20 20 20 20 69 6e  if( zQ ){.    in
4770: 74 20 69 51 20 3d 20 73 74 72 63 6d 70 28 7a 51  t iQ = strcmp(zQ
4780: 2c 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 61 74 6f  ,"on")==0 || ato
4790: 69 28 7a 51 29 3b 0a 20 20 20 20 69 66 28 20 69  i(zQ);.    if( i
47a0: 51 21 3d 69 56 61 6c 20 29 7b 0a 20 20 20 20 20  Q!=iVal ){.     
47b0: 20 64 62 5f 73 65 74 28 7a 56 61 72 2c 20 69 51   db_set(zVar, iQ
47c0: 20 3f 20 22 31 22 20 3a 20 22 30 22 2c 20 30 29   ? "1" : "0", 0)
47d0: 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  ;.      iVal = i
47e0: 51 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  Q;.    }.  }.  i
47f0: 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 40  f( iVal ){.    @
4800: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68   <input type="ch
4810: 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 25 73  eckbox" name="%s
4820: 28 7a 51 50 61 72 6d 29 22 20 63 68 65 63 6b 65  (zQParm)" checke
4830: 64 3e 3c 62 3e 25 73 28 7a 4c 61 62 65 6c 29 3c  d><b>%s(zLabel)<
4840: 2f 62 3e 3c 2f 69 6e 70 75 74 3e 0a 20 20 7d 65  /b></input>.  }e
4850: 6c 73 65 7b 0a 20 20 20 20 40 20 3c 69 6e 70 75  lse{.    @ <inpu
4860: 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78  t type="checkbox
4870: 22 20 6e 61 6d 65 3d 22 25 73 28 7a 51 50 61 72  " name="%s(zQPar
4880: 6d 29 22 3e 3c 62 3e 25 73 28 7a 4c 61 62 65 6c  m)"><b>%s(zLabel
4890: 29 3c 2f 62 3e 3c 2f 69 6e 70 75 74 3e 0a 20 20  )</b></input>.  
48a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
48b0: 61 74 65 20 61 6e 20 65 6e 74 72 79 20 62 6f 78  ate an entry box
48c0: 20 66 6f 72 20 61 6e 20 61 74 74 72 69 62 75 74   for an attribut
48d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
48e0: 64 20 65 6e 74 72 79 5f 61 74 74 72 69 62 75 74  d entry_attribut
48f0: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
4900: 2a 7a 4c 61 62 65 6c 2c 20 20 20 2f 2a 20 54 68  *zLabel,   /* Th
4910: 65 20 74 65 78 74 20 6c 61 62 65 6c 20 6f 6e 20  e text label on 
4920: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f  the entry box */
4930: 0a 20 20 69 6e 74 20 77 69 64 74 68 2c 20 20 20  .  int width,   
4940: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 64 74           /* Widt
4950: 68 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 62  h of the entry b
4960: 6f 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ox */.  const ch
4970: 61 72 20 2a 7a 56 61 72 2c 20 20 20 20 20 2f 2a  ar *zVar,     /*
4980: 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   The correspondi
4990: 6e 67 20 72 6f 77 20 69 6e 20 74 68 65 20 56 41  ng row in the VA
49a0: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  R table */.  con
49b0: 73 74 20 63 68 61 72 20 2a 7a 51 50 61 72 6d 2c  st char *zQParm,
49c0: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
49d0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 63  parameter */.  c
49e0: 68 61 72 20 2a 7a 44 66 6c 74 20 20 20 20 20 2f  har *zDflt     /
49f0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
4a00: 69 66 20 56 41 52 20 74 61 62 6c 65 20 65 6e 74  if VAR table ent
4a10: 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ry does not exis
4a20: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
4a30: 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 64 62 5f  char *zVal = db_
4a40: 67 65 74 28 7a 56 61 72 2c 20 7a 44 66 6c 74 29  get(zVar, zDflt)
4a50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4a60: 7a 51 20 3d 20 50 28 7a 51 50 61 72 6d 29 3b 0a  zQ = P(zQParm);.
4a70: 20 20 69 66 28 20 7a 51 20 26 26 20 73 74 72 63    if( zQ && strc
4a80: 6d 70 28 7a 51 2c 7a 56 61 6c 29 21 3d 30 20 29  mp(zQ,zVal)!=0 )
4a90: 7b 0a 20 20 20 20 64 62 5f 73 65 74 28 7a 56 61  {.    db_set(zVa
4aa0: 72 2c 20 7a 51 2c 20 30 29 3b 0a 20 20 20 20 7a  r, zQ, 0);.    z
4ab0: 56 61 6c 20 3d 20 7a 51 3b 0a 20 20 7d 0a 20 20  Val = zQ;.  }.  
4ac0: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74  @ <input type="t
4ad0: 65 78 74 22 20 6e 61 6d 65 3d 22 25 73 28 7a 51  ext" name="%s(zQ
4ae0: 50 61 72 6d 29 22 20 76 61 6c 75 65 3d 22 25 68  Parm)" value="%h
4af0: 28 7a 56 61 6c 29 22 20 73 69 7a 65 3d 22 25 64  (zVal)" size="%d
4b00: 28 77 69 64 74 68 29 22 3e 0a 20 20 40 20 3c 62  (width)">.  @ <b
4b10: 3e 25 73 28 7a 4c 61 62 65 6c 29 3c 2f 62 3e 0a  >%s(zLabel)</b>.
4b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
4b30: 65 20 61 20 74 65 78 74 20 62 6f 78 20 66 6f 72  e a text box for
4b40: 20 61 6e 20 61 74 74 72 69 62 75 74 65 2e 0a 2a   an attribute..*
4b50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
4b60: 78 74 61 72 65 61 5f 61 74 74 72 69 62 75 74 65  xtarea_attribute
4b70: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4b80: 7a 4c 61 62 65 6c 2c 20 20 20 2f 2a 20 54 68 65  zLabel,   /* The
4b90: 20 74 65 78 74 20 6c 61 62 65 6c 20 6f 6e 20 74   text label on t
4ba0: 68 65 20 74 65 78 74 61 72 65 61 20 2a 2f 0a 20  he textarea */. 
4bb0: 20 69 6e 74 20 72 6f 77 73 2c 20 20 20 20 20 20   int rows,      
4bc0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69         /* Rows i
4bd0: 6e 20 74 68 65 20 74 65 78 74 61 72 65 61 20 2a  n the textarea *
4be0: 2f 0a 20 20 69 6e 74 20 63 6f 6c 73 2c 20 20 20  /.  int cols,   
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4c00: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 65 78 74  umns in the text
4c10: 61 72 65 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  area */.  const 
4c20: 63 68 61 72 20 2a 7a 56 61 72 2c 20 20 20 20 20  char *zVar,     
4c30: 2f 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e  /* The correspon
4c40: 64 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65 20  ding row in the 
4c50: 56 41 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  VAR table */.  c
4c60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 2c 20  onst char *zQP, 
4c70: 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72       /* The quer
4c80: 79 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  y parameter */. 
4c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 66   const char *zDf
4ca0: 6c 74 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c  lt     /* Defaul
4cb0: 74 20 76 61 6c 75 65 20 69 66 20 56 41 52 20 74  t value if VAR t
4cc0: 61 62 6c 65 20 65 6e 74 72 79 20 64 6f 65 73 20  able entry does 
4cd0: 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a  not exist */.){.
4ce0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
4cf0: 3d 20 64 62 5f 67 65 74 28 7a 56 61 72 2c 20 28  = db_get(zVar, (
4d00: 63 68 61 72 2a 29 7a 44 66 6c 74 29 3b 0a 20 20  char*)zDflt);.  
4d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 20 3d  const char *zQ =
4d20: 20 50 28 7a 51 50 29 3b 0a 20 20 69 66 28 20 7a   P(zQP);.  if( z
4d30: 51 20 26 26 20 73 74 72 63 6d 70 28 7a 51 2c 7a  Q && strcmp(zQ,z
4d40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 73  )!=0 ){.    db_s
4d50: 65 74 28 7a 56 61 72 2c 20 7a 51 2c 20 30 29 3b  et(zVar, zQ, 0);
4d60: 0a 20 20 20 20 7a 20 3d 20 7a 51 3b 0a 20 20 7d  .    z = zQ;.  }
4d70: 0a 20 20 69 66 28 20 72 6f 77 73 3e 30 20 26 26  .  if( rows>0 &&
4d80: 20 63 6f 6c 73 3e 30 20 29 7b 0a 20 20 20 20 40   cols>0 ){.    @
4d90: 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d   <textarea name=
4da0: 22 25 73 28 7a 51 50 29 22 20 72 6f 77 73 3d 22  "%s(zQP)" rows="
4db0: 25 64 28 72 6f 77 73 29 22 20 63 6f 6c 73 3d 22  %d(rows)" cols="
4dc0: 25 64 28 63 6f 6c 73 29 22 3e 25 68 28 7a 29 3c  %d(cols)">%h(z)<
4dd0: 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 20 20 40  /textarea>.    @
4de0: 20 3c 62 3e 25 73 28 7a 4c 61 62 65 6c 29 3c 2f   <b>%s(zLabel)</
4df0: 62 3e 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  b>.  }.}.../*.**
4e00: 20 57 45 42 50 41 47 45 3a 20 73 65 74 75 70 5f   WEBPAGE: setup_
4e10: 61 63 63 65 73 73 0a 2a 2f 0a 76 6f 69 64 20 73  access.*/.void s
4e20: 65 74 75 70 5f 61 63 63 65 73 73 28 76 6f 69 64  etup_access(void
4e30: 29 7b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ){.  login_check
4e40: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
4e50: 20 20 69 66 28 20 21 67 2e 6f 6b 53 65 74 75 70    if( !g.okSetup
4e60: 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65   ){.    login_ne
4e70: 65 64 65 64 28 29 3b 0a 20 20 7d 0a 0a 20 20 73  eded();.  }..  s
4e80: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 41 63 63  tyle_header("Acc
4e90: 65 73 73 20 43 6f 6e 74 72 6f 6c 20 53 65 74 74  ess Control Sett
4ea0: 69 6e 67 73 22 29 3b 0a 20 20 64 62 5f 62 65 67  ings");.  db_beg
4eb0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
4ec0: 3b 0a 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69  ;.  @ <form acti
4ed0: 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  on="%s(g.zBaseUR
4ee0: 4c 29 2f 73 65 74 75 70 5f 61 63 63 65 73 73 22  L)/setup_access"
4ef0: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e 0a   method="POST">.
4f00: 0a 20 20 40 20 3c 68 72 3e 0a 20 20 6f 6e 6f 66  .  @ <hr>.  onof
4f10: 66 5f 61 74 74 72 69 62 75 74 65 28 22 52 65 71  f_attribute("Req
4f20: 75 69 72 65 20 70 61 73 73 77 6f 72 64 20 66 6f  uire password fo
4f30: 72 20 6c 6f 63 61 6c 20 61 63 63 65 73 73 22 2c  r local access",
4f40: 0a 20 20 20 20 20 22 6c 6f 63 61 6c 61 75 74 68  .     "localauth
4f50: 22 2c 20 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20  ", "localauth", 
4f60: 31 29 3b 0a 20 20 40 20 3c 70 3e 57 68 65 6e 20  1);.  @ <p>When 
4f70: 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 70 61 73  enabled, the pas
4f80: 73 77 6f 72 64 20 73 69 67 6e 2d 69 6e 20 69 73  sword sign-in is
4f90: 20 72 65 71 75 69 72 65 64 20 66 6f 72 0a 20 20   required for.  
4fa0: 40 20 77 65 62 20 61 63 63 65 73 73 20 63 6f 6d  @ web access com
4fb0: 69 6e 67 20 66 72 6f 6d 20 31 32 37 2e 30 2e 30  ing from 127.0.0
4fc0: 2e 31 2e 20 20 57 68 65 6e 20 64 69 73 61 62 6c  .1.  When disabl
4fd0: 65 64 2c 20 77 65 62 20 61 63 63 65 73 73 0a 20  ed, web access. 
4fe0: 20 40 20 66 72 6f 6d 20 31 32 37 2e 30 2e 30 2e   @ from 127.0.0.
4ff0: 31 20 69 73 20 61 6c 6c 6f 77 73 20 77 69 74 68  1 is allows with
5000: 6f 75 74 20 61 6e 79 20 6c 6f 67 69 6e 20 2d 20  out any login - 
5010: 74 68 65 20 75 73 65 72 20 69 64 20 69 73 20 73  the user id is s
5020: 65 6c 65 63 74 65 64 0a 20 20 40 20 66 72 6f 6d  elected.  @ from
5030: 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 64   the ~/.fossil d
5040: 61 74 61 62 61 73 65 2e 20 50 61 73 73 77 6f 72  atabase. Passwor
5050: 64 20 6c 6f 67 69 6e 20 69 73 20 61 6c 77 61 79  d login is alway
5060: 73 20 72 65 71 75 69 72 65 64 0a 20 20 40 20 66  s required.  @ f
5070: 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 77 65 62 20  or incoming web 
5080: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 69  connections on i
5090: 6e 74 65 72 6e 65 74 20 61 64 64 72 65 73 73 65  nternet addresse
50a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 40  s other than.  @
50b0: 20 31 32 37 2e 30 2e 30 2e 31 2e 3c 2f 70 3e 3c   127.0.0.1.</p><
50c0: 2f 6c 69 3e 0a 0a 20 20 40 20 3c 68 72 3e 0a 20  /li>..  @ <hr>. 
50d0: 20 6f 6e 6f 66 66 5f 61 74 74 72 69 62 75 74 65   onoff_attribute
50e0: 28 22 49 6e 68 65 72 69 74 20 63 61 70 61 62 69  ("Inherit capabi
50f0: 6c 69 74 69 65 73 20 66 72 6f 6d 20 61 6e 6f 6e  lities from anon
5100: 79 6d 6f 75 73 20 75 73 65 72 22 2c 0a 20 20 20  ymous user",.   
5110: 20 20 22 69 6e 68 65 72 69 74 2d 61 6e 6f 6e 22    "inherit-anon"
5120: 2c 20 22 69 6e 68 65 72 69 74 2d 61 6e 6f 6e 22  , "inherit-anon"
5130: 2c 20 30 29 3b 0a 20 20 40 20 3c 70 3e 57 68 65  , 0);.  @ <p>Whe
5140: 6e 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20 77  n enabled, all w
5150: 65 62 20 75 73 65 72 73 20 69 6e 68 65 72 69 74  eb users inherit
5160: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 66 72   capabilities fr
5170: 6f 6d 0a 20 20 40 20 22 61 6e 6f 6e 79 6d 6f 75  om.  @ "anonymou
5180: 73 22 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 66  s", as well as f
5190: 72 6f 6d 20 22 6e 6f 62 6f 64 79 22 2e 3c 2f 70  rom "nobody".</p
51a0: 3e 3c 2f 6c 69 3e 0a 0a 20 20 40 20 3c 68 72 3e  ></li>..  @ <hr>
51b0: 0a 20 20 65 6e 74 72 79 5f 61 74 74 72 69 62 75  .  entry_attribu
51c0: 74 65 28 22 4c 6f 67 69 6e 20 65 78 70 69 72 61  te("Login expira
51d0: 74 69 6f 6e 20 74 69 6d 65 22 2c 20 36 2c 20 22  tion time", 6, "
51e0: 63 6f 6f 6b 69 65 2d 65 78 70 69 72 65 22 2c 20  cookie-expire", 
51f0: 22 63 65 78 22 2c 20 22 38 37 36 36 22 29 3b 0a  "cex", "8766");.
5200: 20 20 40 20 3c 70 3e 54 68 65 20 6e 75 6d 62 65    @ <p>The numbe
5210: 72 20 6f 66 20 68 6f 75 72 73 20 66 6f 72 20 77  r of hours for w
5220: 68 69 63 68 20 61 20 6c 6f 67 69 6e 20 69 73 20  hich a login is 
5230: 76 61 6c 69 64 2e 20 20 54 68 69 73 20 6d 75 73  valid.  This mus
5240: 74 20 62 65 20 61 0a 20 20 40 20 70 6f 73 69 74  t be a.  @ posit
5250: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
5260: 20 64 65 66 61 75 6c 74 20 69 73 20 38 37 36 30   default is 8760
5270: 20 68 6f 75 72 73 20 77 68 69 63 68 20 69 73 20   hours which is 
5280: 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 65 71  approximately eq
5290: 75 61 6c 0a 20 20 40 20 74 6f 20 61 20 79 65 61  ual.  @ to a yea
52a0: 72 2e 3c 2f 70 3e 0a 0a 20 20 40 20 3c 68 72 3e  r.</p>..  @ <hr>
52b0: 0a 20 20 65 6e 74 72 79 5f 61 74 74 72 69 62 75  .  entry_attribu
52c0: 74 65 28 22 44 6f 77 6e 6c 6f 61 64 20 70 61 63  te("Download pac
52d0: 6b 65 74 20 6c 69 6d 69 74 22 2c 20 31 30 2c 20  ket limit", 10, 
52e0: 22 6d 61 78 2d 64 6f 77 6e 6c 6f 61 64 22 2c 20  "max-download", 
52f0: 22 6d 78 64 77 6e 22 2c 0a 20 20 20 20 20 20 20  "mxdwn",.       
5300: 20 20 20 20 20 20 20 20 20 20 20 22 35 30 30 30             "5000
5310: 30 30 30 22 29 3b 0a 20 20 40 20 3c 70 3e 46 6f  000");.  @ <p>Fo
5320: 73 73 69 6c 20 74 72 69 65 73 20 74 6f 20 6c 69  ssil tries to li
5330: 6d 69 74 20 6f 75 74 2d 62 6f 75 6e 64 20 73 79  mit out-bound sy
5340: 6e 63 2c 20 63 6c 6f 6e 65 2c 20 61 6e 64 20 70  nc, clone, and p
5350: 75 6c 6c 20 70 61 63 6b 65 74 73 0a 20 20 40 20  ull packets.  @ 
5360: 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  to this many byt
5370: 65 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  es, uncompressed
5380: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
5390: 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20 64   requires more d
53a0: 61 74 61 0a 20 20 40 20 74 68 61 6e 20 74 68 69  ata.  @ than thi
53b0: 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6c 69 65  s, then the clie
53c0: 6e 74 20 77 69 6c 6c 20 69 73 73 75 65 20 6d 75  nt will issue mu
53d0: 6c 74 69 70 6c 65 20 48 54 54 50 20 72 65 71 75  ltiple HTTP requ
53e0: 65 73 74 73 2e 0a 20 20 40 20 56 61 6c 75 65 73  ests..  @ Values
53f0: 20 62 65 6c 6f 77 20 31 20 6d 69 6c 6c 69 6f 6e   below 1 million
5400: 20 61 72 65 20 6e 6f 74 20 72 65 63 6f 6d 6d 65   are not recomme
5410: 6e 64 65 64 2e 20 20 35 20 6d 69 6c 6c 69 6f 6e  nded.  5 million
5420: 20 69 73 20 61 20 0a 20 20 40 20 72 65 61 73 6f   is a .  @ reaso
5430: 6e 61 62 6c 65 20 6e 75 6d 62 65 72 2e 3c 2f 70  nable number.</p
5440: 3e 0a 0a 20 20 40 20 3c 68 72 3e 0a 20 20 40 20  >..  @ <hr>.  @ 
5450: 3c 70 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22  <p><input type="
5460: 73 75 62 6d 69 74 22 20 20 6e 61 6d 65 3d 22 73  submit"  name="s
5470: 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 41 70  ubmit" value="Ap
5480: 70 6c 79 20 43 68 61 6e 67 65 73 22 3e 3c 2f 70  ply Changes"></p
5490: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20  >.  @ </form>.  
54a0: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
54b0: 6f 6e 28 30 29 3b 0a 20 20 73 74 79 6c 65 5f 66  on(0);.  style_f
54c0: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
54d0: 2a 20 57 45 42 50 41 47 45 3a 20 73 65 74 75 70  * WEBPAGE: setup
54e0: 5f 74 69 6d 65 6c 69 6e 65 0a 2a 2f 0a 76 6f 69  _timeline.*/.voi
54f0: 64 20 73 65 74 75 70 5f 74 69 6d 65 6c 69 6e 65  d setup_timeline
5500: 28 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f  (void){.  login_
5510: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
5520: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
5530: 53 65 74 75 70 20 29 7b 0a 20 20 20 20 6c 6f 67  Setup ){.    log
5540: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 7d  in_needed();.  }
5550: 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  ..  style_header
5560: 28 22 54 69 6d 65 6c 69 6e 65 20 44 69 73 70 6c  ("Timeline Displ
5570: 61 79 20 50 72 65 66 65 72 65 6e 63 65 73 22 29  ay Preferences")
5580: 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61  ;.  db_begin_tra
5590: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 40 20  nsaction();.  @ 
55a0: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73  <form action="%s
55b0: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 73 65 74  (g.zBaseURL)/set
55c0: 75 70 5f 74 69 6d 65 6c 69 6e 65 22 20 6d 65 74  up_timeline" met
55d0: 68 6f 64 3d 22 50 4f 53 54 22 3e 0a 0a 20 20 40  hod="POST">..  @
55e0: 20 3c 68 72 3e 0a 20 20 6f 6e 6f 66 66 5f 61 74   <hr>.  onoff_at
55f0: 74 72 69 62 75 74 65 28 22 42 6c 6f 63 6b 20 6d  tribute("Block m
5600: 61 72 6b 75 70 20 69 6e 20 74 69 6d 65 6c 69 6e  arkup in timelin
5610: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
5620: 20 20 20 20 20 20 22 74 69 6d 65 6c 69 6e 65 2d        "timeline-
5630: 62 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c 20 22  block-markup", "
5640: 74 62 6d 22 2c 20 30 29 3b 0a 20 20 40 20 3c 70  tbm", 0);.  @ <p
5650: 3e 49 6e 20 74 69 6d 65 6c 69 6e 65 20 64 69 73  >In timeline dis
5660: 70 6c 61 79 73 2c 20 63 68 65 63 6b 2d 69 6e 20  plays, check-in 
5670: 63 6f 6d 6d 65 6e 74 73 20 63 61 6e 20 62 65 20  comments can be 
5680: 64 69 73 70 6c 61 79 65 64 20 77 69 74 68 20 6f  displayed with o
5690: 72 0a 20 20 40 20 77 69 74 68 6f 75 74 20 62 6c  r.  @ without bl
56a0: 6f 63 6b 20 6d 61 72 6b 75 70 20 28 70 61 72 61  ock markup (para
56b0: 67 72 61 70 68 73 2c 20 74 61 62 6c 65 73 2c 20  graphs, tables, 
56c0: 65 74 63 2e 29 3c 2f 70 3e 0a 0a 20 20 40 20 3c  etc.)</p>..  @ <
56d0: 68 72 3e 0a 20 20 65 6e 74 72 79 5f 61 74 74 72  hr>.  entry_attr
56e0: 69 62 75 74 65 28 22 4d 61 78 20 74 69 6d 65 6c  ibute("Max timel
56f0: 69 6e 65 20 63 6f 6d 6d 65 6e 74 20 6c 65 6e 67  ine comment leng
5700: 74 68 22 2c 20 36 2c 20 0a 20 20 20 20 20 20 20  th", 6, .       
5710: 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d 65             "time
5720: 6c 69 6e 65 2d 6d 61 78 2d 63 6f 6d 6d 65 6e 74  line-max-comment
5730: 22 2c 20 22 74 6d 63 22 2c 20 22 30 22 29 3b 0a  ", "tmc", "0");.
5740: 20 20 40 20 3c 70 3e 54 68 65 20 6d 61 78 69 6d    @ <p>The maxim
5750: 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 63  um length of a c
5760: 6f 6d 6d 65 6e 74 20 74 6f 20 62 65 20 64 69 73  omment to be dis
5770: 70 6c 61 79 65 64 20 69 6e 20 61 20 74 69 6d 65  played in a time
5780: 6c 69 6e 65 2e 0a 20 20 40 20 22 30 22 20 74 68  line..  @ "0" th
5790: 65 72 65 20 69 73 20 6e 6f 20 6c 65 6e 67 74 68  ere is no length
57a0: 20 6c 69 6d 69 74 2e 3c 2f 70 3e 0a 0a 20 20 40   limit.</p>..  @
57b0: 20 3c 68 72 3e 0a 20 20 40 20 3c 70 3e 3c 69 6e   <hr>.  @ <p><in
57c0: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
57d0: 22 20 20 6e 61 6d 65 3d 22 73 75 62 6d 69 74 22  "  name="submit"
57e0: 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 43 68   value="Apply Ch
57f0: 61 6e 67 65 73 22 3e 3c 2f 70 3e 0a 20 20 40 20  anges"></p>.  @ 
5800: 3c 2f 66 6f 72 6d 3e 0a 20 20 64 62 5f 65 6e 64  </form>.  db_end
5810: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b  _transaction(0);
5820: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
5830: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
5840: 41 47 45 3a 20 73 65 74 75 70 5f 63 6f 6e 66 69  AGE: setup_confi
5850: 67 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75 70 5f  g.*/.void setup_
5860: 63 6f 6e 66 69 67 28 76 6f 69 64 29 7b 0a 20 20  config(void){.  
5870: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
5880: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
5890: 20 21 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a 20   !g.okSetup ){. 
58a0: 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28     login_needed(
58b0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 74 79 6c 65 5f  );.  }..  style_
58c0: 68 65 61 64 65 72 28 22 57 57 57 20 43 6f 6e 66  header("WWW Conf
58d0: 69 67 75 72 61 74 69 6f 6e 22 29 3b 0a 20 20 64  iguration");.  d
58e0: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
58f0: 69 6f 6e 28 29 3b 0a 20 20 40 20 3c 66 6f 72 6d  ion();.  @ <form
5900: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
5910: 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f 63 6f  aseURL)/setup_co
5920: 6e 66 69 67 22 20 6d 65 74 68 6f 64 3d 22 50 4f  nfig" method="PO
5930: 53 54 22 3e 0a 20 20 40 20 3c 68 72 20 2f 3e 0a  ST">.  @ <hr />.
5940: 20 20 65 6e 74 72 79 5f 61 74 74 72 69 62 75 74    entry_attribut
5950: 65 28 22 50 72 6f 6a 65 63 74 20 4e 61 6d 65 22  e("Project Name"
5960: 2c 20 36 30 2c 20 22 70 72 6f 6a 65 63 74 2d 6e  , 60, "project-n
5970: 61 6d 65 22 2c 20 22 70 6e 22 2c 20 22 22 29 3b  ame", "pn", "");
5980: 0a 20 20 40 20 3c 70 3e 47 69 76 65 20 79 6f 75  .  @ <p>Give you
5990: 72 20 70 72 6f 6a 65 63 74 20 61 20 6e 61 6d 65  r project a name
59a0: 20 73 6f 20 76 69 73 69 74 6f 72 73 20 6b 6e 6f   so visitors kno
59b0: 77 20 77 68 61 74 20 74 68 69 73 20 73 69 74 65  w what this site
59c0: 20 69 73 20 61 62 6f 75 74 2e 0a 20 20 40 20 54   is about..  @ T
59d0: 68 65 20 70 72 6f 6a 65 63 74 20 6e 61 6d 65 20  he project name 
59e0: 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 75 73 65  will also be use
59f0: 64 20 61 73 20 74 68 65 20 52 53 53 20 66 65 65  d as the RSS fee
5a00: 64 20 74 69 74 6c 65 2e 3c 2f 70 3e 0a 20 20 40  d title.</p>.  @
5a10: 20 3c 68 72 20 2f 3e 0a 20 20 74 65 78 74 61 72   <hr />.  textar
5a20: 65 61 5f 61 74 74 72 69 62 75 74 65 28 22 50 72  ea_attribute("Pr
5a30: 6f 6a 65 63 74 20 44 65 73 63 72 69 70 74 69 6f  oject Descriptio
5a40: 6e 22 2c 20 35 2c 20 36 30 2c 0a 20 20 20 20 20  n", 5, 60,.     
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 22 70 72 6f 6a 65 63 74 2d 64 65 73 63 72 69 70  "project-descrip
5a70: 74 69 6f 6e 22 2c 20 22 70 64 22 2c 20 22 22 29  tion", "pd", "")
5a80: 3b 0a 20 20 40 20 3c 70 3e 44 65 73 63 72 69 62  ;.  @ <p>Describ
5a90: 65 20 79 6f 75 72 20 70 72 6f 6a 65 63 74 2e 20  e your project. 
5aa0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65  This will be use
5ab0: 64 20 69 6e 20 70 61 67 65 20 68 65 61 64 65 72  d in page header
5ac0: 73 20 66 6f 72 20 73 65 61 72 63 68 0a 20 20 40  s for search.  @
5ad0: 20 65 6e 67 69 6e 65 73 20 61 73 20 77 65 6c 6c   engines as well
5ae0: 20 61 73 20 61 20 73 68 6f 72 74 20 52 53 53 20   as a short RSS 
5af0: 64 65 73 63 72 69 70 74 69 6f 6e 2e 3c 2f 70 3e  description.</p>
5b00: 0a 20 20 40 20 3c 68 72 20 2f 3e 0a 20 20 65 6e  .  @ <hr />.  en
5b10: 74 72 79 5f 61 74 74 72 69 62 75 74 65 28 22 49  try_attribute("I
5b20: 6e 64 65 78 20 50 61 67 65 22 2c 20 36 30 2c 20  ndex Page", 60, 
5b30: 22 69 6e 64 65 78 2d 70 61 67 65 22 2c 20 22 69  "index-page", "i
5b40: 64 78 70 67 22 2c 20 22 2f 68 6f 6d 65 22 29 3b  dxpg", "/home");
5b50: 0a 20 20 40 20 3c 70 3e 45 6e 74 65 72 20 74 68  .  @ <p>Enter th
5b60: 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
5b70: 65 20 70 61 67 65 20 74 6f 20 64 69 73 70 6c 61  e page to displa
5b80: 79 20 77 68 65 6e 20 74 68 65 20 22 48 6f 6d 65  y when the "Home
5b90: 22 20 6d 65 6e 75 0a 20 20 40 20 6f 70 74 69 6f  " menu.  @ optio
5ba0: 6e 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  n is selected an
5bb0: 64 20 77 68 65 6e 20 6e 6f 20 70 61 74 68 6e 61  d when no pathna
5bc0: 6d 65 20 69 73 0a 20 20 40 20 73 70 65 63 69 66  me is.  @ specif
5bd0: 69 65 64 20 69 6e 20 74 68 65 20 55 52 4c 2e 20  ied in the URL. 
5be0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
5bf0: 20 79 6f 75 20 76 69 73 69 74 20 74 68 65 20 75   you visit the u
5c00: 72 6c 3a 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20  rl:</p>.  @.  @ 
5c10: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 25 68 28 67  <blockquote>%h(g
5c20: 2e 7a 42 61 73 65 55 52 4c 29 3c 2f 62 6c 6f 63  .zBaseURL)</bloc
5c30: 6b 71 75 6f 74 65 3e 0a 20 20 40 0a 20 20 40 20  kquote>.  @.  @ 
5c40: 3c 70 3e 41 6e 64 20 79 6f 75 20 68 61 76 65 20  <p>And you have 
5c50: 73 70 65 63 69 66 69 65 64 20 61 6e 20 69 6e 64  specified an ind
5c60: 65 78 20 70 61 67 65 20 6f 66 20 22 2f 68 6f 6d  ex page of "/hom
5c70: 65 22 20 74 68 65 20 61 62 6f 76 65 20 77 69 6c  e" the above wil
5c80: 6c 0a 20 20 40 20 61 75 74 6f 6d 61 74 69 63 61  l.  @ automatica
5c90: 6c 6c 79 20 72 65 64 69 72 65 63 74 20 74 6f 3a  lly redirect to:
5ca0: 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 62 6c  </p>.  @.  @ <bl
5cb0: 6f 63 6b 71 75 6f 74 65 3e 25 68 28 67 2e 7a 42  ockquote>%h(g.zB
5cc0: 61 73 65 55 52 4c 29 2f 68 6f 6d 65 3c 2f 62 6c  aseURL)/home</bl
5cd0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 0a 20 20  ockquote>.  @.  
5ce0: 40 20 3c 70 3e 54 68 65 20 64 65 66 61 75 6c 74  @ <p>The default
5cf0: 20 22 2f 68 6f 6d 65 22 20 70 61 67 65 20 64 69   "/home" page di
5d00: 73 70 6c 61 79 73 20 61 20 57 69 6b 69 20 70 61  splays a Wiki pa
5d10: 67 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ge with the same
5d20: 20 6e 61 6d 65 0a 20 20 40 20 61 73 20 74 68 65   name.  @ as the
5d30: 20 50 72 6f 6a 65 63 74 20 4e 61 6d 65 20 73 70   Project Name sp
5d40: 65 63 69 66 69 65 64 20 61 62 6f 76 65 2e 20 20  ecified above.  
5d50: 53 6f 6d 65 20 73 69 74 65 73 20 70 72 65 66 65  Some sites prefe
5d60: 72 20 74 6f 20 72 65 64 69 72 65 63 74 0a 20 20  r to redirect.  
5d70: 40 20 74 6f 20 61 20 64 6f 63 75 6d 65 6e 74 61  @ to a documenta
5d80: 74 69 6f 6e 20 70 61 67 65 20 28 65 78 3a 20 22  tion page (ex: "
5d90: 2f 64 6f 63 2f 74 69 70 2f 69 6e 64 65 78 2e 77  /doc/tip/index.w
5da0: 69 6b 69 22 29 20 6f 72 20 74 6f 20 22 2f 74 69  iki") or to "/ti
5db0: 6d 65 6c 69 6e 65 22 2e 3c 2f 70 3e 0a 20 20 40  meline".</p>.  @
5dc0: 20 3c 68 72 20 2f 3e 0a 20 20 40 20 3c 70 3e 3c   <hr />.  @ <p><
5dd0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
5de0: 69 74 22 20 20 6e 61 6d 65 3d 22 73 75 62 6d 69  it"  name="submi
5df0: 74 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20  t" value="Apply 
5e00: 43 68 61 6e 67 65 73 22 3e 3c 2f 70 3e 0a 20 20  Changes"></p>.  
5e10: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 64 62 5f 65  @ </form>.  db_e
5e20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30  nd_transaction(0
5e30: 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  );.  style_foote
5e40: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
5e50: 42 50 41 47 45 3a 20 73 65 74 75 70 5f 65 64 69  BPAGE: setup_edi
5e60: 74 63 73 73 0a 2a 2f 0a 76 6f 69 64 20 73 65 74  tcss.*/.void set
5e70: 75 70 5f 65 64 69 74 63 73 73 28 76 6f 69 64 29  up_editcss(void)
5e80: 7b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  {.  login_check_
5e90: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
5ea0: 20 69 66 28 20 21 67 2e 6f 6b 53 65 74 75 70 20   if( !g.okSetup 
5eb0: 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65  ){.    login_nee
5ec0: 64 65 64 28 29 3b 0a 20 20 7d 0a 20 20 73 74 79  ded();.  }.  sty
5ed0: 6c 65 5f 68 65 61 64 65 72 28 22 45 64 69 74 20  le_header("Edit 
5ee0: 43 53 53 22 29 3b 0a 20 20 40 20 3c 66 6f 72 6d  CSS");.  @ <form
5ef0: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
5f00: 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f 65 64  aseURL)/setup_ed
5f10: 69 74 63 73 73 22 20 6d 65 74 68 6f 64 3d 22 50  itcss" method="P
5f20: 4f 53 54 22 3e 0a 20 20 40 20 45 64 69 74 20 74  OST">.  @ Edit t
5f30: 68 65 20 43 53 53 3a 3c 62 72 20 2f 3e 0a 20 20  he CSS:<br />.  
5f40: 74 65 78 74 61 72 65 61 5f 61 74 74 72 69 62 75  textarea_attribu
5f50: 74 65 28 22 22 2c 20 34 30 2c 20 38 30 2c 20 22  te("", 40, 80, "
5f60: 63 73 73 22 2c 20 22 63 73 73 22 2c 20 7a 44 65  css", "css", zDe
5f70: 66 61 75 6c 74 43 53 53 29 3b 0a 20 20 40 20 3c  faultCSS);.  @ <
5f80: 62 72 20 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74  br />.  @ <input
5f90: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e   type="submit" n
5fa0: 61 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c  ame="submit" val
5fb0: 75 65 3d 22 41 70 70 6c 79 20 43 68 61 6e 67 65  ue="Apply Change
5fc0: 73 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a  s">.  @ </form>.
5fd0: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 48 65 72    @ <hr>.  @ Her
5fe0: 65 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  e is the default
5ff0: 20 43 53 53 3a 0a 20 20 40 20 3c 62 6c 6f 63 6b   CSS:.  @ <block
6000: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40 20  quote><pre>.  @ 
6010: 25 68 28 7a 44 65 66 61 75 6c 74 43 53 53 29 0a  %h(zDefaultCSS).
6020: 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63    @ </pre></bloc
6030: 6b 71 75 6f 74 65 3e 0a 20 20 73 74 79 6c 65 5f  kquote>.  style_
6040: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
6050: 2a 2a 20 57 45 42 50 41 47 45 3a 20 73 65 74 75  ** WEBPAGE: setu
6060: 70 5f 68 65 61 64 65 72 0a 2a 2f 0a 76 6f 69 64  p_header.*/.void
6070: 20 73 65 74 75 70 5f 68 65 61 64 65 72 28 76 6f   setup_header(vo
6080: 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  id){.  login_che
6090: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
60a0: 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 53 65 74  ;.  if( !g.okSet
60b0: 75 70 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f  up ){.    login_
60c0: 6e 65 65 64 65 64 28 29 3b 0a 20 20 7d 0a 20 20  needed();.  }.  
60d0: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
60e0: 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28 20 50 28  tion();.  if( P(
60f0: 22 63 6c 65 61 72 22 29 21 3d 30 20 29 7b 0a 20  "clear")!=0 ){. 
6100: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
6110: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f  ("DELETE FROM co
6120: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d  nfig WHERE name=
6130: 27 68 65 61 64 65 72 27 22 29 3b 0a 20 20 20 20  'header'");.    
6140: 63 67 69 5f 72 65 70 6c 61 63 65 5f 70 61 72 61  cgi_replace_para
6150: 6d 65 74 65 72 28 22 68 65 61 64 65 72 22 2c 20  meter("header", 
6160: 7a 44 65 66 61 75 6c 74 48 65 61 64 65 72 29 3b  zDefaultHeader);
6170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65  .  }else{.    te
6180: 78 74 61 72 65 61 5f 61 74 74 72 69 62 75 74 65  xtarea_attribute
6190: 28 30 2c 20 30 2c 20 30 2c 20 22 68 65 61 64 65  (0, 0, 0, "heade
61a0: 72 22 2c 20 22 68 65 61 64 65 72 22 2c 20 7a 44  r", "header", zD
61b0: 65 66 61 75 6c 74 48 65 61 64 65 72 29 3b 0a 20  efaultHeader);. 
61c0: 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65   }.  style_heade
61d0: 72 28 22 45 64 69 74 20 50 61 67 65 20 48 65 61  r("Edit Page Hea
61e0: 64 65 72 22 29 3b 0a 20 20 40 20 3c 66 6f 72 6d  der");.  @ <form
61f0: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
6200: 61 73 65 55 52 4c 29 2f 73 65 74 75 70 5f 68 65  aseURL)/setup_he
6210: 61 64 65 72 22 20 6d 65 74 68 6f 64 3d 22 50 4f  ader" method="PO
6220: 53 54 22 3e 0a 20 20 40 20 3c 70 3e 45 64 69 74  ST">.  @ <p>Edit
6230: 20 48 54 4d 4c 20 74 65 78 74 20 77 69 74 68 20   HTML text with 
6240: 65 6d 62 65 64 64 65 64 20 54 48 31 20 28 61 20  embedded TH1 (a 
6250: 54 43 4c 20 64 69 61 6c 65 63 74 29 20 74 68 61  TCL dialect) tha
6260: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
6270: 6f 0a 20 20 40 20 67 65 6e 65 72 61 74 65 20 74  o.  @ generate t
6280: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
6290: 65 76 65 72 79 20 70 61 67 65 20 74 68 72 6f 75  every page throu
62a0: 67 68 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  gh start of the 
62b0: 6d 61 69 6e 0a 20 20 40 20 6d 65 6e 75 2e 3c 2f  main.  @ menu.</
62c0: 70 3e 0a 20 20 74 65 78 74 61 72 65 61 5f 61 74  p>.  textarea_at
62d0: 74 72 69 62 75 74 65 28 22 22 2c 20 34 30 2c 20  tribute("", 40, 
62e0: 38 30 2c 20 22 68 65 61 64 65 72 22 2c 20 22 68  80, "header", "h
62f0: 65 61 64 65 72 22 2c 20 7a 44 65 66 61 75 6c 74  eader", zDefault
6300: 48 65 61 64 65 72 29 3b 0a 20 20 40 20 3c 62 72  Header);.  @ <br
6310: 20 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74   />.  @ <input t
6320: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d  ype="submit" nam
6330: 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75 65  e="submit" value
6340: 3d 22 41 70 70 6c 79 20 43 68 61 6e 67 65 73 22  ="Apply Changes"
6350: 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  >.  @ <input typ
6360: 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d  e="submit" name=
6370: 22 63 6c 65 61 72 22 20 76 61 6c 75 65 3d 22 52  "clear" value="R
6380: 65 76 65 72 74 20 54 6f 20 44 65 66 61 75 6c 74  evert To Default
6390: 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.  @ </form>. 
63a0: 20 40 20 3c 68 72 3e 0a 20 20 40 20 48 65 72 65   @ <hr>.  @ Here
63b0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
63c0: 70 61 67 65 20 68 65 61 64 65 72 3a 0a 20 20 40  page header:.  @
63d0: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72   <blockquote><pr
63e0: 65 3e 0a 20 20 40 20 25 68 28 7a 44 65 66 61 75  e>.  @ %h(zDefau
63f0: 6c 74 48 65 61 64 65 72 29 0a 20 20 40 20 3c 2f  ltHeader).  @ </
6400: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
6410: 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  >.  style_footer
6420: 28 29 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61  ();.  db_end_tra
6430: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 0a  nsaction(0);.}..
6440: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 73  /*.** WEBPAGE: s
6450: 65 74 75 70 5f 66 6f 6f 74 65 72 0a 2a 2f 0a 76  etup_footer.*/.v
6460: 6f 69 64 20 73 65 74 75 70 5f 66 6f 6f 74 65 72  oid setup_footer
6470: 28 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f  (void){.  login_
6480: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
6490: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
64a0: 53 65 74 75 70 20 29 7b 0a 20 20 20 20 6c 6f 67  Setup ){.    log
64b0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 7d  in_needed();.  }
64c0: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
64d0: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28  saction();.  if(
64e0: 20 50 28 22 63 6c 65 61 72 22 29 21 3d 30 20 29   P("clear")!=0 )
64f0: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
6500: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
6510: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
6520: 6d 65 3d 27 66 6f 6f 74 65 72 27 22 29 3b 0a 20  me='footer'");. 
6530: 20 20 20 63 67 69 5f 72 65 70 6c 61 63 65 5f 70     cgi_replace_p
6540: 61 72 61 6d 65 74 65 72 28 22 66 6f 6f 74 65 72  arameter("footer
6550: 22 2c 20 7a 44 65 66 61 75 6c 74 46 6f 6f 74 65  ", zDefaultFoote
6560: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
6570: 20 74 65 78 74 61 72 65 61 5f 61 74 74 72 69 62   textarea_attrib
6580: 75 74 65 28 30 2c 20 30 2c 20 30 2c 20 22 66 6f  ute(0, 0, 0, "fo
6590: 6f 74 65 72 22 2c 20 22 66 6f 6f 74 65 72 22 2c  oter", "footer",
65a0: 20 7a 44 65 66 61 75 6c 74 46 6f 6f 74 65 72 29   zDefaultFooter)
65b0: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65  ;.  }.  style_he
65c0: 61 64 65 72 28 22 45 64 69 74 20 50 61 67 65 20  ader("Edit Page 
65d0: 46 6f 6f 74 65 72 22 29 3b 0a 20 20 40 20 3c 66  Footer");.  @ <f
65e0: 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73 28 67  orm action="%s(g
65f0: 2e 7a 42 61 73 65 55 52 4c 29 2f 73 65 74 75 70  .zBaseURL)/setup
6600: 5f 66 6f 6f 74 65 72 22 20 6d 65 74 68 6f 64 3d  _footer" method=
6610: 22 50 4f 53 54 22 3e 0a 20 20 40 20 3c 70 3e 45  "POST">.  @ <p>E
6620: 64 69 74 20 48 54 4d 4c 20 74 65 78 74 20 77 69  dit HTML text wi
6630: 74 68 20 65 6d 62 65 64 64 65 64 20 54 48 31 20  th embedded TH1 
6640: 28 61 20 54 43 4c 20 64 69 61 6c 65 63 74 29 20  (a TCL dialect) 
6650: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6660: 64 20 74 6f 0a 20 20 40 20 67 65 6e 65 72 61 74  d to.  @ generat
6670: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  e the end of eve
6680: 72 79 20 70 61 67 65 2e 3c 2f 70 3e 0a 20 20 74  ry page.</p>.  t
6690: 65 78 74 61 72 65 61 5f 61 74 74 72 69 62 75 74  extarea_attribut
66a0: 65 28 22 22 2c 20 32 30 2c 20 38 30 2c 20 22 66  e("", 20, 80, "f
66b0: 6f 6f 74 65 72 22 2c 20 22 66 6f 6f 74 65 72 22  ooter", "footer"
66c0: 2c 20 7a 44 65 66 61 75 6c 74 46 6f 6f 74 65 72  , zDefaultFooter
66d0: 29 3b 0a 20 20 40 20 3c 62 72 20 2f 3e 0a 20 20  );.  @ <br />.  
66e0: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73  @ <input type="s
66f0: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62  ubmit" name="sub
6700: 6d 69 74 22 20 76 61 6c 75 65 3d 22 41 70 70 6c  mit" value="Appl
6710: 79 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20  y Changes">.  @ 
6720: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
6730: 6d 69 74 22 20 6e 61 6d 65 3d 22 63 6c 65 61 72  mit" name="clear
6740: 22 20 76 61 6c 75 65 3d 22 52 65 76 65 72 74 20  " value="Revert 
6750: 54 6f 20 44 65 66 61 75 6c 74 22 3e 0a 20 20 40  To Default">.  @
6760: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 40 20 3c 68 72   </form>.  @ <hr
6770: 3e 0a 20 20 40 20 48 65 72 65 20 69 73 20 74 68  >.  @ Here is th
6780: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 66  e default page f
6790: 6f 6f 74 65 72 3a 0a 20 20 40 20 3c 62 6c 6f 63  ooter:.  @ <bloc
67a0: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40  kquote><pre>.  @
67b0: 20 25 68 28 7a 44 65 66 61 75 6c 74 46 6f 6f 74   %h(zDefaultFoot
67c0: 65 72 29 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f  er).  @ </pre></
67d0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 73 74  blockquote>.  st
67e0: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20  yle_footer();.  
67f0: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
6800: 6f 6e 28 30 29 3b 0a 7d 0a                       on(0);.}.