aclitem.slt 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. reset-server
  11. # Enable rbac checks.
  12. simple conn=mz_system,user=mz_system
  13. ALTER SYSTEM SET enable_rbac_checks TO true;
  14. ----
  15. COMPLETE 0
  16. # Test mz_aclitem type and functions
  17. statement ok
  18. CREATE ROLE test_role
  19. query T
  20. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE')
  21. ----
  22. u1=C/u2
  23. query T
  24. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE, USAGE')
  25. ----
  26. u1=UC/u2
  27. query T
  28. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE')::text
  29. ----
  30. materialize=C/test_role
  31. query T
  32. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE, USAGE')::text
  33. ----
  34. materialize=UC/test_role
  35. query T
  36. SELECT mz_internal.make_mz_aclitem('p', 'u2', 'CREATE')
  37. ----
  38. =C/u2
  39. query T
  40. SELECT mz_internal.make_mz_aclitem('p', 'u2', 'CREATE, USAGE')
  41. ----
  42. =UC/u2
  43. query T
  44. SELECT mz_internal.make_mz_aclitem('p', 'u2', 'SELECT')::text
  45. ----
  46. =r/test_role
  47. query T
  48. SELECT mz_internal.make_mz_aclitem('p', 'u2', 'INSERT, SELECT')::text
  49. ----
  50. =ar/test_role
  51. query error mz_aclitem grantor cannot be PUBLIC role
  52. SELECT mz_internal.make_mz_aclitem('u1', 'p', 'CREATE')
  53. query error mz_aclitem grantor cannot be PUBLIC role
  54. SELECT mz_internal.make_mz_aclitem('u1', 'p', 'CREATE, USAGE')
  55. query T
  56. SELECT mz_internal.mz_aclitem_grantee(mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE'))
  57. ----
  58. u1
  59. query T
  60. SELECT mz_internal.mz_aclitem_grantee(mz_internal.make_mz_aclitem('p', 'u2', 'DELETE'))
  61. ----
  62. p
  63. query T
  64. SELECT mz_internal.mz_aclitem_grantor(mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE'))
  65. ----
  66. u2
  67. query T
  68. SELECT mz_internal.mz_aclitem_privileges(mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE'))
  69. ----
  70. d
  71. query B
  72. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE') = mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  73. ----
  74. true
  75. query B
  76. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE') <> mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  77. ----
  78. false
  79. query B
  80. SELECT mz_internal.make_mz_aclitem('u3', 'u2', 'DELETE') = mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  81. ----
  82. false
  83. query B
  84. SELECT mz_internal.make_mz_aclitem('u1', 'u3', 'DELETE') = mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  85. ----
  86. false
  87. query B
  88. SELECT mz_internal.make_mz_aclitem('u1', 'u3', 'DELETE, USAGE') = mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  89. ----
  90. false
  91. query B
  92. SELECT mz_internal.make_mz_aclitem('u3', 'u2', 'DELETE') <> mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  93. ----
  94. true
  95. query B
  96. SELECT mz_internal.make_mz_aclitem('u1', 'u3', 'DELETE') <> mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  97. ----
  98. true
  99. query B
  100. SELECT mz_internal.make_mz_aclitem('u1', 'u3', 'DELETE, USAGE') <> mz_internal.make_mz_aclitem('u1', 'u2', 'DELETE')
  101. ----
  102. true
  103. # RoleIds that don't exist are printed as IDs instead of names
  104. query T
  105. SELECT mz_internal.make_mz_aclitem('u99991', 'u2', 'CREATE')::text
  106. ----
  107. u99991=C/test_role
  108. query T
  109. SELECT mz_internal.make_mz_aclitem('u1', 'u87398', 'CREATE')::text
  110. ----
  111. materialize=C/u87398
  112. query T
  113. SELECT mz_internal.make_mz_aclitem('u3251', 's345', 'CREATE')::text
  114. ----
  115. u3251=C/s345
  116. # Test parsing errors
  117. query error couldn't parse role id 'uasdf7890ad'
  118. SELECT mz_internal.make_mz_aclitem('u1', 'uasdf7890ad', 'CREATE')
  119. query error couldn't parse role id 'sd98fas9df8'
  120. SELECT mz_internal.make_mz_aclitem('sd98fas9df8', 's1', 'CREATE')
  121. query error unrecognized privilege type: "asdfa ljefioj"
  122. SELECT mz_internal.make_mz_aclitem('u1', 's1', 'asdfa ljefioj')
  123. # Test mz_acl_item_contains_privilege NULLs
  124. query B
  125. SELECT mz_internal.mz_acl_item_contains_privilege(NULL, 'SELECT')
  126. ----
  127. NULL
  128. query B
  129. SELECT mz_internal.mz_acl_item_contains_privilege(mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE'), NULL)
  130. ----
  131. NULL
  132. query B
  133. SELECT mz_internal.mz_acl_item_contains_privilege(NULL, NULL)
  134. ----
  135. NULL
  136. query B
  137. SELECT mz_internal.mz_acl_item_contains_privilege(mz_internal.make_mz_aclitem('u1', 'u2', 'USAGE'), 'CREATE');
  138. ----
  139. false
  140. query B
  141. SELECT mz_internal.mz_acl_item_contains_privilege(mz_internal.make_mz_aclitem('u1', 'u2', 'USAGE'), 'USAGE');
  142. ----
  143. true
  144. # Test aclitem type and functions
  145. statement ok
  146. CREATE TABLE t (a aclitem)
  147. query T
  148. SELECT a::text from t
  149. ----
  150. statement ok
  151. DROP TABLE t
  152. query error binary encoding of aclitem types does not exist
  153. SELECT makeaclitem(1, 2, 'CREATE', false)
  154. query T
  155. SELECT makeaclitem(1, 2, 'CREATE', false)::text
  156. ----
  157. 1=C/2
  158. query T
  159. SELECT makeaclitem(1, 2, 'CREATE, USAGE', false)::text
  160. ----
  161. 1=UC/2
  162. query T
  163. SELECT makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE', false)::text
  164. ----
  165. materialize=C/test_role
  166. query T
  167. SELECT makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE, USAGE', false)::text
  168. ----
  169. materialize=UC/test_role
  170. query T
  171. SELECT makeaclitem(0, 2, 'CREATE', false)::text
  172. ----
  173. =C/2
  174. query T
  175. SELECT makeaclitem(0, 2, 'CREATE, USAGE', false)::text
  176. ----
  177. =UC/2
  178. query T
  179. SELECT makeaclitem(0, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'SELECT', false)::text
  180. ----
  181. =r/test_role
  182. query T
  183. SELECT makeaclitem(0, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'INSERT, SELECT', false)::text
  184. ----
  185. =ar/test_role
  186. query B
  187. SELECT makeaclitem(1, 2, 'DELETE', false) = makeaclitem(1, 2, 'DELETE', false)
  188. ----
  189. true
  190. query B
  191. SELECT makeaclitem(3, 2, 'DELETE', false) = makeaclitem(1, 2, 'DELETE', false)
  192. ----
  193. false
  194. query B
  195. SELECT makeaclitem(1, 3, 'DELETE', false) = makeaclitem(1, 2, 'DELETE', false)
  196. ----
  197. false
  198. query B
  199. SELECT makeaclitem(1, 3, 'DELETE, USAGE', false) = makeaclitem(1, 2, 'DELETE', false)
  200. ----
  201. false
  202. # Role OIDs that don't exist are printed as IDs instead of names
  203. query T
  204. SELECT makeaclitem(99991, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE', false)::text
  205. ----
  206. 99991=C/test_role
  207. query T
  208. SELECT makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), 87398, 'CREATE', false)::text
  209. ----
  210. materialize=C/87398
  211. query T
  212. SELECT makeaclitem(3251, 345, 'CREATE', false)::text
  213. ----
  214. 3251=C/345
  215. # Test parsing errors
  216. query error unrecognized privilege type: "asdfa ljefioj"
  217. SELECT makeaclitem(1, 1, 'asdfa ljefioj', false)::text
  218. # GRANT OPTION isn't implemented.
  219. query error GRANT OPTION not yet supported
  220. SELECT makeaclitem(1, 2, 'CREATE', true)::text
  221. # aclexplode
  222. query T rowsort
  223. SELECT aclexplode(ARRAY[makeaclitem(1, 2, 'SELECT, INSERT, DELETE', false), makeaclitem(3, 4, 'USAGE', false)])
  224. ----
  225. (4,3,USAGE,f)
  226. (2,1,DELETE,f)
  227. (2,1,INSERT,f)
  228. (2,1,SELECT,f)
  229. query error ACL arrays must not contain null values
  230. SELECT aclexplode(array[null]::aclitem[]);
  231. # mz_aclexplode
  232. query T
  233. SELECT mz_internal.mz_aclexplode(ARRAY[mz_internal.make_mz_aclitem('u1', 'u2', 'SELECT, INSERT, DELETE'), mz_internal.make_mz_aclitem('u3', 'u4', 'USAGE')])
  234. ----
  235. (u4,u3,USAGE,f)
  236. (u2,u1,DELETE,f)
  237. (u2,u1,INSERT,f)
  238. (u2,u1,SELECT,f)
  239. query error MZ_ACL arrays must not contain null values
  240. SELECT mz_internal.mz_aclexplode(array[null]::mz_catalog.mz_aclitem[]);
  241. # Test casting to/from aclitem and mz_aclitem
  242. query B
  243. SELECT mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE, USAGE')::aclitem = makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE, USAGE', false)
  244. ----
  245. true
  246. query B
  247. SELECT mz_internal.make_mz_aclitem('p', 'u2', 'CREATE, USAGE')::aclitem = makeaclitem(0, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE, USAGE', false)
  248. ----
  249. true
  250. query B
  251. SELECT makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE, USAGE', false)::mz_catalog.mz_aclitem = mz_internal.make_mz_aclitem('u1', 'u2', 'CREATE, USAGE')
  252. ----
  253. true
  254. query B
  255. SELECT makeaclitem(0, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE, USAGE', false)::mz_catalog.mz_aclitem = mz_internal.make_mz_aclitem('p', 'u2', 'CREATE, USAGE')
  256. ----
  257. true
  258. query T
  259. SELECT mz_internal.make_mz_aclitem('u99991', 'u2', 'CREATE')::aclitem::text
  260. ----
  261. NULL
  262. query T
  263. SELECT mz_internal.make_mz_aclitem('u1', 'u87398', 'CREATE')::aclitem::text
  264. ----
  265. NULL
  266. query T
  267. SELECT mz_internal.make_mz_aclitem('u3251', 's345', 'CREATE')::aclitem::text
  268. ----
  269. NULL
  270. query T
  271. SELECT makeaclitem(99991, (SELECT oid FROM mz_roles WHERE name = 'test_role'), 'CREATE', false)::mz_catalog.mz_aclitem
  272. ----
  273. NULL
  274. query T
  275. SELECT makeaclitem((SELECT oid FROM mz_roles WHERE name = 'materialize'), 87398, 'CREATE', false)::mz_catalog.mz_aclitem
  276. ----
  277. NULL
  278. query T
  279. SELECT makeaclitem(3251, 345, 'CREATE', false)::mz_catalog.mz_aclitem
  280. ----
  281. NULL
  282. # Disable rbac checks.
  283. simple conn=mz_system,user=mz_system
  284. ALTER SYSTEM SET enable_rbac_checks TO false;
  285. ----
  286. COMPLETE 0