Skip to content
This repository was archived by the owner on Apr 16, 2022. It is now read-only.

Commit bb23559

Browse files
committed
fix missing privileges on view update (drop/create)
1 parent 2406adb commit bb23559

12 files changed

+127
-103
lines changed

build.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<project name="apgdiff" default="jar" basedir=".">
22
<property name="name" value="Another PostgreSQL Diff Tool"/>
3-
<property name="version" value="2.6.2-subzero"/>
3+
<property name="version" value="2.6.3-subzero"/>
44
<property name="build" value="build"/>
55
<property name="dist" value="dist"/>
66
<property name="build.output" value="${build}/classes"/>

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<groupId>cz.startnet</groupId>
2121
<artifactId>apgdiff</artifactId>
2222
<name>Another PostgreSQL Diff Tool</name>
23-
<version>2.6.2-subzero</version>
23+
<version>2.6.3-subzero</version>
2424
<description>Simple PostgreSQL diff tool that is useful for schema upgrades. The tool compares two schema dump files and creates output file that is (after some hand-made modifications) suitable for upgrade of old schema.</description>
2525

2626
<url>http://www.apgdiff.com/</url>

src/main/java/cz/startnet/utils/pgdiff/PgDiffViews.java

+72-90
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,17 @@ public static void createViews(final PrintWriter writer,
4646
+ PgDiffUtils.getQuotedName(newView.getName())
4747
+ " OWNER TO " + newView.getOwnerTo() + ";");
4848
}
49+
writer.println();
4950
for (PgRelationPrivilege viewPrivilege : newView.getPrivileges()) {
50-
writer.println("REVOKE ALL ON TABLE "
51-
+ PgDiffUtils.getQuotedName(newView.getName())
52-
+ " FROM " + viewPrivilege.getRoleName() + ";");
53-
if (!"".equals(viewPrivilege.getPrivilegesSQL(true))) {
54-
writer.println("GRANT "
55-
+ viewPrivilege.getPrivilegesSQL(true)
56-
+ " ON TABLE "
57-
+ PgDiffUtils.getQuotedName(newView.getName())
58-
+ " TO " + viewPrivilege.getRoleName()
59-
+ " WITH GRANT OPTION;");
60-
}
61-
if (!"".equals(viewPrivilege.getPrivilegesSQL(false))) {
62-
writer.println("GRANT "
63-
+ viewPrivilege.getPrivilegesSQL(false)
64-
+ " ON TABLE "
65-
+ PgDiffUtils.getQuotedName(newView.getName())
66-
+ " TO " + viewPrivilege.getRoleName() + ";");
51+
grantPrivileges(writer, newView, viewPrivilege);
52+
}
53+
writer.println();
54+
for (PgColumn newColumn : newView.getColumns()) {
55+
for (PgColumnPrivilege newColumnPrivilege : newColumn
56+
.getPrivileges()) {
57+
grantColumnPrivileges(writer, newView, newColumn, newColumnPrivilege);
6758
}
6859
}
69-
7060
}
7161
}
7262
}
@@ -228,8 +218,10 @@ public static void alterViews(final PrintWriter writer,
228218
+ PgDiffUtils.getQuotedName(newView.getName())
229219
+ " OWNER TO " + newView.getOwnerTo() + ";");
230220
}
231-
alterPrivileges(writer, oldView, newView, searchPathHelper);
232-
alterPrivilegesColumns(writer, oldView, newView, searchPathHelper);
221+
if(!isViewModified(oldView, newView)){
222+
alterPrivileges(writer, oldView, newView, searchPathHelper);
223+
alterPrivilegesColumns(writer, oldView, newView, searchPathHelper);
224+
} // else when view is modified, it is dropped and recreated with privileges in createView
233225
}
234226
}
235227

@@ -298,6 +290,27 @@ private static void diffDefaultValues(final PrintWriter writer,
298290
}
299291
}
300292

293+
private static void grantPrivileges(final PrintWriter writer,
294+
final PgView view, final PgRelationPrivilege privilege ){
295+
writer.println("REVOKE ALL ON TABLE "
296+
+ PgDiffUtils.getQuotedName(view.getName())
297+
+ " FROM " + privilege.getRoleName() + ";");
298+
if (!"".equals(privilege.getPrivilegesSQL(true))) {
299+
writer.println("GRANT "
300+
+ privilege.getPrivilegesSQL(true)
301+
+ " ON TABLE "
302+
+ PgDiffUtils.getQuotedName(view.getName())
303+
+ " TO " + privilege.getRoleName()
304+
+ " WITH GRANT OPTION;");
305+
}
306+
if (!"".equals(privilege.getPrivilegesSQL(false))) {
307+
writer.println("GRANT "
308+
+ privilege.getPrivilegesSQL(false)
309+
+ " ON TABLE "
310+
+ PgDiffUtils.getQuotedName(view.getName())
311+
+ " TO " + privilege.getRoleName() + ";");
312+
}
313+
}
301314
private static void alterPrivileges(final PrintWriter writer,
302315
final PgView oldView, final PgView newView,
303316
final SearchPathHelper searchPathHelper) {
@@ -316,24 +329,7 @@ private static void alterPrivileges(final PrintWriter writer,
316329
if (!emptyLinePrinted) {
317330
writer.println();
318331
}
319-
writer.println("REVOKE ALL ON TABLE "
320-
+ PgDiffUtils.getQuotedName(newView.getName())
321-
+ " FROM " + newViewPrivilege.getRoleName() + ";");
322-
if (!"".equals(newViewPrivilege.getPrivilegesSQL(true))) {
323-
writer.println("GRANT "
324-
+ newViewPrivilege.getPrivilegesSQL(true)
325-
+ " ON TABLE "
326-
+ PgDiffUtils.getQuotedName(newView.getName())
327-
+ " TO " + newViewPrivilege.getRoleName()
328-
+ " WITH GRANT OPTION;");
329-
}
330-
if (!"".equals(newViewPrivilege.getPrivilegesSQL(false))) {
331-
writer.println("GRANT "
332-
+ newViewPrivilege.getPrivilegesSQL(false)
333-
+ " ON TABLE "
334-
+ PgDiffUtils.getQuotedName(newView.getName())
335-
+ " TO " + newViewPrivilege.getRoleName() + ";");
336-
}
332+
grantPrivileges(writer, newView, newViewPrivilege);
337333
} // else similar privilege will not be updated
338334
}
339335
for (PgRelationPrivilege newViewPrivilege : newView.getPrivileges()) {
@@ -343,35 +339,53 @@ private static void alterPrivileges(final PrintWriter writer,
343339
if (!emptyLinePrinted) {
344340
writer.println();
345341
}
346-
writer.println("REVOKE ALL ON TABLE "
347-
+ PgDiffUtils.getQuotedName(newView.getName())
348-
+ " FROM " + newViewPrivilege.getRoleName() + ";");
349-
if (!"".equals(newViewPrivilege.getPrivilegesSQL(true))) {
350-
writer.println("GRANT "
351-
+ newViewPrivilege.getPrivilegesSQL(true)
352-
+ " ON TABLE "
353-
+ PgDiffUtils.getQuotedName(newView.getName())
354-
+ " TO " + newViewPrivilege.getRoleName()
355-
+ " WITH GRANT OPTION;");
356-
}
357-
if (!"".equals(newViewPrivilege.getPrivilegesSQL(false))) {
358-
writer.println("GRANT "
359-
+ newViewPrivilege.getPrivilegesSQL(false)
360-
+ " ON TABLE "
361-
+ PgDiffUtils.getQuotedName(newView.getName())
362-
+ " TO " + newViewPrivilege.getRoleName() + ";");
363-
}
342+
grantPrivileges(writer, newView, newViewPrivilege);
364343
}
365344
}
366345
}
367346

