Compare commits
8 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe0a83c8d8 | ||
|
|
852d03216f | ||
|
|
2ecceffd1d | ||
|
|
61bf27784f | ||
|
|
c3eae44511 | ||
|
|
8d23ee0487 | ||
|
|
b299b04e8b | ||
|
|
66e87cc858 |
9 changed files with 3267 additions and 2002 deletions
|
|
@ -1 +0,0 @@
|
|||
postgresql-8.3.7.tar.bz2
|
||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
postgresql-8.3.9.tar.bz2
|
||||
21
Makefile
21
Makefile
|
|
@ -1,21 +0,0 @@
|
|||
# Makefile for source rpm: sepostgresql
|
||||
# $Id$
|
||||
NAME := sepostgresql
|
||||
SPECFILE = $(firstword $(wildcard *.spec))
|
||||
|
||||
define find-makefile-common
|
||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(find-makefile-common))
|
||||
|
||||
ifeq ($(MAKEFILE_COMMON),)
|
||||
# attept a checkout
|
||||
define checkout-makefile-common
|
||||
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
|
||||
endif
|
||||
|
||||
include $(MAKEFILE_COMMON)
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -20,8 +20,8 @@ diff -rpNU3 base/src/test/regress/expected/sanity_check.out sepgsql-new/src/test
|
|||
-- another sanity check: every system catalog that has OIDs should have
|
||||
diff -rpNU3 base/src/test/sepgsql/Makefile sepgsql-new/src/test/sepgsql/Makefile
|
||||
--- base/src/test/sepgsql/Makefile 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/Makefile 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,65 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/Makefile 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,62 @@
|
||||
+# ----------------------------------------------------
|
||||
+# Makefile for SE-PostgreSQL testcases
|
||||
+# ----------------------------------------------------
|
||||
|
|
@ -46,7 +46,7 @@ diff -rpNU3 base/src/test/sepgsql/Makefile sepgsql-new/src/test/sepgsql/Makefile
|
|||
+
|
||||
+results.diff: $(TESTCASES:sql/%.sql=results/%.diff)
|
||||
+ @for x in $^; do cat $$x >> $@; done
|
||||
+ @test -s $@ && echo "HINT: See $@ to confirm errors" || :
|
||||
+ @test -s $@ && echo "HINT: See $(shell pwd)/$@ to confirm errors" || :
|
||||
+
|
||||
+results/%.diff: sql/%.sql
|
||||
+ @./launch_psql $(PSQL) -a $(DBNAME) < $< >& $(@:%.diff=%.out)
|
||||
|
|
@ -73,9 +73,9 @@ diff -rpNU3 base/src/test/sepgsql/Makefile sepgsql-new/src/test/sepgsql/Makefile
|
|||
+ @$(PSQL) -qt -c 'SHOW sepostgresql' -d $(DBNAME) 2>/dev/null | grep -q on || \
|
||||
+ (echo "HINT: database \"$(DBNAME)\" is not available"; \
|
||||
+ echo "HINT: SE-PostgreSQL may not be available on server"; exit 1)
|
||||
+ @$(GETSEBOOL) allow_user_postgresql_connect | grep -q on || \
|
||||
+ @$(GETSEBOOL) allow_user_postgresql_connect | grep -q 'on$$' || \
|
||||
+ (echo "HINT: check allow_user_postgresql_connect boolean"; exit 1)
|
||||
+ @$(GETSEBOOL) sepgsql_regression_test_mode | grep -q on || \
|
||||
+ @$(GETSEBOOL) sepgsql_regression_test_mode | grep -q 'on$$' || \
|
||||
+ (echo "HINT: check sepgsql_regression_test_mode boolean"; \
|
||||
+ echo "HINT: check sepostgresql-devel.pp installed"; exit 1)
|
||||
+ @$(RUNCON) -t sepgsql_test_t -l s0-s0:c0.c15 \
|
||||
|
|
@ -83,15 +83,14 @@ diff -rpNU3 base/src/test/sepgsql/Makefile sepgsql-new/src/test/sepgsql/Makefile
|
|||
+ (echo "HINT: /sbin/restorecon -R <prefix> and restart"; \
|
||||
+ echo "HINT: user shell should have 's0-s0:c0.c15' range, at least"; \
|
||||
+ echo " semanage enables to set up it"; exit 1)
|
||||
+ @test -x /etc/init.d/mcstrans && /etc/init.d/mcstrans status >& /dev/null && \
|
||||
+ (echo "HINT: stop mcstrans daemon"; exit 1) || \
|
||||
+ (test $$? -eq 3 && exit 0 || exit 1)
|
||||
+ @echo "PASS: check runtime environment"
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsql/expected/basic.out
|
||||
--- base/src/test/sepgsql/expected/basic.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/basic.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,108 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/basic.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,114 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -141,6 +140,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+) inherits(t2);
|
||||
+CREATE TABLE
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+---------------------------------------------------
|
||||
|
|
@ -148,7 +149,7 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+(1 row)
|
||||
+
|
||||
+SELECT * FROM t1; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t1.c
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT a, b FROM t1;
|
||||
+ a | b
|
||||
+---+-----
|
||||
|
|
@ -157,13 +158,13 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+(2 rows)
|
||||
+
|
||||
+SELECT COUNT(*) FROM t1 WHERE c; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t1.c
|
||||
+ERROR: SELinux: security policy violation
|
||||
+UPDATE t1 SET b = 'ccc'; -- to be denied
|
||||
+ERROR: SELinux: denied { update } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_ro_table_t:s0 tclass=db_column name=t1.b
|
||||
+ERROR: SELinux: security policy violation
|
||||
+UPDATE t1 SET a = a + 2;
|
||||
+UPDATE 2
|
||||
+INSERT INTO t1 VALUES (5, 'eee', true); -- to be denied
|
||||
+ERROR: SELinux: denied { insert } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_ro_table_t:s0 tclass=db_column name=t1.b
|
||||
+ERROR: SELinux: security policy violation
|
||||
+INSERT INTO t1 VALUES (5);
|
||||
+INSERT 0 1
|
||||
+SELECT * FROM t2;
|
||||
|
|
@ -177,13 +178,15 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+(0 rows)
|
||||
+
|
||||
+SELECT t3 FROM t3; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0:c1 tclass=db_column name=t3.x
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT 1 FROM t3;
|
||||
+ ?column?
|
||||
+----------
|
||||
+(0 rows)
|
||||
+
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c1
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+---------------------------------------------------
|
||||
|
|
@ -191,9 +194,9 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+(1 row)
|
||||
+
|
||||
+SELECT * FROM t2; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c1 tcontext=unconfined_u:object_r:sepgsql_table_t:s0:c0 tclass=db_table name=t2
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT t2 FROM t2; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c1 tcontext=unconfined_u:object_r:sepgsql_table_t:s0:c0 tclass=db_table name=t2
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT t3 FROM t3;
|
||||
+ t3
|
||||
+----
|
||||
|
|
@ -201,9 +204,11 @@ diff -rpNU3 base/src/test/sepgsql/expected/basic.out sepgsql-new/src/test/sepgsq
|
|||
+
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/copy_stmt.out sepgsql-new/src/test/sepgsql/expected/copy_stmt.out
|
||||
--- base/src/test/sepgsql/expected/copy_stmt.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/copy_stmt.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,90 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/copy_stmt.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,94 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -256,6 +261,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/copy_stmt.out sepgsql-new/src/test/se
|
|||
+INSERT INTO t2 VALUES (1, 'sss'), (2, 'ttt');
|
||||
+INSERT 0 2
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+---------------------------------------------------
|
||||
|
|
@ -269,11 +276,11 @@ diff -rpNU3 base/src/test/sepgsql/expected/copy_stmt.out sepgsql-new/src/test/se
|
|||
+COPY t1 TO '/tmp/sepgsql_test_copy_1';
|
||||
+COPY 4
|
||||
+COPY t1 TO '/tmp/sepgsql_test_copy_2'; -- to be denied
|
||||
+ERROR: SELinux: denied { write } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:postgresql_db_t:s0 tclass=file name=/tmp/sepgsql_test_copy_2
|
||||
+ERROR: SELinux: security policy violation
|
||||
+COPY t2 TO stdout; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t2.y
|
||||
+ERROR: SELinux: security policy violation
|
||||
+COPY t2 FROM stdin; -- to be denied
|
||||
+ERROR: SELinux: denied { insert } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t2.y
|
||||
+ERROR: SELinux: security policy violation
|
||||
+COPY t2 (x) TO stdout;
|
||||
+1
|
||||
+2
|
||||
|
|
@ -281,7 +288,7 @@ diff -rpNU3 base/src/test/sepgsql/expected/copy_stmt.out sepgsql-new/src/test/se
|
|||
+2
|
||||
+COPY t3 TO stdout;
|
||||
+COPY t3 FROM '/tmp/sepgsql_test_copy_1'; -- to be denied
|
||||
+ERROR: SELinux: denied { insert } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_ro_table_t:s0 tclass=db_table name=t3
|
||||
+ERROR: SELinux: security policy violation
|
||||
+COPY t1 FROM '/tmp/sepgsql_test_copy_1';
|
||||
+COPY 4
|
||||
+COPY t1 TO stdout;
|
||||
|
|
@ -295,9 +302,11 @@ diff -rpNU3 base/src/test/sepgsql/expected/copy_stmt.out sepgsql-new/src/test/se
|
|||
+4 ddd
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/enhanced_ddl_stmt.out sepgsql-new/src/test/sepgsql/expected/enhanced_ddl_stmt.out
|
||||
--- base/src/test/sepgsql/expected/enhanced_ddl_stmt.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/enhanced_ddl_stmt.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,180 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/enhanced_ddl_stmt.out 2009-06-19 15:02:12.000000000 +0900
|
||||
@@ -0,0 +1,182 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -384,12 +393,12 @@ diff -rpNU3 base/src/test/sepgsql/expected/enhanced_ddl_stmt.out sepgsql-new/src
|
|||
+ a int,
|
||||
+ b text
|
||||
+) SECURITY_CONTEXT = 'unconfined_u:object_r:invalid_label_t:s0'; -- to be failed
|
||||
+ERROR: invalid security label: unconfined_u:object_r:invalid_label_t:s0
|
||||
+ERROR: Invalid security context: "unconfined_u:object_r:invalid_label_t:s0"
|
||||
+CREATE TABLE t4 (
|
||||
+ a int,
|
||||
+ b text
|
||||
+) SECURITY_CONTEXT = 'unconfined_u:object_r:sepgsql_proc_t:s0'; -- to be denied
|
||||
+ERROR: SELinux: denied { create } scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15 tcontext=unconfined_u:object_r:sepgsql_proc_t:s0 tclass=db_table name=t4
|
||||
+ERROR: SELinux: security policy violation
|
||||
+-- ALTER TABLE with SECURITY_CONTEXT clause
|
||||
+ALTER TABLE t2 SECURITY_CONTEXT = 'unconfined_u:object_r:sepgsql_secret_table_t:s0';
|
||||
+ALTER TABLE
|
||||
|
|
@ -442,20 +451,20 @@ diff -rpNU3 base/src/test/sepgsql/expected/enhanced_ddl_stmt.out sepgsql-new/src
|
|||
+ LANGUAGE 'sql'
|
||||
+ SECURITY_CONTEXT = 'unconfined_u:object_r:invalid_label_t:s0'
|
||||
+ AS 'SELECT $1 + $1'; -- to be failed
|
||||
+ERROR: invalid security label: unconfined_u:object_r:invalid_label_t:s0
|
||||
+ERROR: Invalid security context: "unconfined_u:object_r:invalid_label_t:s0"
|
||||
+CREATE FUNCTION f2 (int) RETURNS int
|
||||
+ LANGUAGE 'sql'
|
||||
+ SECURITY_CONTEXT = 'unconfined_u:object_r:sepgsql_proc_t:s0:c16'
|
||||
+ AS 'SELECT $1 + $1'; -- to be denied
|
||||
+ERROR: SELinux: denied { create } scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15 tcontext=unconfined_u:object_r:sepgsql_proc_t:s0:c16 tclass=db_procedure name=f2
|
||||
+ERROR: SELinux: security policy violation
|
||||
+CREATE FUNCTION f2 (int) RETURNS int
|
||||
+ LANGUAGE 'sql'
|
||||
+ AS 'SELECT $1 + $1';
|
||||
+CREATE FUNCTION
|
||||
+SELECT proname, security_context FROM pg_proc WHERE oid = 'f2'::regproc;
|
||||
+ proname | security_context
|
||||
+---------+-----------------------------------------
|
||||
+ f2 | unconfined_u:object_r:sepgsql_proc_t:s0
|
||||
+ proname | security_context
|
||||
+---------+----------------------------------------------
|
||||
+ f2 | unconfined_u:object_r:sepgsql_proc_exec_t:s0
|
||||
+(1 row)
|
||||
+
|
||||
+-- ALTER FUNCTION with SECURITY_CONTEXT clause
|
||||
|
|
@ -470,18 +479,20 @@ diff -rpNU3 base/src/test/sepgsql/expected/enhanced_ddl_stmt.out sepgsql-new/src
|
|||
+
|
||||
+ALTER FUNCTION f2(int)
|
||||
+ SECURITY_CONTEXT = 'unconfined_u:object_r:sepgsql_proc_t:s0:c16'; -- to be denied
|
||||
+ERROR: SELinux: denied { relabelto } scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15 tcontext=unconfined_u:object_r:sepgsql_proc_t:s0:c16 tclass=db_procedure name=f2
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT proname, security_context FROM pg_proc WHERE oid = 'f2'::regproc;
|
||||
+ proname | security_context
|
||||
+---------+-----------------------------------------
|
||||
+ f2 | unconfined_u:object_r:sepgsql_proc_t:s0
|
||||
+ proname | security_context
|
||||
+---------+----------------------------------------------
|
||||
+ f2 | unconfined_u:object_r:sepgsql_proc_exec_t:s0
|
||||
+(1 row)
|
||||
+
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/join_query.out sepgsql-new/src/test/sepgsql/expected/join_query.out
|
||||
--- base/src/test/sepgsql/expected/join_query.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/join_query.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,85 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/join_query.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,89 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -538,6 +549,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/join_query.out sepgsql-new/src/test/s
|
|||
+INSERT INTO t2 VALUES (1, 'sss'), (5, 'ttt');
|
||||
+INSERT 0 2
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+---------------------------------------------------
|
||||
|
|
@ -545,7 +558,7 @@ diff -rpNU3 base/src/test/sepgsql/expected/join_query.out sepgsql-new/src/test/s
|
|||
+(1 row)
|
||||
+
|
||||
+SELECT * FROM t1 JOIN t2 ON a = x; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t1.c
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT a, b, y FROM t1 JOIN t2 ON a = x;
|
||||
+ a | b | y
|
||||
+---+-----+-----
|
||||
|
|
@ -557,7 +570,7 @@ diff -rpNU3 base/src/test/sepgsql/expected/join_query.out sepgsql-new/src/test/s
|
|||
+(5 rows)
|
||||
+
|
||||
+SELECT a, b, y FROM t1 JOIN t2 ON c = x; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t1.c
|
||||
+ERROR: SELinux: security policy violation
|
||||
+SELECT COUNT(*) FROM t1 JOIN t2 ON a = x;
|
||||
+ count
|
||||
+-------
|
||||
|
|
@ -565,12 +578,14 @@ diff -rpNU3 base/src/test/sepgsql/expected/join_query.out sepgsql-new/src/test/s
|
|||
+(1 row)
|
||||
+
|
||||
+SELECT j FROM (t1 JOIN t2 ON a = x) AS j; -- to be denied
|
||||
+ERROR: SELinux: denied { select } scontext=unconfined_u:unconfined_r:sepgsql_test_t:s0-s0:c0 tcontext=unconfined_u:object_r:sepgsql_secret_table_t:s0 tclass=db_column name=t1.c
|
||||
+ERROR: SELinux: security policy violation
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/large_object.out sepgsql-new/src/test/sepgsql/expected/large_object.out
|
||||
--- base/src/test/sepgsql/expected/large_object.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/large_object.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,293 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/large_object.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,299 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -623,6 +638,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/large_object.out sepgsql-new/src/test
|
|||
+(1 row)
|
||||
+
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0:c0
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+------------------------------------------------
|
||||
|
|
@ -805,6 +822,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/large_object.out sepgsql-new/src/test
|
|||
+COMMIT;
|
||||
+COMMIT
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -832,23 +851,23 @@ diff -rpNU3 base/src/test/sepgsql/expected/large_object.out sepgsql-new/src/test
|
|||
+(2 rows)
|
||||
+
|
||||
+SELECT lo_get_security(loid) FROM lolabel;
|
||||
+ lo_get_security
|
||||
+---------------------------------------------------------
|
||||
+ lo_get_security
|
||||
+-------------------------------------------------
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4
|
||||
+ system_u:object_r:sepgsql_secret_blob_t:s0
|
||||
+ unconfined_u:object_r:sepgsql_test_sepgsql_blob_t:s0:c0
|
||||
+ unconfined_u:object_r:user_sepgsql_blob_t:s0:c0
|
||||
+(4 rows)
|
||||
+
|
||||
+SELECT security_context, lo_label(loid) AS label, count(*)
|
||||
+ FROM pg_largeobject WHERE loid in (SELECT loid FROM lolabel)
|
||||
+ GROUP BY security_context, loid ORDER BY label;
|
||||
+ security_context | label | count
|
||||
+---------------------------------------------------------+----------+-------
|
||||
+ unconfined_u:object_r:sepgsql_test_sepgsql_blob_t:s0:c0 | local | 1
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4 | normal | 10
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4 | readonly | 10
|
||||
+ system_u:object_r:sepgsql_secret_blob_t:s0 | secret | 10
|
||||
+ security_context | label | count
|
||||
+-------------------------------------------------+----------+-------
|
||||
+ unconfined_u:object_r:user_sepgsql_blob_t:s0:c0 | local | 1
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4 | normal | 10
|
||||
+ system_u:object_r:sepgsql_blob_t:s0:c4 | readonly | 10
|
||||
+ system_u:object_r:sepgsql_secret_blob_t:s0 | secret | 10
|
||||
+(4 rows)
|
||||
+
|
||||
+ROLLBACK;
|
||||
|
|
@ -865,9 +884,11 @@ diff -rpNU3 base/src/test/sepgsql/expected/large_object.out sepgsql-new/src/test
|
|||
+
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/row_level.out sepgsql-new/src/test/sepgsql/expected/row_level.out
|
||||
--- base/src/test/sepgsql/expected/row_level.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/row_level.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,131 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/row_level.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,136 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -936,6 +957,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/row_level.out sepgsql-new/src/test/se
|
|||
+(3 rows)
|
||||
+
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:sepgsql_test_t:s0:c0
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+------------------------------------------------
|
||||
|
|
@ -996,13 +1019,16 @@ diff -rpNU3 base/src/test/sepgsql/expected/row_level.out sepgsql-new/src/test/se
|
|||
+CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."t2" x WHERE $1 OPERATOR(pg_catalog.=) "x" FOR SHARE OF x"
|
||||
+DELETE FROM t1 WHERE a not in (SELECT x FROM t2); -- to be failed
|
||||
+ERROR: SELinux: security policy violation
|
||||
+CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."t2" x WHERE $1 OPERATOR(pg_catalog.=) "x" FOR SHARE OF x"
|
||||
+DELETE FROM t1 WHERE a = 7;
|
||||
+DELETE 1
|
||||
diff -rpNU3 base/src/test/sepgsql/expected/security_label.out sepgsql-new/src/test/sepgsql/expected/security_label.out
|
||||
--- base/src/test/sepgsql/expected/security_label.out 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/security_label.out 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,127 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/expected/security_label.out 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,129 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+SET sepostgresql_mcstrans TO off;
|
||||
+SET
|
||||
+SELECT sepgsql_getcon();
|
||||
+ sepgsql_getcon
|
||||
+-----------------------------------------------------
|
||||
|
|
@ -1051,7 +1077,7 @@ diff -rpNU3 base/src/test/sepgsql/expected/security_label.out sepgsql-new/src/te
|
|||
+INSERT INTO t1 VALUES (4, 'ddd'), (5, 'eee');
|
||||
+INSERT 0 2
|
||||
+INSERT INTO t1 (security_context, a, b) VALUES ('invalid security context', 6, 'fff'); -- to be failed
|
||||
+ERROR: invalid security label: invalid security context
|
||||
+ERROR: Invalid security context: "invalid security context"
|
||||
+INSERT INTO t1 (security_context, a, b) VALUES ('system_u:object_r:sepgsql_table_t:s0:c20', 6, 'fff'); -- to be denied
|
||||
+INSERT 0 0
|
||||
+SELECT security_context, * FROM t1;
|
||||
|
|
@ -1131,8 +1157,8 @@ diff -rpNU3 base/src/test/sepgsql/expected/security_label.out sepgsql-new/src/te
|
|||
+system_u:object_r:sepgsql_table_t:s0:c4 13 nnn
|
||||
diff -rpNU3 base/src/test/sepgsql/launch_psql.c sepgsql-new/src/test/sepgsql/launch_psql.c
|
||||
--- base/src/test/sepgsql/launch_psql.c 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/launch_psql.c 2009-03-15 17:38:39.000000000 +0900
|
||||
@@ -0,0 +1,87 @@
|
||||
+++ sepgsql-new/src/test/sepgsql/launch_psql.c 2009-06-10 21:37:54.000000000 +0900
|
||||
@@ -0,0 +1,91 @@
|
||||
+/*
|
||||
+ * launch_psql.c
|
||||
+ *
|
||||
|
|
@ -1189,6 +1215,10 @@ diff -rpNU3 base/src/test/sepgsql/launch_psql.c sepgsql-new/src/test/sepgsql/lau
|
|||
+ pclose(filp);
|
||||
+ filp = NULL;
|
||||
+ }
|
||||
+ /* Inject SET sepostgresql_mcstrans TO off */
|
||||
+ ofs = strlen(buffer);
|
||||
+ snprintf(buffer + ofs, sizeof(buffer) - ofs,
|
||||
+ "\nSET sepostgresql_mcstrans TO off;\n");
|
||||
+
|
||||
+ /* Inject a pseudo sepgsql_getcon() to confirm new context */
|
||||
+ ofs = strlen(buffer);
|
||||
|
|
@ -1222,7 +1252,7 @@ diff -rpNU3 base/src/test/sepgsql/launch_psql.c sepgsql-new/src/test/sepgsql/lau
|
|||
+}
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/basic.sql sepgsql-new/src/test/sepgsql/sql/basic.sql
|
||||
--- base/src/test/sepgsql/sql/basic.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/basic.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/basic.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,59 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1285,7 +1315,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/basic.sql sepgsql-new/src/test/sepgsql/sql
|
|||
+SELECT t3 FROM t3;
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/copy_stmt.sql sepgsql-new/src/test/sepgsql/sql/copy_stmt.sql
|
||||
--- base/src/test/sepgsql/sql/copy_stmt.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/copy_stmt.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/copy_stmt.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,58 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1347,7 +1377,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/copy_stmt.sql sepgsql-new/src/test/sepgsql
|
|||
+COPY t1 TO stdout;
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/enhanced_ddl_stmt.sql sepgsql-new/src/test/sepgsql/sql/enhanced_ddl_stmt.sql
|
||||
--- base/src/test/sepgsql/sql/enhanced_ddl_stmt.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/enhanced_ddl_stmt.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/enhanced_ddl_stmt.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,89 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1440,7 +1470,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/enhanced_ddl_stmt.sql sepgsql-new/src/test
|
|||
+SELECT proname, security_context FROM pg_proc WHERE oid = 'f2'::regproc;
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/join_query.sql sepgsql-new/src/test/sepgsql/sql/join_query.sql
|
||||
--- base/src/test/sepgsql/sql/join_query.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/join_query.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/join_query.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,50 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1494,7 +1524,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/join_query.sql sepgsql-new/src/test/sepgsq
|
|||
+SELECT j FROM (t1 JOIN t2 ON a = x) AS j; -- to be denied
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/large_object.sql sepgsql-new/src/test/sepgsql/sql/large_object.sql
|
||||
--- base/src/test/sepgsql/sql/large_object.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/large_object.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/large_object.sql 2009-03-03 14:31:40.000000000 +0900
|
||||
@@ -0,0 +1,103 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1601,7 +1631,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/large_object.sql sepgsql-new/src/test/sepg
|
|||
+SELECT lo_unlink(loid) FROM lolabel;
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/row_level.sql sepgsql-new/src/test/sepgsql/sql/row_level.sql
|
||||
--- base/src/test/sepgsql/sql/row_level.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/row_level.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/row_level.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,61 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
@ -1666,7 +1696,7 @@ diff -rpNU3 base/src/test/sepgsql/sql/row_level.sql sepgsql-new/src/test/sepgsql
|
|||
+DELETE FROM t1 WHERE a = 7;
|
||||
diff -rpNU3 base/src/test/sepgsql/sql/security_label.sql sepgsql-new/src/test/sepgsql/sql/security_label.sql
|
||||
--- base/src/test/sepgsql/sql/security_label.sql 1970-01-01 09:00:00.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/security_label.sql 2009-03-15 17:38:39.000000000 +0900
|
||||
+++ sepgsql-new/src/test/sepgsql/sql/security_label.sql 2009-03-02 00:24:34.000000000 +0900
|
||||
@@ -0,0 +1,60 @@
|
||||
+--@SECURITY_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c15
|
||||
+
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
||||
--- base/src/bin/initdb/initdb.c 2008-11-05 09:57:00.000000000 +0900
|
||||
+++ sepgsql-new/src/bin/initdb/initdb.c 2009-03-13 18:14:33.000000000 +0900
|
||||
--- base/src/bin/initdb/initdb.c 2009-12-15 16:55:43.000000000 +0900
|
||||
+++ sepgsql-new/src/bin/initdb/initdb.c 2009-12-15 17:05:57.000000000 +0900
|
||||
@@ -94,6 +94,7 @@ static bool debug = false;
|
||||
static bool noclean = false;
|
||||
static bool show_setting = false;
|
||||
|
|
@ -9,7 +9,7 @@ diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
|||
|
||||
|
||||
/* internal vars */
|
||||
@@ -1212,6 +1213,13 @@ setup_config(void)
|
||||
@@ -1224,6 +1225,13 @@ setup_config(void)
|
||||
"#default_text_search_config = 'pg_catalog.simple'",
|
||||
repltok);
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
|||
snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
|
||||
|
||||
writefile(path, conflines);
|
||||
@@ -2383,6 +2391,7 @@ usage(const char *progname)
|
||||
@@ -2395,6 +2403,7 @@ usage(const char *progname)
|
||||
printf(_(" -U, --username=NAME database superuser name\n"));
|
||||
printf(_(" -W, --pwprompt prompt for a password for the new superuser\n"));
|
||||
printf(_(" --pwfile=FILE read password for the new superuser from file\n"));
|
||||
|
|
@ -31,7 +31,7 @@ diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
|||
printf(_(" -?, --help show this help, then exit\n"));
|
||||
printf(_(" -V, --version output version information, then exit\n"));
|
||||
printf(_("\nLess commonly used options:\n"));
|
||||
@@ -2417,6 +2426,7 @@ main(int argc, char *argv[])
|
||||
@@ -2429,6 +2438,7 @@ main(int argc, char *argv[])
|
||||
{"auth", required_argument, NULL, 'A'},
|
||||
{"pwprompt", no_argument, NULL, 'W'},
|
||||
{"pwfile", required_argument, NULL, 9},
|
||||
|
|
@ -39,7 +39,7 @@ diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
|||
{"username", required_argument, NULL, 'U'},
|
||||
{"help", no_argument, NULL, '?'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
@@ -2531,6 +2541,9 @@ main(int argc, char *argv[])
|
||||
@@ -2543,6 +2553,9 @@ main(int argc, char *argv[])
|
||||
case 9:
|
||||
pwfilename = xstrdup(optarg);
|
||||
break;
|
||||
|
|
@ -50,8 +50,8 @@ diff -rpNU3 base/src/bin/initdb/initdb.c sepgsql-new/src/bin/initdb/initdb.c
|
|||
show_setting = true;
|
||||
break;
|
||||
diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
||||
--- base/src/bin/pg_dump/pg_dump.c 2009-02-02 11:47:17.000000000 +0900
|
||||
+++ sepgsql-new/src/bin/pg_dump/pg_dump.c 2009-03-13 18:14:33.000000000 +0900
|
||||
--- base/src/bin/pg_dump/pg_dump.c 2009-09-10 20:11:35.000000000 +0900
|
||||
+++ sepgsql-new/src/bin/pg_dump/pg_dump.c 2009-09-10 20:24:37.000000000 +0900
|
||||
@@ -118,6 +118,8 @@ static int g_numNamespaces;
|
||||
/* flag to turn on/off dollar quoting */
|
||||
static int disable_dollar_quoting = 0;
|
||||
|
|
@ -121,7 +121,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
fmtQualifiedId(tbinfo->dobj.namespace->dobj.name,
|
||||
classname));
|
||||
}
|
||||
@@ -1785,11 +1810,29 @@ dumpBlobComments(Archive *AH, void *arg)
|
||||
@@ -1791,11 +1816,29 @@ dumpBlobComments(Archive *AH, void *arg)
|
||||
Oid blobOid;
|
||||
char *comment;
|
||||
|
||||
|
|
@ -152,7 +152,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
comment = PQgetvalue(res, i, 1);
|
||||
|
||||
printfPQExpBuffer(commentcmd, "COMMENT ON LARGE OBJECT %u IS ",
|
||||
@@ -2887,6 +2930,7 @@ getTables(int *numTables)
|
||||
@@ -2893,6 +2936,7 @@ getTables(int *numTables)
|
||||
int i_owning_col;
|
||||
int i_reltablespace;
|
||||
int i_reloptions;
|
||||
|
|
@ -160,7 +160,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
|
||||
/* Make sure we are in proper schema */
|
||||
selectSourceSchema("pg_catalog");
|
||||
@@ -2926,7 +2970,8 @@ getTables(int *numTables)
|
||||
@@ -2932,7 +2976,8 @@ getTables(int *numTables)
|
||||
"d.refobjid as owning_tab, "
|
||||
"d.refobjsubid as owning_col, "
|
||||
"(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
|
||||
|
|
@ -170,7 +170,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class c "
|
||||
"left join pg_depend d on "
|
||||
"(c.relkind = '%c' and "
|
||||
@@ -2936,6 +2981,7 @@ getTables(int *numTables)
|
||||
@@ -2942,6 +2987,7 @@ getTables(int *numTables)
|
||||
"where relkind in ('%c', '%c', '%c', '%c') "
|
||||
"order by c.oid",
|
||||
username_subquery,
|
||||
|
|
@ -178,7 +178,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
RELKIND_SEQUENCE,
|
||||
RELKIND_RELATION, RELKIND_SEQUENCE,
|
||||
RELKIND_VIEW, RELKIND_COMPOSITE_TYPE);
|
||||
@@ -2955,7 +3001,8 @@ getTables(int *numTables)
|
||||
@@ -2961,7 +3007,8 @@ getTables(int *numTables)
|
||||
"d.refobjid as owning_tab, "
|
||||
"d.refobjsubid as owning_col, "
|
||||
"(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
|
||||
|
|
@ -188,7 +188,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class c "
|
||||
"left join pg_depend d on "
|
||||
"(c.relkind = '%c' and "
|
||||
@@ -2984,7 +3031,8 @@ getTables(int *numTables)
|
||||
@@ -2990,7 +3037,8 @@ getTables(int *numTables)
|
||||
"d.refobjid as owning_tab, "
|
||||
"d.refobjsubid as owning_col, "
|
||||
"NULL as reltablespace, "
|
||||
|
|
@ -198,7 +198,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class c "
|
||||
"left join pg_depend d on "
|
||||
"(c.relkind = '%c' and "
|
||||
@@ -3009,7 +3057,8 @@ getTables(int *numTables)
|
||||
@@ -3015,7 +3063,8 @@ getTables(int *numTables)
|
||||
"NULL::oid as owning_tab, "
|
||||
"NULL::int4 as owning_col, "
|
||||
"NULL as reltablespace, "
|
||||
|
|
@ -208,7 +208,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class "
|
||||
"where relkind in ('%c', '%c', '%c') "
|
||||
"order by oid",
|
||||
@@ -3029,7 +3078,8 @@ getTables(int *numTables)
|
||||
@@ -3035,7 +3084,8 @@ getTables(int *numTables)
|
||||
"NULL::oid as owning_tab, "
|
||||
"NULL::int4 as owning_col, "
|
||||
"NULL as reltablespace, "
|
||||
|
|
@ -218,7 +218,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class "
|
||||
"where relkind in ('%c', '%c', '%c') "
|
||||
"order by oid",
|
||||
@@ -3059,7 +3109,8 @@ getTables(int *numTables)
|
||||
@@ -3065,7 +3115,8 @@ getTables(int *numTables)
|
||||
"NULL::oid as owning_tab, "
|
||||
"NULL::int4 as owning_col, "
|
||||
"NULL as reltablespace, "
|
||||
|
|
@ -228,7 +228,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_class c "
|
||||
"where relkind in ('%c', '%c') "
|
||||
"order by oid",
|
||||
@@ -3102,6 +3153,7 @@ getTables(int *numTables)
|
||||
@@ -3108,6 +3159,7 @@ getTables(int *numTables)
|
||||
i_owning_col = PQfnumber(res, "owning_col");
|
||||
i_reltablespace = PQfnumber(res, "reltablespace");
|
||||
i_reloptions = PQfnumber(res, "reloptions");
|
||||
|
|
@ -236,7 +236,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
|
||||
for (i = 0; i < ntups; i++)
|
||||
{
|
||||
@@ -3132,6 +3184,7 @@ getTables(int *numTables)
|
||||
@@ -3138,6 +3190,7 @@ getTables(int *numTables)
|
||||
}
|
||||
tblinfo[i].reltablespace = strdup(PQgetvalue(res, i, i_reltablespace));
|
||||
tblinfo[i].reloptions = strdup(PQgetvalue(res, i, i_reloptions));
|
||||
|
|
@ -244,7 +244,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
|
||||
/* other fields were zeroed above */
|
||||
|
||||
@@ -4320,6 +4373,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4326,6 +4379,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
int i_atthasdef;
|
||||
int i_attisdropped;
|
||||
int i_attislocal;
|
||||
|
|
@ -252,7 +252,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
PGresult *res;
|
||||
int ntups;
|
||||
bool hasdefaults;
|
||||
@@ -4362,12 +4416,14 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4368,12 +4422,14 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
/* need left join here to not fail on dropped columns ... */
|
||||
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, a.attstattarget, a.attstorage, t.typstorage, "
|
||||
"a.attnotnull, a.atthasdef, a.attisdropped, a.attislocal, "
|
||||
|
|
@ -268,7 +268,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
tbinfo->dobj.catId.oid);
|
||||
}
|
||||
else if (g_fout->remoteVersion >= 70100)
|
||||
@@ -4379,7 +4435,8 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4385,7 +4441,8 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
*/
|
||||
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, -1 as attstattarget, a.attstorage, t.typstorage, "
|
||||
"a.attnotnull, a.atthasdef, false as attisdropped, false as attislocal, "
|
||||
|
|
@ -278,7 +278,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_attribute a left join pg_type t "
|
||||
"on a.atttypid = t.oid "
|
||||
"where a.attrelid = '%u'::oid "
|
||||
@@ -4392,7 +4449,8 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4398,7 +4455,8 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
/* format_type not available before 7.1 */
|
||||
appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, attstorage, attstorage as typstorage, "
|
||||
"attnotnull, atthasdef, false as attisdropped, false as attislocal, "
|
||||
|
|
@ -288,7 +288,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"from pg_attribute a "
|
||||
"where attrelid = '%u'::oid "
|
||||
"and attnum > 0::int2 "
|
||||
@@ -4416,6 +4474,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4422,6 +4480,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
i_atthasdef = PQfnumber(res, "atthasdef");
|
||||
i_attisdropped = PQfnumber(res, "attisdropped");
|
||||
i_attislocal = PQfnumber(res, "attislocal");
|
||||
|
|
@ -296,7 +296,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
|
||||
tbinfo->numatts = ntups;
|
||||
tbinfo->attnames = (char **) malloc(ntups * sizeof(char *));
|
||||
@@ -4426,6 +4485,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4432,6 +4491,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
tbinfo->typstorage = (char *) malloc(ntups * sizeof(char));
|
||||
tbinfo->attisdropped = (bool *) malloc(ntups * sizeof(bool));
|
||||
tbinfo->attislocal = (bool *) malloc(ntups * sizeof(bool));
|
||||
|
|
@ -304,7 +304,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
tbinfo->notnull = (bool *) malloc(ntups * sizeof(bool));
|
||||
tbinfo->attrdefs = (AttrDefInfo **) malloc(ntups * sizeof(AttrDefInfo *));
|
||||
tbinfo->inhAttrs = (bool *) malloc(ntups * sizeof(bool));
|
||||
@@ -4449,6 +4509,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
@@ -4455,6 +4515,7 @@ getTableAttrs(TableInfo *tblinfo, int nu
|
||||
tbinfo->typstorage[j] = *(PQgetvalue(res, j, i_typstorage));
|
||||
tbinfo->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't');
|
||||
tbinfo->attislocal[j] = (PQgetvalue(res, j, i_attislocal)[0] == 't');
|
||||
|
|
@ -312,7 +312,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
tbinfo->notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't');
|
||||
tbinfo->attrdefs[j] = NULL; /* fix below */
|
||||
if (PQgetvalue(res, j, i_atthasdef)[0] == 't')
|
||||
@@ -6430,6 +6491,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6436,6 +6497,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
char *procost;
|
||||
char *prorows;
|
||||
char *lanname;
|
||||
|
|
@ -320,7 +320,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
char *rettypename;
|
||||
int nallargs;
|
||||
char **allargtypes = NULL;
|
||||
@@ -6459,9 +6521,11 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6465,9 +6527,11 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"proallargtypes, proargmodes, proargnames, "
|
||||
"provolatile, proisstrict, prosecdef, "
|
||||
"proconfig, procost, prorows, "
|
||||
|
|
@ -333,7 +333,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
finfo->dobj.catId.oid);
|
||||
}
|
||||
else if (g_fout->remoteVersion >= 80100)
|
||||
@@ -6471,7 +6535,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6477,7 +6541,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"proallargtypes, proargmodes, proargnames, "
|
||||
"provolatile, proisstrict, prosecdef, "
|
||||
"null as proconfig, 0 as procost, 0 as prorows, "
|
||||
|
|
@ -343,7 +343,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"FROM pg_catalog.pg_proc "
|
||||
"WHERE oid = '%u'::pg_catalog.oid",
|
||||
finfo->dobj.catId.oid);
|
||||
@@ -6485,7 +6550,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6491,7 +6556,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"proargnames, "
|
||||
"provolatile, proisstrict, prosecdef, "
|
||||
"null as proconfig, 0 as procost, 0 as prorows, "
|
||||
|
|
@ -353,7 +353,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"FROM pg_catalog.pg_proc "
|
||||
"WHERE oid = '%u'::pg_catalog.oid",
|
||||
finfo->dobj.catId.oid);
|
||||
@@ -6499,7 +6565,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6505,7 +6571,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"null as proargnames, "
|
||||
"provolatile, proisstrict, prosecdef, "
|
||||
"null as proconfig, 0 as procost, 0 as prorows, "
|
||||
|
|
@ -363,7 +363,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"FROM pg_catalog.pg_proc "
|
||||
"WHERE oid = '%u'::pg_catalog.oid",
|
||||
finfo->dobj.catId.oid);
|
||||
@@ -6515,7 +6582,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6521,7 +6588,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"proisstrict, "
|
||||
"'f'::boolean as prosecdef, "
|
||||
"null as proconfig, 0 as procost, 0 as prorows, "
|
||||
|
|
@ -373,7 +373,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"FROM pg_proc "
|
||||
"WHERE oid = '%u'::oid",
|
||||
finfo->dobj.catId.oid);
|
||||
@@ -6531,7 +6599,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6537,7 +6605,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
"'f'::boolean as proisstrict, "
|
||||
"'f'::boolean as prosecdef, "
|
||||
"null as proconfig, 0 as procost, 0 as prorows, "
|
||||
|
|
@ -383,7 +383,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
"FROM pg_proc "
|
||||
"WHERE oid = '%u'::oid",
|
||||
finfo->dobj.catId.oid);
|
||||
@@ -6562,6 +6631,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6568,6 +6637,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
|
||||
prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
|
||||
lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
|
||||
|
|
@ -391,7 +391,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
|
||||
/*
|
||||
* See backend/commands/define.c for details of how the 'AS' clause is
|
||||
@@ -6699,6 +6769,9 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
@@ -6705,6 +6775,9 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
||||
if (prosecdef[0] == 't')
|
||||
appendPQExpBuffer(q, " SECURITY DEFINER");
|
||||
|
||||
|
|
@ -401,7 +401,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
/*
|
||||
* COST and ROWS are emitted only if present and not default, so as not to
|
||||
* break backwards-compatibility of the dump without need. Keep this code
|
||||
@@ -8780,6 +8853,10 @@ dumpTableSchema(Archive *fout, TableInfo
|
||||
@@ -8786,6 +8859,10 @@ dumpTableSchema(Archive *fout, TableInfo
|
||||
if (tbinfo->notnull[j] && !tbinfo->inhNotNull[j])
|
||||
appendPQExpBuffer(q, " NOT NULL");
|
||||
|
||||
|
|
@ -412,7 +412,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
actual_atts++;
|
||||
}
|
||||
}
|
||||
@@ -8827,6 +8904,9 @@ dumpTableSchema(Archive *fout, TableInfo
|
||||
@@ -8833,6 +8910,9 @@ dumpTableSchema(Archive *fout, TableInfo
|
||||
if (tbinfo->reloptions && strlen(tbinfo->reloptions) > 0)
|
||||
appendPQExpBuffer(q, "\nWITH (%s)", tbinfo->reloptions);
|
||||
|
||||
|
|
@ -422,7 +422,7 @@ diff -rpNU3 base/src/bin/pg_dump/pg_dump.c sepgsql-new/src/bin/pg_dump/pg_dump.c
|
|||
appendPQExpBuffer(q, ";\n");
|
||||
|
||||
/* Loop dumping statistics and storage statements */
|
||||
@@ -10244,6 +10324,13 @@ fmtCopyColumnList(const TableInfo *ti)
|
||||
@@ -10250,6 +10330,13 @@ fmtCopyColumnList(const TableInfo *ti)
|
||||
|
||||
appendPQExpBuffer(q, "(");
|
||||
needComma = false;
|
||||
|
|
|
|||
|
|
@ -7,9 +7,9 @@
|
|||
# pidfile: /var/run/postmaster.pid
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
PGVERSION="8.3.7"
|
||||
PGVERSION="8.3.9"
|
||||
PGMAJORVERSION=`echo "$PGVERSION" | sed 's/^\([0-9]*\.[0-9a-z]*\).*$/\1/'`
|
||||
SEPGVERSION="1771"
|
||||
SEPGVERSION="2515"
|
||||
|
||||
# source function library
|
||||
. /etc/rc.d/init.d/functions
|
||||
|
|
@ -165,7 +165,7 @@ do_initdb() {
|
|||
test -x /sbin/restorecon && /sbin/restorecon -R "${SEPGSQL_DATA}"
|
||||
# Initialize the database
|
||||
cd ${SEPGSQL_BIN}
|
||||
/sbin/runuser -- sepgsql -c "./initdb.sepgsql --pgace-feature=selinux -A 'ident sameuser' ${SEPGSQL_DATA}" \
|
||||
/sbin/runuser -- sepgsql -c "./initdb.sepgsql --enable-selinux -A 'ident sameuser' ${SEPGSQL_DATA}" \
|
||||
>> "${SEPGSQL_STARTUP_LOG}" 2>&1 < /dev/null
|
||||
if [ -f "${SEPGSQL_DATA}/PG_VERSION" ]; then
|
||||
echo_success
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
|
||||
Summary: Security Enhanced PostgreSQL
|
||||
Name: sepostgresql
|
||||
Version: 8.3.7
|
||||
Release: 1771%{?dist}
|
||||
Version: 8.3.9
|
||||
Release: 2582%{?dist}
|
||||
License: BSD
|
||||
Group: Applications/Databases
|
||||
Url: http://code.google.com/p/sepgsql/
|
||||
|
|
@ -26,7 +26,7 @@ Patch1: sepostgresql-utils-8.3.patch
|
|||
Patch2: sepostgresql-test-8.3.patch
|
||||
Patch3: sepostgresql-fedora-prefix.patch
|
||||
BuildRequires: perl glibc-devel bison flex readline-devel zlib-devel >= 1.0.4
|
||||
BuildRequires: checkpolicy libselinux-devel >= 2.0.43
|
||||
BuildRequires: checkpolicy libselinux-devel >= 2.0.80
|
||||
BuildRequires: selinux-policy >= 3.4.2
|
||||
%if %{ssl}
|
||||
BuildRequires: openssl-devel
|
||||
|
|
@ -35,8 +35,9 @@ Requires(pre): shadow-utils
|
|||
Requires(post): policycoreutils /sbin/chkconfig
|
||||
Requires(preun): /sbin/chkconfig /sbin/service
|
||||
Requires(postun): policycoreutils
|
||||
Requires: postgresql-server = %{version}
|
||||
Requires: policycoreutils >= 2.0.16 libselinux >= 2.0.43
|
||||
Requires: postgresql-server >= 8.3.0
|
||||
Conflicts: postgresql-server >= 8.4.0
|
||||
Requires: policycoreutils >= 2.0.16 libselinux >= 2.0.80
|
||||
Requires: selinux-policy >= 3.4.2
|
||||
Requires: tzdata logrotate
|
||||
|
||||
|
|
@ -199,6 +200,21 @@ fi
|
|||
%attr(700,sepgsql,sepgsql) %dir %{_localstatedir}/lib/sepgsql/backups
|
||||
|
||||
%changelog
|
||||
* Thu Mar 18 2010 KaiGai Kohei <kaigai@ak.jp.nec.com> - 8.3.9-2583
|
||||
- detach dependency to minor updates
|
||||
|
||||
* Fri Dec 25 2009 KaiGai Kohei <kaigai@kaigai.gr.jp> - 8.3.9-2515
|
||||
- upgrade base PostgreSQL v8.3.8->8.3.9
|
||||
|
||||
* Thu Sep 10 2009 KaiGai Kohei <kaigai@kaigai.gr.jp> - 8.3.8-2300
|
||||
- upgrade base PostgreSQL v8.3.7->8.3.8
|
||||
|
||||
* Tue Jun 9 2009 KaiGai Kohei <kaigai@kaigai.gr.jp> - 8.3.7-1990
|
||||
- backport features from v8.4devel, it also needs libselinux-2.0.80
|
||||
|
||||
* Fri Apr 17 2009 KaiGai Kohei <kaigai@kaigai.gr.jp> - 8.3.7-1772
|
||||
- bugfix: /etc/init.d/sepostgresql initdb didn't work correctly
|
||||
|
||||
* Fri Mar 27 2009 KaiGai Kohei <kaigai@kaigai.gr.jp> - 8.3.7-1770
|
||||
- upgrade base PostgreSQL versin 8.3.6->8.3.7
|
||||
- backport features from v8.4devel
|
||||
|
|
|
|||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
7b7e91a2221e55fe1b167e663217a96d postgresql-8.3.7.tar.bz2
|
||||
e120b001354851b5df26cbee8c2786d5 postgresql-8.3.9.tar.bz2
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue