/ Hex Artifact Content
Login

Artifact f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e629edbe2648:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 2d 30 39 2d 30 38  /*.** 2014-09-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 75 6c  contains the bul
0190: 6b 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65  k of the impleme
01a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
01b0: 2a 20 75 73 65 72 2d 61 75 74 68 65 6e 74 69 63  * user-authentic
01c0: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ation extension 
01d0: 66 65 61 74 75 72 65 2e 20 20 53 6f 6d 65 20 70  feature.  Some p
01e0: 61 72 74 73 20 6f 66 20 74 68 65 20 75 73 65 72  arts of the user
01f0: 2d 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  -.** authenticat
0200: 69 6f 6e 20 63 6f 64 65 20 61 72 65 20 63 6f 6e  ion code are con
0210: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
0220: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 28 69  e SQLite core (i
0230: 6e 20 74 68 65 0a 2a 2a 20 73 72 63 2f 20 73 75  n the.** src/ su
0240: 62 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68  bdirectory of th
0250: 65 20 6d 61 69 6e 20 73 6f 75 72 63 65 20 63 6f  e main source co
0260: 64 65 20 74 72 65 65 29 20 62 75 74 20 74 68 6f  de tree) but tho
0270: 73 65 20 70 61 72 74 73 0a 2a 2a 20 74 68 61 74  se parts.** that
0280: 20 63 6f 75 6c 64 20 72 65 61 73 6f 6e 61 62 6c   could reasonabl
0290: 65 20 62 65 20 73 65 70 61 72 61 74 65 64 20 6f  e be separated o
02a0: 75 74 20 61 72 65 20 6d 6f 76 65 64 20 69 6e 74  ut are moved int
02b0: 6f 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 0a  o this file..**.
02c0: 2a 2a 20 54 6f 20 63 6f 6d 70 69 6c 65 20 77 69  ** To compile wi
02d0: 74 68 20 74 68 65 20 75 73 65 72 2d 61 75 74 68  th the user-auth
02e0: 65 6e 74 69 63 61 74 69 6f 6e 20 66 65 61 74 75  entication featu
02f0: 72 65 2c 20 61 70 70 65 6e 64 20 74 68 69 73 20  re, append this 
0300: 66 69 6c 65 20 74 6f 0a 2a 2a 20 65 6e 64 20 6f  file to.** end o
0310: 66 20 61 6e 20 53 51 4c 69 74 65 20 61 6d 61 6c  f an SQLite amal
0320: 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 61  gamation, then a
0330: 64 64 20 74 68 65 20 53 51 4c 49 54 45 5f 55 53  dd the SQLITE_US
0340: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
0350: 4e 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  N.** compile-tim
0360: 65 20 6f 70 74 69 6f 6e 2e 20 20 53 65 65 20 74  e option.  See t
0370: 68 65 20 75 73 65 72 2d 61 75 74 68 2e 74 78 74  he user-auth.txt
0380: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
0390: 65 20 73 6f 75 72 63 65 0a 2a 2a 20 64 69 72 65  e source.** dire
03a0: 63 74 6f 72 79 20 61 73 20 74 68 69 73 20 66 69  ctory as this fi
03b0: 6c 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  le for additiona
03c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
03d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
03e0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
03f0: 49 4f 4e 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ION.#ifndef SQLI
0400: 54 45 49 4e 54 5f 48 0a 23 20 69 6e 63 6c 75 64  TEINT_H.# includ
0410: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0420: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72  #endif../*.** Pr
0430: 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61  epare an SQL sta
0440: 74 65 6d 65 6e 74 20 66 6f 72 20 75 73 65 20 62  tement for use b
0450: 79 20 74 68 65 20 75 73 65 72 20 61 75 74 68 65  y the user authe
0460: 6e 74 69 63 61 74 69 6f 6e 20 6c 6f 67 69 63 2e  ntication logic.
0470: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
0480: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 70  nter to the prep
0490: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f  ared statement o
04a0: 6e 20 73 75 63 63 65 73 73 2e 20 20 52 65 74 75  n success.  Retu
04b0: 72 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20 70 6f 69  rn a.** NULL poi
04c0: 6e 74 65 72 20 69 66 20 74 68 65 72 65 20 69 73  nter if there is
04d0: 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 61 6e 79   an error of any
04e0: 20 6b 69 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   kind..*/.static
04f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73   sqlite3_stmt *s
0500: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 50 72  qlite3UserAuthPr
0510: 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
0520: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
0530: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
0540: 2e 2e 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ...){.  sqlite3_
0550: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
0560: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
0570: 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61   rc;.  va_list a
0580: 70 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  p;.  int savedFl
0590: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
05a0: 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ..  va_start(ap,
05b0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71   zFormat);.  zSq
05c0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  l = sqlite3_vmpr
05d0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
05e0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
05f0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
0600: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 2d   return 0;.  db-
0610: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
0620: 5f 57 72 69 74 65 53 63 68 65 6d 61 3b 0a 20 20  _WriteSchema;.  
0630: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
0640: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
0650: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
0660: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
0670: 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 73 71  savedFlags;.  sq
0680: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
0690: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
06a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
06b0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ze(pStmt);.    p
06c0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
06d0: 72 65 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a  return pStmt;.}.
06e0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
06f0: 73 65 65 20 69 66 20 74 68 65 20 73 71 6c 69 74  see if the sqlit
0700: 65 5f 75 73 65 72 20 74 61 62 6c 65 20 65 78 69  e_user table exi
0710: 73 74 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  sts in database 
0720: 7a 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  zDb..*/.static i
0730: 6e 74 20 75 73 65 72 54 61 62 6c 65 45 78 69 73  nt userTableExis
0740: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ts(sqlite3 *db, 
0750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
0760: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
0770: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
0780: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
0790: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
07a0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20  rAll(db);.  if( 
07b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
07c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
07d0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  rr = 0;.    sqli
07e0: 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
07f0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
0800: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 29 3b  bFree(db, zErr);
0810: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
0820: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
0830: 20 22 73 71 6c 69 74 65 5f 75 73 65 72 22 2c 20   "sqlite_user", 
0840: 7a 44 62 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  zDb)!=0;.  sqlit
0850: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
0860: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
0870: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
0880: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
0890: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
08a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 64 61 74  ck to see if dat
08b0: 61 62 61 73 65 20 7a 44 62 20 68 61 73 20 61 20  abase zDb has a 
08c0: 22 73 71 6c 69 74 65 5f 75 73 65 72 22 20 74 61  "sqlite_user" ta
08d0: 62 6c 65 20 61 6e 64 20 69 66 20 69 74 20 64 6f  ble and if it do
08e0: 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 74 68  es.** whether th
08f0: 61 74 20 74 61 62 6c 65 20 63 61 6e 20 61 75 74  at table can aut
0900: 68 65 6e 74 69 63 61 74 65 20 7a 55 73 65 72 20  henticate zUser 
0910: 77 69 74 68 20 6e 50 77 2c 7a 50 77 2e 20 20 57  with nPw,zPw.  W
0920: 72 69 74 65 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  rite one of.** t
0930: 68 65 20 55 41 55 54 48 5f 2a 20 75 73 65 72 20  he UAUTH_* user 
0940: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6c 65  authorization le
0950: 76 65 6c 20 63 6f 64 65 73 20 69 6e 74 6f 20 2a  vel codes into *
0960: 70 65 41 75 74 68 20 61 6e 64 20 72 65 74 75 72  peAuth and retur
0970: 6e 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  n a.** result co
0980: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
0990: 74 20 75 73 65 72 41 75 74 68 43 68 65 63 6b 4c  t userAuthCheckL
09a0: 6f 67 69 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  ogin(.  sqlite3 
09b0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
09c0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
09d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
09e0: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73   check */.  cons
09f0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
0a00: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0a10: 66 20 73 70 65 63 69 66 69 63 20 64 61 74 61 62  f specific datab
0a20: 61 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ase to check */.
0a30: 20 20 75 38 20 2a 70 65 41 75 74 68 20 20 20 20    u8 *peAuth    
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a50: 4f 55 54 3a 20 4f 6e 65 20 6f 66 20 55 41 55 54  OUT: One of UAUT
0a60: 48 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  H_* constants */
0a70: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
0a80: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
0a90: 20 72 63 3b 0a 0a 20 20 2a 70 65 41 75 74 68 20   rc;..  *peAuth 
0aa0: 3d 20 55 41 55 54 48 5f 55 6e 6b 6e 6f 77 6e 3b  = UAUTH_Unknown;
0ab0: 0a 20 20 69 66 28 20 21 75 73 65 72 54 61 62 6c  .  if( !userTabl
0ac0: 65 45 78 69 73 74 73 28 64 62 2c 20 22 6d 61 69  eExists(db, "mai
0ad0: 6e 22 29 20 29 7b 0a 20 20 20 20 2a 70 65 41 75  n") ){.    *peAu
0ae0: 74 68 20 3d 20 55 41 55 54 48 5f 41 64 6d 69 6e  th = UAUTH_Admin
0af0: 3b 20 20 2f 2a 20 4e 6f 20 73 71 6c 69 74 65 5f  ;  /* No sqlite_
0b00: 75 73 65 72 20 74 61 62 6c 65 2e 20 20 45 76 65  user table.  Eve
0b10: 72 79 62 6f 64 79 20 69 73 20 61 64 6d 69 6e 2e  rybody is admin.
0b20: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
0b30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
0b40: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 7a 41 75  if( db->auth.zAu
0b50: 74 68 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20  thUser==0 ){.   
0b60: 20 2a 70 65 41 75 74 68 20 3d 20 55 41 55 54 48   *peAuth = UAUTH
0b70: 5f 46 61 69 6c 3b 0a 20 20 20 20 72 65 74 75 72  _Fail;.    retur
0b80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
0b90: 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
0ba0: 65 33 55 73 65 72 41 75 74 68 50 72 65 70 61 72  e3UserAuthPrepar
0bb0: 65 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  e(db,.          
0bc0: 20 20 22 53 45 4c 45 43 54 20 70 77 3d 73 71 6c    "SELECT pw=sql
0bd0: 69 74 65 5f 63 72 79 70 74 28 3f 31 2c 70 77 29  ite_crypt(?1,pw)
0be0: 2c 20 69 73 41 64 6d 69 6e 20 46 52 4f 4d 20 5c  , isAdmin FROM \
0bf0: 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 75 73 65  "%w\".sqlite_use
0c00: 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  r".            "
0c10: 20 57 48 45 52 45 20 75 6e 61 6d 65 3d 3f 32 22   WHERE uname=?2"
0c20: 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 53  , zDb);.  if( pS
0c30: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
0c40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0c50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
0c60: 62 28 70 53 74 6d 74 2c 20 31 2c 20 64 62 2d 3e  b(pStmt, 1, db->
0c70: 61 75 74 68 2e 7a 41 75 74 68 50 57 2c 20 64 62  auth.zAuthPW, db
0c80: 2d 3e 61 75 74 68 2e 6e 41 75 74 68 50 57 2c 53  ->auth.nAuthPW,S
0c90: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
0ca0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
0cb0: 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 64 62 2d  xt(pStmt, 2, db-
0cc0: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 2c  >auth.zAuthUser,
0cd0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
0ce0: 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  IC);.  rc = sqli
0cf0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
0d00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
0d10: 45 5f 52 4f 57 20 26 26 20 73 71 6c 69 74 65 33  E_ROW && sqlite3
0d20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
0d30: 74 2c 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 41  t,0) ){.    *peA
0d40: 75 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  uth = sqlite3_co
0d50: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
0d60: 31 29 20 2b 20 55 41 55 54 48 5f 55 73 65 72 3b  1) + UAUTH_User;
0d70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
0d80: 65 41 75 74 68 20 3d 20 55 41 55 54 48 5f 46 61  eAuth = UAUTH_Fa
0d90: 69 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  il;.  }.  return
0da0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0db0: 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 69 6e 74 20  e(pStmt);.}.int 
0dc0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 43  sqlite3UserAuthC
0dd0: 68 65 63 6b 4c 6f 67 69 6e 28 0a 20 20 73 71 6c  heckLogin(.  sql
0de0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
0df0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
0e00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0e10: 6f 6e 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  on to check */. 
0e20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
0e30: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
0e40: 61 6d 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ame of specific 
0e50: 64 61 74 61 62 61 73 65 20 74 6f 20 63 68 65 63  database to chec
0e60: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 65 41 75 74  k */.  u8 *peAut
0e70: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
0e80: 20 20 2f 2a 20 4f 55 54 3a 20 4f 6e 65 20 6f 66    /* OUT: One of
0e90: 20 55 41 55 54 48 5f 2a 20 63 6f 6e 73 74 61 6e   UAUTH_* constan
0ea0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
0eb0: 63 3b 0a 20 20 75 38 20 73 61 76 65 64 41 75 74  c;.  u8 savedAut
0ec0: 68 4c 65 76 65 6c 3b 0a 20 20 61 73 73 65 72 74  hLevel;.  assert
0ed0: 28 20 7a 44 62 21 3d 30 20 29 3b 0a 20 20 61 73  ( zDb!=0 );.  as
0ee0: 73 65 72 74 28 20 70 65 41 75 74 68 21 3d 30 20  sert( peAuth!=0 
0ef0: 29 3b 0a 20 20 73 61 76 65 64 41 75 74 68 4c 65  );.  savedAuthLe
0f00: 76 65 6c 20 3d 20 64 62 2d 3e 61 75 74 68 2e 61  vel = db->auth.a
0f10: 75 74 68 4c 65 76 65 6c 3b 0a 20 20 64 62 2d 3e  uthLevel;.  db->
0f20: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 20 3d  auth.authLevel =
0f30: 20 55 41 55 54 48 5f 41 64 6d 69 6e 3b 0a 20 20   UAUTH_Admin;.  
0f40: 72 63 20 3d 20 75 73 65 72 41 75 74 68 43 68 65  rc = userAuthChe
0f50: 63 6b 4c 6f 67 69 6e 28 64 62 2c 20 7a 44 62 2c  ckLogin(db, zDb,
0f60: 20 70 65 41 75 74 68 29 3b 0a 20 20 64 62 2d 3e   peAuth);.  db->
0f70: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 20 3d  auth.authLevel =
0f80: 20 73 61 76 65 64 41 75 74 68 4c 65 76 65 6c 3b   savedAuthLevel;
0f90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
0fa0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  ./*.** If the cu
0fb0: 72 72 65 6e 74 20 61 75 74 68 4c 65 76 65 6c 20  rrent authLevel 
0fc0: 69 73 20 55 41 55 54 48 5f 55 6e 6b 6e 6f 77 6e  is UAUTH_Unknown
0fd0: 2c 20 74 68 65 20 74 61 6b 65 20 61 63 74 69 6f  , the take actio
0fe0: 6e 73 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a 20  ns to figure.** 
0ff0: 6f 75 74 20 77 68 61 74 20 61 75 74 68 4c 65 76  out what authLev
1000: 65 6c 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2f 0a  el should be.*/.
1010: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 73 65 72  void sqlite3User
1020: 41 75 74 68 49 6e 69 74 28 73 71 6c 69 74 65 33  AuthInit(sqlite3
1030: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
1040: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d  >auth.authLevel=
1050: 3d 55 41 55 54 48 5f 55 6e 6b 6e 6f 77 6e 20 29  =UAUTH_Unknown )
1060: 7b 0a 20 20 20 20 75 38 20 61 75 74 68 4c 65 76  {.    u8 authLev
1070: 65 6c 20 3d 20 55 41 55 54 48 5f 46 61 69 6c 3b  el = UAUTH_Fail;
1080: 0a 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72  .    sqlite3User
1090: 41 75 74 68 43 68 65 63 6b 4c 6f 67 69 6e 28 64  AuthCheckLogin(d
10a0: 62 2c 20 22 6d 61 69 6e 22 2c 20 26 61 75 74 68  b, "main", &auth
10b0: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e  Level);.    db->
10c0: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 20 3d  auth.authLevel =
10d0: 20 61 75 74 68 4c 65 76 65 6c 3b 0a 20 20 20 20   authLevel;.    
10e0: 69 66 28 20 61 75 74 68 4c 65 76 65 6c 3c 55 41  if( authLevel<UA
10f0: 55 54 48 5f 41 64 6d 69 6e 20 29 20 64 62 2d 3e  UTH_Admin ) db->
1100: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1110: 5f 57 72 69 74 65 53 63 68 65 6d 61 3b 0a 20 20  _WriteSchema;.  
1120: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
1130: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1140: 20 73 71 6c 69 74 65 5f 63 72 79 70 74 28 58 2c   sqlite_crypt(X,
1150: 59 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  Y) function..**.
1160: 2a 2a 20 49 66 20 59 20 69 73 20 4e 55 4c 4c 20  ** If Y is NULL 
1170: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 61 20  then generate a 
1180: 6e 65 77 20 68 61 73 68 20 66 6f 72 20 70 61 73  new hash for pas
1190: 73 77 6f 72 64 20 58 20 61 6e 64 20 72 65 74 75  sword X and retu
11a0: 72 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 68 2e  rn that.** hash.
11b0: 20 20 49 66 20 59 20 69 73 20 6e 6f 74 20 6e 75    If Y is not nu
11c0: 6c 6c 2c 20 74 68 65 6e 20 67 65 6e 65 72 61 74  ll, then generat
11d0: 65 20 61 20 68 61 73 68 20 66 6f 72 20 70 61 73  e a hash for pas
11e0: 73 77 6f 72 64 20 58 20 75 73 69 6e 67 20 74 68  sword X using th
11f0: 65 0a 2a 2a 20 73 61 6d 65 20 73 61 6c 74 20 61  e.** same salt a
1200: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 68  s the previous h
1210: 61 73 68 20 59 20 61 6e 64 20 72 65 74 75 72 6e  ash Y and return
1220: 20 74 68 65 20 6e 65 77 20 68 61 73 68 2e 0a 2a   the new hash..*
1230: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
1240: 79 70 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  yptFunc(.  sqlit
1250: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1260: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
1270: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
1280: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
12a0: 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 69 69 3b 0a  .  int nIn, ii;.
12b0: 20 20 75 38 20 2a 7a 4f 75 74 3b 0a 20 20 63 68    u8 *zOut;.  ch
12c0: 61 72 20 7a 53 61 6c 74 5b 38 5d 3b 0a 20 20 7a  ar zSalt[8];.  z
12d0: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
12e0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
12f0: 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65  ;.  nIn = sqlite
1300: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
1310: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 73 71  gv[0]);.  if( sq
1320: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1330: 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54  (argv[1])==SQLIT
1340: 45 5f 42 4c 4f 42 0a 20 20 20 26 26 20 73 71 6c  E_BLOB.   && sql
1350: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
1360: 28 61 72 67 76 5b 31 5d 29 3d 3d 6e 49 6e 2b 73  (argv[1])==nIn+s
1370: 69 7a 65 6f 66 28 7a 53 61 6c 74 29 0a 20 20 29  izeof(zSalt).  )
1380: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 61  {.    memcpy(zSa
1390: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  lt, sqlite3_valu
13a0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 2c  e_blob(argv[1]),
13b0: 20 73 69 7a 65 6f 66 28 7a 53 61 6c 74 29 29 3b   sizeof(zSalt));
13c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
13d0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
13e0: 28 73 69 7a 65 6f 66 28 7a 53 61 6c 74 29 2c 20  (sizeof(zSalt), 
13f0: 7a 53 61 6c 74 29 3b 0a 20 20 7d 0a 20 20 7a 4f  zSalt);.  }.  zO
1400: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ut = sqlite3_mal
1410: 6c 6f 63 28 20 6e 49 6e 2b 73 69 7a 65 6f 66 28  loc( nIn+sizeof(
1420: 7a 53 61 6c 74 29 20 29 3b 0a 20 20 69 66 28 20  zSalt) );.  if( 
1430: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  zOut==0 ){.    s
1440: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1450: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
1460: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1470: 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 53   memcpy(zOut, zS
1480: 61 6c 74 2c 20 73 69 7a 65 6f 66 28 7a 53 61 6c  alt, sizeof(zSal
1490: 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  t));.    for(ii=
14a0: 30 3b 20 69 69 3c 6e 49 6e 3b 20 69 69 2b 2b 29  0; ii<nIn; ii++)
14b0: 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 69 69 2b  {.      zOut[ii+
14c0: 73 69 7a 65 6f 66 28 7a 53 61 6c 74 29 5d 20 3d  sizeof(zSalt)] =
14d0: 20 7a 49 6e 5b 69 69 5d 5e 7a 53 61 6c 74 5b 69   zIn[ii]^zSalt[i
14e0: 69 26 30 78 37 5d 3b 0a 20 20 20 20 7d 0a 20 20  i&0x7];.    }.  
14f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1500: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 7a  _blob(context, z
1510: 4f 75 74 2c 20 6e 49 6e 2b 73 69 7a 65 6f 66 28  Out, nIn+sizeof(
1520: 7a 53 61 6c 74 29 2c 20 73 71 6c 69 74 65 33 5f  zSalt), sqlite3_
1530: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  free);.  }.}../*
1540: 0a 2a 2a 20 49 66 20 61 20 64 61 74 61 62 61 73  .** If a databas
1550: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 53  e contains the S
1560: 51 4c 49 54 45 5f 55 53 45 52 20 74 61 62 6c 65  QLITE_USER table
1570: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  , then the.** sq
1580: 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65  lite3_user_authe
1590: 6e 74 69 63 61 74 65 28 29 20 69 6e 74 65 72 66  nticate() interf
15a0: 61 63 65 20 6d 75 73 74 20 62 65 20 69 6e 76 6f  ace must be invo
15b0: 6b 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 61  ked with an.** a
15c0: 70 70 72 6f 70 72 69 61 74 65 20 75 73 65 72 6e  ppropriate usern
15d0: 61 6d 65 20 61 6e 64 20 70 61 73 73 77 6f 72 64  ame and password
15e0: 20 70 72 69 6f 72 20 74 6f 20 65 6e 61 62 6c 65   prior to enable
15f0: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a   read and write.
1600: 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ** access to the
1610: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1620: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1630: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1640: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
1650: 74 68 65 20 75 73 65 72 6e 61 6d 65 2f 70 61 73  the username/pas
1660: 73 77 6f 72 64 0a 2a 2a 20 63 6f 6d 62 69 6e 61  sword.** combina
1670: 74 69 6f 6e 20 69 73 20 69 6e 63 6f 72 72 65 63  tion is incorrec
1680: 74 20 6f 72 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  t or unknown..**
1690: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
16a0: 45 5f 55 53 45 52 20 74 61 62 6c 65 20 69 73 20  E_USER table is 
16b0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
16c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16d0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 69  , then.** this i
16e0: 6e 74 65 72 66 61 63 65 20 69 73 20 61 20 68 61  nterface is a ha
16f0: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 20 72 65 74  rmless no-op ret
1700: 75 72 6e 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  urnning SQLITE_O
1710: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1720: 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  3_user_authentic
1730: 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
1740: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
1750: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1760: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
1770: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 6e  nst char *zUsern
1780: 61 6d 65 2c 20 2f 2a 20 55 73 65 72 6e 61 6d 65  ame, /* Username
1790: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
17a0: 20 2a 7a 50 57 2c 20 20 20 20 20 20 20 2f 2a 20   *zPW,       /* 
17b0: 50 61 73 73 77 6f 72 64 20 6f 72 20 63 72 65 64  Password or cred
17c0: 65 6e 74 69 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  entials */.  int
17d0: 20 6e 50 57 20 20 20 20 20 20 20 20 20 20 20 20   nPW            
17e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17f0: 20 62 79 74 65 73 20 69 6e 20 61 50 57 5b 5d 20   bytes in aPW[] 
1800: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1810: 20 20 75 38 20 61 75 74 68 4c 65 76 65 6c 20 3d    u8 authLevel =
1820: 20 55 41 55 54 48 5f 46 61 69 6c 3b 0a 20 20 64   UAUTH_Fail;.  d
1830: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
1840: 6c 20 3d 20 55 41 55 54 48 5f 55 6e 6b 6e 6f 77  l = UAUTH_Unknow
1850: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  n;.  sqlite3_fre
1860: 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  e(db->auth.zAuth
1870: 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  User);.  sqlite3
1880: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
1890: 41 75 74 68 50 57 29 3b 0a 20 20 6d 65 6d 73 65  AuthPW);.  memse
18a0: 74 28 26 64 62 2d 3e 61 75 74 68 2c 20 30 2c 20  t(&db->auth, 0, 
18b0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 75 74 68 29  sizeof(db->auth)
18c0: 29 3b 0a 20 20 64 62 2d 3e 61 75 74 68 2e 7a 41  );.  db->auth.zA
18d0: 75 74 68 55 73 65 72 20 3d 20 73 71 6c 69 74 65  uthUser = sqlite
18e0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
18f0: 7a 55 73 65 72 6e 61 6d 65 29 3b 0a 20 20 69 66  zUsername);.  if
1900: 28 20 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  ( db->auth.zAuth
1910: 55 73 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  User==0 ) return
1920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1930: 20 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50   db->auth.zAuthP
1940: 57 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  W = sqlite3_mall
1950: 6f 63 28 20 6e 50 57 2b 31 20 29 3b 0a 20 20 69  oc( nPW+1 );.  i
1960: 66 28 20 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  f( db->auth.zAut
1970: 68 50 57 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  hPW==0 ) return 
1980: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1990: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 75 74 68 2e  memcpy(db->auth.
19a0: 7a 41 75 74 68 50 57 2c 7a 50 57 2c 6e 50 57 29  zAuthPW,zPW,nPW)
19b0: 3b 0a 20 20 64 62 2d 3e 61 75 74 68 2e 6e 41 75  ;.  db->auth.nAu
19c0: 74 68 50 57 20 3d 20 6e 50 57 3b 0a 20 20 72 63  thPW = nPW;.  rc
19d0: 20 3d 20 73 71 6c 69 74 65 33 55 73 65 72 41 75   = sqlite3UserAu
19e0: 74 68 43 68 65 63 6b 4c 6f 67 69 6e 28 64 62 2c  thCheckLogin(db,
19f0: 20 22 6d 61 69 6e 22 2c 20 26 61 75 74 68 4c 65   "main", &authLe
1a00: 76 65 6c 29 3b 0a 20 20 64 62 2d 3e 61 75 74 68  vel);.  db->auth
1a10: 2e 61 75 74 68 4c 65 76 65 6c 20 3d 20 61 75 74  .authLevel = aut
1a20: 68 4c 65 76 65 6c 3b 0a 20 20 73 71 6c 69 74 65  hLevel;.  sqlite
1a30: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1a40: 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29  tatements(db, 0)
1a50: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1a60: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
1a70: 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 65 72         /* OOM er
1a80: 72 6f 72 2c 20 49 2f 4f 20 65 72 72 6f 72 2c 20  ror, I/O error, 
1a90: 65 74 63 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  etc. */.  }.  if
1aa0: 28 20 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  ( authLevel<UAUT
1ab0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 72 65  H_User ){.    re
1ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 55 54 48  turn SQLITE_AUTH
1ad0: 3b 20 20 2f 2a 20 49 6e 63 6f 72 72 65 63 74 20  ;  /* Incorrect 
1ae0: 75 73 65 72 6e 61 6d 65 20 61 6e 64 2f 6f 72 20  username and/or 
1af0: 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 7d 0a  password */.  }.
1b00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b10: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 53 75 63 63  OK;      /* Succ
1b20: 65 73 73 66 75 6c 20 6c 6f 67 69 6e 20 2a 2f 0a  essful login */.
1b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
1b40: 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 29 20  ite3_user_add() 
1b50: 69 6e 74 65 72 66 61 63 65 20 63 61 6e 20 62 65  interface can be
1b60: 20 75 73 65 64 20 28 62 79 20 61 6e 20 61 64 6d   used (by an adm
1b70: 69 6e 20 75 73 65 72 20 6f 6e 6c 79 29 0a 2a 2a  in user only).**
1b80: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
1b90: 20 75 73 65 72 2e 20 20 57 68 65 6e 20 63 61 6c   user.  When cal
1ba0: 6c 65 64 20 6f 6e 20 61 20 6e 6f 2d 61 75 74 68  led on a no-auth
1bb0: 65 6e 74 69 63 61 74 69 6f 6e 2d 72 65 71 75 69  entication-requi
1bc0: 72 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2c  red.** database,
1bd0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
1be0: 6e 76 65 72 74 73 20 74 68 65 20 64 61 74 61 62  nverts the datab
1bf0: 61 73 65 20 69 6e 74 6f 20 61 6e 20 61 75 74 68  ase into an auth
1c00: 65 6e 74 69 63 61 74 69 6f 6e 2d 0a 2a 2a 20 72  entication-.** r
1c10: 65 71 75 69 72 65 64 20 64 61 74 61 62 61 73 65  equired database
1c20: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
1c30: 6d 61 6b 65 73 20 74 68 65 20 61 64 64 65 64 20  makes the added 
1c40: 75 73 65 72 20 61 6e 0a 2a 2a 20 61 64 6d 69 6e  user an.** admin
1c50: 69 73 74 72 61 74 6f 72 2c 20 61 6e 64 20 6c 6f  istrator, and lo
1c60: 67 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  gs in the curren
1c70: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  t connection as 
1c80: 74 68 61 74 20 75 73 65 72 2e 0a 2a 2a 20 54 68  that user..** Th
1c90: 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  e sqlite3_user_a
1ca0: 64 64 28 29 20 69 6e 74 65 72 66 61 63 65 20 6f  dd() interface o
1cb0: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 74 68  nly works for th
1cc0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
1cd0: 65 2c 20 6e 6f 74 0a 2a 2a 20 66 6f 72 20 61 6e  e, not.** for an
1ce0: 79 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61  y ATTACH-ed data
1cf0: 62 61 73 65 73 2e 20 20 41 6e 79 20 63 61 6c 6c  bases.  Any call
1d00: 20 74 6f 20 73 71 6c 69 74 65 33 5f 75 73 65 72   to sqlite3_user
1d10: 5f 61 64 64 28 29 20 62 79 20 61 0a 2a 2a 20 6e  _add() by a.** n
1d20: 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 20 72 65  on-admin user re
1d30: 73 75 6c 74 73 20 69 6e 20 61 6e 20 65 72 72 6f  sults in an erro
1d40: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1d50: 33 5f 75 73 65 72 5f 61 64 64 28 0a 20 20 73 71  3_user_add(.  sq
1d60: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1d70: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
1da0: 65 72 6e 61 6d 65 2c 20 2f 2a 20 55 73 65 72 6e  ername, /* Usern
1db0: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
1dc0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1dd0: 2a 61 50 57 2c 20 20 20 20 20 20 20 2f 2a 20 50  *aPW,       /* P
1de0: 61 73 73 77 6f 72 64 20 6f 72 20 63 72 65 64 65  assword or crede
1df0: 6e 74 69 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ntials */.  int 
1e00: 6e 50 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  nPW,            
1e10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e20: 62 79 74 65 73 20 69 6e 20 61 50 57 5b 5d 20 2a  bytes in aPW[] *
1e30: 2f 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20  /.  int isAdmin 
1e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e50: 75 65 20 74 6f 20 67 69 76 65 20 6e 65 77 20 75  ue to give new u
1e60: 73 65 72 20 61 64 6d 69 6e 20 70 72 69 76 69 6c  ser admin privil
1e70: 65 67 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ege */.){.  sqli
1e80: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1e90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1ea0: 69 74 65 33 55 73 65 72 41 75 74 68 49 6e 69 74  ite3UserAuthInit
1eb0: 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
1ec0: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
1ed0: 41 55 54 48 5f 41 64 6d 69 6e 20 29 20 72 65 74  AUTH_Admin ) ret
1ee0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 55 54 48 3b  urn SQLITE_AUTH;
1ef0: 0a 20 20 69 66 28 20 21 75 73 65 72 54 61 62 6c  .  if( !userTabl
1f00: 65 45 78 69 73 74 73 28 64 62 2c 20 22 6d 61 69  eExists(db, "mai
1f10: 6e 22 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  n") ){.    if( !
1f20: 69 73 41 64 6d 69 6e 20 29 20 72 65 74 75 72 6e  isAdmin ) return
1f30: 20 53 51 4c 49 54 45 5f 41 55 54 48 3b 0a 20 20   SQLITE_AUTH;.  
1f40: 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    pStmt = sqlite
1f50: 33 55 73 65 72 41 75 74 68 50 72 65 70 61 72 65  3UserAuthPrepare
1f60: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
1f70: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
1f80: 45 20 73 71 6c 69 74 65 5f 75 73 65 72 28 5c 6e  E sqlite_user(\n
1f90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1fa0: 22 20 20 75 6e 61 6d 65 20 54 45 58 54 20 50 52  "  uname TEXT PR
1fb0: 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20  IMARY KEY,\n".  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 69              "  i
1fd0: 73 41 64 6d 69 6e 20 42 4f 4f 4c 45 41 4e 2c 5c  sAdmin BOOLEAN,\
1fe0: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
1ff0: 20 22 20 20 70 77 20 42 4c 4f 42 5c 6e 22 0a 20   "  pw BLOB\n". 
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 20               ") 
2010: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 29  WITHOUT ROWID;")
2020: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d  ;.    if( pStmt=
2030: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2040: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71  TE_NOMEM;.    sq
2050: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2060: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2070: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2080: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  mt);.    if( rc 
2090: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
20a0: 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
20b0: 65 33 55 73 65 72 41 75 74 68 50 72 65 70 61 72  e3UserAuthPrepar
20c0: 65 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  e(db, .         
20d0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
20e0: 73 71 6c 69 74 65 5f 75 73 65 72 28 75 6e 61 6d  sqlite_user(unam
20f0: 65 2c 69 73 41 64 6d 69 6e 2c 70 77 29 22 0a 20  e,isAdmin,pw)". 
2100: 20 20 20 20 20 20 20 20 20 20 20 22 20 56 41 4c             " VAL
2110: 55 45 53 28 25 51 2c 25 64 2c 73 71 6c 69 74 65  UES(%Q,%d,sqlite
2120: 5f 63 72 79 70 74 28 3f 31 2c 4e 55 4c 4c 29 29  _crypt(?1,NULL))
2130: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ",.            z
2140: 55 73 65 72 6e 61 6d 65 2c 20 69 73 41 64 6d 69  Username, isAdmi
2150: 6e 21 3d 30 29 3b 0a 20 20 69 66 28 20 70 53 74  n!=0);.  if( pSt
2160: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  mt==0 ) return S
2170: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
2180: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
2190: 28 70 53 74 6d 74 2c 20 31 2c 20 61 50 57 2c 20  (pStmt, 1, aPW, 
21a0: 6e 50 57 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  nPW, SQLITE_STAT
21b0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
21c0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 72 63  tep(pStmt);.  rc
21d0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
21e0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
21f0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2200: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  ;.  if( db->auth
2210: 2e 7a 41 75 74 68 55 73 65 72 3d 3d 30 20 29 7b  .zAuthUser==0 ){
2220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
2230: 64 6d 69 6e 21 3d 30 20 29 3b 0a 20 20 20 20 73  dmin!=0 );.    s
2240: 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68  qlite3_user_auth
2250: 65 6e 74 69 63 61 74 65 28 64 62 2c 20 7a 55 73  enticate(db, zUs
2260: 65 72 6e 61 6d 65 2c 20 61 50 57 2c 20 6e 50 57  ername, aPW, nPW
2270: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2290: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
22a0: 75 73 65 72 5f 63 68 61 6e 67 65 28 29 20 69 6e  user_change() in
22b0: 74 65 72 66 61 63 65 20 63 61 6e 20 62 65 20 75  terface can be u
22c0: 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 61 20  sed to change a 
22d0: 75 73 65 72 73 0a 2a 2a 20 6c 6f 67 69 6e 20 63  users.** login c
22e0: 72 65 64 65 6e 74 69 61 6c 73 20 6f 72 20 61 64  redentials or ad
22f0: 6d 69 6e 20 70 72 69 76 69 6c 65 67 65 2e 20 20  min privilege.  
2300: 41 6e 79 20 75 73 65 72 20 63 61 6e 20 63 68 61  Any user can cha
2310: 6e 67 65 20 74 68 65 69 72 20 6f 77 6e 0a 2a 2a  nge their own.**
2320: 20 6c 6f 67 69 6e 20 63 72 65 64 65 6e 74 69 61   login credentia
2330: 6c 73 2e 20 20 4f 6e 6c 79 20 61 6e 20 61 64 6d  ls.  Only an adm
2340: 69 6e 20 75 73 65 72 20 63 61 6e 20 63 68 61 6e  in user can chan
2350: 67 65 20 61 6e 6f 74 68 65 72 20 75 73 65 72 73  ge another users
2360: 20 6c 6f 67 69 6e 0a 2a 2a 20 63 72 65 64 65 6e   login.** creden
2370: 74 69 61 6c 73 20 6f 72 20 61 64 6d 69 6e 20 70  tials or admin p
2380: 72 69 76 69 6c 65 67 65 20 73 65 74 74 69 6e 67  rivilege setting
2390: 2e 20 20 4e 6f 20 75 73 65 72 20 6d 61 79 20 63  .  No user may c
23a0: 68 61 6e 67 65 20 74 68 65 69 72 20 6f 77 6e 20  hange their own 
23b0: 0a 2a 2a 20 61 64 6d 69 6e 20 70 72 69 76 69 6c  .** admin privil
23c0: 65 67 65 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a  ege setting..*/.
23d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 73 65 72  int sqlite3_user
23e0: 5f 63 68 61 6e 67 65 28 0a 20 20 73 71 6c 69 74  _change(.  sqlit
23f0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2400: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2410: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
2420: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 6e  nst char *zUsern
2430: 61 6d 65 2c 20 2f 2a 20 55 73 65 72 6e 61 6d 65  ame, /* Username
2440: 20 74 6f 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20   to change */.  
2450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 57 2c  const char *aPW,
2460: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
2470: 65 64 20 70 61 73 73 77 6f 72 64 20 6f 72 20 63  ed password or c
2480: 72 65 64 65 6e 74 69 61 6c 73 20 2a 2f 0a 20 20  redentials */.  
2490: 69 6e 74 20 6e 50 57 2c 20 20 20 20 20 20 20 20  int nPW,        
24a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24b0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 50 57   of bytes in aPW
24c0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 64  [] */.  int isAd
24d0: 6d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 2f  min            /
24e0: 2a 20 4d 6f 64 69 66 69 65 64 20 61 64 6d 69 6e  * Modified admin
24f0: 20 70 72 69 76 69 6c 65 67 65 20 66 6f 72 20 74   privilege for t
2500: 68 65 20 75 73 65 72 20 2a 2f 0a 29 7b 0a 20 20  he user */.){.  
2510: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2520: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
2530: 20 75 38 20 61 75 74 68 4c 65 76 65 6c 3b 0a 0a   u8 authLevel;..
2540: 20 20 61 75 74 68 4c 65 76 65 6c 20 3d 20 64 62    authLevel = db
2550: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
2560: 3b 0a 20 20 69 66 28 20 61 75 74 68 4c 65 76 65  ;.  if( authLeve
2570: 6c 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a  l<UAUTH_User ){.
2580: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 6c      /* Must be l
2590: 6f 67 67 65 64 20 69 6e 20 74 6f 20 6d 61 6b 65  ogged in to make
25a0: 20 61 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20   a change */.   
25b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
25c0: 55 54 48 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  UTH;.  }.  if( s
25d0: 74 72 63 6d 70 28 64 62 2d 3e 61 75 74 68 2e 7a  trcmp(db->auth.z
25e0: 41 75 74 68 55 73 65 72 2c 20 7a 55 73 65 72 6e  AuthUser, zUsern
25f0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  ame)!=0 ){.    i
2600: 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  f( db->auth.auth
2610: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69  Level<UAUTH_Admi
2620: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  n ){.      /* Mu
2630: 73 74 20 62 65 20 61 6e 20 61 64 6d 69 6e 69 73  st be an adminis
2640: 74 72 61 74 6f 72 20 74 6f 20 63 68 61 6e 67 65  trator to change
2650: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 73 65   a different use
2660: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
2670: 6e 20 53 51 4c 49 54 45 5f 41 55 54 48 3b 0a 20  n SQLITE_AUTH;. 
2680: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2690: 20 69 73 41 64 6d 69 6e 21 3d 28 61 75 74 68 4c   isAdmin!=(authL
26a0: 65 76 65 6c 3d 3d 55 41 55 54 48 5f 41 64 6d 69  evel==UAUTH_Admi
26b0: 6e 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e  n) ){.    /* Can
26c0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 69  not change the i
26d0: 73 41 64 6d 69 6e 20 73 65 74 74 69 6e 67 20 66  sAdmin setting f
26e0: 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 72  or self */.    r
26f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 55 54  eturn SQLITE_AUT
2700: 48 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 75 74  H;.  }.  db->aut
2710: 68 2e 61 75 74 68 4c 65 76 65 6c 20 3d 20 55 41  h.authLevel = UA
2720: 55 54 48 5f 41 64 6d 69 6e 3b 0a 20 20 69 66 28  UTH_Admin;.  if(
2730: 20 21 75 73 65 72 54 61 62 6c 65 45 78 69 73 74   !userTableExist
2740: 73 28 64 62 2c 20 22 6d 61 69 6e 22 29 20 29 7b  s(db, "main") ){
2750: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
2760: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2770: 69 66 20 74 68 65 20 75 73 65 72 20 74 6f 20 62  if the user to b
2780: 65 20 6d 6f 64 69 66 69 65 64 20 64 6f 65 73 20  e modified does 
2790: 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 7d  not exist */.  }
27a0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d 74 20  else{.    pStmt 
27b0: 3d 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  = sqlite3UserAut
27c0: 68 50 72 65 70 61 72 65 28 64 62 2c 0a 20 20 20  hPrepare(db,.   
27d0: 20 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41             "UPDA
27e0: 54 45 20 73 71 6c 69 74 65 5f 75 73 65 72 20 53  TE sqlite_user S
27f0: 45 54 20 69 73 41 64 6d 69 6e 3d 25 64 2c 20 70  ET isAdmin=%d, p
2800: 77 3d 73 71 6c 69 74 65 5f 63 72 79 70 74 28 3f  w=sqlite_crypt(?
2810: 31 2c 4e 55 4c 4c 29 22 0a 20 20 20 20 20 20 20  1,NULL)".       
2820: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 75         " WHERE u
2830: 6e 61 6d 65 3d 25 51 22 2c 20 69 73 41 64 6d 69  name=%Q", isAdmi
2840: 6e 2c 20 7a 55 73 65 72 6e 61 6d 65 29 3b 0a 20  n, zUsername);. 
2850: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
2860: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2870: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2890: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
28a0: 53 74 6d 74 2c 20 31 2c 20 61 50 57 2c 20 6e 50  Stmt, 1, aPW, nP
28b0: 57 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  W, SQLITE_STATIC
28c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
28e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
2910: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
2920: 20 3d 20 61 75 74 68 4c 65 76 65 6c 3b 0a 20 20   = authLevel;.  
2930: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
2950: 75 73 65 72 5f 64 65 6c 65 74 65 28 29 20 69 6e  user_delete() in
2960: 74 65 72 66 61 63 65 20 63 61 6e 20 62 65 20 75  terface can be u
2970: 73 65 64 20 28 62 79 20 61 6e 20 61 64 6d 69 6e  sed (by an admin
2980: 20 75 73 65 72 20 6f 6e 6c 79 29 0a 2a 2a 20 74   user only).** t
2990: 6f 20 64 65 6c 65 74 65 20 61 20 75 73 65 72 2e  o delete a user.
29a0: 20 20 54 68 65 20 63 75 72 72 65 6e 74 6c 79 20    The currently 
29b0: 6c 6f 67 67 65 64 2d 69 6e 20 75 73 65 72 20 63  logged-in user c
29c0: 61 6e 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  annot be deleted
29d0: 2c 0a 2a 2a 20 77 68 69 63 68 20 67 75 61 72 61  ,.** which guara
29e0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
29f0: 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 64   is always an ad
2a00: 6d 69 6e 20 75 73 65 72 20 61 6e 64 20 68 65 6e  min user and hen
2a10: 63 65 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 64  ce that.** the d
2a20: 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
2a30: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2a40: 20 61 20 6e 6f 2d 61 75 74 68 65 6e 74 69 63 61   a no-authentica
2a50: 74 69 6f 6e 2d 72 65 71 75 69 72 65 64 0a 2a 2a  tion-required.**
2a60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
2a70: 74 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  t sqlite3_user_d
2a80: 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2a90: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
2aa0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2ab0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
2ac0: 74 20 63 68 61 72 20 2a 7a 55 73 65 72 6e 61 6d  t char *zUsernam
2ad0: 65 20 20 2f 2a 20 55 73 65 72 6e 61 6d 65 20 74  e  /* Username t
2ae0: 6f 20 72 65 6d 6f 76 65 20 2a 2f 0a 29 7b 0a 20  o remove */.){. 
2af0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b00: 53 74 6d 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Stmt;.  if( db->
2b10: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
2b20: 41 55 54 48 5f 41 64 6d 69 6e 20 29 7b 0a 20 20  AUTH_Admin ){.  
2b30: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 6e 20    /* Must be an 
2b40: 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 20 74 6f  administrator to
2b50: 20 64 65 6c 65 74 65 20 61 20 75 73 65 72 20 2a   delete a user *
2b60: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
2b70: 49 54 45 5f 41 55 54 48 3b 0a 20 20 7d 0a 20 20  ITE_AUTH;.  }.  
2b80: 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d 3e 61  if( strcmp(db->a
2b90: 75 74 68 2e 7a 41 75 74 68 55 73 65 72 2c 20 7a  uth.zAuthUser, z
2ba0: 55 73 65 72 6e 61 6d 65 29 3d 3d 30 20 29 7b 0a  Username)==0 ){.
2bb0: 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 64 65      /* Cannot de
2bc0: 6c 65 74 65 20 73 65 6c 66 20 2a 2f 0a 20 20 20  lete self */.   
2bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
2be0: 55 54 48 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  UTH;.  }.  if( !
2bf0: 75 73 65 72 54 61 62 6c 65 45 78 69 73 74 73 28  userTableExists(
2c00: 64 62 2c 20 22 6d 61 69 6e 22 29 20 29 7b 0a 20  db, "main") ){. 
2c10: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
2c20: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ne is a no-op if
2c30: 20 74 68 65 20 75 73 65 72 20 74 6f 20 62 65 20   the user to be 
2c40: 64 65 6c 65 74 65 64 20 64 6f 65 73 20 6e 6f 74  deleted does not
2c50: 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 72 65   exist */.    re
2c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c70: 20 20 7d 0a 20 20 70 53 74 6d 74 20 3d 20 73 71    }.  pStmt = sq
2c80: 6c 69 74 65 33 55 73 65 72 41 75 74 68 50 72 65  lite3UserAuthPre
2c90: 70 61 72 65 28 64 62 2c 0a 20 20 20 20 20 20 20  pare(db,.       
2ca0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
2cb0: 52 4f 4d 20 73 71 6c 69 74 65 5f 75 73 65 72 20  ROM sqlite_user 
2cc0: 57 48 45 52 45 20 75 6e 61 6d 65 3d 25 51 22 2c  WHERE uname=%Q",
2cd0: 20 7a 55 73 65 72 6e 61 6d 65 29 3b 0a 20 20 69   zUsername);.  i
2ce0: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( pStmt==0 ) re
2cf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d00: 4d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  M;.  sqlite3_ste
2d10: 70 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  p(pStmt);.  retu
2d20: 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
2d30: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 23  ize(pStmt);.}..#
2d40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d50: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2d60: 49 4f 4e 20 2a 2f 0a                             ION */.