/ Hex Artifact Content
Login

Artifact 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3:


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 61 70 70  contains the app
0190: 6c 69 63 61 74 69 6f 6e 20 69 6e 74 65 72 66 61  lication interfa
01a0: 63 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 66  ce definitions f
01b0: 6f 72 20 74 68 65 0a 2a 2a 20 75 73 65 72 2d 61  or the.** user-a
01c0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
01d0: 74 65 6e 73 69 6f 6e 20 66 65 61 74 75 72 65 2e  tension feature.
01e0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6f 6d 70 69 6c  .**.** To compil
01f0: 65 20 77 69 74 68 20 74 68 65 20 75 73 65 72 2d  e with the user-
0200: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
0210: 65 61 74 75 72 65 2c 20 61 70 70 65 6e 64 20 74  eature, append t
0220: 68 69 73 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 65  his file to.** e
0230: 6e 64 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20  nd of an SQLite 
0240: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 68 65 61  amalgamation hea
0250: 64 65 72 20 66 69 6c 65 20 28 22 73 71 6c 69 74  der file ("sqlit
0260: 65 33 2e 68 22 29 2c 20 74 68 65 6e 20 61 64 64  e3.h"), then add
0270: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
0280: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
0290: 4f 4e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ON compile-time 
02a0: 6f 70 74 69 6f 6e 2e 20 20 53 65 65 20 74 68 65  option.  See the
02b0: 0a 2a 2a 20 75 73 65 72 2d 61 75 74 68 2e 74 78  .** user-auth.tx
02c0: 74 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  t file in the sa
02d0: 6d 65 20 73 6f 75 72 63 65 20 64 69 72 65 63 74  me source direct
02e0: 6f 72 79 20 61 73 20 74 68 69 73 20 66 69 6c 65  ory as this file
02f0: 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   for.** addition
0300: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0310: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0320: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
0330: 54 49 4f 4e 0a 0a 23 69 66 64 65 66 20 5f 5f 63  TION..#ifdef __c
0340: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
0350: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  "C" {.#endif../*
0360: 0a 2a 2a 20 49 66 20 61 20 64 61 74 61 62 61 73  .** If a databas
0370: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 53  e contains the S
0380: 51 4c 49 54 45 5f 55 53 45 52 20 74 61 62 6c 65  QLITE_USER table
0390: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  , then the.** sq
03a0: 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65  lite3_user_authe
03b0: 6e 74 69 63 61 74 65 28 29 20 69 6e 74 65 72 66  nticate() interf
03c0: 61 63 65 20 6d 75 73 74 20 62 65 20 69 6e 76 6f  ace must be invo
03d0: 6b 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 61  ked with an.** a
03e0: 70 70 72 6f 70 72 69 61 74 65 20 75 73 65 72 6e  ppropriate usern
03f0: 61 6d 65 20 61 6e 64 20 70 61 73 73 77 6f 72 64  ame and password
0400: 20 70 72 69 6f 72 20 74 6f 20 65 6e 61 62 6c 65   prior to enable
0410: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a   read and write.
0420: 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ** access to the
0430: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
0440: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
0450: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
0460: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
0470: 74 68 65 20 75 73 65 72 6e 61 6d 65 2f 70 61 73  the username/pas
0480: 73 77 6f 72 64 0a 2a 2a 20 63 6f 6d 62 69 6e 61  sword.** combina
0490: 74 69 6f 6e 20 69 73 20 69 6e 63 6f 72 72 65 63  tion is incorrec
04a0: 74 20 6f 72 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  t or unknown..**
04b0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
04c0: 45 5f 55 53 45 52 20 74 61 62 6c 65 20 69 73 20  E_USER table is 
04d0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
04e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
04f0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 69  , then.** this i
0500: 6e 74 65 72 66 61 63 65 20 69 73 20 61 20 68 61  nterface is a ha
0510: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 20 72 65 74  rmless no-op ret
0520: 75 72 6e 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  urnning SQLITE_O
0530: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
0540: 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  3_user_authentic
0550: 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
0560: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
0570: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
0580: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
0590: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 6e  nst char *zUsern
05a0: 61 6d 65 2c 20 2f 2a 20 55 73 65 72 6e 61 6d 65  ame, /* Username
05b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
05c0: 20 2a 61 50 57 2c 20 20 20 20 20 20 20 2f 2a 20   *aPW,       /* 
05d0: 50 61 73 73 77 6f 72 64 20 6f 72 20 63 72 65 64  Password or cred
05e0: 65 6e 74 69 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  entials */.  int
05f0: 20 6e 50 57 20 20 20 20 20 20 20 20 20 20 20 20   nPW            
0600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0610: 20 62 79 74 65 73 20 69 6e 20 61 50 57 5b 5d 20   bytes in aPW[] 
0620: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.);../*.** The
0630: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64   sqlite3_user_ad
0640: 64 28 29 20 69 6e 74 65 72 66 61 63 65 20 63 61  d() interface ca
0650: 6e 20 62 65 20 75 73 65 64 20 28 62 79 20 61 6e  n be used (by an
0660: 20 61 64 6d 69 6e 20 75 73 65 72 20 6f 6e 6c 79   admin user only
0670: 29 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  ).** to create a
0680: 20 6e 65 77 20 75 73 65 72 2e 20 20 57 68 65 6e   new user.  When
0690: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 6e 6f 2d   called on a no-
06a0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2d 72  authentication-r
06b0: 65 71 75 69 72 65 64 0a 2a 2a 20 64 61 74 61 62  equired.** datab
06c0: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
06d0: 65 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 64  e converts the d
06e0: 61 74 61 62 61 73 65 20 69 6e 74 6f 20 61 6e 20  atabase into an 
06f0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2d 0a  authentication-.
0700: 2a 2a 20 72 65 71 75 69 72 65 64 20 64 61 74 61  ** required data
0710: 62 61 73 65 2c 20 61 75 74 6f 6d 61 74 69 63 61  base, automatica
0720: 6c 6c 79 20 6d 61 6b 65 73 20 74 68 65 20 61 64  lly makes the ad
0730: 64 65 64 20 75 73 65 72 20 61 6e 0a 2a 2a 20 61  ded user an.** a
0740: 64 6d 69 6e 69 73 74 72 61 74 6f 72 2c 20 61 6e  dministrator, an
0750: 64 20 6c 6f 67 73 20 69 6e 20 74 68 65 20 63 75  d logs in the cu
0760: 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
0770: 20 61 73 20 74 68 61 74 20 75 73 65 72 2e 0a 2a   as that user..*
0780: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 75 73  * The sqlite3_us
0790: 65 72 5f 61 64 64 28 29 20 69 6e 74 65 72 66 61  er_add() interfa
07a0: 63 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ce only works fo
07b0: 72 20 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74  r the "main" dat
07c0: 61 62 61 73 65 2c 20 6e 6f 74 0a 2a 2a 20 66 6f  abase, not.** fo
07d0: 72 20 61 6e 79 20 41 54 54 41 43 48 2d 65 64 20  r any ATTACH-ed 
07e0: 64 61 74 61 62 61 73 65 73 2e 20 20 41 6e 79 20  databases.  Any 
07f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
0800: 75 73 65 72 5f 61 64 64 28 29 20 62 79 20 61 0a  user_add() by a.
0810: 2a 2a 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ** non-admin use
0820: 72 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  r results in an 
0830: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
0840: 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 0a  lite3_user_add(.
0850: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
0860: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
0870: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
0880: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0890: 2a 7a 55 73 65 72 6e 61 6d 65 2c 20 2f 2a 20 55  *zUsername, /* U
08a0: 73 65 72 6e 61 6d 65 20 74 6f 20 62 65 20 61 64  sername to be ad
08b0: 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ded */.  const c
08c0: 68 61 72 20 2a 61 50 57 2c 20 20 20 20 20 20 20  har *aPW,       
08d0: 2f 2a 20 50 61 73 73 77 6f 72 64 20 6f 72 20 63  /* Password or c
08e0: 72 65 64 65 6e 74 69 61 6c 73 20 2a 2f 0a 20 20  redentials */.  
08f0: 69 6e 74 20 6e 50 57 2c 20 20 20 20 20 20 20 20  int nPW,        
0900: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0910: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 50 57   of bytes in aPW
0920: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 64  [] */.  int isAd
0930: 6d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 2f  min            /
0940: 2a 20 54 72 75 65 20 74 6f 20 67 69 76 65 20 6e  * True to give n
0950: 65 77 20 75 73 65 72 20 61 64 6d 69 6e 20 70 72  ew user admin pr
0960: 69 76 69 6c 65 67 65 20 2a 2f 0a 29 3b 0a 0a 2f  ivilege */.);../
0970: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
0980: 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 29 20 69  _user_change() i
0990: 6e 74 65 72 66 61 63 65 20 63 61 6e 20 62 65 20  nterface can be 
09a0: 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 61  used to change a
09b0: 20 75 73 65 72 73 0a 2a 2a 20 6c 6f 67 69 6e 20   users.** login 
09c0: 63 72 65 64 65 6e 74 69 61 6c 73 20 6f 72 20 61  credentials or a
09d0: 64 6d 69 6e 20 70 72 69 76 69 6c 65 67 65 2e 20  dmin privilege. 
09e0: 20 41 6e 79 20 75 73 65 72 20 63 61 6e 20 63 68   Any user can ch
09f0: 61 6e 67 65 20 74 68 65 69 72 20 6f 77 6e 0a 2a  ange their own.*
0a00: 2a 20 6c 6f 67 69 6e 20 63 72 65 64 65 6e 74 69  * login credenti
0a10: 61 6c 73 2e 20 20 4f 6e 6c 79 20 61 6e 20 61 64  als.  Only an ad
0a20: 6d 69 6e 20 75 73 65 72 20 63 61 6e 20 63 68 61  min user can cha
0a30: 6e 67 65 20 61 6e 6f 74 68 65 72 20 75 73 65 72  nge another user
0a40: 73 20 6c 6f 67 69 6e 0a 2a 2a 20 63 72 65 64 65  s login.** crede
0a50: 6e 74 69 61 6c 73 20 6f 72 20 61 64 6d 69 6e 20  ntials or admin 
0a60: 70 72 69 76 69 6c 65 67 65 20 73 65 74 74 69 6e  privilege settin
0a70: 67 2e 20 20 4e 6f 20 75 73 65 72 20 6d 61 79 20  g.  No user may 
0a80: 63 68 61 6e 67 65 20 74 68 65 69 72 20 6f 77 6e  change their own
0a90: 20 0a 2a 2a 20 61 64 6d 69 6e 20 70 72 69 76 69   .** admin privi
0aa0: 6c 65 67 65 20 73 65 74 74 69 6e 67 2e 0a 2a 2f  lege setting..*/
0ab0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 73 65  .int sqlite3_use
0ac0: 72 5f 63 68 61 6e 67 65 28 0a 20 20 73 71 6c 69  r_change(.  sqli
0ad0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
0ae0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
0af0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
0b00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
0b10: 6e 61 6d 65 2c 20 2f 2a 20 55 73 65 72 6e 61 6d  name, /* Usernam
0b20: 65 20 74 6f 20 63 68 61 6e 67 65 20 2a 2f 0a 20  e to change */. 
0b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 57   const char *aPW
0b40: 2c 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70  ,       /* New p
0b50: 61 73 73 77 6f 72 64 20 6f 72 20 63 72 65 64 65  assword or crede
0b60: 6e 74 69 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ntials */.  int 
0b70: 6e 50 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  nPW,            
0b80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0b90: 62 79 74 65 73 20 69 6e 20 61 50 57 5b 5d 20 2a  bytes in aPW[] *
0ba0: 2f 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20  /.  int isAdmin 
0bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
0bc0: 64 69 66 69 65 64 20 61 64 6d 69 6e 20 70 72 69  dified admin pri
0bd0: 76 69 6c 65 67 65 20 66 6f 72 20 74 68 65 20 75  vilege for the u
0be0: 73 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ser */.);../*.**
0bf0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 75 73 65   The sqlite3_use
0c00: 72 5f 64 65 6c 65 74 65 28 29 20 69 6e 74 65 72  r_delete() inter
0c10: 66 61 63 65 20 63 61 6e 20 62 65 20 75 73 65 64  face can be used
0c20: 20 28 62 79 20 61 6e 20 61 64 6d 69 6e 20 75 73   (by an admin us
0c30: 65 72 20 6f 6e 6c 79 29 0a 2a 2a 20 74 6f 20 64  er only).** to d
0c40: 65 6c 65 74 65 20 61 20 75 73 65 72 2e 20 20 54  elete a user.  T
0c50: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 6f 67  he currently log
0c60: 67 65 64 2d 69 6e 20 75 73 65 72 20 63 61 6e 6e  ged-in user cann
0c70: 6f 74 20 62 65 20 64 65 6c 65 74 65 64 2c 0a 2a  ot be deleted,.*
0c80: 2a 20 77 68 69 63 68 20 67 75 61 72 61 6e 74 65  * which guarante
0c90: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
0ca0: 20 61 6c 77 61 79 73 20 61 6e 20 61 64 6d 69 6e   always an admin
0cb0: 20 75 73 65 72 20 61 6e 64 20 68 65 6e 63 65 20   user and hence 
0cc0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 64 61 74 61  that.** the data
0cd0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
0ce0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
0cf0: 6e 6f 2d 61 75 74 68 65 6e 74 69 63 61 74 69 6f  no-authenticatio
0d00: 6e 2d 72 65 71 75 69 72 65 64 0a 2a 2a 20 64 61  n-required.** da
0d10: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
0d20: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
0d30: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
0d40: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
0d50: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
0d60: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
0d70: 68 61 72 20 2a 7a 55 73 65 72 6e 61 6d 65 20 20  har *zUsername  
0d80: 2f 2a 20 55 73 65 72 6e 61 6d 65 20 74 6f 20 72  /* Username to r
0d90: 65 6d 6f 76 65 20 2a 2f 0a 29 3b 0a 0a 23 69 66  emove */.);..#if
0da0: 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a  def __cplusplus.
0db0: 7d 20 20 2f 2a 20 65 6e 64 20 6f 66 20 74 68 65  }  /* end of the
0dc0: 20 27 65 78 74 65 72 6e 20 22 43 22 27 20 62 6c   'extern "C"' bl
0dd0: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  ock */.#endif..#
0de0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0df0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
0e00: 49 4f 4e 20 2a 2f 0a                             ION */.