Hex Artifact Content
Not logged in

Artifact 2446896fe8282aa84e2d92fd8d324958316fa4c7:

File src/setup.c part of check-in [f3807dbd88] - Removed unnecessary items from WWW Configuration, also made RSS Title and Description into generic Project Name and Project Description settings, which will be used elsewhere in the web site. by jnc on 2007-10-10 02:49:29.

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 64 74 3e 0a  esc.){.  @ <dt>.
0570: 20 20 69 66 28 20 7a 4c 69 6e 6b 20 26 26 20 7a    if( zLink && z
0580: 4c 69 6e 6b 5b 30 5d 20 29 7b 0a 20 20 20 20 40  Link[0] ){.    @
0590: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 7a 4c 69   <a href="%s(zLi
05a0: 6e 6b 29 22 3e 25 68 28 7a 54 69 74 6c 65 29 3c  nk)">%h(zTitle)<
05b0: 2f 61 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /a>.  }else{.   
05c0: 20 40 20 25 68 28 7a 54 69 74 6c 65 29 0a 20 20   @ %h(zTitle).  
05d0: 7d 0a 20 20 40 20 3c 2f 64 74 3e 0a 20 20 40 20  }.  @ </dt>.  @ 
05e0: 3c 64 64 3e 25 68 28 7a 44 65 73 63 29 3c 2f 64  <dd>%h(zDesc)</d
05f0: 64 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  d>.}../*.** WEBP
0600: 41 47 45 3a 20 2f 73 65 74 75 70 0a 2a 2f 0a 76  AGE: /setup.*/.v
0610: 6f 69 64 20 73 65 74 75 70 5f 70 61 67 65 28 76  oid setup_page(v
0620: 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f 63 68  oid){.  login_ch
0630: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
0640: 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 53 65  );.  if( !g.okSe
0650: 74 75 70 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e  tup ){.    login
0660: 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 7d 0a 0a  _needed();.  }..
0670: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
0680: 53 65 74 75 70 22 29 3b 0a 20 20 40 20 3c 64 6c  Setup");.  @ <dl
0690: 20 69 64 3d 22 73 65 74 75 70 22 3e 0a 20 20 73   id="setup">.  s
06a0: 65 74 75 70 5f 6d 65 6e 75 5f 65 6e 74 72 79 28  etup_menu_entry(
06b0: 22 55 73 65 72 73 22 2c 20 22 73 65 74 75 70 5f  "Users", "setup_
06c0: 75 6c 69 73 74 22 2c 0a 20 20 20 20 22 47 72 61  ulist",.    "Gra
06d0: 6e 74 20 70 72 69 76 69 6c 65 67 65 73 20 74 6f  nt privileges to
06e0: 20 69 6e 64 69 76 69 64 75 61 6c 20 75 73 65 72   individual user
06f0: 73 2e 22 29 3b 0a 20 20 73 65 74 75 70 5f 6d 65  s.");.  setup_me
0700: 6e 75 5f 65 6e 74 72 79 28 22 41 63 63 65 73 73  nu_entry("Access
0710: 22 2c 20 22 73 65 74 75 70 5f 61 63 63 65 73 73  ", "setup_access
0720: 22 2c 0a 20 20 20 20 22 43 6f 6e 74 72 6f 6c 20  ",.    "Control 
0730: 61 63 63 65 73 73 20 73 65 74 74 69 6e 67 73 2e  access settings.
0740: 22 29 3b 0a 20 20 73 65 74 75 70 5f 6d 65 6e 75  ");.  setup_menu
0750: 5f 65 6e 74 72 79 28 22 43 6f 6e 66 69 67 75 72  _entry("Configur
0760: 61 74 69 6f 6e 22 2c 20 22 73 65 74 75 70 5f 63  ation", "setup_c
0770: 6f 6e 66 69 67 22 2c 0a 20 20 20 20 22 43 6f 6e  onfig",.    "Con
0780: 66 69 67 75 72 65 20 74 68 65 20 57 57 57 20 63  figure the WWW c
0790: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65  omponents of the
07a0: 20 72 65 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20   repository");. 
07b0: 20 73 65 74 75 70 5f 6d 65 6e 75 5f 65 6e 74 72   setup_menu_entr
07c0: 79 28 22 54 69 63 6b 65 74 73 22 2c 20 22 74 6b  y("Tickets", "tk
07d0: 74 73 65 74 75 70 22 2c 0a 20 20 20 20 22 43 6f  tsetup",.    "Co
07e0: 6e 66 69 67 75 72 65 20 74 68 65 20 74 72 6f 75  nfigure the trou
07f0: 62 6c 65 2d 74 69 63 6b 65 74 69 6e 67 20 73 79  ble-ticketing sy
0800: 73 74 65 6d 20 66 6f 72 20 74 68 69 73 20 72 65  stem for this re
0810: 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20 20 40 20  pository");.  @ 
0820: 3c 2f 64 6c 3e 0a 0a 20 20 73 74 79 6c 65 5f 66  </dl>..  style_f
0830: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
0840: 2a 20 57 45 42 50 41 47 45 3a 20 73 65 74 75 70  * WEBPAGE: setup
0850: 5f 75 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 53 68 6f  _ulist.**.** Sho
0860: 77 20 61 20 6c 69 73 74 20 6f 66 20 75 73 65 72  w a list of user
0870: 73 2e 20 20 43 6c 69 63 6b 69 6e 67 20 6f 6e 20  s.  Clicking on 
0880: 61 6e 79 20 75 73 65 72 20 6a 75 6d 70 73 20 74  any user jumps t
0890: 6f 20 74 68 65 20 65 64 69 74 0a 2a 2a 20 73 63  o the edit.** sc
08a0: 72 65 65 6e 20 66 6f 72 20 74 68 61 74 20 75 73  reen for that us
08b0: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75  er..*/.void setu
08c0: 70 5f 75 6c 69 73 74 28 76 6f 69 64 29 7b 0a 20  p_ulist(void){. 
08d0: 20 53 74 6d 74 20 73 3b 0a 0a 20 20 6c 6f 67 69   Stmt s;..  logi
08e0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
08f0: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
0900: 6f 6b 53 65 74 75 70 20 29 7b 0a 20 20 20 20 6c  okSetup ){.    l
0910: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20  ogin_needed();. 
0920: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0930: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
0940: 65 6c 65 6d 65 6e 74 28 22 41 64 64 22 2c 20 22  element("Add", "
0950: 41 64 64 20 55 73 65 72 22 2c 20 22 73 65 74 75  Add User", "setu
0960: 70 5f 75 65 64 69 74 22 29 3b 0a 20 20 73 74 79  p_uedit");.  sty
0970: 6c 65 5f 68 65 61 64 65 72 28 22 55 73 65 72 20  le_header("User 
0980: 4c 69 73 74 22 29 3b 0a 20 20 40 20 3c 74 61 62  List");.  @ <tab
0990: 6c 65 20 62 6f 72 64 65 72 3d 22 30 22 20 63 65  le border="0" ce
09a0: 6c 6c 70 61 64 64 69 6e 67 3d 22 30 22 20 63 65  llpadding="0" ce
09b0: 6c 6c 73 70 61 63 69 6e 67 3d 22 32 35 22 3e 0a  llspacing="25">.
09c0: 20 20 40 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69    @ <tr><td vali
09d0: 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c 62  gn="top">.  @ <b
09e0: 3e 55 73 65 72 73 3a 3c 2f 62 3e 0a 20 20 40 20  >Users:</b>.  @ 
09f0: 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 22 31  <table border="1
0a00: 22 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 22 31  " cellpadding="1
0a10: 30 22 3e 3c 74 72 3e 3c 74 64 3e 0a 20 20 40 20  0"><tr><td>.  @ 
0a20: 3c 74 61 62 6c 65 20 63 65 6c 6c 73 70 61 63 69  <table cellspaci
0a30: 6e 67 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67  ng=0 cellpadding
0a40: 3d 30 20 62 6f 72 64 65 72 3d 30 3e 0a 20 20 40  =0 border=0>.  @
0a50: 20 3c 74 72 3e 0a 20 20 40 20 20 20 3c 74 68 20   <tr>.  @   <th 
0a60: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 55 73  align="right">Us
0a70: 65 72 26 6e 62 73 70 3b 49 44 3c 2f 74 68 3e 3c  er&nbsp;ID</th><
0a80: 74 68 20 77 69 64 74 68 3d 22 31 35 22 3e 3c 2f  th width="15"></
0a90: 74 64 3e 0a 20 20 40 20 20 20 3c 74 68 3e 43 61  td>.  @   <th>Ca
0aa0: 70 61 62 69 6c 69 74 69 65 73 3c 2f 74 68 3e 3c  pabilities</th><
0ab0: 74 68 20 77 69 64 74 68 3d 22 31 35 22 3e 3c 2f  th width="15"></
0ac0: 74 64 3e 0a 20 20 40 20 20 20 3c 74 68 3e 43 6f  td>.  @   <th>Co
0ad0: 6e 74 61 63 74 26 6e 62 73 70 3b 49 6e 66 6f 3c  ntact&nbsp;Info<
0ae0: 2f 74 68 3e 0a 20 20 40 20 3c 2f 74 72 3e 0a 20  /th>.  @ </tr>. 
0af0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 73 2c 20   db_prepare(&s, 
0b00: 22 53 45 4c 45 43 54 20 75 69 64 2c 20 6c 6f 67  "SELECT uid, log
0b10: 69 6e 2c 20 63 61 70 2c 20 69 6e 66 6f 20 46 52  in, cap, info FR
0b20: 4f 4d 20 75 73 65 72 20 4f 52 44 45 52 20 42 59  OM user ORDER BY
0b30: 20 6c 6f 67 69 6e 22 29 3b 0a 20 20 77 68 69 6c   login");.  whil
0b40: 65 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d  e( db_step(&s)==
0b50: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
0b60: 20 20 40 20 3c 74 72 3e 0a 20 20 20 20 40 20 3c    @ <tr>.    @ <
0b70: 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22  td align="right"
0b80: 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 41 64  >.    if( g.okAd
0b90: 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  min ){.      @ <
0ba0: 61 20 68 72 65 66 3d 22 73 65 74 75 70 5f 75 65  a href="setup_ue
0bb0: 64 69 74 3f 69 64 3d 25 64 28 64 62 5f 63 6f 6c  dit?id=%d(db_col
0bc0: 75 6d 6e 5f 69 6e 74 28 26 73 2c 30 29 29 22 3e  umn_int(&s,0))">
0bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 6e 6f  .    }.    @ <no
0be0: 62 72 3e 25 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f  br>%h(db_column_
0bf0: 74 65 78 74 28 26 73 2c 31 29 29 3c 2f 6e 6f 62  text(&s,1))</nob
0c00: 72 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 41  r>.    if( g.okA
0c10: 64 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 40 20  dmin ){.      @ 
0c20: 3c 2f 61 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40  </a>.    }.    @
0c30: 20 3c 2f 74 64 3e 3c 74 64 3e 3c 2f 74 64 3e 0a   </td><td></td>.
0c40: 20 20 20 20 40 20 3c 74 64 20 61 6c 69 67 6e 3d      @ <td align=
0c50: 22 63 65 6e 74 65 72 22 3e 25 73 28 64 62 5f 63  "center">%s(db_c
0c60: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 73 2c 32 29  olumn_text(&s,2)
0c70: 29 3c 2f 74 64 3e 3c 74 64 3e 3c 2f 74 64 3e 0a  )</td><td></td>.
0c80: 20 20 20 20 40 20 3c 74 64 20 61 6c 69 67 6e 3d      @ <td align=
0c90: 22 6c 65 66 74 22 3e 25 73 28 64 62 5f 63 6f 6c  "left">%s(db_col
0ca0: 75 6d 6e 5f 74 65 78 74 28 26 73 2c 33 29 29 3c  umn_text(&s,3))<
0cb0: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 2f 74 72 3e  /td>.    @ </tr>
0cc0: 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65  .  }.  @ </table
0cd0: 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62  ></td></tr></tab
0ce0: 6c 65 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69  le>.  @ <td vali
0cf0: 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c 62  gn="top">.  @ <b
0d00: 3e 4e 6f 74 65 73 3a 3c 2f 62 3e 0a 20 20 40 20  >Notes:</b>.  @ 
0d10: 3c 6f 6c 3e 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e  <ol>.  @ <li><p>
0d20: 54 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 20 66  The permission f
0d30: 6c 61 67 73 20 61 72 65 20 61 73 20 66 6f 6c 6c  lags are as foll
0d40: 6f 77 73 3a 3c 2f 70 3e 0a 20 20 40 20 3c 6f 6c  ows:</p>.  @ <ol
0d50: 20 74 79 70 65 3d 22 61 22 3e 0a 20 20 40 20 3c   type="a">.  @ <
0d60: 6c 69 20 76 61 6c 75 65 3d 22 31 22 3e 3c 62 3e  li value="1"><b>
0d70: 41 64 6d 69 6e 3c 2f 62 3e 3a 20 43 72 65 61 74  Admin</b>: Creat
0d80: 65 20 61 6e 64 20 64 65 6c 65 74 65 20 75 73 65  e and delete use
0d90: 72 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20  rs</li>.  @ <li 
0da0: 76 61 6c 75 65 3d 22 33 22 3e 3c 62 3e 41 70 70  value="3"><b>App
0db0: 65 6e 64 2d 54 6b 74 3c 2f 62 3e 3a 20 41 70 70  end-Tkt</b>: App
0dc0: 65 6e 64 20 74 6f 20 74 69 63 6b 65 74 73 3c 2f  end to tickets</
0dd0: 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75  li>.  @ <li valu
0de0: 65 3d 22 34 22 3e 3c 62 3e 44 65 6c 65 74 65 3c  e="4"><b>Delete<
0df0: 2f 62 3e 3a 20 44 65 6c 65 74 65 20 77 69 6b 69  /b>: Delete wiki
0e00: 20 61 6e 64 20 74 69 63 6b 65 74 73 3c 2f 6c 69   and tickets</li
0e10: 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d  >.  @ <li value=
0e20: 22 36 22 3e 3c 62 3e 4e 65 77 2d 57 69 6b 69 3c  "6"><b>New-Wiki<
0e30: 2f 62 3e 3a 20 43 72 65 61 74 65 20 6e 65 77 20  /b>: Create new 
0e40: 77 69 6b 69 20 70 61 67 65 73 3c 2f 6c 69 3e 0a  wiki pages</li>.
0e50: 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 37    @ <li value="7
0e60: 22 3e 3c 62 3e 43 6c 6f 6e 65 3c 2f 62 3e 3a 20  "><b>Clone</b>: 
0e70: 43 6c 6f 6e 65 20 74 68 65 20 72 65 70 6f 73 69  Clone the reposi
0e80: 74 6f 72 79 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c  tory</li>.  @ <l
0e90: 69 20 76 61 6c 75 65 3d 22 38 22 3e 3c 62 3e 48  i value="8"><b>H
0ea0: 69 73 74 6f 72 79 3c 2f 62 3e 3a 20 56 69 65 77  istory</b>: View
0eb0: 20 64 65 74 61 69 6c 20 72 65 70 6f 73 69 74 6f   detail reposito
0ec0: 72 79 20 68 69 73 74 6f 72 79 3c 2f 6c 69 3e 0a  ry history</li>.
0ed0: 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 39    @ <li value="9
0ee0: 22 3e 3c 62 3e 43 68 65 63 6b 2d 49 6e 3c 2f 62  "><b>Check-In</b
0ef0: 3e 3a 20 43 6f 6d 6d 69 74 20 6e 65 77 20 76 65  >: Commit new ve
0f00: 72 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65  rsions in the re
0f10: 70 6f 73 69 74 6f 72 79 3c 2f 6c 69 3e 0a 20 20  pository</li>.  
0f20: 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 30 22  @ <li value="10"
0f30: 3e 3c 62 3e 52 65 61 64 2d 57 69 6b 69 3c 2f 62  ><b>Read-Wiki</b
0f40: 3e 3a 20 56 69 65 77 20 77 69 6b 69 20 70 61 67  >: View wiki pag
0f50: 65 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20  es</li>.  @ <li 
0f60: 76 61 6c 75 65 3d 22 31 31 22 3e 3c 62 3e 57 72  value="11"><b>Wr
0f70: 69 74 65 2d 57 69 6b 69 3c 2f 62 3e 3a 20 45 64  ite-Wiki</b>: Ed
0f80: 69 74 20 77 69 6b 69 20 70 61 67 65 73 3c 2f 6c  it wiki pages</l
0f90: 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75 65  i>.  @ <li value
0fa0: 3d 22 31 33 22 3e 3c 62 3e 41 70 70 65 6e 64 2d  ="13"><b>Append-
0fb0: 57 69 6b 69 3c 2f 62 3e 3a 20 41 70 70 65 6e 64  Wiki</b>: Append
0fc0: 20 74 6f 20 77 69 6b 69 20 70 61 67 65 73 3c 2f   to wiki pages</
0fd0: 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75  li>.  @ <li valu
0fe0: 65 3d 22 31 34 22 3e 3c 62 3e 4e 65 77 2d 54 6b  e="14"><b>New-Tk
0ff0: 74 3c 2f 62 3e 3a 20 43 72 65 61 74 65 20 6e 65  t</b>: Create ne
1000: 77 20 74 69 63 6b 65 74 73 3c 2f 6c 69 3e 0a 20  w tickets</li>. 
1010: 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 35   @ <li value="15
1020: 22 3e 3c 62 3e 43 68 65 63 6b 2d 4f 75 74 3c 2f  "><b>Check-Out</
1030: 62 3e 3a 20 43 68 65 63 6b 20 6f 75 74 20 76 65  b>: Check out ve
1040: 72 73 69 6f 6e 73 3c 2f 6c 69 3e 0a 20 20 40 20  rsions</li>.  @ 
1050: 3c 6c 69 20 76 61 6c 75 65 3d 22 31 36 22 3e 3c  <li value="16"><
1060: 62 3e 50 61 73 73 77 6f 72 64 3c 2f 62 3e 3a 20  b>Password</b>: 
1070: 43 68 61 6e 67 65 20 79 6f 75 72 20 6f 77 6e 20  Change your own 
1080: 70 61 73 73 77 6f 72 64 3c 2f 6c 69 3e 0a 20 20  password</li>.  
1090: 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 37 22  @ <li value="17"
10a0: 3e 3c 62 3e 51 75 65 72 79 3c 2f 62 3e 3a 20 43  ><b>Query</b>: C
10b0: 72 65 61 74 65 20 6e 65 77 20 71 75 65 72 69 65  reate new querie
10c0: 73 20 61 67 61 69 6e 73 74 20 74 69 63 6b 65 74  s against ticket
10d0: 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76  s</li>.  @ <li v
10e0: 61 6c 75 65 3d 22 31 38 22 3e 3c 62 3e 52 65 61  alue="18"><b>Rea
10f0: 64 2d 54 6b 74 3c 2f 62 3e 3a 20 56 69 65 77 20  d-Tkt</b>: View 
1100: 74 69 63 6b 65 74 73 3c 2f 6c 69 3e 0a 20 20 40  tickets</li>.  @
1110: 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 39 22 3e   <li value="19">
1120: 3c 62 3e 53 65 74 75 70 3a 3c 2f 62 3e 20 53 65  <b>Setup:</b> Se
1130: 74 75 70 20 61 6e 64 20 63 6f 6e 66 69 67 75 72  tup and configur
1140: 65 20 74 68 69 73 20 77 65 62 73 69 74 65 3c 2f  e this website</
1150: 6c 69 3e 0a 20 20 40 20 3c 6c 69 20 76 61 6c 75  li>.  @ <li valu
1160: 65 3d 22 32 33 22 3e 3c 62 3e 57 72 69 74 65 2d  e="23"><b>Write-
1170: 54 6b 74 3c 2f 62 3e 3a 20 45 64 69 74 20 74 69  Tkt</b>: Edit ti
1180: 63 6b 65 74 73 3c 2f 6c 69 3e 0a 20 20 40 20 3c  ckets</li>.  @ <
1190: 2f 6f 6c 3e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c  /ol>.  @ </p></l
11a0: 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c  i>.  @.  @ <li><
11b0: 70 3e 0a 20 20 40 20 45 76 65 72 79 20 75 73 65  p>.  @ Every use
11c0: 72 2c 20 6c 6f 67 67 65 64 20 69 6e 20 6f 72 20  r, logged in or 
11d0: 6e 6f 74 2c 20 68 61 73 20 74 68 65 20 70 72 69  not, has the pri
11e0: 76 69 6c 65 67 65 73 20 6f 66 20 3c 62 3e 6e 6f  vileges of <b>no
11f0: 62 6f 64 79 3c 2f 62 3e 2e 0a 20 20 40 20 41 6e  body</b>..  @ An
1200: 79 20 68 75 6d 61 6e 20 63 61 6e 20 6c 6f 67 69  y human can logi
1210: 6e 20 61 73 20 3c 62 3e 61 6e 6f 6e 79 6d 6f 75  n as <b>anonymou
1220: 73 3c 2f 62 3e 20 73 69 6e 63 65 20 74 68 65 20  s</b> since the 
1230: 70 61 73 73 77 6f 72 64 20 69 73 0a 20 20 40 20  password is.  @ 
1240: 63 6c 65 61 72 6c 79 20 64 69 73 70 6c 61 79 65  clearly displaye
1250: 64 20 6f 6e 20 74 68 65 20 6c 6f 67 69 6e 20 70  d on the login p
1260: 61 67 65 20 66 6f 72 20 74 68 65 6d 20 74 6f 20  age for them to 
1270: 74 79 70 65 2e 20 20 54 68 65 20 70 75 72 70 6f  type.  The purpo
1280: 73 65 0a 20 20 40 20 6f 66 20 72 65 71 75 69 72  se.  @ of requir
1290: 69 6e 67 20 61 6e 6f 6e 79 6d 6f 75 73 20 74 6f  ing anonymous to
12a0: 20 6c 6f 67 20 69 6e 20 69 73 20 74 6f 20 70 72   log in is to pr
12b0: 65 76 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  event access by 
12c0: 73 70 69 64 65 72 73 2e 0a 20 20 40 20 3c 2f 70  spiders..  @ </p
12d0: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
12e0: 2f 6f 6c 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f  /ol>.  @ </td></
12f0: 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 73 74  tr></table>.  st
1300: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
1310: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
1320: 2f 73 65 74 75 70 5f 75 65 64 69 74 0a 2a 2f 0a  /setup_uedit.*/.
1330: 76 6f 69 64 20 75 73 65 72 5f 65 64 69 74 28 76  void user_edit(v
1340: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
1350: 61 72 20 2a 7a 49 64 2c 20 2a 7a 4c 6f 67 69 6e  ar *zId, *zLogin
1360: 2c 20 2a 7a 49 6e 66 6f 2c 20 2a 7a 43 61 70 3b  , *zInfo, *zCap;
1370: 0a 20 20 63 68 61 72 20 2a 6f 61 61 2c 20 2a 6f  .  char *oaa, *o
1380: 61 73 2c 20 2a 6f 61 72 2c 20 2a 6f 61 77 2c 20  as, *oar, *oaw, 
1390: 2a 6f 61 6e 2c 20 2a 6f 61 69 2c 20 2a 6f 61 6a  *oan, *oai, *oaj
13a0: 2c 20 2a 6f 61 6f 2c 20 2a 6f 61 70 20 3b 0a 20  , *oao, *oap ;. 
13b0: 20 63 68 61 72 20 2a 6f 61 6b 2c 20 2a 6f 61 64   char *oak, *oad
13c0: 2c 20 2a 6f 61 71 2c 20 2a 6f 61 63 2c 20 2a 6f  , *oaq, *oac, *o
13d0: 61 66 2c 20 2a 6f 61 6d 2c 20 2a 6f 61 68 2c 20  af, *oam, *oah, 
13e0: 2a 6f 61 67 3b 0a 20 20 69 6e 74 20 64 6f 57 72  *oag;.  int doWr
13f0: 69 74 65 3b 0a 20 20 69 6e 74 20 75 69 64 3b 0a  ite;.  int uid;.
1400: 20 20 69 6e 74 20 68 69 67 68 65 72 55 73 65 72    int higherUser
1410: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69   = 0;  /* True i
1420: 66 20 75 73 65 72 20 62 65 69 6e 67 20 65 64 69  f user being edi
1430: 74 65 64 20 69 73 20 53 45 54 55 50 20 61 6e 64  ted is SETUP and
1440: 20 74 68 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   the */.        
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1460: 2a 20 75 73 65 72 20 64 6f 69 6e 67 20 74 68 65  * user doing the
1470: 20 65 64 69 74 69 6e 67 20 69 73 20 41 44 4d 49   editing is ADMI
1480: 4e 2e 20 20 44 69 73 61 6c 6c 6f 77 20 65 64 69  N.  Disallow edi
1490: 74 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 75  ting */..  /* Mu
14a0: 73 74 20 68 61 76 65 20 41 44 4d 49 4e 20 70 72  st have ADMIN pr
14b0: 69 76 6c 65 67 65 73 20 74 6f 20 61 63 63 65 73  ivleges to acces
14c0: 73 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  s this page.  */
14d0: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
14e0: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
14f0: 69 66 28 20 21 67 2e 6f 6b 41 64 6d 69 6e 20 29  if( !g.okAdmin )
1500: 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29  { login_needed()
1510: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20 20 2f  ; return; }..  /
1520: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1530: 66 20 61 6e 20 41 44 4d 49 4e 20 75 73 65 72 20  f an ADMIN user 
1540: 69 73 20 74 72 79 69 6e 67 20 74 6f 20 65 64 69  is trying to edi
1550: 74 20 61 20 53 45 54 55 50 20 61 63 63 6f 75 6e  t a SETUP accoun
1560: 74 2e 0a 20 20 2a 2a 20 44 6f 6e 27 74 20 61 6c  t..  ** Don't al
1570: 6c 6f 77 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20  low that..  */. 
1580: 20 7a 49 64 20 3d 20 50 44 28 22 69 64 22 2c 20   zId = PD("id", 
1590: 22 30 22 29 3b 0a 20 20 75 69 64 20 3d 20 61 74  "0");.  uid = at
15a0: 6f 69 28 7a 49 64 29 3b 0a 20 20 69 66 28 20 7a  oi(zId);.  if( z
15b0: 49 64 20 26 26 20 21 67 2e 6f 6b 53 65 74 75 70  Id && !g.okSetup
15c0: 20 26 26 20 75 69 64 3e 30 20 29 7b 0a 20 20 20   && uid>0 ){.   
15d0: 20 63 68 61 72 20 2a 7a 4f 6c 64 43 61 70 73 3b   char *zOldCaps;
15e0: 0a 20 20 20 20 7a 4f 6c 64 43 61 70 73 20 3d 20  .    zOldCaps = 
15f0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
1600: 43 54 20 63 61 70 73 20 46 52 4f 4d 20 75 73 65  CT caps FROM use
1610: 72 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c  r WHERE uid=%d",
1620: 75 69 64 29 3b 0a 20 20 20 20 68 69 67 68 65 72  uid);.    higher
1630: 55 73 65 72 20 3d 20 7a 4f 6c 64 43 61 70 73 20  User = zOldCaps 
1640: 26 26 20 73 74 72 63 68 72 28 7a 4f 6c 64 43 61  && strchr(zOldCa
1650: 70 73 2c 27 73 27 29 3b 0a 20 20 7d 0a 0a 20 20  ps,'s');.  }..  
1660: 69 66 28 20 50 28 22 63 61 6e 22 29 20 29 7b 0a  if( P("can") ){.
1670: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
1680: 28 22 73 65 74 75 70 5f 75 6c 69 73 74 22 29 3b  ("setup_ulist");
1690: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16a0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
16b0: 65 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73  e all the necess
16c0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c  ary information,
16d0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 6f   write the new o
16e0: 72 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20  r.  ** modified 
16f0: 75 73 65 72 20 72 65 63 6f 72 64 2e 20 20 41 66  user record.  Af
1700: 74 65 72 20 77 72 69 74 69 6e 67 20 74 68 65 20  ter writing the 
1710: 75 73 65 72 20 72 65 63 6f 72 64 2c 20 72 65 64  user record, red
1720: 69 72 65 63 74 0a 20 20 2a 2a 20 74 6f 20 74 68  irect.  ** to th
1730: 65 20 70 61 67 65 20 74 68 61 74 20 64 69 73 70  e page that disp
1740: 6c 61 79 73 20 61 20 6c 69 73 74 20 6f 66 20 75  lays a list of u
1750: 73 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 64 6f 57  sers..  */.  doW
1760: 72 69 74 65 20 3d 20 63 67 69 5f 61 6c 6c 28 22  rite = cgi_all("
1770: 6c 6f 67 69 6e 22 2c 22 69 6e 66 6f 22 2c 22 70  login","info","p
1780: 77 22 29 20 26 26 20 21 68 69 67 68 65 72 55 73  w") && !higherUs
1790: 65 72 3b 0a 20 20 69 66 28 20 64 6f 57 72 69 74  er;.  if( doWrit
17a0: 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  e ){.    const c
17b0: 68 61 72 20 2a 7a 50 77 3b 0a 20 20 20 20 63 6f  har *zPw;.    co
17c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e  nst char *zLogin
17d0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 43 61 70 5b  ;.    char zCap[
17e0: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d  30];.    int i =
17f0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 61 61 20 3d   0;.    int aa =
1800: 20 50 28 22 61 61 22 29 21 3d 30 3b 0a 20 20 20   P("aa")!=0;.   
1810: 20 69 6e 74 20 61 64 20 3d 20 50 28 22 61 64 22   int ad = P("ad"
1820: 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 69  )!=0;.    int ai
1830: 20 3d 20 50 28 22 61 69 22 29 21 3d 30 3b 0a 20   = P("ai")!=0;. 
1840: 20 20 20 69 6e 74 20 61 6a 20 3d 20 50 28 22 61     int aj = P("a
1850: 6a 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20  j")!=0;.    int 
1860: 61 6b 20 3d 20 50 28 22 61 6b 22 29 21 3d 30 3b  ak = P("ak")!=0;
1870: 0a 20 20 20 20 69 6e 74 20 61 6e 20 3d 20 50 28  .    int an = P(
1880: 22 61 6e 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e  "an")!=0;.    in
1890: 74 20 61 6f 20 3d 20 50 28 22 61 6f 22 29 21 3d  t ao = P("ao")!=
18a0: 30 3b 0a 20 20 20 20 69 6e 74 20 61 70 20 3d 20  0;.    int ap = 
18b0: 50 28 22 61 70 22 29 21 3d 30 3b 0a 20 20 20 20  P("ap")!=0;.    
18c0: 69 6e 74 20 61 71 20 3d 20 50 28 22 61 71 22 29  int aq = P("aq")
18d0: 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 72 20  !=0;.    int ar 
18e0: 3d 20 50 28 22 61 72 22 29 21 3d 30 3b 0a 20 20  = P("ar")!=0;.  
18f0: 20 20 69 6e 74 20 61 73 20 3d 20 67 2e 6f 6b 53    int as = g.okS
1900: 65 74 75 70 20 26 26 20 50 28 22 61 73 22 29 21  etup && P("as")!
1910: 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 77 20 3d  =0;.    int aw =
1920: 20 50 28 22 61 77 22 29 21 3d 30 3b 0a 20 20 20   P("aw")!=0;.   
1930: 20 69 6e 74 20 61 63 20 3d 20 50 28 22 61 63 22   int ac = P("ac"
1940: 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20 61 66  )!=0;.    int af
1950: 20 3d 20 50 28 22 61 66 22 29 21 3d 30 3b 0a 20   = P("af")!=0;. 
1960: 20 20 20 69 6e 74 20 61 6d 20 3d 20 50 28 22 61     int am = P("a
1970: 6d 22 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74 20  m")!=0;.    int 
1980: 61 68 20 3d 20 50 28 22 61 68 22 29 21 3d 30 3b  ah = P("ah")!=0;
1990: 0a 20 20 20 20 69 6e 74 20 61 67 20 3d 20 50 28  .    int ag = P(
19a0: 22 61 67 22 29 21 3d 30 3b 0a 20 20 20 20 69 66  "ag")!=0;.    if
19b0: 28 20 61 61 20 29 7b 20 7a 43 61 70 5b 69 2b 2b  ( aa ){ zCap[i++
19c0: 5d 20 3d 20 27 61 27 3b 20 7d 0a 20 20 20 20 69  ] = 'a'; }.    i
19d0: 66 28 20 61 63 20 29 7b 20 7a 43 61 70 5b 69 2b  f( ac ){ zCap[i+
19e0: 2b 5d 20 3d 20 27 63 27 3b 20 7d 0a 20 20 20 20  +] = 'c'; }.    
19f0: 69 66 28 20 61 64 20 29 7b 20 7a 43 61 70 5b 69  if( ad ){ zCap[i
1a00: 2b 2b 5d 20 3d 20 27 64 27 3b 20 7d 0a 20 20 20  ++] = 'd'; }.   
1a10: 20 69 66 28 20 61 66 20 29 7b 20 7a 43 61 70 5b   if( af ){ zCap[
1a20: 69 2b 2b 5d 20 3d 20 27 66 27 3b 20 7d 0a 20 20  i++] = 'f'; }.  
1a30: 20 20 69 66 28 20 61 68 20 29 7b 20 7a 43 61 70    if( ah ){ zCap
1a40: 5b 69 2b 2b 5d 20 3d 20 27 68 27 3b 20 7d 0a 20  [i++] = 'h'; }. 
1a50: 20 20 20 69 66 28 20 61 67 20 29 7b 20 7a 43 61     if( ag ){ zCa
1a60: 70 5b 69 2b 2b 5d 20 3d 20 27 67 27 3b 20 7d 0a  p[i++] = 'g'; }.
1a70: 20 20 20 20 69 66 28 20 61 69 20 29 7b 20 7a 43      if( ai ){ zC
1a80: 61 70 5b 69 2b 2b 5d 20 3d 20 27 69 27 3b 20 7d  ap[i++] = 'i'; }
1a90: 0a 20 20 20 20 69 66 28 20 61 6a 20 29 7b 20 7a  .    if( aj ){ z
1aa0: 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 6a 27 3b 20  Cap[i++] = 'j'; 
1ab0: 7d 0a 20 20 20 20 69 66 28 20 61 6b 20 29 7b 20  }.    if( ak ){ 
1ac0: 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 6b 27 3b  zCap[i++] = 'k';
1ad0: 20 7d 0a 20 20 20 20 69 66 28 20 61 6d 20 29 7b   }.    if( am ){
1ae0: 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 6d 27   zCap[i++] = 'm'
1af0: 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 6e 20 29  ; }.    if( an )
1b00: 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27 6e  { zCap[i++] = 'n
1b10: 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 6f 20  '; }.    if( ao 
1b20: 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 27  ){ zCap[i++] = '
1b30: 6f 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61 70  o'; }.    if( ap
1b40: 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20   ){ zCap[i++] = 
1b50: 27 70 27 3b 20 7d 0a 20 20 20 20 69 66 28 20 61  'p'; }.    if( a
1b60: 71 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d  q ){ zCap[i++] =
1b70: 20 27 71 27 3b 20 7d 0a 20 20 20 20 69 66 28 20   'q'; }.    if( 
1b80: 61 72 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d 20  ar ){ zCap[i++] 
1b90: 3d 20 27 72 27 3b 20 7d 0a 20 20 20 20 69 66 28  = 'r'; }.    if(
1ba0: 20 61 73 20 29 7b 20 7a 43 61 70 5b 69 2b 2b 5d   as ){ zCap[i++]
1bb0: 20 3d 20 27 73 27 3b 20 7d 0a 20 20 20 20 69 66   = 's'; }.    if
1bc0: 28 20 61 77 20 29 7b 20 7a 43 61 70 5b 69 2b 2b  ( aw ){ zCap[i++
1bd0: 5d 20 3d 20 27 77 27 3b 20 7d 0a 0a 20 20 20 20  ] = 'w'; }..    
1be0: 7a 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  zCap[i] = 0;.   
1bf0: 20 7a 50 77 20 3d 20 50 28 22 70 77 22 29 3b 0a   zPw = P("pw");.
1c00: 20 20 20 20 69 66 28 20 7a 50 77 3d 3d 30 20 7c      if( zPw==0 |
1c10: 7c 20 7a 50 77 5b 30 5d 3d 3d 30 20 29 7b 0a 20  | zPw[0]==0 ){. 
1c20: 20 20 20 20 20 7a 50 77 20 3d 20 64 62 5f 74 65       zPw = db_te
1c30: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70 77  xt(0, "SELECT pw
1c40: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45   FROM user WHERE
1c50: 20 75 69 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a   uid=%d", uid);.
1c60: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 6f 67 69 6e      }.    zLogin
1c70: 20 3d 20 50 28 22 6c 6f 67 69 6e 22 29 3b 0a 20   = P("login");. 
1c80: 20 20 20 69 66 28 20 75 69 64 3e 30 20 26 26 0a     if( uid>0 &&.
1c90: 20 20 20 20 20 20 20 20 64 62 5f 65 78 69 73 74          db_exist
1ca0: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
1cb0: 20 75 73 65 72 20 57 48 45 52 45 20 6c 6f 67 69   user WHERE logi
1cc0: 6e 3d 25 51 20 41 4e 44 20 75 69 64 21 3d 25 64  n=%Q AND uid!=%d
1cd0: 22 2c 20 7a 4c 6f 67 69 6e 2c 20 75 69 64 29 0a  ", zLogin, uid).
1ce0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 74 79      ){.      sty
1cf0: 6c 65 5f 68 65 61 64 65 72 28 22 55 73 65 72 20  le_header("User 
1d00: 43 72 65 61 74 69 6f 6e 20 45 72 72 6f 72 22 29  Creation Error")
1d10: 3b 0a 20 20 20 20 20 20 40 20 3c 66 6f 6e 74 20  ;.      @ <font 
1d20: 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 4c 6f 67 69  color="red">Logi
1d30: 6e 20 22 25 68 28 7a 4c 6f 67 69 6e 29 22 20 69  n "%h(zLogin)" i
1d40: 73 20 61 6c 72 65 61 64 79 20 75 73 65 64 20 62  s already used b
1d50: 79 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  y a different.  
1d60: 20 20 20 20 40 20 75 73 65 72 2e 3c 2f 66 6f 6e      @ user.</fon
1d70: 74 3e 0a 20 20 20 20 20 20 40 0a 20 20 20 20 20  t>.      @.     
1d80: 20 40 20 3c 70 3e 3c 61 20 68 72 65 66 3d 22 73   @ <p><a href="s
1d90: 65 74 75 70 5f 75 65 64 69 74 3f 69 64 3d 25 64  etup_uedit?id=%d
1da0: 28 75 69 64 29 29 3e 5b 42 75 6d 6d 65 72 5d 3c  (uid))>[Bummer]<
1db0: 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 20 20 73 74  /a></p>.      st
1dc0: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20  yle_footer();.  
1dd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1de0: 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  }.    db_multi_e
1df0: 78 65 63 28 0a 20 20 20 20 20 20 20 22 52 45 50  xec(.       "REP
1e00: 4c 41 43 45 20 49 4e 54 4f 20 75 73 65 72 28 75  LACE INTO user(u
1e10: 69 64 2c 6c 6f 67 69 6e 2c 69 6e 66 6f 2c 70 77  id,login,info,pw
1e20: 2c 63 61 70 29 20 22 0a 20 20 20 20 20 20 20 22  ,cap) ".       "
1e30: 56 41 4c 55 45 53 28 6e 75 6c 6c 69 66 28 25 64  VALUES(nullif(%d
1e40: 2c 30 29 2c 25 51 2c 25 51 2c 25 51 2c 27 25 73  ,0),%Q,%Q,%Q,'%s
1e50: 27 29 22 2c 0a 20 20 20 20 20 20 75 69 64 2c 20  ')",.      uid, 
1e60: 50 28 22 6c 6f 67 69 6e 22 29 2c 20 50 28 22 69  P("login"), P("i
1e70: 6e 66 6f 22 29 2c 20 7a 50 77 2c 20 7a 43 61 70  nfo"), zPw, zCap
1e80: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 67 69 5f  .    );.    cgi_
1e90: 72 65 64 69 72 65 63 74 28 22 73 65 74 75 70 5f  redirect("setup_
1ea0: 75 6c 69 73 74 22 29 3b 0a 20 20 20 20 72 65 74  ulist");.    ret
1eb0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  urn;.  }..  /* L
1ec0: 6f 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  oad the existing
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1ee0: 75 74 20 74 68 65 20 75 73 65 72 2c 20 69 66 20  ut the user, if 
1ef0: 61 6e 79 0a 20 20 2a 2f 0a 20 20 7a 4c 6f 67 69  any.  */.  zLogi
1f00: 6e 20 3d 20 22 22 3b 0a 20 20 7a 49 6e 66 6f 20  n = "";.  zInfo 
1f10: 3d 20 22 22 3b 0a 20 20 7a 43 61 70 20 3d 20 22  = "";.  zCap = "
1f20: 22 3b 0a 20 20 6f 61 61 20 3d 20 6f 61 63 20 3d  ";.  oaa = oac =
1f30: 20 6f 61 64 20 3d 20 6f 61 66 20 3d 20 6f 61 67   oad = oaf = oag
1f40: 20 3d 20 6f 61 68 20 3d 20 6f 61 69 20 3d 20 6f   = oah = oai = o
1f50: 61 6a 20 3d 20 6f 61 6b 20 3d 20 6f 61 6d 20 3d  aj = oak = oam =
1f60: 0a 20 20 20 20 20 20 20 20 6f 61 6e 20 3d 20 6f  .        oan = o
1f70: 61 6f 20 3d 20 6f 61 70 20 3d 20 6f 61 71 20 3d  ao = oap = oaq =
1f80: 20 6f 61 72 20 3d 20 6f 61 73 20 3d 20 6f 61 77   oar = oas = oaw
1f90: 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 75 69 64   = "";.  if( uid
1fa0: 20 29 7b 0a 20 20 20 20 7a 4c 6f 67 69 6e 20 3d   ){.    zLogin =
1fb0: 20 64 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45   db_text("", "SE
1fc0: 4c 45 43 54 20 6c 6f 67 69 6e 20 46 52 4f 4d 20  LECT login FROM 
1fd0: 75 73 65 72 20 57 48 45 52 45 20 75 69 64 3d 25  user WHERE uid=%
1fe0: 64 22 2c 20 75 69 64 29 3b 0a 20 20 20 20 7a 49  d", uid);.    zI
1ff0: 6e 66 6f 20 3d 20 64 62 5f 74 65 78 74 28 22 22  nfo = db_text(""
2000: 2c 20 22 53 45 4c 45 43 54 20 69 6e 66 6f 20 46  , "SELECT info F
2010: 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45 20 75  ROM user WHERE u
2020: 69 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a 20 20  id=%d", uid);.  
2030: 20 20 7a 43 61 70 20 3d 20 64 62 5f 74 65 78 74    zCap = db_text
2040: 28 22 22 2c 20 22 53 45 4c 45 43 54 20 63 61 70  ("", "SELECT cap
2050: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45   FROM user WHERE
2060: 20 75 69 64 3d 25 64 22 2c 20 75 69 64 29 3b 0a   uid=%d", uid);.
2070: 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a      if( strchr(z
2080: 43 61 70 2c 20 27 61 27 29 20 29 20 6f 61 61 20  Cap, 'a') ) oaa 
2090: 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20  = " checked";.  
20a0: 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 43 61    if( strchr(zCa
20b0: 70 2c 20 27 63 27 29 20 29 20 6f 61 63 20 3d 20  p, 'c') ) oac = 
20c0: 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20  " checked";.    
20d0: 69 66 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c  if( strchr(zCap,
20e0: 20 27 64 27 29 20 29 20 6f 61 64 20 3d 20 22 20   'd') ) oad = " 
20f0: 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66  checked";.    if
2100: 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27  ( strchr(zCap, '
2110: 66 27 29 20 29 20 6f 61 66 20 3d 20 22 20 63 68  f') ) oaf = " ch
2120: 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20  ecked";.    if( 
2130: 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27 67 27  strchr(zCap, 'g'
2140: 29 20 29 20 6f 61 67 20 3d 20 22 20 63 68 65 63  ) ) oag = " chec
2150: 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74  ked";.    if( st
2160: 72 63 68 72 28 7a 43 61 70 2c 20 27 68 27 29 20  rchr(zCap, 'h') 
2170: 29 20 6f 61 68 20 3d 20 22 20 63 68 65 63 6b 65  ) oah = " checke
2180: 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  d";.    if( strc
2190: 68 72 28 7a 43 61 70 2c 20 27 69 27 29 20 29 20  hr(zCap, 'i') ) 
21a0: 6f 61 69 20 3d 20 22 20 63 68 65 63 6b 65 64 22  oai = " checked"
21b0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72  ;.    if( strchr
21c0: 28 7a 43 61 70 2c 20 27 6a 27 29 20 29 20 6f 61  (zCap, 'j') ) oa
21d0: 6a 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a  j = " checked";.
21e0: 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a      if( strchr(z
21f0: 43 61 70 2c 20 27 6b 27 29 20 29 20 6f 61 6b 20  Cap, 'k') ) oak 
2200: 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20  = " checked";.  
2210: 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 43 61    if( strchr(zCa
2220: 70 2c 20 27 6d 27 29 20 29 20 6f 61 6d 20 3d 20  p, 'm') ) oam = 
2230: 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20  " checked";.    
2240: 69 66 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c  if( strchr(zCap,
2250: 20 27 6e 27 29 20 29 20 6f 61 6e 20 3d 20 22 20   'n') ) oan = " 
2260: 63 68 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66  checked";.    if
2270: 28 20 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27  ( strchr(zCap, '
2280: 6f 27 29 20 29 20 6f 61 6f 20 3d 20 22 20 63 68  o') ) oao = " ch
2290: 65 63 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20  ecked";.    if( 
22a0: 73 74 72 63 68 72 28 7a 43 61 70 2c 20 27 70 27  strchr(zCap, 'p'
22b0: 29 20 29 20 6f 61 70 20 3d 20 22 20 63 68 65 63  ) ) oap = " chec
22c0: 6b 65 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74  ked";.    if( st
22d0: 72 63 68 72 28 7a 43 61 70 2c 20 27 71 27 29 20  rchr(zCap, 'q') 
22e0: 29 20 6f 61 71 20 3d 20 22 20 63 68 65 63 6b 65  ) oaq = " checke
22f0: 64 22 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  d";.    if( strc
2300: 68 72 28 7a 43 61 70 2c 20 27 72 27 29 20 29 20  hr(zCap, 'r') ) 
2310: 6f 61 72 20 3d 20 22 20 63 68 65 63 6b 65 64 22  oar = " checked"
2320: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72  ;.    if( strchr
2330: 28 7a 43 61 70 2c 20 27 73 27 29 20 29 20 6f 61  (zCap, 's') ) oa
2340: 73 20 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a  s = " checked";.
2350: 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a      if( strchr(z
2360: 43 61 70 2c 20 27 77 27 29 20 29 20 6f 61 77 20  Cap, 'w') ) oaw 
2370: 3d 20 22 20 63 68 65 63 6b 65 64 22 3b 0a 20 20  = " checked";.  
2380: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
2390: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 70 61 67  nerating the pag
23a0: 65 0a 20 20 2a 2f 0a 20 20 73 74 79 6c 65 5f 73  e.  */.  style_s
23b0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
23c0: 43 61 6e 63 65 6c 22 2c 20 22 43 61 6e 63 65 6c  Cancel", "Cancel
23d0: 22 2c 20 22 73 65 74 75 70 5f 75 6c 69 73 74 22  ", "setup_ulist"
23e0: 29 3b 0a 20 20 69 66 28 20 75 69 64 20 29 7b 0a  );.  if( uid ){.
23f0: 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72      style_header
2400: 28 6d 70 72 69 6e 74 66 28 22 45 64 69 74 20 55  (mprintf("Edit U
2410: 73 65 72 20 25 68 22 2c 20 7a 4c 6f 67 69 6e 29  ser %h", zLogin)
2420: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2430: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 41 64  style_header("Ad
2440: 64 20 41 20 4e 65 77 20 55 73 65 72 22 29 3b 0a  d A New User");.
2450: 20 20 7d 0a 20 20 40 20 3c 74 61 62 6c 65 20 61    }.  @ <table a
2460: 6c 69 67 6e 3d 22 6c 65 66 74 22 20 68 73 70 61  lign="left" hspa
2470: 63 65 3d 22 32 30 22 20 76 73 70 61 63 65 3d 22  ce="20" vspace="
2480: 31 30 22 3e 3c 74 72 3e 3c 74 64 3e 0a 20 20 40  10"><tr><td>.  @
2490: 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25   <form action="%
24a0: 73 28 67 2e 7a 50 61 74 68 29 22 20 6d 65 74 68  s(g.zPath)" meth
24b0: 6f 64 3d 22 50 4f 53 54 22 3e 0a 20 20 40 20 3c  od="POST">.  @ <
24c0: 74 61 62 6c 65 3e 0a 20 20 40 20 3c 74 72 3e 0a  table>.  @ <tr>.
24d0: 20 20 40 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d    @   <td align=
24e0: 22 72 69 67 68 74 22 3e 3c 6e 6f 62 72 3e 55 73  "right"><nobr>Us
24f0: 65 72 20 49 44 3a 3c 2f 6e 6f 62 72 3e 3c 2f 74  er ID:</nobr></t
2500: 64 3e 0a 20 20 69 66 28 20 75 69 64 20 29 7b 0a  d>.  if( uid ){.
2510: 20 20 20 20 40 20 20 20 3c 74 64 3e 25 64 28 75      @   <td>%d(u
2520: 69 64 29 20 3c 69 6e 70 75 74 20 74 79 70 65 3d  id) <input type=
2530: 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 69  "hidden" name="i
2540: 64 22 20 76 61 6c 75 65 3d 22 25 64 28 75 69 64  d" value="%d(uid
2550: 29 22 3e 3c 2f 74 64 3e 0a 20 20 7d 65 6c 73 65  )"></td>.  }else
2560: 7b 0a 20 20 20 20 40 20 20 20 3c 74 64 3e 28 6e  {.    @   <td>(n
2570: 65 77 20 75 73 65 72 29 3c 69 6e 70 75 74 20 74  ew user)<input t
2580: 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d  ype="hidden" nam
2590: 65 3d 22 69 64 22 20 76 61 6c 75 65 3d 30 3e 3c  e="id" value=0><
25a0: 2f 74 64 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /td>.  }.  @ </t
25b0: 72 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 20  r>.  @ <tr>.  @ 
25c0: 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67    <td align="rig
25d0: 68 74 22 3e 3c 6e 6f 62 72 3e 4c 6f 67 69 6e 3a  ht"><nobr>Login:
25e0: 3c 2f 6e 6f 62 72 3e 3c 2f 74 64 3e 0a 20 20 40  </nobr></td>.  @
25f0: 20 20 20 3c 74 64 3e 3c 69 6e 70 75 74 20 74 79     <td><input ty
2600: 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22  pe="text" name="
2610: 6c 6f 67 69 6e 22 20 76 61 6c 75 65 3d 22 25 68  login" value="%h
2620: 28 7a 4c 6f 67 69 6e 29 22 3e 3c 2f 74 64 3e 0a  (zLogin)"></td>.
2630: 20 20 40 20 3c 2f 74 72 3e 0a 20 20 40 20 3c 74    @ </tr>.  @ <t
2640: 72 3e 0a 20 20 40 20 20 20 3c 74 64 20 61 6c 69  r>.  @   <td ali
2650: 67 6e 3d 22 72 69 67 68 74 22 3e 3c 6e 6f 62 72  gn="right"><nobr
2660: 3e 43 6f 6e 74 61 63 74 26 6e 62 73 70 3b 49 6e  >Contact&nbsp;In
2670: 66 6f 3a 3c 2f 6e 6f 62 72 3e 3c 2f 74 64 3e 0a  fo:</nobr></td>.
2680: 20 20 40 20 20 20 3c 74 64 3e 3c 69 6e 70 75 74    @   <td><input
2690: 20 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d   type="text" nam
26a0: 65 3d 22 69 6e 66 6f 22 20 73 69 7a 65 3d 34 30  e="info" size=40
26b0: 20 76 61 6c 75 65 3d 22 25 68 28 7a 49 6e 66 6f   value="%h(zInfo
26c0: 29 22 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 2f 74  )"></td>.  @ </t
26d0: 72 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20 40 20  r>.  @ <tr>.  @ 
26e0: 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67    <td align="rig
26f0: 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  ht" valign="top"
2700: 3e 43 61 70 61 62 69 6c 69 74 69 65 73 3a 3c 2f  >Capabilities:</
2710: 74 64 3e 0a 20 20 40 20 20 20 3c 74 64 3e 0a 20  td>.  @   <td>. 
2720: 20 69 66 28 20 67 2e 6f 6b 53 65 74 75 70 20 29   if( g.okSetup )
2730: 7b 0a 20 20 20 20 40 20 20 20 20 20 3c 69 6e 70  {.    @     <inp
2740: 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f  ut type="checkbo
2750: 78 22 20 6e 61 6d 65 3d 22 61 73 22 25 73 28 6f  x" name="as"%s(o
2760: 61 73 29 3e 53 65 74 75 70 3c 2f 69 6e 70 75 74  as)>Setup</input
2770: 3e 3c 62 72 3e 0a 20 20 7d 0a 20 20 40 20 20 20  ><br>.  }.  @   
2780: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63    <input type="c
2790: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61  heckbox" name="a
27a0: 61 22 25 73 28 6f 61 61 29 3e 41 64 6d 69 6e 3c  a"%s(oaa)>Admin<
27b0: 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20  /input><br>.  @ 
27c0: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
27d0: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
27e0: 22 61 64 22 25 73 28 6f 61 64 29 3e 44 65 6c 65  "ad"%s(oad)>Dele
27f0: 74 65 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20  te</input><br>. 
2800: 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79   @     <input ty
2810: 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61  pe="checkbox" na
2820: 6d 65 3d 22 61 70 22 25 73 28 6f 61 70 29 3e 50  me="ap"%s(oap)>P
2830: 61 73 73 77 6f 72 64 3c 2f 69 6e 70 75 74 3e 3c  assword</input><
2840: 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e 70  br>.  @     <inp
2850: 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f  ut type="checkbo
2860: 78 22 20 6e 61 6d 65 3d 22 61 71 22 25 73 28 6f  x" name="aq"%s(o
2870: 61 71 29 3e 51 75 65 72 79 3c 2f 69 6e 70 75 74  aq)>Query</input
2880: 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69  ><br>.  @     <i
2890: 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b  nput type="check
28a0: 62 6f 78 22 20 6e 61 6d 65 3d 22 61 69 22 25 73  box" name="ai"%s
28b0: 28 6f 61 69 29 3e 43 68 65 63 6b 2d 49 6e 3c 2f  (oai)>Check-In</
28c0: 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20  input><br>.  @  
28d0: 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22     <input type="
28e0: 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22  checkbox" name="
28f0: 61 6f 22 25 73 28 6f 61 6f 29 3e 43 68 65 63 6b  ao"%s(oao)>Check
2900: 2d 4f 75 74 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e  -Out</input><br>
2910: 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20  .  @     <input 
2920: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
2930: 6e 61 6d 65 3d 22 61 68 22 25 73 28 6f 61 68 29  name="ah"%s(oah)
2940: 3e 48 69 73 74 6f 72 79 3c 2f 69 6e 70 75 74 3e  >History</input>
2950: 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e  <br>.  @     <in
2960: 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62  put type="checkb
2970: 6f 78 22 20 6e 61 6d 65 3d 22 61 67 22 25 73 28  ox" name="ag"%s(
2980: 6f 61 67 29 3e 43 6c 6f 6e 65 3c 2f 69 6e 70 75  oag)>Clone</inpu
2990: 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c  t><br>.  @     <
29a0: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
29b0: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61 6a 22 25  kbox" name="aj"%
29c0: 73 28 6f 61 6a 29 3e 52 65 61 64 20 57 69 6b 69  s(oaj)>Read Wiki
29d0: 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40  </input><br>.  @
29e0: 20 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65       <input type
29f0: 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65  ="checkbox" name
2a00: 3d 22 61 66 22 25 73 28 6f 61 66 29 3e 4e 65 77  ="af"%s(oaf)>New
2a10: 20 57 69 6b 69 3c 2f 69 6e 70 75 74 3e 3c 62 72   Wiki</input><br
2a20: 3e 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74  >.  @     <input
2a30: 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
2a40: 20 6e 61 6d 65 3d 22 61 6d 22 25 73 28 6f 61 6d   name="am"%s(oam
2a50: 29 3e 41 70 70 65 6e 64 20 57 69 6b 69 3c 2f 69  )>Append Wiki</i
2a60: 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20  nput><br>.  @   
2a70: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63    <input type="c
2a80: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61  heckbox" name="a
2a90: 6b 22 25 73 28 6f 61 6b 29 3e 57 72 69 74 65 20  k"%s(oak)>Write 
2aa0: 57 69 6b 69 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e  Wiki</input><br>
2ab0: 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20  .  @     <input 
2ac0: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
2ad0: 6e 61 6d 65 3d 22 61 72 22 25 73 28 6f 61 72 29  name="ar"%s(oar)
2ae0: 3e 52 65 61 64 20 54 6b 74 3c 2f 69 6e 70 75 74  >Read Tkt</input
2af0: 3e 3c 62 72 3e 0a 20 20 40 20 20 20 20 20 3c 69  ><br>.  @     <i
2b00: 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b  nput type="check
2b10: 62 6f 78 22 20 6e 61 6d 65 3d 22 61 6e 22 25 73  box" name="an"%s
2b20: 28 6f 61 6e 29 3e 4e 65 77 20 54 6b 74 3c 2f 69  (oan)>New Tkt</i
2b30: 6e 70 75 74 3e 3c 62 72 3e 0a 20 20 40 20 20 20  nput><br>.  @   
2b40: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63    <input type="c
2b50: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 61  heckbox" name="a
2b60: 63 22 25 73 28 6f 61 63 29 3e 41 70 70 65 6e 64  c"%s(oac)>Append
2b70: 20 54 6b 74 3c 2f 69 6e 70 75 74 3e 3c 62 72 3e   Tkt</input><br>
2b80: 0a 20 20 40 20 20 20 20 20 3c 69 6e 70 75 74 20  .  @     <input 
2b90: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
2ba0: 6e 61 6d 65 3d 22 61 77 22 25 73 28 6f 61 77 29  name="aw"%s(oaw)
2bb0: 3e 57 72 69 74 65 20 54 6b 74 3c 2f 69 6e 70 75  >Write Tkt</inpu
2bc0: 74 3e 0a 20 20 40 20 20 20 3c 2f 74 64 3e 0a 20  t>.  @   </td>. 
2bd0: 20 40 20 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72   @ </tr>.  @ <tr
2be0: 3e 0a 20 20 40 20 20 20 3c 74 64 20 61 6c 69 67  >.  @   <td alig
2bf0: 6e 3d 22 72 69 67 68 74 22 3e 50 61 73 73 77 6f  n="right">Passwo
2c00: 72 64 3a 3c 2f 74 64 3e 0a 20 20 40 20 20 20 3c  rd:</td>.  @   <
2c10: 74 64 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22  td><input type="
2c20: 70 61 73 73 77 6f 72 64 22 20 6e 61 6d 65 3d 22  password" name="
2c30: 70 77 22 20 76 61 6c 75 65 3d 22 22 3e 3c 2f 74  pw" value=""></t
2c40: 64 3e 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20 69  d>.  @ </tr>.  i
2c50: 66 28 20 21 68 69 67 68 65 72 55 73 65 72 20 29  f( !higherUser )
2c60: 7b 0a 20 20 20 20 40 20 3c 74 72 3e 0a 20 20 20  {.    @ <tr>.   
2c70: 20 40 20 20 20 3c 74 64 3e 26 6e 62 73 70 3c 2f   @   <td>&nbsp</
2c80: 74 64 3e 0a 20 20 20 20 40 20 20 20 3c 74 64 3e  td>.    @   <td>
2c90: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
2ca0: 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d 69  mit" name="submi
2cb0: 74 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20  t" value="Apply 
2cc0: 43 68 61 6e 67 65 73 22 3e 0a 20 20 20 20 40 20  Changes">.    @ 
2cd0: 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f  </tr>.  }.  @ </
2ce0: 74 61 62 6c 65 3e 3c 2f 74 64 3e 3c 2f 74 72 3e  table></td></tr>
2cf0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 70 3e  </table>.  @ <p>
2d00: 3c 62 3e 4e 6f 74 65 73 3a 3c 2f 62 3e 3c 2f 70  <b>Notes:</b></p
2d10: 3e 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 69 66 28  >.  @ <ol>.  if(
2d20: 20 68 69 67 68 65 72 55 73 65 72 20 29 7b 0a 20   higherUser ){. 
2d30: 20 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20     @ <li><p>.   
2d40: 20 40 20 55 73 65 72 20 25 68 28 7a 49 64 29 20   @ User %h(zId) 
2d50: 68 61 73 20 53 65 74 75 70 20 70 72 69 76 69 6c  has Setup privil
2d60: 65 67 65 73 20 61 6e 64 20 79 6f 75 20 6f 6e 6c  eges and you onl
2d70: 79 20 68 61 76 65 20 41 64 6d 69 6e 20 70 72 69  y have Admin pri
2d80: 76 69 6c 65 67 65 73 0a 20 20 20 20 40 20 73 6f  vileges.    @ so
2d90: 20 79 6f 75 20 61 72 65 20 6e 6f 74 20 70 65 72   you are not per
2da0: 6d 69 74 74 65 64 20 74 6f 20 6d 61 6b 65 20 63  mitted to make c
2db0: 68 61 6e 67 65 73 20 74 6f 20 25 68 28 7a 49 64  hanges to %h(zId
2dc0: 29 2e 0a 20 20 20 20 40 20 3c 2f 70 3e 3c 2f 6c  )..    @ </p></l
2dd0: 69 3e 0a 20 20 20 20 40 0a 20 20 7d 0a 20 20 40  i>.    @.  }.  @
2de0: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40  .  @ <li><p>.  @
2df0: 20 54 68 65 20 3c 62 3e 44 65 6c 65 74 65 3c 2f   The <b>Delete</
2e00: 62 3e 20 70 72 69 76 69 6c 65 67 65 20 67 69 76  b> privilege giv
2e10: 65 20 74 68 65 20 75 73 65 72 20 74 68 65 20 61  e the user the a
2e20: 62 69 6c 69 74 79 20 74 6f 20 65 72 61 73 65 0a  bility to erase.
2e30: 20 20 40 20 77 69 6b 69 2c 20 74 69 63 6b 65 74    @ wiki, ticket
2e40: 73 2c 20 61 6e 64 20 61 74 74 74 61 63 68 6d 65  s, and atttachme
2e50: 6e 74 73 20 74 68 61 74 20 68 61 76 65 20 62 65  nts that have be
2e60: 65 6e 20 61 64 64 65 64 20 62 79 20 61 6e 6f 6e  en added by anon
2e70: 79 6d 6f 75 73 0a 20 20 40 20 75 73 65 72 73 2e  ymous.  @ users.
2e80: 20 20 54 68 69 73 20 63 61 70 61 62 69 6c 69 74    This capabilit
2e90: 79 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  y is intended fo
2ea0: 72 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 73 70  r deletion of sp
2eb0: 61 6d 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69  am..  @ </p></li
2ec0: 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70  >.  @.  @ <li><p
2ed0: 3e 0a 20 20 40 20 54 68 65 20 3c 62 3e 51 75 65  >.  @ The <b>Que
2ee0: 72 79 3c 2f 62 3e 20 70 72 69 76 69 6c 65 67 65  ry</b> privilege
2ef0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 75 73 65 72   allows the user
2f00: 20 74 6f 20 63 72 65 61 74 65 20 6f 72 20 65 64   to create or ed
2f10: 69 74 0a 20 20 40 20 72 65 70 6f 72 74 20 66 6f  it.  @ report fo
2f20: 72 6d 61 74 73 20 62 79 20 73 70 65 63 69 66 79  rmats by specify
2f30: 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 20  ing appropriate 
2f40: 53 51 4c 2e 20 20 55 73 65 72 73 20 63 61 6e 20  SQL.  Users can 
2f50: 72 75 6e 0a 20 20 40 20 65 78 69 73 74 69 6e 67  run.  @ existing
2f60: 20 72 65 70 6f 72 74 73 20 77 69 74 68 6f 75 74   reports without
2f70: 20 74 68 65 20 51 75 65 72 79 20 70 72 69 76 69   the Query privi
2f80: 6c 65 67 65 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f  lege..  @ </p></
2f90: 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e  li>.  @.  @ <li>
2fa0: 3c 70 3e 0a 20 20 40 20 41 6e 20 3c 62 3e 41 64  <p>.  @ An <b>Ad
2fb0: 6d 69 6e 3c 2f 62 3e 20 75 73 65 72 20 63 61 6e  min</b> user can
2fc0: 20 61 64 64 20 6f 74 68 65 72 20 75 73 65 72 73   add other users
2fd0: 2c 20 63 72 65 61 74 65 20 6e 65 77 20 74 69 63  , create new tic
2fe0: 6b 65 74 20 72 65 70 6f 72 74 0a 20 20 40 20 66  ket report.  @ f
2ff0: 6f 72 6d 61 74 73 2c 20 61 6e 64 20 63 68 61 6e  ormats, and chan
3000: 67 65 20 73 79 73 74 65 6d 20 64 65 66 61 75 6c  ge system defaul
3010: 74 73 2e 20 20 42 75 74 20 6f 6e 6c 79 20 74 68  ts.  But only th
3020: 65 20 3c 62 3e 53 65 74 75 70 3c 2f 62 3e 20 75  e <b>Setup</b> u
3030: 73 65 72 0a 20 20 40 20 69 73 20 61 62 6c 65 20  ser.  @ is able 
3040: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 72 65  to change the re
3050: 70 6f 73 69 74 6f 72 79 20 74 6f 0a 20 20 40 20  pository to.  @ 
3060: 77 68 69 63 68 20 74 68 69 73 20 70 72 6f 67 72  which this progr
3070: 61 6d 20 69 73 20 6c 69 6e 6b 65 64 2e 0a 20 20  am is linked..  
3080: 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  @ </p></li>.  @.
3090: 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20    @ <li><p>.  @ 
30a0: 54 68 65 20 3c 62 3e 48 69 73 74 6f 72 79 3c 2f  The <b>History</
30b0: 62 3e 20 70 72 69 76 69 6c 65 67 65 20 61 6c 6c  b> privilege all
30c0: 6f 77 73 20 61 20 75 73 65 72 20 74 6f 20 73 65  ows a user to se
30d0: 65 20 61 20 74 69 6d 65 6c 69 6e 65 0a 20 20 40  e a timeline.  @
30e0: 20 77 69 74 68 20 68 79 70 65 72 6c 69 6e 6b 73   with hyperlinks
30f0: 20 74 6f 20 76 65 72 73 69 6f 6e 20 69 6e 66 6f   to version info
3100: 72 6d 61 74 69 6f 6e 2c 20 74 6f 20 64 6f 77 6e  rmation, to down
3110: 6c 6f 61 64 20 5a 49 50 20 61 72 63 68 69 76 65  load ZIP archive
3120: 73 0a 20 20 40 20 6f 66 20 69 6e 64 69 76 69 64  s.  @ of individ
3130: 75 61 6c 20 76 65 72 73 69 6f 6e 73 2e 0a 20 20  ual versions..  
3140: 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  @ </p></li>.  @.
3150: 20 20 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20    @ <li><p>.  @ 
3160: 4e 6f 20 6c 6f 67 69 6e 20 69 73 20 72 65 71 75  No login is requ
3170: 69 72 65 64 20 66 6f 72 20 75 73 65 72 20 22 3c  ired for user "<
3180: 62 3e 6e 6f 62 6f 64 79 3c 2f 62 3e 22 2e 20 20  b>nobody</b>".  
3190: 54 68 65 20 63 61 70 61 62 69 6c 69 74 69 65 73  The capabilities
31a0: 0a 20 20 40 20 6f 66 20 74 68 69 73 20 75 73 65  .  @ of this use
31b0: 72 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  r are available 
31c0: 74 6f 20 61 6e 79 6f 6e 65 20 77 69 74 68 6f 75  to anyone withou
31d0: 74 20 73 75 70 70 6c 79 69 6e 67 20 61 20 75 73  t supplying a us
31e0: 65 72 6e 61 6d 65 20 6f 72 0a 20 20 40 20 70 61  ername or.  @ pa
31f0: 73 73 77 6f 72 64 2e 20 20 54 6f 20 64 69 73 61  ssword.  To disa
3200: 62 6c 65 20 6e 6f 62 6f 64 79 20 61 63 63 65 73  ble nobody acces
3210: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  s, make sure the
3220: 72 65 20 69 73 20 6e 6f 20 75 73 65 72 0a 20 20  re is no user.  
3230: 40 20 77 69 74 68 20 61 6e 20 49 44 20 6f 66 20  @ with an ID of 
3240: 3c 62 3e 6e 6f 62 6f 64 79 3c 2f 62 3e 20 6f 72  <b>nobody</b> or
3250: 20 74 68 61 74 20 74 68 65 20 6e 6f 62 6f 64 79   that the nobody
3260: 20 75 73 65 72 20 68 61 73 20 6e 6f 0a 20 20 40   user has no.  @
3270: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 65 6e   capabilities en
3280: 61 62 6c 65 64 2e 20 20 54 68 65 20 70 61 73 73  abled.  The pass
3290: 77 6f 72 64 20 66 6f 72 20 6e 6f 62 6f 64 79 20  word for nobody 
32a0: 69 73 20 69 67 6e 6f 72 65 2e 20 20 54 6f 0a 20  is ignore.  To. 
32b0: 20 40 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d   @ avoid problem
32c0: 73 20 77 69 74 68 20 73 70 69 64 65 72 73 20 6f  s with spiders o
32d0: 76 65 72 6c 6f 61 64 69 6e 67 20 74 68 65 20 73  verloading the s
32e0: 65 72 76 65 72 2c 20 69 74 20 69 73 20 73 75 67  erver, it is sug
32f0: 67 65 73 74 65 64 0a 20 20 40 20 74 68 61 74 20  gested.  @ that 
3300: 74 68 65 20 27 68 27 20 28 48 69 73 74 6f 72 79  the 'h' (History
3310: 29 20 63 61 70 61 62 69 6c 69 74 79 20 62 65 20  ) capability be 
3320: 74 75 72 6e 65 64 20 6f 66 66 20 66 6f 72 20 75  turned off for u
3330: 73 65 72 20 6e 6f 62 6f 64 79 2e 0a 20 20 40 20  ser nobody..  @ 
3340: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20  </p></li>.  @.  
3350: 40 20 3c 6c 69 3e 3c 70 3e 0a 20 20 40 20 4c 6f  @ <li><p>.  @ Lo
3360: 67 69 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  gin is required 
3370: 66 6f 72 20 75 73 65 72 20 22 3c 62 3e 61 6e 6f  for user "<b>ano
3380: 6e 79 6d 6f 75 73 3c 2f 62 3e 22 20 62 75 74 20  nymous</b>" but 
3390: 74 68 65 20 70 61 73 73 77 6f 72 64 0a 20 20 40  the password.  @
33a0: 20 69 73 20 64 69 73 70 6c 61 79 65 64 20 6f 6e   is displayed on
33b0: 20 74 68 65 20 6c 6f 67 69 6e 20 73 63 72 65 65   the login scree
33c0: 6e 20 62 65 73 69 64 65 20 74 68 65 20 70 61 73  n beside the pas
33d0: 73 77 6f 72 64 20 65 6e 74 72 79 20 62 6f 78 0a  sword entry box.
33e0: 20 20 40 20 73 6f 20 61 6e 79 62 6f 64 79 20 77    @ so anybody w
33f0: 68 6f 20 63 61 6e 20 72 65 61 64 20 73 68 6f 75  ho can read shou
3400: 6c 64 20 62 65 20 61 62 6c 65 20 74 6f 20 6c 6f  ld be able to lo
3410: 67 69 6e 20 61 73 20 61 6e 6f 6e 79 6d 6f 75 73  gin as anonymous
3420: 2e 0a 20 20 40 20 4f 6e 20 74 68 65 20 6f 74 68  ..  @ On the oth
3430: 65 72 20 68 61 6e 64 2c 20 73 70 69 64 65 72 73  er hand, spiders
3440: 20 61 6e 64 20 77 65 62 2d 63 72 61 77 6c 65 72   and web-crawler
3450: 73 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79  s will typically
3460: 20 6e 6f 74 0a 20 20 40 20 62 65 20 61 62 6c 65   not.  @ be able
3470: 20 74 6f 20 6c 6f 67 69 6e 2e 20 20 53 65 74 20   to login.  Set 
3480: 74 68 65 20 63 61 70 61 62 69 6c 69 74 69 65 73  the capabilities
3490: 20 6f 66 20 74 68 65 20 61 6e 6f 6e 79 6d 6f 75   of the anonymou
34a0: 73 20 75 73 65 72 0a 20 20 40 20 74 6f 20 74 68  s user.  @ to th
34b0: 69 6e 67 73 20 74 68 61 74 20 79 6f 75 20 77 61  ings that you wa
34c0: 6e 74 20 61 6e 79 20 68 75 6d 61 6e 20 74 6f 20  nt any human to 
34d0: 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2c 20 62  be able to do, b
34e0: 75 74 20 6e 6f 20 61 6e 79 0a 20 20 40 20 73 70  ut no any.  @ sp
34f0: 69 64 65 72 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f  ider..  @ </p></
3500: 6c 69 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a  li>.  @ </form>.
3510: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
3520: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
3530: 72 61 74 65 20 61 20 63 68 65 63 6b 62 6f 78 20  rate a checkbox 
3540: 66 6f 72 20 61 6e 20 61 74 74 72 69 62 75 74 65  for an attribute
3550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3560: 20 6f 6e 6f 66 66 5f 61 74 74 72 69 62 75 74 65   onoff_attribute
3570: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
3580: 7a 4c 61 62 65 6c 2c 20 20 20 2f 2a 20 54 68 65  zLabel,   /* The
3590: 20 74 65 78 74 20 6c 61 62 65 6c 20 6f 6e 20 74   text label on t
35a0: 68 65 20 63 68 65 63 6b 62 6f 78 20 2a 2f 0a 20  he checkbox */. 
35b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
35c0: 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  r,     /* The co
35d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 20  rresponding row 
35e0: 69 6e 20 74 68 65 20 56 41 52 20 74 61 62 6c 65  in the VAR table
35f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3600: 20 2a 7a 51 50 61 72 6d 2c 20 20 20 2f 2a 20 54   *zQParm,   /* T
3610: 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
3620: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 66 6c 74  er */.  int dflt
3630: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
3640: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69   Default value i
3650: 66 20 56 41 52 20 74 61 62 6c 65 20 65 6e 74 72  f VAR table entr
3660: 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  y does not exist
3670: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
3680: 68 61 72 20 2a 7a 56 61 6c 20 3d 20 64 62 5f 67  har *zVal = db_g
3690: 65 74 28 7a 56 61 72 2c 20 30 29 3b 0a 20 20 63  et(zVar, 0);.  c
36a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 20 3d 20  onst char *zQ = 
36b0: 50 28 7a 51 50 61 72 6d 29 3b 0a 20 20 69 6e 74  P(zQParm);.  int
36c0: 20 69 56 61 6c 3b 0a 20 20 69 66 28 20 7a 56 61   iVal;.  if( zVa
36d0: 6c 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20  l ){.    iVal = 
36e0: 61 74 6f 69 28 7a 56 61 6c 29 3b 0a 20 20 7d 65  atoi(zVal);.  }e
36f0: 6c 73 65 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20  lse{.    iVal = 
3700: 64 66 6c 74 56 61 6c 3b 0a 20 20 7d 0a 20 20 69  dfltVal;.  }.  i
3710: 66 28 20 7a 51 3d 3d 30 20 26 26 20 50 28 22 73  f( zQ==0 && P("s
3720: 75 62 6d 69 74 22 29 20 29 7b 0a 20 20 20 20 7a  ubmit") ){.    z
3730: 51 20 3d 20 22 6f 66 66 22 3b 0a 20 20 7d 0a 20  Q = "off";.  }. 
3740: 20 69 66 28 20 7a 51 20 29 7b 0a 20 20 20 20 69   if( zQ ){.    i
3750: 6e 74 20 69 51 20 3d 20 73 74 72 63 6d 70 28 7a  nt iQ = strcmp(z
3760: 51 2c 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 61 74  Q,"on")==0 || at
3770: 6f 69 28 7a 51 29 3b 0a 20 20 20 20 69 66 28 20  oi(zQ);.    if( 
3780: 69 51 21 3d 69 56 61 6c 20 29 7b 0a 20 20 20 20  iQ!=iVal ){.    
3790: 20 20 64 62 5f 73 65 74 28 7a 56 61 72 2c 20 69    db_set(zVar, i
37a0: 51 20 3f 20 22 31 22 20 3a 20 22 30 22 2c 20 30  Q ? "1" : "0", 0
37b0: 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  );.      iVal = 
37c0: 69 51 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  iQ;.    }.  }.  
37d0: 69 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20  if( iVal ){.    
37e0: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63  @ <input type="c
37f0: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 25  heckbox" name="%
3800: 73 28 7a 51 50 61 72 6d 29 22 20 63 68 65 63 6b  s(zQParm)" check
3810: 65 64 3e 25 73 28 7a 4c 61 62 65 6c 29 3c 2f 69  ed>%s(zLabel)</i
3820: 6e 70 75 74 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20  nput>.  }else{. 
3830: 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65     @ <input type
3840: 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65  ="checkbox" name
3850: 3d 22 25 73 28 7a 51 50 61 72 6d 29 22 3e 25 73  ="%s(zQParm)">%s
3860: 28 7a 4c 61 62 65 6c 29 3c 2f 69 6e 70 75 74 3e  (zLabel)</input>
3870: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
3880: 6e 65 72 61 74 65 20 61 6e 20 65 6e 74 72 79 20  nerate an entry 
3890: 62 6f 78 20 66 6f 72 20 61 6e 20 61 74 74 72 69  box for an attri
38a0: 62 75 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bute..*/.static 
38b0: 76 6f 69 64 20 65 6e 74 72 79 5f 61 74 74 72 69  void entry_attri
38c0: 62 75 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  bute(.  const ch
38d0: 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 2f 2a  ar *zLabel,   /*
38e0: 20 54 68 65 20 74 65 78 74 20 6c 61 62 65 6c 20   The text label 
38f0: 6f 6e 20 74 68 65 20 65 6e 74 72 79 20 62 6f 78  on the entry box
3900: 20 2a 2f 0a 20 20 69 6e 74 20 77 69 64 74 68 2c   */.  int width,
3910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
3920: 69 64 74 68 20 6f 66 20 74 68 65 20 65 6e 74 72  idth of the entr
3930: 79 20 62 6f 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  y box */.  const
3940: 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 20 20 20   char *zVar,    
3950: 20 2f 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f   /* The correspo
3960: 6e 64 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65  nding row in the
3970: 20 56 41 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20   VAR table */.  
3980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 61  const char *zQPa
3990: 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 71 75 65  rm,   /* The que
39a0: 72 79 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ry parameter */.
39b0: 20 20 63 68 61 72 20 2a 7a 44 66 6c 74 20 20 20    char *zDflt   
39c0: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c    /* Default val
39d0: 75 65 20 69 66 20 56 41 52 20 74 61 62 6c 65 20  ue if VAR table 
39e0: 65 6e 74 72 79 20 64 6f 65 73 20 6e 6f 74 20 65  entry does not e
39f0: 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  xist */.){.  con
3a00: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  st char *zVal = 
3a10: 64 62 5f 67 65 74 28 7a 56 61 72 2c 20 7a 44 66  db_get(zVar, zDf
3a20: 6c 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lt);.  const cha
3a30: 72 20 2a 7a 51 20 3d 20 50 28 7a 51 50 61 72 6d  r *zQ = P(zQParm
3a40: 29 3b 0a 20 20 69 66 28 20 7a 51 20 26 26 20 73  );.  if( zQ && s
3a50: 74 72 63 6d 70 28 7a 51 2c 7a 56 61 6c 29 21 3d  trcmp(zQ,zVal)!=
3a60: 30 20 29 7b 0a 20 20 20 20 64 62 5f 73 65 74 28  0 ){.    db_set(
3a70: 7a 56 61 72 2c 20 7a 51 2c 20 30 29 3b 0a 20 20  zVar, zQ, 0);.  
3a80: 20 20 7a 56 61 6c 20 3d 20 7a 51 3b 0a 20 20 7d    zVal = zQ;.  }
3a90: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
3aa0: 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 25 73  ="text" name="%s
3ab0: 28 7a 51 50 61 72 6d 29 22 20 76 61 6c 75 65 3d  (zQParm)" value=
3ac0: 22 25 68 28 7a 56 61 6c 29 22 20 73 69 7a 65 3d  "%h(zVal)" size=
3ad0: 22 25 64 28 77 69 64 74 68 29 22 3e 0a 20 20 40  "%d(width)">.  @
3ae0: 20 25 73 28 7a 4c 61 62 65 6c 29 0a 7d 0a 0a 2f   %s(zLabel).}../
3af0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
3b00: 74 65 78 74 20 62 6f 78 20 66 6f 72 20 61 6e 20  text box for an 
3b10: 61 74 74 72 69 62 75 74 65 2e 0a 2a 2f 0a 73 74  attribute..*/.st
3b20: 61 74 69 63 20 76 6f 69 64 20 74 65 78 74 61 72  atic void textar
3b30: 65 61 5f 61 74 74 72 69 62 75 74 65 28 0a 20 20  ea_attribute(.  
3b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
3b50: 65 6c 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 78  el,   /* The tex
3b60: 74 20 6c 61 62 65 6c 20 6f 6e 20 74 68 65 20 74  t label on the t
3b70: 65 78 74 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  extarea */.  int
3b80: 20 72 6f 77 73 2c 20 20 20 20 20 20 20 20 20 20   rows,          
3b90: 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68     /* Rows in th
3ba0: 65 20 74 65 78 74 61 72 65 61 20 2a 2f 0a 20 20  e textarea */.  
3bb0: 69 6e 74 20 63 6f 6c 73 2c 20 20 20 20 20 20 20  int cols,       
3bc0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
3bd0: 20 69 6e 20 74 68 65 20 74 65 78 74 61 72 65 61   in the textarea
3be0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3bf0: 20 2a 7a 56 61 72 2c 20 20 20 20 20 2f 2a 20 54   *zVar,     /* T
3c00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
3c10: 20 72 6f 77 20 69 6e 20 74 68 65 20 56 41 52 20   row in the VAR 
3c20: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
3c30: 20 63 68 61 72 20 2a 7a 51 50 61 72 6d 2c 20 20   char *zQParm,  
3c40: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 70 61   /* The query pa
3c50: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 63 68 61  rameter */.  cha
3c60: 72 20 2a 7a 44 66 6c 74 20 20 20 20 20 20 20 20  r *zDflt        
3c70: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61     /* Default va
3c80: 6c 75 65 20 69 66 20 56 41 52 20 74 61 62 6c 65  lue if VAR table
3c90: 20 65 6e 74 72 79 20 64 6f 65 73 20 6e 6f 74 20   entry does not 
3ca0: 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  exist */.){.  co
3cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
3cc0: 20 64 62 5f 67 65 74 28 7a 56 61 72 2c 20 7a 44   db_get(zVar, zD
3cd0: 66 6c 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  flt);.  const ch
3ce0: 61 72 20 2a 7a 51 20 3d 20 50 28 7a 51 50 61 72  ar *zQ = P(zQPar
3cf0: 6d 29 3b 0a 20 20 69 66 28 20 7a 51 20 26 26 20  m);.  if( zQ && 
3d00: 73 74 72 63 6d 70 28 7a 51 2c 7a 56 61 6c 29 21  strcmp(zQ,zVal)!
3d10: 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 73 65 74  =0 ){.    db_set
3d20: 28 7a 56 61 72 2c 20 7a 51 2c 20 30 29 3b 0a 20  (zVar, zQ, 0);. 
3d30: 20 20 20 7a 56 61 6c 20 3d 20 7a 51 3b 0a 20 20     zVal = zQ;.  
3d40: 7d 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61 20  }.  @ <textarea 
3d50: 6e 61 6d 65 3d 22 25 73 28 7a 51 50 61 72 6d 29  name="%s(zQParm)
3d60: 22 20 72 6f 77 73 3d 22 25 64 28 72 6f 77 73 29  " rows="%d(rows)
3d70: 22 20 63 6f 6c 73 3d 22 25 64 28 63 6f 6c 73 29  " cols="%d(cols)
3d80: 22 3e 25 68 28 7a 56 61 6c 29 3c 2f 74 65 78 74  ">%h(zVal)</text
3d90: 61 72 65 61 3e 0a 20 20 40 20 25 73 28 7a 4c 61  area>.  @ %s(zLa
3da0: 62 65 6c 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  bel).}.../*.** W
3db0: 45 42 50 41 47 45 3a 20 73 65 74 75 70 5f 61 63  EBPAGE: setup_ac
3dc0: 63 65 73 73 0a 2a 2f 0a 76 6f 69 64 20 73 65 74  cess.*/.void set
3dd0: 75 70 5f 61 63 63 65 73 73 28 76 6f 69 64 29 7b  up_access(void){
3de0: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
3df0: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
3e00: 69 66 28 20 21 67 2e 6f 6b 53 65 74 75 70 20 29  if( !g.okSetup )
3e10: 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64  {.    login_need
3e20: 65 64 28 29 3b 0a 20 20 7d 0a 0a 20 20 73 74 79  ed();.  }..  sty
3e30: 6c 65 5f 68 65 61 64 65 72 28 22 41 63 63 65 73  le_header("Acces
3e40: 73 20 43 6f 6e 74 72 6f 6c 20 53 65 74 74 69 6e  s Control Settin
3e50: 67 73 22 29 3b 0a 20 20 64 62 5f 62 65 67 69 6e  gs");.  db_begin
3e60: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
3e70: 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e    @ <form action
3e80: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
3e90: 2f 73 65 74 75 70 5f 61 63 63 65 73 73 22 20 6d  /setup_access" m
3ea0: 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e 0a 0a 20  ethod="POST">.. 
3eb0: 20 40 20 3c 68 72 3e 0a 20 20 6f 6e 6f 66 66 5f   @ <hr>.  onoff_
3ec0: 61 74 74 72 69 62 75 74 65 28 22 52 65 71 75 69  attribute("Requi
3ed0: 72 65 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20  re password for 
3ee0: 6c 6f 63 61 6c 20 61 63 63 65 73 73 22 2c 0a 20  local access",. 
3ef0: 20 20 20 20 22 6c 6f 63 61 6c 61 75 74 68 22 2c      "localauth",
3f00: 20 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 31 29   "localauth", 1)
3f10: 3b 0a 20 20 40 20 3c 70 3e 57 68 65 6e 20 65 6e  ;.  @ <p>When en
3f20: 61 62 6c 65 64 2c 20 74 68 65 20 70 61 73 73 77  abled, the passw
3f30: 6f 72 64 20 73 69 67 6e 2d 69 6e 20 69 73 20 72  ord sign-in is r
3f40: 65 71 75 69 72 65 64 20 66 6f 72 0a 20 20 40 20  equired for.  @ 
3f50: 77 65 62 20 61 63 63 65 73 73 20 63 6f 6d 69 6e  web access comin
3f60: 67 20 66 72 6f 6d 20 31 32 37 2e 30 2e 30 2e 31  g from 127.0.0.1
3f70: 2e 20 20 57 68 65 6e 20 64 69 73 61 62 6c 65 64  .  When disabled
3f80: 2c 20 77 65 62 20 61 63 63 65 73 73 0a 20 20 40  , web access.  @
3f90: 20 66 72 6f 6d 20 31 32 37 2e 30 2e 30 2e 31 20   from 127.0.0.1 
3fa0: 69 73 20 61 6c 6c 6f 77 73 20 77 69 74 68 6f 75  is allows withou
3fb0: 74 20 61 6e 79 20 6c 6f 67 69 6e 20 2d 20 74 68  t any login - th
3fc0: 65 20 75 73 65 72 20 69 64 20 69 73 20 73 65 6c  e user id is sel
3fd0: 65 63 74 65 64 0a 20 20 40 20 66 72 6f 6d 20 74  ected.  @ from t
3fe0: 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 64 61 74  he ~/.fossil dat
3ff0: 61 62 61 73 65 2e 20 50 61 73 73 77 6f 72 64 20  abase. Password 
4000: 6c 6f 67 69 6e 20 69 73 20 61 6c 77 61 79 73 20  login is always 
4010: 72 65 71 75 69 72 65 64 0a 20 20 40 20 66 6f 72  required.  @ for
4020: 20 69 6e 63 6f 6d 69 6e 67 20 77 65 62 20 63 6f   incoming web co
4030: 6e 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 69 6e 74  nnections on int
4040: 65 72 6e 65 74 20 61 64 64 72 65 73 73 65 73 20  ernet addresses 
4050: 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 40 20 31  other than.  @ 1
4060: 32 37 2e 30 2e 30 2e 31 2e 3c 2f 70 3e 3c 2f 6c  27.0.0.1.</p></l
4070: 69 3e 0a 0a 20 20 40 20 3c 68 72 3e 0a 20 20 65  i>..  @ <hr>.  e
4080: 6e 74 72 79 5f 61 74 74 72 69 62 75 74 65 28 22  ntry_attribute("
4090: 4c 6f 67 69 6e 20 65 78 70 69 72 61 74 69 6f 6e  Login expiration
40a0: 20 74 69 6d 65 22 2c 20 36 2c 20 22 63 6f 6f 6b   time", 6, "cook
40b0: 69 65 2d 65 78 70 69 72 65 22 2c 20 22 63 65 78  ie-expire", "cex
40c0: 22 2c 20 22 38 37 36 36 22 29 3b 0a 20 20 40 20  ", "8766");.  @ 
40d0: 3c 70 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  <p>The number of
40e0: 20 68 6f 75 72 73 20 66 6f 72 20 77 68 69 63 68   hours for which
40f0: 20 61 20 6c 6f 67 69 6e 20 69 73 20 76 61 6c 69   a login is vali
4100: 64 2e 20 20 54 68 69 73 20 6d 75 73 74 20 62 65  d.  This must be
4110: 20 61 0a 20 20 40 20 70 6f 73 69 74 69 76 65 20   a.  @ positive 
4120: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 64 65 66  number.  The def
4130: 61 75 6c 74 20 69 73 20 38 37 36 30 20 68 6f 75  ault is 8760 hou
4140: 72 73 20 77 68 69 63 68 20 69 73 20 61 70 70 72  rs which is appr
4150: 6f 78 69 6d 61 74 65 6c 79 20 65 71 75 61 6c 0a  oximately equal.
4160: 20 20 40 20 74 6f 20 61 20 79 65 61 72 2e 3c 2f    @ to a year.</
4170: 70 3e 0a 0a 20 20 40 20 3c 68 72 3e 0a 20 20 6f  p>..  @ <hr>.  o
4180: 6e 6f 66 66 5f 61 74 74 72 69 62 75 74 65 28 22  noff_attribute("
4190: 41 6c 6c 6f 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  Allow anonymous 
41a0: 73 69 67 6e 75 70 22 2c 20 22 61 6e 6f 6e 2d 73  signup", "anon-s
41b0: 69 67 6e 75 70 22 2c 20 22 61 73 75 22 2c 20 30  ignup", "asu", 0
41c0: 29 3b 0a 20 20 40 20 3c 70 3e 41 6c 6c 6f 77 20  );.  @ <p>Allow 
41d0: 75 73 65 72 73 20 74 6f 20 63 72 65 61 74 65 20  users to create 
41e0: 74 68 65 69 72 20 6f 77 6e 20 61 63 63 6f 75 6e  their own accoun
41f0: 74 73 3c 2f 70 3e 0a 0a 20 20 40 20 3c 68 72 3e  ts</p>..  @ <hr>
4200: 0a 20 20 40 20 3c 70 3e 3c 69 6e 70 75 74 20 74  .  @ <p><input t
4210: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 20 6e 61  ype="submit"  na
4220: 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75  me="submit" valu
4230: 65 3d 22 41 70 70 6c 79 20 43 68 61 6e 67 65 73  e="Apply Changes
4240: 22 3e 3c 2f 70 3e 0a 20 20 40 20 3c 2f 66 6f 72  "></p>.  @ </for
4250: 6d 3e 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e  m>.  db_end_tran
4260: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 73 74  saction(0);.  st
4270: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
4280: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
4290: 73 65 74 75 70 5f 63 6f 6e 66 69 67 0a 2a 2f 0a  setup_config.*/.
42a0: 76 6f 69 64 20 73 65 74 75 70 5f 63 6f 6e 66 69  void setup_confi
42b0: 67 28 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e  g(void){.  login
42c0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
42d0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
42e0: 6b 53 65 74 75 70 20 29 7b 0a 20 20 20 20 6c 6f  kSetup ){.    lo
42f0: 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20  gin_needed();.  
4300: 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  }..  style_heade
4310: 72 28 22 57 57 57 20 43 6f 6e 66 69 67 75 72 61  r("WWW Configura
4320: 74 69 6f 6e 22 29 3b 0a 20 20 64 62 5f 62 65 67  tion");.  db_beg
4330: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
4340: 3b 0a 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69  ;.  @ <form acti
4350: 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  on="%s(g.zBaseUR
4360: 4c 29 2f 73 65 74 75 70 5f 63 6f 6e 66 69 67 22  L)/setup_config"
4370: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e 0a   method="POST">.
4380: 0a 20 20 40 20 3c 68 72 20 2f 3e 0a 0a 20 20 65  .  @ <hr />..  e
4390: 6e 74 72 79 5f 61 74 74 72 69 62 75 74 65 28 22  ntry_attribute("
43a0: 50 72 6f 6a 65 63 74 20 4e 61 6d 65 22 2c 20 36  Project Name", 6
43b0: 30 2c 20 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65  0, "project-name
43c0: 22 2c 20 22 70 6e 22 2c 20 22 22 29 3b 0a 20 20  ", "pn", "");.  
43d0: 40 20 3c 70 3e 47 69 76 65 20 79 6f 75 72 20 70  @ <p>Give your p
43e0: 72 6f 6a 65 63 74 20 61 20 6e 61 6d 65 20 73 6f  roject a name so
43f0: 20 76 69 73 69 74 6f 72 73 20 6b 6e 6f 77 20 77   visitors know w
4400: 68 61 74 20 74 68 69 73 20 73 69 74 65 20 69 73  hat this site is
4410: 20 61 62 6f 75 74 2e 0a 20 20 40 20 54 68 65 20   about..  @ The 
4420: 70 72 6f 6a 65 63 74 20 6e 61 6d 65 20 77 69 6c  project name wil
4430: 6c 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 61  l also be used a
4440: 73 20 74 68 65 20 52 53 53 20 66 65 65 64 20 74  s the RSS feed t
4450: 69 74 6c 65 2e 3c 2f 70 3e 0a 0a 20 20 40 20 3c  itle.</p>..  @ <
4460: 68 72 20 2f 3e 0a 0a 20 20 74 65 78 74 61 72 65  hr />..  textare
4470: 61 5f 61 74 74 72 69 62 75 74 65 28 22 50 72 6f  a_attribute("Pro
4480: 6a 65 63 74 20 44 65 73 63 72 69 70 74 69 6f 6e  ject Description
4490: 22 2c 20 35 2c 20 36 30 2c 20 22 70 72 6f 6a 65  ", 5, 60, "proje
44a0: 63 74 2d 64 65 73 63 72 69 70 74 69 6f 6e 22 2c  ct-description",
44b0: 20 22 70 64 22 2c 20 22 22 29 3b 0a 20 20 40 20   "pd", "");.  @ 
44c0: 3c 70 3e 44 65 73 63 72 69 62 65 20 79 6f 75 72  <p>Describe your
44d0: 20 70 72 6f 6a 65 63 74 2e 20 54 68 69 73 20 77   project. This w
44e0: 69 6c 6c 20 62 65 20 75 73 65 64 20 69 6e 20 70  ill be used in p
44f0: 61 67 65 20 68 65 61 64 65 72 73 20 66 6f 72 20  age headers for 
4500: 73 65 61 72 63 68 0a 20 20 40 20 65 6e 67 69 6e  search.  @ engin
4510: 65 73 20 61 73 20 77 65 6c 6c 20 61 73 20 61 20  es as well as a 
4520: 73 68 6f 72 74 20 52 53 53 20 64 65 73 63 72 69  short RSS descri
4530: 70 74 69 6f 6e 2e 3c 2f 70 3e 0a 0a 20 20 40 20  ption.</p>..  @ 
4540: 3c 68 72 20 2f 3e 0a 20 20 40 20 3c 70 3e 3c 69  <hr />.  @ <p><i
4550: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
4560: 74 22 20 20 6e 61 6d 65 3d 22 73 75 62 6d 69 74  t"  name="submit
4570: 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 43  " value="Apply C
4580: 68 61 6e 67 65 73 22 3e 3c 2f 70 3e 0a 20 20 40  hanges"></p>.  @
4590: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 64 62 5f 65 6e   </form>.  db_en
45a0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29  d_transaction(0)
45b0: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
45c0: 28 29 3b 0a 7d 0a                                ();.}.