auth2.test 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # 2006 Aug 24
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. # This file implements regression tests for SQLite library. The
  12. # focus of this script is testing the sqlite3_set_authorizer() API
  13. # and related functionality.
  14. #
  15. # $Id: auth2.test,v 1.3 2008/07/02 13:13:53 danielk1977 Exp $
  16. #
  17. set testdir [file dirname $argv0]
  18. source $testdir/tester.tcl
  19. # disable this test if the SQLITE_OMIT_AUTHORIZATION macro is
  20. # defined during compilation.
  21. if {[catch {db auth {}} msg]} {
  22. finish_test
  23. return
  24. }
  25. do_test auth2-1.1 {
  26. execsql {
  27. CREATE TABLE t1(a,b,c);
  28. INSERT INTO t1 VALUES(1,2,3);
  29. }
  30. set ::flist {}
  31. proc auth {code arg1 arg2 arg3 arg4} {
  32. if {$code=="SQLITE_FUNCTION"} {
  33. lappend ::flist $arg2
  34. if {$arg2=="max"} {
  35. return SQLITE_DENY
  36. } elseif {$arg2=="min"} {
  37. return SQLITE_IGNORE
  38. } else {
  39. return SQLITE_OK
  40. }
  41. }
  42. return SQLITE_OK
  43. }
  44. db authorizer ::auth
  45. catchsql {SELECT max(a,b,c) FROM t1}
  46. } {1 {not authorized to use function: max}}
  47. do_test auth2-1.2 {
  48. set ::flist
  49. } max
  50. do_test auth2-1.3 {
  51. set ::flist {}
  52. catchsql {SELECT min(a,b,c) FROM t1}
  53. } {0 {{}}}
  54. do_test auth2-1.4 {
  55. set ::flist
  56. } min
  57. do_test auth2-1.5 {
  58. set ::flist {}
  59. catchsql {SELECT coalesce(min(a,b,c),999) FROM t1}
  60. } {0 999}
  61. do_test auth2-1.6 {
  62. set ::flist
  63. } {coalesce min}
  64. do_test auth2-1.7 {
  65. set ::flist {}
  66. catchsql {SELECT coalesce(a,b,c) FROM t1}
  67. } {0 1}
  68. do_test auth2-1.8 {
  69. set ::flist
  70. } coalesce
  71. # Make sure the authorizer is not called when parsing the schema
  72. # and when computing the result set of a view.
  73. #
  74. db close
  75. sqlite3 db test.db
  76. sqlite3 db2 test.db
  77. proc auth {args} {
  78. global authargs
  79. append authargs $args\n
  80. return SQLITE_OK
  81. }
  82. db auth auth
  83. do_test auth2-2.1 {
  84. set ::authargs {}
  85. db eval {
  86. CREATE TABLE t2(x,y,z);
  87. }
  88. set ::authargs
  89. } {SQLITE_INSERT sqlite_master {} main {}
  90. SQLITE_CREATE_TABLE t2 {} main {}
  91. SQLITE_UPDATE sqlite_master type main {}
  92. SQLITE_UPDATE sqlite_master name main {}
  93. SQLITE_UPDATE sqlite_master tbl_name main {}
  94. SQLITE_UPDATE sqlite_master rootpage main {}
  95. SQLITE_UPDATE sqlite_master sql main {}
  96. SQLITE_READ sqlite_master ROWID main {}
  97. SQLITE_READ sqlite_master name main {}
  98. SQLITE_READ sqlite_master rootpage main {}
  99. SQLITE_READ sqlite_master sql main {}
  100. SQLITE_READ sqlite_master tbl_name main {}
  101. SQLITE_READ sqlite_master ROWID main {}
  102. }
  103. do_test auth2-2.2 {
  104. set ::authargs {}
  105. db eval {
  106. CREATE VIEW v2 AS SELECT x+y AS a, y+z AS b from t2;
  107. }
  108. set ::authargs
  109. } {SQLITE_INSERT sqlite_master {} main {}
  110. SQLITE_CREATE_VIEW v2 {} main {}
  111. SQLITE_UPDATE sqlite_master type main {}
  112. SQLITE_UPDATE sqlite_master name main {}
  113. SQLITE_UPDATE sqlite_master tbl_name main {}
  114. SQLITE_UPDATE sqlite_master rootpage main {}
  115. SQLITE_UPDATE sqlite_master sql main {}
  116. SQLITE_READ sqlite_master ROWID main {}
  117. SQLITE_READ sqlite_master name main {}
  118. SQLITE_READ sqlite_master rootpage main {}
  119. SQLITE_READ sqlite_master sql main {}
  120. SQLITE_READ sqlite_master tbl_name main {}
  121. SQLITE_READ sqlite_master ROWID main {}
  122. }
  123. do_test auth2-2.3 {
  124. set ::authargs {}
  125. db eval {
  126. SELECT a, b FROM v2;
  127. }
  128. set ::authargs
  129. } {SQLITE_SELECT {} {} {} {}
  130. SQLITE_READ t2 x main v2
  131. SQLITE_READ t2 y main v2
  132. SQLITE_READ t2 y main v2
  133. SQLITE_READ t2 z main v2
  134. SQLITE_READ v2 a main {}
  135. SQLITE_READ v2 b main {}
  136. SQLITE_SELECT {} {} {} v2
  137. }
  138. do_test auth2-2.4 {
  139. db2 eval {
  140. CREATE TABLE t3(p,q,r);
  141. }
  142. set ::authargs {}
  143. db eval {
  144. SELECT b, a FROM v2;
  145. }
  146. set ::authargs
  147. } {SQLITE_SELECT {} {} {} {}
  148. SQLITE_READ t2 x main v2
  149. SQLITE_READ t2 y main v2
  150. SQLITE_READ t2 y main v2
  151. SQLITE_READ t2 z main v2
  152. SQLITE_READ v2 b main {}
  153. SQLITE_READ v2 a main {}
  154. SQLITE_SELECT {} {} {} v2
  155. SQLITE_SELECT {} {} {} {}
  156. SQLITE_READ t2 x main v2
  157. SQLITE_READ t2 y main v2
  158. SQLITE_READ t2 y main v2
  159. SQLITE_READ t2 z main v2
  160. SQLITE_READ v2 b main {}
  161. SQLITE_READ v2 a main {}
  162. SQLITE_SELECT {} {} {} v2
  163. }
  164. db2 close
  165. finish_test