347+
private static void grantColumnPrivileges(final PrintWriter writer,
348+
final PgView view, final PgColumn column, final PgColumnPrivilege privilege){
349+
350+
writer.println("REVOKE ALL ("
351+
+ PgDiffUtils.getQuotedName(column.getName())
352+
+ ") ON TABLE "
353+
+ PgDiffUtils.getQuotedName(view.getName())
354+
+ " FROM " + privilege.getRoleName()
355+
+ ";");
356+
if (!"".equals(privilege.getPrivilegesSQL(
357+
true,
358+
PgDiffUtils.getQuotedName(column.getName())))) {
359+
writer.println("GRANT "
360+
+ privilege.getPrivilegesSQL(true,
361+
PgDiffUtils.getQuotedName(column
362+
.getName()))
363+
+ " ON TABLE "
364+
+ PgDiffUtils.getQuotedName(view
365+
.getName()) + " TO "
366+
+ privilege.getRoleName()
367+
+ " WITH GRANT OPTION;");
368+
}
369+
if (!"".equals(privilege.getPrivilegesSQL(
370+
false,
371+
PgDiffUtils.getQuotedName(column.getName())))) {
372+
writer.println("GRANT "
373+
+ privilege.getPrivilegesSQL(
374+
false, PgDiffUtils
375+
.getQuotedName(column
376+
.getName()))
377+
+ " ON TABLE "
378+
+ PgDiffUtils.getQuotedName(view
379+
.getName()) + " TO "
380+
+ privilege.getRoleName() + ";");
381+
}
382+
}
368383
private static void alterPrivilegesColumns(final PrintWriter writer,
369384
final PgView oldView, final PgView newView,
370385
final SearchPathHelper searchPathHelper) {
371386
boolean emptyLinePrinted = false;
372387
for (PgColumn newColumn : newView.getColumns()) {
373388
final PgColumn oldColumn = oldView.getColumn(newColumn.getName());
374-
375389
if (oldColumn != null) {
376390
for (PgColumnPrivilege oldColumnPrivilege : oldColumn
377391
.getPrivileges()) {
@@ -404,39 +418,7 @@ private static void alterPrivilegesColumns(final PrintWriter writer,
404418
emptyLinePrinted = true;
405419
writer.println();
406420
}
407-
writer.println("REVOKE ALL ("
408-
+ PgDiffUtils.getQuotedName(newColumn.getName())
409-
+ ") ON TABLE "
410-
+ PgDiffUtils.getQuotedName(newView.getName())
411-
+ " FROM " + newColumnPrivilege.getRoleName()
412-
+ ";");
413-
if (!"".equals(newColumnPrivilege.getPrivilegesSQL(
414-
true,
415-
PgDiffUtils.getQuotedName(newColumn.getName())))) {
416-
writer.println("GRANT "
417-
+ newColumnPrivilege.getPrivilegesSQL(true,
418-
PgDiffUtils.getQuotedName(newColumn
419-
.getName()))
420-
+ " ON TABLE "
421-
+ PgDiffUtils.getQuotedName(newView
422-
.getName()) + " TO "
423-
+ newColumnPrivilege.getRoleName()
424-
+ " WITH GRANT OPTION;");
425-
}
426-
if (!"".equals(newColumnPrivilege.getPrivilegesSQL(
427-
false,
428-
PgDiffUtils.getQuotedName(newColumn.getName())))) {
429-
writer.println("GRANT "
430-
+ newColumnPrivilege.getPrivilegesSQL(
431-
false, PgDiffUtils
432-
.getQuotedName(newColumn
433-
.getName()))
434-
+ " ON TABLE "
435-
+ PgDiffUtils.getQuotedName(newView
436-
.getName()) + " TO "
437-
+ newColumnPrivilege.getRoleName() + ";");
438-
}
439-
421+
grantColumnPrivileges(writer, newView, newColumn, newColumnPrivilege);
440422
}
441423
}
442424
}

src/test/java/cz/startnet/utils/pgdiff/PgDiffTest.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ public static Collection<?> parameters() {
272272
, {"alter_view_owner", false, false, false, false}
273273
, {"grant_on_table_cols_mixed", false, false, false, false}
274274
, {"grant_on_view_cols_mixed", false, false, false, false}
275+
, {"grant_on_view_change", false, false, false, false}
275276
});
276277
}
277278
/**
@@ -399,7 +400,9 @@ public void runDiff() throws FileNotFoundException, IOException {
399400
}
400401

401402
reader.close();
402-
403+
// System.out.println("exp???" + sbExpDiff.toString().trim() + "???");
404+
// System.out.println("");
405+
// System.out.println("diff!!!" + diffInput.toString().trim() + "!!!");
403406
Assert.assertEquals("File name template: " + fileNameTemplate,
404407
sbExpDiff.toString().trim(),
405408
diffInput.toString().trim());

src/test/resources/cz/startnet/utils/pgdiff/add_view_diff.sql

+8
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,11 @@ CREATE VIEW testview WITH (security_barrier) AS
33
SELECT testtable.id, testtable.name FROM testtable;
44

55
ALTER VIEW testview OWNER TO fordfrog;
6+
7+
REVOKE ALL ON TABLE testview FROM admin;
8+
GRANT UPDATE ON TABLE testview TO admin;
9+
10+
REVOKE ALL (id) ON TABLE testview FROM admin;
11+
GRANT SELECT (id) ON TABLE testview TO admin;
12+
REVOKE ALL (name) ON TABLE testview FROM admin;
13+
GRANT SELECT (name), INSERT (name) ON TABLE testview TO admin;

src/test/resources/cz/startnet/utils/pgdiff/add_view_new.sql

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ CREATE VIEW testview WITH (security_barrier) AS
4242

4343

4444
ALTER TABLE public.testview OWNER TO fordfrog;
45+
grant select(id, name), insert(name), update on testview to admin;
4546

4647
--
4748
-- Data for Name: testtable; Type: TABLE DATA; Schema: public; Owner: fordfrog
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
DROP VIEW IF EXISTS items_view;
2+
3+
CREATE VIEW items_view AS
4+
select id, name from items;
5+
6+
REVOKE ALL ON TABLE items_view FROM admin;
7+
GRANT UPDATE ON TABLE items_view TO admin;
8+
REVOKE ALL ON TABLE items_view FROM customer;
9+
GRANT SELECT ON TABLE items_view TO customer;
10+
REVOKE ALL ON TABLE items_view FROM webuser;
11+
GRANT INSERT, DELETE ON TABLE items_view TO webuser;
12+
13+
REVOKE ALL (id) ON TABLE items_view FROM admin;
14+
GRANT SELECT (id) ON TABLE items_view TO admin;
15+
REVOKE ALL (id) ON TABLE items_view FROM webuser;
16+
GRANT SELECT (id) ON TABLE items_view TO webuser;
17+
REVOKE ALL (name) ON TABLE items_view FROM admin;
18+
GRANT SELECT (name), INSERT (name) ON TABLE items_view TO admin;
19+
REVOKE ALL (name) ON TABLE items_view FROM customer;
20+
GRANT UPDATE (name) ON TABLE items_view TO customer;
21+
REVOKE ALL (name) ON TABLE items_view FROM webuser;
22+
GRANT SELECT (name), UPDATE (name) ON TABLE items_view TO webuser;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
create table items(id integer, name text);
2+
3+
create view items_view as select id, name from items;
4+
5+
grant select(id, name), insert(name), update on items_view to admin;
6+
7+
grant select, update(name) on items_view to customer;
8+
9+
grant select(id, name), insert, delete, update(name) on items_view to webuser;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
create table items(id integer, name text);
2+
3+
create view items_view as select id from items;
4+
5+
grant select(id), update on items_view to admin;

src/test/resources/cz/startnet/utils/pgdiff/grant_on_view_cols_mixed_diff.sql

-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
1-
2-
REVOKE ALL ON TABLE items_view FROM admin;
3-
GRANT UPDATE ON TABLE items_view TO admin;
4-
51
REVOKE ALL ON TABLE items_view FROM customer;
62
GRANT SELECT ON TABLE items_view TO customer;
73

84
REVOKE ALL ON TABLE items_view FROM webuser;
95
GRANT INSERT, DELETE ON TABLE items_view TO webuser;
106

11-
REVOKE ALL (id) ON TABLE items_view FROM admin;
12-
GRANT SELECT (id) ON TABLE items_view TO admin;
137
REVOKE ALL (id) ON TABLE items_view FROM webuser;
148
GRANT SELECT (id) ON TABLE items_view TO webuser;
15-
REVOKE ALL (name) ON TABLE items_view FROM admin;
16-
GRANT SELECT (name), INSERT (name) ON TABLE items_view TO admin;
179
REVOKE ALL (name) ON TABLE items_view FROM customer;
1810
GRANT UPDATE (name) ON TABLE items_view TO customer;
1911
REVOKE ALL (name) ON TABLE items_view FROM webuser;

src/test/resources/cz/startnet/utils/pgdiff/grant_on_view_cols_mixed_new.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
create table items(id integer, name text);
22

3-
create view items_view as select id from items;
3+
create view items_view as select id, name from items;
44

55
grant select(id, name), insert(name), update on items_view to admin;
66

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
create table items(id integer, name text);
22

3-
create view items_view as select id from items;
3+
create view items_view as select id, name from items;
4+
5+
grant select(id, name), insert(name), update on items_view to admin;

0 commit comments

Comments
 (0)