/ Hex Artifact Content
Login

Artifact e740a2697a7b40d7c5003a7d7edaee16acd349a9:


0000: 23 20 32 30 31 34 2d 30 39 2d 31 30 0a 23 0a 23  # 2014-09-10.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u give..#.#*****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 0a 23 20 0a 23 20 54 68 69 73 20 66 69 6c  **.# .# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73  e implements tes
0180: 74 73 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ts of the SQLITE
0190: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
01a0: 54 49 4f 4e 20 65 78 74 65 6e 73 69 6f 6e 2e 0a  TION extension..
01b0: 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b  #..set testdir [
01c0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72  file dirname $ar
01d0: 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73  gv0].source $tes
01e0: 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a  tdir/tester.tcl.
01f0: 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20 75  set testprefix u
0200: 73 65 72 61 75 74 68 30 31 0a 0a 69 66 63 61 70  serauth01..ifcap
0210: 61 62 6c 65 20 21 75 73 65 72 61 75 74 68 20 7b  able !userauth {
0220: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
0230: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 43 72 65   return.}..# Cre
0240: 61 74 65 20 61 20 6e 6f 2d 61 75 74 68 65 6e 74  ate a no-authent
0250: 69 63 61 74 69 6f 6e 2d 72 65 71 75 69 72 65 64  ication-required
0260: 20 64 61 74 61 62 61 73 65 0a 23 0a 64 6f 5f 65   database.#.do_e
0270: 78 65 63 73 71 6c 5f 74 65 73 74 20 75 73 65 72  xecsql_test user
0280: 61 75 74 68 30 31 2d 31 2e 30 20 7b 0a 20 20 43  auth01-1.0 {.  C
0290: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
02a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
02b0: 20 74 31 20 56 41 4c 55 45 53 28 31 29 2c 28 32   t1 VALUES(1),(2
02c0: 2e 35 29 2c 28 27 74 68 72 65 65 27 29 2c 28 78  .5),('three'),(x
02d0: 27 34 34 34 34 27 29 2c 28 4e 55 4c 4c 29 3b 0a  '4444'),(NULL);.
02e0: 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78    SELECT quote(x
02f0: 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  ) FROM t1 ORDER 
0300: 42 59 20 78 3b 0a 20 20 53 45 4c 45 43 54 20 6e  BY x;.  SELECT n
0310: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
0320: 6d 61 73 74 65 72 3b 0a 7d 20 7b 4e 55 4c 4c 20  master;.} {NULL 
0330: 31 20 32 2e 35 20 27 74 68 72 65 65 27 20 58 27  1 2.5 'three' X'
0340: 34 34 34 34 27 20 74 31 7d 0a 0a 23 20 43 61 6c  4444' t1}..# Cal
0350: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 75 73 65  ling sqlite3_use
0360: 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 29  r_authenticate()
0370: 20 6f 6e 20 61 20 6e 6f 2d 61 75 74 68 65 6e 74   on a no-authent
0380: 69 63 61 74 69 6f 6e 2d 72 65 71 75 69 72 65 64  ication-required
0390: 0a 23 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  .# database conn
03a0: 65 63 74 69 6f 6e 20 69 73 20 61 20 68 61 72 6d  ection is a harm
03b0: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 0a 23 0a  less no-op.  .#.
03c0: 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68  do_test userauth
03d0: 30 31 2d 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74  01-1.1 {.  sqlit
03e0: 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
03f0: 63 61 74 65 20 64 62 20 61 6c 69 63 65 20 70 77  cate db alice pw
0400: 2d 34 2d 61 6c 69 63 65 0a 20 20 65 78 65 63 73  -4-alice.  execs
0410: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0420: 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 74 31  quote(x) FROM t1
0430: 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 20 20 20   ORDER BY x;.   
0440: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
0450: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
0460: 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 20 31 20 32  .  }.} {NULL 1 2
0470: 2e 35 20 27 74 68 72 65 65 27 20 58 27 34 34 34  .5 'three' X'444
0480: 34 27 20 74 31 7d 0a 0a 23 20 49 66 20 73 71 6c  4' t1}..# If sql
0490: 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 44 2c  ite3_user_add(D,
04a0: 55 2c 50 2c 4e 2c 41 29 20 69 73 20 63 61 6c 6c  U,P,N,A) is call
04b0: 65 64 20 6f 6e 20 61 20 6e 6f 2d 61 75 74 68 65  ed on a no-authe
04c0: 6e 74 69 63 61 74 69 6f 6e 2d 72 65 71 75 69 72  ntication-requir
04d0: 65 64 0a 23 20 64 61 74 61 62 61 73 65 20 61 6e  ed.# database an
04e0: 64 20 41 20 69 73 20 66 61 6c 73 65 2c 20 74 68  d A is false, th
04f0: 65 6e 20 74 68 65 20 63 61 6c 6c 20 66 61 69 6c  en the call fail
0500: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
0510: 5f 41 55 54 48 20 65 72 72 6f 72 2e 0a 23 0a 64  _AUTH error..#.d
0520: 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30  o_test userauth0
0530: 31 2d 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  1-1.2 {.  sqlite
0540: 33 5f 75 73 65 72 5f 61 64 64 20 64 62 20 62 6f  3_user_add db bo
0550: 62 20 70 77 2d 34 2d 62 6f 62 20 30 0a 7d 20 7b  b pw-4-bob 0.} {
0560: 53 51 4c 49 54 45 5f 41 55 54 48 7d 0a 64 6f 5f  SQLITE_AUTH}.do_
0570: 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d  test userauth01-
0580: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0590: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f  {.    SELECT quo
05a0: 74 65 28 78 29 20 46 52 4f 4d 20 74 31 20 4f 52  te(x) FROM t1 OR
05b0: 44 45 52 20 42 59 20 78 3b 0a 20 20 20 20 53 45  DER BY x;.    SE
05c0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
05d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
05e0: 7d 0a 7d 20 7b 4e 55 4c 4c 20 31 20 32 2e 35 20  }.} {NULL 1 2.5 
05f0: 27 74 68 72 65 65 27 20 58 27 34 34 34 34 27 20  'three' X'4444' 
0600: 74 31 7d 0a 0a 23 20 57 68 65 6e 20 63 61 6c 6c  t1}..# When call
0610: 65 64 20 6f 6e 20 61 20 6e 6f 2d 61 75 74 68 65  ed on a no-authe
0620: 6e 74 69 63 61 74 69 6f 6e 2d 72 65 71 75 69 72  ntication-requir
0630: 65 64 0a 23 20 64 61 74 61 62 61 73 65 20 61 6e  ed.# database an
0640: 64 20 77 68 65 6e 20 41 20 69 73 20 74 72 75 65  d when A is true
0650: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 75 73  , the sqlite3_us
0660: 65 72 5f 61 64 64 28 44 2c 55 2c 50 2c 4e 2c 41  er_add(D,U,P,N,A
0670: 29 20 72 6f 75 74 69 6e 65 0a 23 20 63 6f 6e 76  ) routine.# conv
0680: 65 72 74 73 20 74 68 65 20 64 61 74 61 62 61 73  erts the databas
0690: 65 20 69 6e 74 6f 20 61 6e 20 61 75 74 68 65 6e  e into an authen
06a0: 74 69 63 61 74 69 6f 6e 2d 72 65 71 75 69 72 65  tication-require
06b0: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 0a 23  d database and.#
06c0: 20 6c 6f 67 73 20 74 68 65 20 64 61 74 61 62 61   logs the databa
06d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 44 20  se connection D 
06e0: 69 6e 20 75 73 69 6e 67 20 75 73 65 72 20 55 20  in using user U 
06f0: 77 69 74 68 20 70 61 73 73 77 6f 72 64 20 50 2c  with password P,
0700: 4e 2e 0a 23 20 20 0a 64 6f 5f 74 65 73 74 20 75  N..#  .do_test u
0710: 73 65 72 61 75 74 68 30 31 2d 31 2e 34 20 7b 0a  serauth01-1.4 {.
0720: 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61    sqlite3_user_a
0730: 64 64 20 64 62 20 61 6c 69 63 65 20 70 77 2d 34  dd db alice pw-4
0740: 2d 61 6c 69 63 65 20 31 0a 7d 20 7b 53 51 4c 49  -alice 1.} {SQLI
0750: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 75  TE_OK}.do_test u
0760: 73 65 72 61 75 74 68 30 31 2d 31 2e 35 20 7b 0a  serauth01-1.5 {.
0770: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0780: 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
0790: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
07a0: 20 78 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 75   x;.    SELECT u
07b0: 6e 61 6d 65 2c 20 69 73 61 64 6d 69 6e 20 46 52  name, isadmin FR
07c0: 4f 4d 20 73 71 6c 69 74 65 5f 75 73 65 72 20 4f  OM sqlite_user O
07d0: 52 44 45 52 20 42 59 20 75 6e 61 6d 65 3b 0a 20  RDER BY uname;. 
07e0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
07f0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0800: 72 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  r ORDER BY name;
0810: 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 20 31 20 32  .  }.} {NULL 1 2
0820: 2e 35 20 27 74 68 72 65 65 27 20 58 27 34 34 34  .5 'three' X'444
0830: 34 27 20 61 6c 69 63 65 20 31 20 73 71 6c 69 74  4' alice 1 sqlit
0840: 65 5f 75 73 65 72 20 74 31 7d 0a 0a 23 20 54 68  e_user t1}..# Th
0850: 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  e sqlite3_user_a
0860: 64 64 28 29 20 69 6e 74 65 72 66 61 63 65 20 63  dd() interface c
0870: 61 6e 20 62 65 20 75 73 65 64 20 28 62 79 20 61  an be used (by a
0880: 6e 20 61 64 6d 69 6e 20 75 73 65 72 20 6f 6e 6c  n admin user onl
0890: 79 29 0a 23 20 74 6f 20 63 72 65 61 74 65 20 61  y).# to create a
08a0: 20 6e 65 77 20 75 73 65 72 2e 0a 23 0a 64 6f 5f   new user..#.do_
08b0: 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d  test userauth01-
08c0: 31 2e 36 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  1.6 {.  sqlite3_
08d0: 75 73 65 72 5f 61 64 64 20 64 62 20 62 6f 62 20  user_add db bob 
08e0: 70 77 2d 34 2d 62 6f 62 20 30 0a 20 20 73 71 6c  pw-4-bob 0.  sql
08f0: 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20 64 62  ite3_user_add db
0900: 20 63 69 6e 64 79 20 70 77 2d 34 2d 63 69 6e 64   cindy pw-4-cind
0910: 79 20 30 0a 20 20 73 71 6c 69 74 65 33 5f 75 73  y 0.  sqlite3_us
0920: 65 72 5f 61 64 64 20 64 62 20 64 61 76 69 64 20  er_add db david 
0930: 70 77 2d 34 2d 64 61 76 69 64 20 30 0a 20 20 65  pw-4-david 0.  e
0940: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0950: 45 43 54 20 75 6e 61 6d 65 2c 20 69 73 61 64 6d  ECT uname, isadm
0960: 69 6e 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 75  in FROM sqlite_u
0970: 73 65 72 20 4f 52 44 45 52 20 42 59 20 75 6e 61  ser ORDER BY una
0980: 6d 65 3b 0a 20 20 7d 0a 7d 20 7b 61 6c 69 63 65  me;.  }.} {alice
0990: 20 31 20 62 6f 62 20 30 20 63 69 6e 64 79 20 30   1 bob 0 cindy 0
09a0: 20 64 61 76 69 64 20 30 7d 0a 0a 23 20 54 68 65   david 0}..# The
09b0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
09c0: 6c 65 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  le is inaccessib
09d0: 6c 65 20 28 75 6e 72 65 61 64 61 62 6c 65 20 61  le (unreadable a
09e0: 6e 64 20 75 6e 77 72 69 74 65 61 62 6c 65 29 20  nd unwriteable) 
09f0: 74 6f 0a 23 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75  to.# non-admin u
0a00: 73 65 72 73 20 61 6e 64 20 69 73 20 72 65 61 64  sers and is read
0a10: 2d 6f 6e 6c 79 20 66 6f 72 20 61 64 6d 69 6e 20  -only for admin 
0a20: 75 73 65 72 73 2e 20 20 48 6f 77 65 76 65 72 2c  users.  However,
0a30: 20 69 66 20 74 68 65 20 73 61 6d 65 0a 23 0a 64   if the same.#.d
0a40: 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30  o_test userauth0
0a50: 31 2d 31 2e 37 20 7b 0a 20 20 73 71 6c 69 74 65  1-1.7 {.  sqlite
0a60: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
0a70: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
0a80: 68 65 6e 74 69 63 61 74 65 20 64 62 32 20 63 69  henticate db2 ci
0a90: 6e 64 79 20 70 77 2d 34 2d 63 69 6e 64 79 0a 20  ndy pw-4-cindy. 
0aa0: 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20   db2 eval {.    
0ab0: 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
0ac0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
0ad0: 20 78 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e   x;.    SELECT n
0ae0: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
0af0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
0b00: 6e 61 6d 65 3b 0a 20 20 7d 0a 7d 20 7b 4e 55 4c  name;.  }.} {NUL
0b10: 4c 20 31 20 32 2e 35 20 27 74 68 72 65 65 27 20  L 1 2.5 'three' 
0b20: 58 27 34 34 34 34 27 20 73 71 6c 69 74 65 5f 75  X'4444' sqlite_u
0b30: 73 65 72 20 74 31 7d 0a 64 6f 5f 74 65 73 74 20  ser t1}.do_test 
0b40: 75 73 65 72 61 75 74 68 30 31 2d 31 2e 38 20 7b  userauth01-1.8 {
0b50: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0b60: 20 20 53 45 4c 45 43 54 20 75 6e 61 6d 65 2c 20    SELECT uname, 
0b70: 69 73 61 64 6d 69 6e 20 46 52 4f 4d 20 73 71 6c  isadmin FROM sql
0b80: 69 74 65 5f 75 73 65 72 20 4f 52 44 45 52 20 42  ite_user ORDER B
0b90: 59 20 75 6e 61 6d 65 3b 0a 20 20 7d 20 64 62 32  Y uname;.  } db2
0ba0: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74  .} {1 {no such t
0bb0: 61 62 6c 65 3a 20 73 71 6c 69 74 65 5f 75 73 65  able: sqlite_use
0bc0: 72 7d 7d 0a 0a 23 20 41 6e 79 20 75 73 65 72 20  r}}..# Any user 
0bd0: 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 69 72  can change their
0be0: 20 6f 77 6e 20 70 61 73 73 77 6f 72 64 2e 20 20   own password.  
0bf0: 0a 23 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61  .#.do_test usera
0c00: 75 74 68 30 31 2d 31 2e 39 20 7b 0a 20 20 73 71  uth01-1.9 {.  sq
0c10: 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
0c20: 65 20 64 62 32 20 63 69 6e 64 79 20 78 79 7a 7a  e db2 cindy xyzz
0c30: 79 2d 63 69 6e 64 79 20 30 0a 7d 20 7b 53 51 4c  y-cindy 0.} {SQL
0c40: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
0c50: 75 73 65 72 61 75 74 68 30 31 2d 31 2e 31 30 20  userauth01-1.10 
0c60: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  {.  sqlite3_user
0c70: 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 64 62  _authenticate db
0c80: 32 20 63 69 6e 64 79 20 70 77 2d 34 2d 63 69 6e  2 cindy pw-4-cin
0c90: 64 79 0a 7d 20 7b 53 51 4c 49 54 45 5f 41 55 54  dy.} {SQLITE_AUT
0ca0: 48 7d 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61  H}.do_test usera
0cb0: 75 74 68 30 31 2d 31 2e 31 31 20 7b 0a 20 20 73  uth01-1.11 {.  s
0cc0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68  qlite3_user_auth
0cd0: 65 6e 74 69 63 61 74 65 20 64 62 32 20 63 69 6e  enticate db2 cin
0ce0: 64 79 20 78 79 7a 7a 79 2d 63 69 6e 64 79 0a 7d  dy xyzzy-cindy.}
0cf0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
0d00: 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d  test userauth01-
0d10: 31 2e 31 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  1.12 {.  sqlite3
0d20: 5f 75 73 65 72 5f 63 68 61 6e 67 65 20 64 62 20  _user_change db 
0d30: 61 6c 69 63 65 20 78 79 7a 7a 79 2d 61 6c 69 63  alice xyzzy-alic
0d40: 65 20 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  e 1.} {SQLITE_OK
0d50: 7d 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75  }.do_test userau
0d60: 74 68 30 31 2d 31 2e 31 33 20 7b 0a 20 20 73 71  th01-1.13 {.  sq
0d70: 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65  lite3_user_authe
0d80: 6e 74 69 63 61 74 65 20 64 62 20 61 6c 69 63 65  nticate db alice
0d90: 20 70 77 2d 34 2d 61 6c 69 63 65 0a 7d 20 7b 53   pw-4-alice.} {S
0da0: 51 4c 49 54 45 5f 41 55 54 48 7d 0a 64 6f 5f 74  QLITE_AUTH}.do_t
0db0: 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d 31  est userauth01-1
0dc0: 2e 31 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  .14 {.  sqlite3_
0dd0: 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
0de0: 65 20 64 62 20 61 6c 69 63 65 20 78 79 7a 7a 79  e db alice xyzzy
0df0: 2d 61 6c 69 63 65 0a 7d 20 7b 53 51 4c 49 54 45  -alice.} {SQLITE
0e00: 5f 4f 4b 7d 0a 0a 23 20 4e 6f 20 75 73 65 72 20  _OK}..# No user 
0e10: 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 69 72  may change their
0e20: 20 6f 77 6e 20 61 64 6d 69 6e 20 70 72 69 76 69   own admin privi
0e30: 6c 65 67 65 20 73 65 74 74 69 6e 67 2e 0a 23 0a  lege setting..#.
0e40: 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68  do_test userauth
0e50: 30 31 2d 31 2e 31 35 20 7b 0a 20 20 73 71 6c 69  01-1.15 {.  sqli
0e60: 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 20  te3_user_change 
0e70: 64 62 20 61 6c 69 63 65 20 78 79 7a 7a 79 2d 61  db alice xyzzy-a
0e80: 6c 69 63 65 20 30 0a 7d 20 7b 53 51 4c 49 54 45  lice 0.} {SQLITE
0e90: 5f 41 55 54 48 7d 0a 64 6f 5f 74 65 73 74 20 75  _AUTH}.do_test u
0ea0: 73 65 72 61 75 74 68 30 31 2d 31 2e 31 36 20 7b  serauth01-1.16 {
0eb0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
0ec0: 43 54 20 75 6e 61 6d 65 2c 20 69 73 61 64 6d 69  CT uname, isadmi
0ed0: 6e 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 75 73  n FROM sqlite_us
0ee0: 65 72 20 4f 52 44 45 52 20 42 59 20 75 6e 61 6d  er ORDER BY unam
0ef0: 65 7d 0a 7d 20 7b 61 6c 69 63 65 20 31 20 62 6f  e}.} {alice 1 bo
0f00: 62 20 30 20 63 69 6e 64 79 20 30 20 64 61 76 69  b 0 cindy 0 davi
0f10: 64 20 30 7d 0a 64 6f 5f 74 65 73 74 20 75 73 65  d 0}.do_test use
0f20: 72 61 75 74 68 30 31 2d 31 2e 31 37 20 7b 0a 20  rauth01-1.17 {. 
0f30: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68   sqlite3_user_ch
0f40: 61 6e 67 65 20 64 62 32 20 63 69 6e 64 79 20 78  ange db2 cindy x
0f50: 79 7a 7a 79 2d 63 69 6e 64 79 20 31 0a 7d 20 7b  yzzy-cindy 1.} {
0f60: 53 51 4c 49 54 45 5f 41 55 54 48 7d 0a 64 6f 5f  SQLITE_AUTH}.do_
0f70: 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d  test userauth01-
0f80: 31 2e 31 38 20 7b 0a 20 20 64 62 20 65 76 61 6c  1.18 {.  db eval
0f90: 20 7b 53 45 4c 45 43 54 20 75 6e 61 6d 65 2c 20   {SELECT uname, 
0fa0: 69 73 61 64 6d 69 6e 20 46 52 4f 4d 20 73 71 6c  isadmin FROM sql
0fb0: 69 74 65 5f 75 73 65 72 20 4f 52 44 45 52 20 42  ite_user ORDER B
0fc0: 59 20 75 6e 61 6d 65 7d 0a 7d 20 7b 61 6c 69 63  Y uname}.} {alic
0fd0: 65 20 31 20 62 6f 62 20 30 20 63 69 6e 64 79 20  e 1 bob 0 cindy 
0fe0: 30 20 64 61 76 69 64 20 30 7d 0a 0a 23 20 54 68  0 david 0}..# Th
0ff0: 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63  e sqlite3_user_c
1000: 68 61 6e 67 65 28 29 20 69 6e 74 65 72 66 61 63  hange() interfac
1010: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
1020: 20 63 68 61 6e 67 65 20 61 20 75 73 65 72 73 0a   change a users.
1030: 23 20 6c 6f 67 69 6e 20 63 72 65 64 65 6e 74 69  # login credenti
1040: 61 6c 73 20 6f 72 20 61 64 6d 69 6e 20 70 72 69  als or admin pri
1050: 76 69 6c 65 67 65 2e 0a 23 0a 64 6f 5f 74 65 73  vilege..#.do_tes
1060: 74 20 75 73 65 72 61 75 74 68 30 31 2d 31 2e 32  t userauth01-1.2
1070: 30 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 73  0 {.  sqlite3_us
1080: 65 72 5f 63 68 61 6e 67 65 20 64 62 20 64 61 76  er_change db dav
1090: 69 64 20 78 79 7a 7a 79 2d 64 61 76 69 64 20 31  id xyzzy-david 1
10a0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
10b0: 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30  o_test userauth0
10c0: 31 2d 31 2e 32 31 20 7b 0a 20 20 64 62 20 65 76  1-1.21 {.  db ev
10d0: 61 6c 20 7b 53 45 4c 45 43 54 20 75 6e 61 6d 65  al {SELECT uname
10e0: 2c 20 69 73 61 64 6d 69 6e 20 46 52 4f 4d 20 73  , isadmin FROM s
10f0: 71 6c 69 74 65 5f 75 73 65 72 20 4f 52 44 45 52  qlite_user ORDER
1100: 20 42 59 20 75 6e 61 6d 65 7d 0a 7d 20 7b 61 6c   BY uname}.} {al
1110: 69 63 65 20 31 20 62 6f 62 20 30 20 63 69 6e 64  ice 1 bob 0 cind
1120: 79 20 30 20 64 61 76 69 64 20 31 7d 0a 64 6f 5f  y 0 david 1}.do_
1130: 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31 2d  test userauth01-
1140: 31 2e 32 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  1.22 {.  sqlite3
1150: 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
1160: 74 65 20 64 62 32 20 64 61 76 69 64 20 78 79 7a  te db2 david xyz
1170: 7a 79 2d 64 61 76 69 64 0a 7d 20 7b 53 51 4c 49  zy-david.} {SQLI
1180: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 75  TE_OK}.do_test u
1190: 73 65 72 61 75 74 68 30 31 2d 31 2e 32 33 20 7b  serauth01-1.23 {
11a0: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45 4c  .  db2 eval {SEL
11b0: 45 43 54 20 75 6e 61 6d 65 2c 20 69 73 61 64 6d  ECT uname, isadm
11c0: 69 6e 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 75  in FROM sqlite_u
11d0: 73 65 72 20 4f 52 44 45 52 20 42 59 20 75 6e 61  ser ORDER BY una
11e0: 6d 65 7d 0a 7d 20 7b 61 6c 69 63 65 20 31 20 62  me}.} {alice 1 b
11f0: 6f 62 20 30 20 63 69 6e 64 79 20 30 20 64 61 76  ob 0 cindy 0 dav
1200: 69 64 20 31 7d 0a 64 6f 5f 74 65 73 74 20 75 73  id 1}.do_test us
1210: 65 72 61 75 74 68 30 31 2d 31 2e 32 34 20 7b 0a  erauth01-1.24 {.
1220: 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63    sqlite3_user_c
1230: 68 61 6e 67 65 20 64 62 20 64 61 76 69 64 20 70  hange db david p
1240: 77 2d 34 2d 64 61 76 69 64 20 30 0a 7d 20 7b 53  w-4-david 0.} {S
1250: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
1260: 74 20 75 73 65 72 61 75 74 68 30 31 2d 31 2e 32  t userauth01-1.2
1270: 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 73  5 {.  sqlite3_us
1280: 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20  er_authenticate 
1290: 64 62 32 20 64 61 76 69 64 20 70 77 2d 34 2d 64  db2 david pw-4-d
12a0: 61 76 69 64 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  avid.} {SQLITE_O
12b0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61  K}.do_test usera
12c0: 75 74 68 30 31 2d 31 2e 32 36 20 7b 0a 20 20 64  uth01-1.26 {.  d
12d0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 75  b eval {SELECT u
12e0: 6e 61 6d 65 2c 20 69 73 61 64 6d 69 6e 20 46 52  name, isadmin FR
12f0: 4f 4d 20 73 71 6c 69 74 65 5f 75 73 65 72 20 4f  OM sqlite_user O
1300: 52 44 45 52 20 42 59 20 75 6e 61 6d 65 7d 0a 7d  RDER BY uname}.}
1310: 20 7b 61 6c 69 63 65 20 31 20 62 6f 62 20 30 20   {alice 1 bob 0 
1320: 63 69 6e 64 79 20 30 20 64 61 76 69 64 20 30 7d  cindy 0 david 0}
1330: 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74  .do_test useraut
1340: 68 30 31 2d 31 2e 32 37 20 7b 0a 20 20 63 61 74  h01-1.27 {.  cat
1350: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 6e  chsql {SELECT un
1360: 61 6d 65 2c 20 69 73 61 64 6d 69 6e 20 46 52 4f  ame, isadmin FRO
1370: 4d 20 73 71 6c 69 74 65 5f 75 73 65 72 20 4f 52  M sqlite_user OR
1380: 44 45 52 20 42 59 20 75 6e 61 6d 65 7d 20 64 62  DER BY uname} db
1390: 32 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  2.} {1 {no such 
13a0: 74 61 62 6c 65 3a 20 73 71 6c 69 74 65 5f 75 73  table: sqlite_us
13b0: 65 72 7d 7d 0a 0a 23 20 4f 6e 6c 79 20 61 6e 20  er}}..# Only an 
13c0: 61 64 6d 69 6e 20 75 73 65 72 20 63 61 6e 20 63  admin user can c
13d0: 68 61 6e 67 65 20 61 6e 6f 74 68 65 72 20 75 73  hange another us
13e0: 65 72 73 20 6c 6f 67 69 6e 0a 23 20 63 72 65 64  ers login.# cred
13f0: 65 6e 74 69 61 6c 73 20 6f 72 20 61 64 6d 69 6e  entials or admin
1400: 20 70 72 69 76 69 6c 65 67 65 20 73 65 74 74 69   privilege setti
1410: 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 75 73  ng..#.do_test us
1420: 65 72 61 75 74 68 30 31 2d 31 2e 33 30 20 7b 0a  erauth01-1.30 {.
1430: 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63    sqlite3_user_c
1440: 68 61 6e 67 65 20 64 62 32 20 62 6f 62 20 78 79  hange db2 bob xy
1450: 7a 7a 79 2d 62 6f 62 20 31 0a 7d 20 7b 53 51 4c  zzy-bob 1.} {SQL
1460: 49 54 45 5f 41 55 54 48 7d 0a 64 6f 5f 74 65 73  ITE_AUTH}.do_tes
1470: 74 20 75 73 65 72 61 75 74 68 30 31 2d 31 2e 33  t userauth01-1.3
1480: 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  1 {.  db eval {S
1490: 45 4c 45 43 54 20 75 6e 61 6d 65 2c 20 69 73 61  ELECT uname, isa
14a0: 64 6d 69 6e 20 46 52 4f 4d 20 73 71 6c 69 74 65  dmin FROM sqlite
14b0: 5f 75 73 65 72 20 4f 52 44 45 52 20 42 59 20 75  _user ORDER BY u
14c0: 6e 61 6d 65 7d 0a 7d 20 7b 61 6c 69 63 65 20 31  name}.} {alice 1
14d0: 20 62 6f 62 20 30 20 63 69 6e 64 79 20 30 20 64   bob 0 cindy 0 d
14e0: 61 76 69 64 20 30 7d 0a 0a 23 20 54 68 65 20 73  avid 0}..# The s
14f0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
1500: 74 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 63  te() interface c
1510: 61 6e 20 62 65 20 75 73 65 64 20 28 62 79 20 61  an be used (by a
1520: 6e 20 61 64 6d 69 6e 20 75 73 65 72 20 6f 6e 6c  n admin user onl
1530: 79 29 0a 23 20 74 6f 20 64 65 6c 65 74 65 20 61  y).# to delete a
1540: 20 75 73 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74   user..#.do_test
1550: 20 75 73 65 72 61 75 74 68 30 31 2d 31 2e 34 30   userauth01-1.40
1560: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 73 65   {.  sqlite3_use
1570: 72 5f 64 65 6c 65 74 65 20 64 62 20 62 6f 62 0a  r_delete db bob.
1580: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
1590: 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30 31  _test userauth01
15a0: 2d 31 2e 34 31 20 7b 0a 20 20 64 62 20 65 76 61  -1.41 {.  db eva
15b0: 6c 20 7b 53 45 4c 45 43 54 20 75 6e 61 6d 65 2c  l {SELECT uname,
15c0: 20 69 73 61 64 6d 69 6e 20 46 52 4f 4d 20 73 71   isadmin FROM sq
15d0: 6c 69 74 65 5f 75 73 65 72 20 4f 52 44 45 52 20  lite_user ORDER 
15e0: 42 59 20 75 6e 61 6d 65 7d 0a 7d 20 7b 61 6c 69  BY uname}.} {ali
15f0: 63 65 20 31 20 63 69 6e 64 79 20 30 20 64 61 76  ce 1 cindy 0 dav
1600: 69 64 20 30 7d 0a 64 6f 5f 74 65 73 74 20 75 73  id 0}.do_test us
1610: 65 72 61 75 74 68 30 31 2d 31 2e 34 32 20 7b 0a  erauth01-1.42 {.
1620: 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64    sqlite3_user_d
1630: 65 6c 65 74 65 20 64 62 32 20 63 69 6e 64 79 0a  elete db2 cindy.
1640: 7d 20 7b 53 51 4c 49 54 45 5f 41 55 54 48 7d 0a  } {SQLITE_AUTH}.
1650: 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68  do_test userauth
1660: 30 31 2d 31 2e 34 33 20 7b 0a 20 20 73 71 6c 69  01-1.43 {.  sqli
1670: 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 20  te3_user_delete 
1680: 64 62 32 20 61 6c 69 63 65 0a 7d 20 7b 53 51 4c  db2 alice.} {SQL
1690: 49 54 45 5f 41 55 54 48 7d 0a 64 6f 5f 74 65 73  ITE_AUTH}.do_tes
16a0: 74 20 75 73 65 72 61 75 74 68 30 31 2d 31 2e 34  t userauth01-1.4
16b0: 34 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  4 {.  db eval {S
16c0: 45 4c 45 43 54 20 75 6e 61 6d 65 2c 20 69 73 61  ELECT uname, isa
16d0: 64 6d 69 6e 20 46 52 4f 4d 20 73 71 6c 69 74 65  dmin FROM sqlite
16e0: 5f 75 73 65 72 20 4f 52 44 45 52 20 42 59 20 75  _user ORDER BY u
16f0: 6e 61 6d 65 7d 0a 7d 20 7b 61 6c 69 63 65 20 31  name}.} {alice 1
1700: 20 63 69 6e 64 79 20 30 20 64 61 76 69 64 20 30   cindy 0 david 0
1710: 7d 0a 0a 23 20 54 68 65 20 63 75 72 72 65 6e 74  }..# The current
1720: 6c 79 20 6c 6f 67 67 65 64 2d 69 6e 20 75 73 65  ly logged-in use
1730: 72 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 6c 65  r cannot be dele
1740: 74 65 64 0a 23 0a 64 6f 5f 74 65 73 74 20 75 73  ted.#.do_test us
1750: 65 72 61 75 74 68 30 31 2d 31 2e 35 30 20 7b 0a  erauth01-1.50 {.
1760: 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64    sqlite3_user_d
1770: 65 6c 65 74 65 20 64 62 20 61 6c 69 63 65 0a 7d  elete db alice.}
1780: 20 7b 53 51 4c 49 54 45 5f 41 55 54 48 7d 0a 64   {SQLITE_AUTH}.d
1790: 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30  o_test userauth0
17a0: 31 2d 31 2e 35 31 20 7b 0a 20 20 64 62 20 65 76  1-1.51 {.  db ev
17b0: 61 6c 20 7b 53 45 4c 45 43 54 20 75 6e 61 6d 65  al {SELECT uname
17c0: 2c 20 69 73 61 64 6d 69 6e 20 46 52 4f 4d 20 73  , isadmin FROM s
17d0: 71 6c 69 74 65 5f 75 73 65 72 20 4f 52 44 45 52  qlite_user ORDER
17e0: 20 42 59 20 75 6e 61 6d 65 7d 0a 7d 20 7b 61 6c   BY uname}.} {al
17f0: 69 63 65 20 31 20 63 69 6e 64 79 20 30 20 64 61  ice 1 cindy 0 da
1800: 76 69 64 20 30 7d 0a 0a 23 20 57 68 65 6e 20 41  vid 0}..# When A
1810: 54 54 41 43 48 2d 69 6e 67 20 6e 65 77 20 64 61  TTACH-ing new da
1820: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 6f 20  tabase files to 
1830: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 65 61  a connection, ea
1840: 63 68 20 6e 65 77 6c 79 20 61 74 74 61 63 68 65  ch newly attache
1850: 64 0a 23 20 64 61 74 61 62 61 73 65 20 74 68 61  d.# database tha
1860: 74 20 69 73 20 61 6e 20 61 75 74 68 65 6e 74 69  t is an authenti
1870: 63 61 74 69 6f 6e 2d 72 65 71 75 69 72 65 64 20  cation-required 
1880: 64 61 74 61 62 61 73 65 20 69 73 20 63 68 65 63  database is chec
1890: 6b 65 64 20 75 73 69 6e 67 0a 23 20 74 68 65 20  ked using.# the 
18a0: 73 61 6d 65 20 75 73 65 72 6e 61 6d 65 20 61 6e  same username an
18b0: 64 20 70 61 73 73 77 6f 72 64 20 61 73 20 73 75  d password as su
18c0: 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6d 61  pplied to the ma
18d0: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  in database.  If
18e0: 20 74 68 61 74 0a 23 20 63 68 65 63 6b 20 66 61   that.# check fa
18f0: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 41 54  ils, then the AT
1900: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 66 61 69  TACH command fai
1910: 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ls with an SQLIT
1920: 45 5f 41 55 54 48 20 65 72 72 6f 72 2e 0a 23 0a  E_AUTH error..#.
1930: 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68  do_test userauth
1940: 30 31 2d 31 2e 36 30 20 7b 0a 20 20 66 6f 72 63  01-1.60 {.  forc
1950: 65 64 65 6c 65 74 65 20 74 65 73 74 33 2e 64 62  edelete test3.db
1960: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 33 20 74  .  sqlite3 db3 t
1970: 65 73 74 33 2e 64 62 0a 20 20 73 71 6c 69 74 65  est3.db.  sqlite
1980: 33 5f 75 73 65 72 5f 61 64 64 20 64 62 33 20 61  3_user_add db3 a
1990: 6c 69 63 65 20 78 79 7a 7a 79 2d 61 6c 69 63 65  lice xyzzy-alice
19a0: 20 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d   1.} {SQLITE_OK}
19b0: 0a 64 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74  .do_test useraut
19c0: 68 30 31 2d 31 2e 36 31 20 7b 0a 20 20 64 62 33  h01-1.61 {.  db3
19d0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41   eval {.    CREA
19e0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 62 2c  TE TABLE t3(a,b,
19f0: 63 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  c); INSERT INTO 
1a00: 74 33 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29  t3 VALUES(1,2,3)
1a10: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1a20: 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t3;.  }.} {1
1a30: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 75 73   2 3}.do_test us
1a40: 65 72 61 75 74 68 30 31 2d 31 2e 36 32 20 7b 0a  erauth01-1.62 {.
1a50: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
1a60: 41 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62  ATTACH 'test3.db
1a70: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 53 45  ' AS aux;.    SE
1a80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
1a90: 74 33 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49  t3 ORDER BY x LI
1aa0: 4d 49 54 20 31 3b 0a 20 20 20 20 44 45 54 41 43  MIT 1;.    DETAC
1ab0: 48 20 61 75 78 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  H aux;.  }.} {{}
1ac0: 20 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20   1 2 3}.do_test 
1ad0: 75 73 65 72 61 75 74 68 30 31 2d 31 2e 36 33 20  userauth01-1.63 
1ae0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  {.  sqlite3_user
1af0: 5f 63 68 61 6e 67 65 20 64 62 20 61 6c 69 63 65  _change db alice
1b00: 20 70 77 2d 34 2d 61 6c 69 63 65 20 31 0a 20 20   pw-4-alice 1.  
1b10: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
1b20: 68 65 6e 74 69 63 61 74 65 20 64 62 20 61 6c 69  henticate db ali
1b30: 63 65 20 70 77 2d 34 2d 61 6c 69 63 65 0a 20 20  ce pw-4-alice.  
1b40: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 41  catchsql {.    A
1b50: 54 54 41 43 48 20 27 74 65 73 74 33 2e 64 62 27  TTACH 'test3.db'
1b60: 20 41 53 20 61 75 78 3b 0a 20 20 7d 0a 7d 20 7b   AS aux;.  }.} {
1b70: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
1b80: 6e 20 64 61 74 61 62 61 73 65 3a 20 74 65 73 74  n database: test
1b90: 33 2e 64 62 7d 7d 0a 64 6f 5f 74 65 73 74 20 75  3.db}}.do_test u
1ba0: 73 65 72 61 75 74 68 30 31 2d 31 2e 36 34 20 7b  serauth01-1.64 {
1bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
1bc0: 64 65 64 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d  ded_errcode db.}
1bd0: 20 7b 53 51 4c 49 54 45 5f 41 55 54 48 7d 0a 64   {SQLITE_AUTH}.d
1be0: 6f 5f 74 65 73 74 20 75 73 65 72 61 75 74 68 30  o_test userauth0
1bf0: 31 2d 31 2e 36 35 20 7b 0a 20 20 64 62 20 65 76  1-1.65 {.  db ev
1c00: 61 6c 20 7b 50 52 41 47 4d 41 20 64 61 74 61 62  al {PRAGMA datab
1c10: 61 73 65 5f 6c 69 73 74 7d 0a 7d 20 7b 7e 2f 74  ase_list}.} {~/t
1c20: 65 73 74 33 2e 64 62 2f 7d 0a 0a 23 20 54 68 65  est3.db/}..# The
1c30: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
1c40: 68 6f 72 69 7a 65 72 28 29 20 63 61 6c 6c 62 61  horizer() callba
1c50: 63 6b 20 69 73 20 6d 6f 64 69 66 69 65 64 20 74  ck is modified t
1c60: 6f 20 74 61 6b 65 20 61 20 37 74 68 20 70 61 72  o take a 7th par
1c70: 61 6d 65 74 65 72 0a 23 20 77 68 69 63 68 20 69  ameter.# which i
1c80: 73 20 74 68 65 20 75 73 65 72 6e 61 6d 65 20 6f  s the username o
1c90: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
1ca0: 6c 6f 67 67 65 64 20 69 6e 20 75 73 65 72 2c 20  logged in user, 
1cb0: 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 61 0a 23 20  or NULL for a.# 
1cc0: 6e 6f 2d 61 75 74 68 65 6e 74 69 63 61 74 69 6f  no-authenticatio
1cd0: 6e 2d 72 65 71 75 69 72 65 64 20 64 61 74 61 62  n-required datab
1ce0: 61 73 65 2e 0a 23 0a 70 72 6f 63 20 61 75 74 68  ase..#.proc auth
1cf0: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 6c 61 70 70   {args} {.  lapp
1d00: 65 6e 64 20 3a 3a 61 75 74 68 61 72 67 73 20 24  end ::authargs $
1d10: 61 72 67 73 0a 20 20 72 65 74 75 72 6e 20 53 51  args.  return SQ
1d20: 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73  LITE_OK.}.do_tes
1d30: 74 20 61 75 74 68 75 73 65 72 30 31 2d 32 2e 31  t authuser01-2.1
1d40: 20 7b 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f   {.  unset -noco
1d50: 6d 70 6c 61 69 6e 20 3a 3a 61 75 74 68 61 72 67  mplain ::autharg
1d60: 73 0a 20 20 64 62 20 61 75 74 68 20 61 75 74 68  s.  db auth auth
1d70: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
1d80: 43 54 20 78 20 46 52 4f 4d 20 74 31 7d 0a 20 20  CT x FROM t1}.  
1d90: 73 65 74 20 3a 3a 61 75 74 68 61 72 67 73 0a 7d  set ::authargs.}
1da0: 20 7b 2f 53 51 4c 49 54 45 5f 53 45 4c 45 43 54   {/SQLITE_SELECT
1db0: 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 61 6c 69   {} {} {} {} ali
1dc0: 63 65 2f 7d 20 20 0a 0a 0a 66 69 6e 69 73 68 5f  ce/}  ...finish_
1dd0: 74 65 73 74 0a                                   test.