/ Hex Artifact Content
Login

Artifact d8abcde53426275dab6243b441256fcd8ccbebb2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4a 61 6e 75 61  /*.** 2003 Janua
0010: 72 79 20 31 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ry 11.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
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 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0190: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
01a0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 65  t the sqlite3_se
01b0: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 0a 2a  t_authorizer().*
01c0: 2a 20 41 50 49 2e 20 20 54 68 69 73 20 66 61 63  * API.  This fac
01d0: 69 6c 69 74 79 20 69 73 20 61 6e 20 6f 70 74 69  ility is an opti
01e0: 6f 6e 61 6c 20 66 65 61 74 75 72 65 20 6f 66 20  onal feature of 
01f0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 45 6d  the library.  Em
0200: 62 65 64 64 65 64 0a 2a 2a 20 73 79 73 74 65 6d  bedded.** system
0210: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 6e 65  s that do not ne
0220: 65 64 20 74 68 69 73 20 66 61 63 69 6c 69 74 79  ed this facility
0230: 20 6d 61 79 20 6f 6d 69 74 20 69 74 20 62 79 20   may omit it by 
0240: 72 65 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 74  recompiling.** t
0250: 68 65 20 6c 69 62 72 61 72 79 20 77 69 74 68 20  he library with 
0260: 2d 44 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  -DSQLITE_OMIT_AU
0270: 54 48 4f 52 49 5a 41 54 49 4f 4e 3d 31 0a 2a 2f  THORIZATION=1.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0290: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
02a0: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  ll of the code i
02b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 6d 61 79 20  n this file may 
02c0: 62 65 20 6f 6d 69 74 74 65 64 20 62 79 20 64 65  be omitted by de
02d0: 66 69 6e 69 6e 67 20 61 20 73 69 6e 67 6c 65 0a  fining a single.
02e0: 2a 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  ** macro..*/.#if
02f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0300: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 0a  _AUTHORIZATION..
0310: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
0320: 61 72 20 74 68 65 20 61 63 63 65 73 73 20 61 75  ar the access au
0330: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
0340: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0350: 61 63 63 65 73 73 20 61 75 74 68 6f 72 69 7a 61  access authoriza
0360: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  tion function is
0370: 20 62 65 20 63 61 6c 6c 65 64 20 64 75 72 69 6e   be called durin
0380: 67 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f  g the compilatio
0390: 6e 0a 2a 2a 20 70 68 61 73 65 20 74 6f 20 76 65  n.** phase to ve
03a0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 75 73  rify that the us
03b0: 65 72 20 68 61 73 20 72 65 61 64 20 61 6e 64 2f  er has read and/
03c0: 6f 72 20 77 72 69 74 65 20 61 63 63 65 73 73 20  or write access 
03d0: 70 65 72 6d 69 73 73 69 6f 6e 20 6f 6e 0a 2a 2a  permission on.**
03e0: 20 76 61 72 69 6f 75 73 20 66 69 65 6c 64 73 20   various fields 
03f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0400: 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75    The first argu
0410: 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 75 74 68  ment to the auth
0420: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
0430: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 33 72  a copy of the 3r
0440: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
0450: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
0460: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
0470: 0a 2a 2a 20 74 6f 20 74 68 65 20 61 75 74 68 20  .** to the auth 
0480: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 65 20  function is one 
0490: 6f 66 20 74 68 65 73 65 20 63 6f 6e 73 74 61 6e  of these constan
04a0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ts:.**.**       
04b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
04c0: 44 45 58 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c  DEX.**       SQL
04d0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
04e0: 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45  .**       SQLITE
04f0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
0500: 45 58 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49  EX.**       SQLI
0510: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
0520: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 20 20 53 51  ABLE.**       SQ
0530: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
0540: 5f 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 20  _TRIGGER.**     
0550: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
0560: 54 45 4d 50 5f 56 49 45 57 0a 2a 2a 20 20 20 20  TEMP_VIEW.**    
0570: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
0580: 5f 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 20  _TRIGGER.**     
0590: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
05a0: 56 49 45 57 0a 2a 2a 20 20 20 20 20 20 20 53 51  VIEW.**       SQ
05b0: 4c 49 54 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20  LITE_DELETE.**  
05c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 52 4f 50       SQLITE_DROP
05d0: 5f 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20 20 20  _INDEX.**       
05e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
05f0: 45 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54  E.**       SQLIT
0600: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
0610: 58 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54  X.**       SQLIT
0620: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
0630: 45 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54  E.**       SQLIT
0640: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
0650: 47 45 52 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c  GER.**       SQL
0660: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
0670: 45 57 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49  EW.**       SQLI
0680: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 0a  TE_DROP_TRIGGER.
0690: 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  **       SQLITE_
06a0: 44 52 4f 50 5f 56 49 45 57 0a 2a 2a 20 20 20 20  DROP_VIEW.**    
06b0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54     SQLITE_INSERT
06c0: 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45  .**       SQLITE
06d0: 5f 50 52 41 47 4d 41 0a 2a 2a 20 20 20 20 20 20  _PRAGMA.**      
06e0: 20 53 51 4c 49 54 45 5f 52 45 41 44 0a 2a 2a 20   SQLITE_READ.** 
06f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 45 4c        SQLITE_SEL
0700: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c  ECT.**       SQL
0710: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 0a  ITE_TRANSACTION.
0720: 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  **       SQLITE_
0730: 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 54 68 65  UPDATE.**.** The
0740: 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74   third and fourt
0750: 68 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  h arguments to t
0760: 68 65 20 61 75 74 68 20 66 75 6e 63 74 69 6f 6e  he auth function
0770: 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66   are the name of
0780: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 6e  .** the table an
0790: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61  d the column tha
07a0: 74 20 61 72 65 20 62 65 69 6e 67 20 61 63 63 65  t are being acce
07b0: 73 73 65 64 2e 20 20 54 68 65 20 61 75 74 68 20  ssed.  The auth 
07c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 68 6f 75  function.** shou
07d0: 6c 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72  ld return either
07e0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 53 51 4c 49   SQLITE_OK, SQLI
07f0: 54 45 5f 44 45 4e 59 2c 20 6f 72 20 53 51 4c 49  TE_DENY, or SQLI
0800: 54 45 5f 49 47 4e 4f 52 45 2e 20 20 49 66 0a 2a  TE_IGNORE.  If.*
0810: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
0820: 65 74 75 72 6e 65 64 2c 20 69 74 20 6d 65 61 6e  eturned, it mean
0830: 73 20 74 68 61 74 20 61 63 63 65 73 73 20 69 73  s that access is
0840: 20 61 6c 6c 6f 77 65 64 2e 20 20 53 51 4c 49 54   allowed.  SQLIT
0850: 45 5f 44 45 4e 59 0a 2a 2a 20 6d 65 61 6e 73 20  E_DENY.** means 
0860: 74 68 61 74 20 74 68 65 20 53 51 4c 20 73 74 61  that the SQL sta
0870: 74 65 6d 65 6e 74 20 77 69 6c 6c 20 6e 65 76 65  tement will neve
0880: 72 2d 72 75 6e 20 2d 20 74 68 65 20 73 71 6c 69  r-run - the sqli
0890: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 0a  te3_exec() call.
08a0: 2a 2a 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 77  ** will return w
08b0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 20 20 53  ith an error.  S
08c0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 6d 65 61  QLITE_IGNORE mea
08d0: 6e 73 20 74 68 61 74 20 74 68 65 20 53 51 4c 20  ns that the SQL 
08e0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 73 68 6f  statement.** sho
08f0: 75 6c 64 20 72 75 6e 20 62 75 74 20 61 74 74 65  uld run but atte
0900: 6d 70 74 73 20 74 6f 20 72 65 61 64 20 74 68 65  mpts to read the
0910: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
0920: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 4e 55  n will return NU
0930: 4c 4c 0a 2a 2a 20 61 6e 64 20 61 74 74 65 6d 70  LL.** and attemp
0940: 74 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ts to write the 
0950: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 20 69  column will be i
0960: 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  gnored..**.** Se
0970: 74 74 69 6e 67 20 74 68 65 20 61 75 74 68 20 66  tting the auth f
0980: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
0990: 64 69 73 61 62 6c 65 73 20 74 68 69 73 20 68 6f  disables this ho
09a0: 6f 6b 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  ok.  The default
09b0: 0a 2a 2a 20 73 65 74 74 69 6e 67 20 6f 66 20 74  .** setting of t
09c0: 68 65 20 61 75 74 68 20 66 75 6e 63 74 69 6f 6e  he auth function
09d0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74   is NULL..*/.int
09e0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
09f0: 68 6f 72 69 7a 65 72 28 0a 20 20 73 71 6c 69 74  horizer(.  sqlit
0a00: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
0a10: 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74  xAuth)(void*,int
0a20: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
0a30: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
0a40: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
0a50: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
0a60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
0a70: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
0a80: 65 78 29 3b 0a 20 20 64 62 2d 3e 78 41 75 74 68  ex);.  db->xAuth
0a90: 20 3d 20 28 73 71 6c 69 74 65 33 5f 78 61 75 74   = (sqlite3_xaut
0aa0: 68 29 78 41 75 74 68 3b 0a 20 20 64 62 2d 3e 70  h)xAuth;.  db->p
0ab0: 41 75 74 68 41 72 67 20 3d 20 70 41 72 67 3b 0a  AuthArg = pArg;.
0ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
0ad0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
0ae0: 73 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  s(db);.  sqlite3
0af0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
0b00: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
0b10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
0b20: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
0b30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
0b40: 6f 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  o pParse->zErrMs
0b50: 67 20 74 68 61 74 20 65 78 70 6c 61 69 6e 73 20  g that explains 
0b60: 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 73 65 72  that the.** user
0b70: 2d 73 75 70 70 6c 69 65 64 20 61 75 74 68 6f 72  -supplied author
0b80: 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
0b90: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6c 6c   returned an ill
0ba0: 65 67 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  egal value..*/.s
0bb0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
0bc0: 65 41 75 74 68 42 61 64 52 65 74 75 72 6e 43 6f  eAuthBadReturnCo
0bd0: 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
0be0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ){.  sqlite3Erro
0bf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 75  rMsg(pParse, "au
0c00: 74 68 6f 72 69 7a 65 72 20 6d 61 6c 66 75 6e 63  thorizer malfunc
0c10: 74 69 6f 6e 22 29 3b 0a 20 20 70 50 61 72 73 65  tion");.  pParse
0c20: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0c30: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ROR;.}../*.** In
0c40: 76 6f 6b 65 20 74 68 65 20 61 75 74 68 6f 72 69  voke the authori
0c50: 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  zation callback 
0c60: 66 6f 72 20 70 65 72 6d 69 73 73 69 6f 6e 20 74  for permission t
0c70: 6f 20 72 65 61 64 20 63 6f 6c 75 6d 6e 20 7a 43  o read column zC
0c80: 6f 6c 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  ol from.** table
0c90: 20 7a 54 61 62 20 69 6e 20 64 61 74 61 62 61 73   zTab in databas
0ca0: 65 20 7a 44 62 2e 20 54 68 69 73 20 66 75 6e 63  e zDb. This func
0cb0: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
0cc0: 74 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  t an authorizati
0cd0: 6f 6e 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 68  on.** callback h
0ce0: 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  as been register
0cf0: 65 64 20 28 69 2e 65 2e 20 74 68 61 74 20 73 71  ed (i.e. that sq
0d00: 6c 69 74 65 33 2e 78 41 75 74 68 20 69 73 20 6e  lite3.xAuth is n
0d10: 6f 74 20 4e 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  ot NULL)..**.** 
0d20: 49 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  If SQLITE_IGNORE
0d30: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
0d40: 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 4e 55   pExpr is not NU
0d50: 4c 4c 2c 20 74 68 65 6e 20 70 45 78 70 72 20 69  LL, then pExpr i
0d60: 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20  s changed.** to 
0d70: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 65 78 70 72  an SQL NULL expr
0d80: 65 73 73 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  ession. Otherwis
0d90: 65 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  e, if pExpr is N
0da0: 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ULL, then SQLITE
0db0: 5f 49 47 4e 4f 52 45 0a 2a 2a 20 69 73 20 74 72  _IGNORE.** is tr
0dc0: 65 61 74 65 64 20 61 73 20 53 51 4c 49 54 45 5f  eated as SQLITE_
0dd0: 44 45 4e 59 2e 20 49 6e 20 74 68 69 73 20 63 61  DENY. In this ca
0de0: 73 65 20 61 6e 20 65 72 72 6f 72 20 69 73 20 6c  se an error is l
0df0: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  eft in pParse..*
0e00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 75 74  /.int sqlite3Aut
0e10: 68 52 65 61 64 43 6f 6c 28 0a 20 20 50 61 72 73  hReadCol(.  Pars
0e20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0e40: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
0e50: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
0e60: 72 20 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20  r *zTab,        
0e70: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0e80: 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
0e90: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20  char *zCol,     
0ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0eb0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
0ec0: 74 20 69 44 62 20 20 20 20 20 20 20 20 20 20 20  t iDb           
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0ee0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6e 74 61 69   Index of contai
0ef0: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 2e 20 2a  ning database. *
0f00: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
0f10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0f20: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0f30: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
0f40: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
0f50: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 20 2f  Db[iDb].zName; /
0f60: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
0f70: 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
0f80: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 2f 2a 20 41 75 74 68 20 63 61 6c 6c 62 61 63   /* Auth callbac
0fb0: 6b 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  k return code */
0fc0: 0a 0a 20 20 72 63 20 3d 20 64 62 2d 3e 78 41 75  ..  rc = db->xAu
0fd0: 74 68 28 64 62 2d 3e 70 41 75 74 68 41 72 67 2c  th(db->pAuthArg,
0fe0: 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 7a 54   SQLITE_READ, zT
0ff0: 61 62 2c 7a 43 6f 6c 2c 7a 44 62 2c 70 50 61 72  ab,zCol,zDb,pPar
1000: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1010: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1020: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
1030: 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
1040: 20 20 20 20 2c 64 62 2d 3e 61 75 74 68 2e 7a 41      ,db->auth.zA
1050: 75 74 68 55 73 65 72 0a 23 65 6e 64 69 66 0a 20  uthUser.#endif. 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
1070: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1080: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 69  TE_DENY ){.    i
1090: 66 28 20 64 62 2d 3e 6e 44 62 3e 32 20 7c 7c 20  f( db->nDb>2 || 
10a0: 69 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb!=0 ){.      
10b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10c0: 70 50 61 72 73 65 2c 20 22 61 63 63 65 73 73 20  pParse, "access 
10d0: 74 6f 20 25 73 2e 25 73 2e 25 73 20 69 73 20 70  to %s.%s.%s is p
10e0: 72 6f 68 69 62 69 74 65 64 22 2c 7a 44 62 2c 7a  rohibited",zDb,z
10f0: 54 61 62 2c 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Tab,zCol);.    }
1100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1110: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1120: 73 65 2c 20 22 61 63 63 65 73 73 20 74 6f 20 25  se, "access to %
1130: 73 2e 25 73 20 69 73 20 70 72 6f 68 69 62 69 74  s.%s is prohibit
1140: 65 64 22 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  ed", zTab, zCol)
1150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1160: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1170: 41 55 54 48 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AUTH;.  }else if
1180: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 47 4e  ( rc!=SQLITE_IGN
1190: 4f 52 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ORE && rc!=SQLIT
11a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
11b0: 74 65 41 75 74 68 42 61 64 52 65 74 75 72 6e 43  teAuthBadReturnC
11c0: 6f 64 65 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ode(pParse);.  }
11d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  ./*.** The pExpr
11f0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 54 4b 5f   should be a TK_
1200: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
1210: 6e 2e 20 20 54 68 65 20 74 61 62 6c 65 20 72 65  n.  The table re
1220: 66 65 72 72 65 64 20 74 6f 0a 2a 2a 20 69 73 20  ferred to.** is 
1230: 69 6e 20 70 54 61 62 4c 69 73 74 20 6f 72 20 65  in pTabList or e
1240: 6c 73 65 20 69 74 20 69 73 20 74 68 65 20 4e 45  lse it is the NE
1250: 57 20 6f 72 20 4f 4c 44 20 74 61 62 6c 65 20 6f  W or OLD table o
1260: 66 20 61 20 74 72 69 67 67 65 72 2e 20 20 0a 2a  f a trigger.  .*
1270: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1280: 66 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 72 65  f it is OK to re
1290: 61 64 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  ad this particul
12a0: 61 72 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  ar column..**.**
12b0: 20 49 66 20 74 68 65 20 61 75 74 68 20 66 75 6e   If the auth fun
12c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
12d0: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 63 68 61  LITE_IGNORE, cha
12e0: 6e 67 65 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nge the TK_COLUM
12f0: 4e 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  N .** instructio
1300: 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 4e 55 4c 4c  n into a TK_NULL
1310: 2e 20 20 49 66 20 74 68 65 20 61 75 74 68 20 66  .  If the auth f
1320: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1330: 53 51 4c 49 54 45 5f 44 45 4e 59 2c 0a 2a 2a 20  SQLITE_DENY,.** 
1340: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 61 6e  then generate an
1350: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20   error..*/.void 
1360: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
1370: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1380: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1390: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
13a0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
13b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
13d0: 68 65 63 6b 20 61 75 74 68 6f 72 69 7a 61 74 69  heck authorizati
13e0: 6f 6e 20 6f 6e 20 2a 2f 0a 20 20 53 63 68 65 6d  on on */.  Schem
13f0: 61 20 2a 70 53 63 68 65 6d 61 2c 20 20 20 20 20  a *pSchema,     
1400: 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6f   /* The schema o
1410: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1420: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1430: 54 61 62 4c 69 73 74 20 20 20 20 20 2f 2a 20 41  TabList     /* A
1440: 6c 6c 20 74 61 62 6c 65 20 74 68 61 74 20 70 45  ll table that pE
1450: 78 70 72 20 6d 69 67 68 74 20 72 65 66 65 72 20  xpr might refer 
1460: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
1470: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1480: 3e 64 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  >db;.  Table *pT
1490: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
14a0: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
14b0: 72 65 61 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  read */.  const 
14c0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 20 20 20 20 20  char *zCol;     
14d0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
14e0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
14f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63  le */.  int iSrc
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1510: 20 49 6e 64 65 78 20 69 6e 20 70 54 61 62 4c 69   Index in pTabLi
1520: 73 74 2d 3e 61 5b 5d 20 6f 66 20 74 61 62 6c 65  st->a[] of table
1530: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 20   being read */. 
1540: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1550: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1560: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
1570: 61 73 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ase the expressi
1580: 6f 6e 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  on refers to */.
1590: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
15a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15b0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61   of column in ta
15c0: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ble */..  if( db
15d0: 2d 3e 78 41 75 74 68 3d 3d 30 20 29 20 72 65 74  ->xAuth==0 ) ret
15e0: 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  urn;.  iDb = sql
15f0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1600: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  x(pParse->db, pS
1610: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 69 44  chema);.  if( iD
1620: 62 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  b<0 ){.    /* An
1630: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
1640: 20 61 20 63 6f 6c 75 6d 6e 20 6f 75 74 20 6f 66   a column out of
1650: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 6f   a subquery or o
1660: 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 65 6d 70  ther.    ** temp
1670: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 2a 2f 0a  orary table. */.
1680: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1690: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
16a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
16b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
16c0: 5f 54 52 49 47 47 45 52 20 29 3b 0a 20 20 69 66  _TRIGGER );.  if
16d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16e0: 54 52 49 47 47 45 52 20 29 7b 0a 20 20 20 20 70  TRIGGER ){.    p
16f0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54  Tab = pParse->pT
1700: 72 69 67 67 65 72 54 61 62 3b 0a 20 20 7d 65 6c  riggerTab;.  }el
1710: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1720: 70 54 61 62 4c 69 73 74 20 29 3b 0a 20 20 20 20  pTabList );.    
1730: 66 6f 72 28 69 53 72 63 3d 30 3b 20 41 4c 57 41  for(iSrc=0; ALWA
1740: 59 53 28 69 53 72 63 3c 70 54 61 62 4c 69 73 74  YS(iSrc<pTabList
1750: 2d 3e 6e 53 72 63 29 3b 20 69 53 72 63 2b 2b 29  ->nSrc); iSrc++)
1760: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
1770: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 54 61 62 4c  r->iTable==pTabL
1780: 69 73 74 2d 3e 61 5b 69 53 72 63 5d 2e 69 43 75  ist->a[iSrc].iCu
1790: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
17a0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
17b0: 3e 61 5b 69 53 72 63 5d 2e 70 54 61 62 3b 0a 20  >a[iSrc].pTab;. 
17c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17e0: 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
17f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 4e  iColumn;.  if( N
1800: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
1810: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 69  return;..  if( i
1820: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  Col>=0 ){.    as
1830: 73 65 72 74 28 20 69 43 6f 6c 3c 70 54 61 62 2d  sert( iCol<pTab-
1840: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 7a 43 6f  >nCol );.    zCo
1850: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
1860: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  Col].zName;.  }e
1870: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 69 50  lse if( pTab->iP
1880: 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  Key>=0 ){.    as
1890: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
18a0: 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  y<pTab->nCol );.
18b0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
18c0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
18d0: 79 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  y].zName;.  }els
18e0: 65 7b 0a 20 20 20 20 7a 43 6f 6c 20 3d 20 22 52  e{.    zCol = "R
18f0: 4f 57 49 44 22 3b 0a 20 20 7d 0a 20 20 61 73 73  OWID";.  }.  ass
1900: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1910: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1920: 69 66 28 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  if( SQLITE_IGNOR
1930: 45 3d 3d 73 71 6c 69 74 65 33 41 75 74 68 52 65  E==sqlite3AuthRe
1940: 61 64 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 54  adCol(pParse, pT
1950: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 2c  ab->zName, zCol,
1960: 20 69 44 62 29 20 29 7b 0a 20 20 20 20 70 45 78   iDb) ){.    pEx
1970: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1980: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1990: 6f 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  o an authorizati
19a0: 6f 6e 20 63 68 65 63 6b 20 75 73 69 6e 67 20 74  on check using t
19b0: 68 65 20 63 6f 64 65 20 61 6e 64 20 61 72 67 75  he code and argu
19c0: 6d 65 6e 74 73 20 67 69 76 65 6e 2e 20 20 52 65  ments given.  Re
19d0: 74 75 72 6e 0a 2a 2a 20 65 69 74 68 65 72 20 53  turn.** either S
19e0: 51 4c 49 54 45 5f 4f 4b 20 28 7a 65 72 6f 29 20  QLITE_OK (zero) 
19f0: 6f 72 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  or SQLITE_IGNORE
1a00: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e   or SQLITE_DENY.
1a10: 20 20 49 66 20 53 51 4c 49 54 45 5f 44 45 4e 59    If SQLITE_DENY
1a20: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2c  .** is returned,
1a30: 20 74 68 65 6e 20 74 68 65 20 65 72 72 6f 72 20   then the error 
1a40: 63 6f 75 6e 74 20 61 6e 64 20 65 72 72 6f 72 20  count and error 
1a50: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
1a60: 65 20 61 72 65 0a 2a 2a 20 6d 6f 64 69 66 69 65  e are.** modifie
1a70: 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  d appropriately.
1a80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41  .*/.int sqlite3A
1a90: 75 74 68 43 68 65 63 6b 28 0a 20 20 50 61 72 73  uthCheck(.  Pars
1aa0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e 74  e *pParse,.  int
1ab0: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
1ac0: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
1ad0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
1ae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af0: 41 72 67 33 0a 29 7b 0a 20 20 73 71 6c 69 74 65  Arg3.){.  sqlite
1b00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b10: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
1b20: 20 2f 2a 20 44 6f 6e 27 74 20 64 6f 20 61 6e 79   /* Don't do any
1b30: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
1b40: 68 65 63 6b 73 20 69 66 20 74 68 65 20 64 61 74  hecks if the dat
1b50: 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61 6c  abase is initial
1b60: 69 73 69 6e 67 0a 20 20 2a 2a 20 6f 72 20 69 66  ising.  ** or if
1b70: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 62   the parser is b
1b80: 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 66 72 6f  eing invoked fro
1b90: 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
1ba0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 2e 0a 20  _declare_vtab.. 
1bb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1bc0: 69 74 2e 62 75 73 79 20 7c 7c 20 49 4e 5f 44 45  it.busy || IN_DE
1bd0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
1be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bf0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64  OK;.  }..  if( d
1c00: 62 2d 3e 78 41 75 74 68 3d 3d 30 20 29 7b 0a 20  b->xAuth==0 ){. 
1c10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c20: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
1c30: 64 62 2d 3e 78 41 75 74 68 28 64 62 2d 3e 70 41  db->xAuth(db->pA
1c40: 75 74 68 41 72 67 2c 20 63 6f 64 65 2c 20 7a 41  uthArg, code, zA
1c50: 72 67 31 2c 20 7a 41 72 67 32 2c 20 7a 41 72 67  rg1, zArg2, zArg
1c60: 33 2c 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  3, pParse->zAuth
1c70: 43 6f 6e 74 65 78 74 0a 23 69 66 64 65 66 20 53  Context.#ifdef S
1c80: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1c90: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20  NTICATION.      
1ca0: 20 20 20 20 20 20 20 20 20 20 20 2c 64 62 2d 3e             ,db->
1cb0: 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 0a 23  auth.zAuthUser.#
1cc0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
1cd0: 20 20 20 20 20 20 29 3b 0a 20 20 69 66 28 20 72        );.  if( r
1ce0: 63 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  c==SQLITE_DENY )
1cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1d00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d10: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 22 29 3b  ot authorized");
1d20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1d30: 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 3b 0a 20  = SQLITE_AUTH;. 
1d40: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
1d50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1d60: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 7b  SQLITE_IGNORE ){
1d70: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d80: 5f 44 45 4e 59 3b 0a 20 20 20 20 73 71 6c 69 74  _DENY;.    sqlit
1d90: 65 41 75 74 68 42 61 64 52 65 74 75 72 6e 43 6f  eAuthBadReturnCo
1da0: 64 65 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  de(pParse);.  }.
1db0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dc0: 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 6e 20 61 75  /*.** Push an au
1dd0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e 74  thorization cont
1de0: 65 78 74 2e 20 20 41 66 74 65 72 20 74 68 69 73  ext.  After this
1df0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e00: 65 64 2c 20 74 68 65 0a 2a 2a 20 7a 41 72 67 33  ed, the.** zArg3
1e10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 75 74   argument to aut
1e20: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
1e30: 61 63 6b 73 20 77 69 6c 6c 20 62 65 20 7a 43 6f  acks will be zCo
1e40: 6e 74 65 78 74 20 75 6e 74 69 6c 0a 2a 2a 20 70  ntext until.** p
1e50: 6f 70 70 65 64 2e 20 20 4f 72 20 69 66 20 70 50  opped.  Or if pP
1e60: 61 72 73 65 3d 3d 30 2c 20 74 68 69 73 20 72 6f  arse==0, this ro
1e70: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1e80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e90: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68  3AuthContextPush
1ea0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1eb0: 65 2c 0a 20 20 41 75 74 68 43 6f 6e 74 65 78 74  e,.  AuthContext
1ec0: 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
1ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
1ee0: 65 78 74 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  ext.){.  assert(
1ef0: 20 70 50 61 72 73 65 20 29 3b 0a 20 20 70 43 6f   pParse );.  pCo
1f00: 6e 74 65 78 74 2d 3e 70 50 61 72 73 65 20 3d 20  ntext->pParse = 
1f10: 70 50 61 72 73 65 3b 0a 20 20 70 43 6f 6e 74 65  pParse;.  pConte
1f20: 78 74 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  xt->zAuthContext
1f30: 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1f40: 43 6f 6e 74 65 78 74 3b 0a 20 20 70 50 61 72 73  Context;.  pPars
1f50: 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1f60: 3d 20 7a 43 6f 6e 74 65 78 74 3b 0a 7d 0a 0a 2f  = zContext;.}../
1f70: 2a 0a 2a 2a 20 50 6f 70 20 61 6e 20 61 75 74 68  *.** Pop an auth
1f80: 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e 74 65 78  orization contex
1f90: 74 20 74 68 61 74 20 77 61 73 20 70 72 65 76 69  t that was previ
1fa0: 6f 75 73 6c 79 20 70 75 73 68 65 64 0a 2a 2a 20  ously pushed.** 
1fb0: 62 79 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f  by sqlite3AuthCo
1fc0: 6e 74 65 78 74 50 75 73 68 0a 2a 2f 0a 76 6f 69  ntextPush.*/.voi
1fd0: 64 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e  d sqlite3AuthCon
1fe0: 74 65 78 74 50 6f 70 28 41 75 74 68 43 6f 6e 74  textPop(AuthCont
1ff0: 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 29 7b 0a  ext *pContext){.
2000: 20 20 69 66 28 20 70 43 6f 6e 74 65 78 74 2d 3e    if( pContext->
2010: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 70 43  pParse ){.    pC
2020: 6f 6e 74 65 78 74 2d 3e 70 50 61 72 73 65 2d 3e  ontext->pParse->
2030: 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
2040: 43 6f 6e 74 65 78 74 2d 3e 7a 41 75 74 68 43 6f  Context->zAuthCo
2050: 6e 74 65 78 74 3b 0a 20 20 20 20 70 43 6f 6e 74  ntext;.    pCont
2060: 65 78 74 2d 3e 70 50 61 72 73 65 20 3d 20 30 3b  ext->pParse = 0;
2070: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
2080: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
2090: 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a     THORIZATION */.