mirror of https://github.com/postgres/postgres
This is still a bit of a hack, but it's better than the old way, for sure. KaiGai Kohei, with one change by me to make it compilepull/1/head
parent
a5e94ea52b
commit
291873c155
@ -0,0 +1,88 @@ |
||||
/* -------------------------------------------------------------------------
|
||||
* |
||||
* contrib/sepgsql/database.c |
||||
* |
||||
* Routines corresponding to database objects |
||||
* |
||||
* Copyright (c) 2010-2011, PostgreSQL Global Development Group |
||||
* |
||||
* ------------------------------------------------------------------------- |
||||
*/ |
||||
#include "postgres.h" |
||||
|
||||
#include "catalog/dependency.h" |
||||
#include "catalog/pg_database.h" |
||||
#include "commands/seclabel.h" |
||||
#include "sepgsql.h" |
||||
|
||||
void |
||||
sepgsql_database_post_create(Oid databaseId) |
||||
{ |
||||
char *scontext = sepgsql_get_client_label(); |
||||
char *tcontext; |
||||
char *ncontext; |
||||
ObjectAddress object; |
||||
|
||||
/*
|
||||
* Compute a default security label of the newly created database |
||||
* based on a pair of security label of client and source database. |
||||
* |
||||
* XXX - Right now, this logic uses "template1" as its source, because |
||||
* here is no way to know the Oid of source database. |
||||
*/ |
||||
object.classId = DatabaseRelationId; |
||||
object.objectId = TemplateDbOid; |
||||
object.objectSubId = 0; |
||||
tcontext = GetSecurityLabel(&object, SEPGSQL_LABEL_TAG); |
||||
|
||||
ncontext = sepgsql_compute_create(scontext, tcontext, |
||||
SEPG_CLASS_DB_DATABASE); |
||||
|
||||
/*
|
||||
* Assign the default security label on the new database |
||||
*/ |
||||
object.classId = DatabaseRelationId; |
||||
object.objectId = databaseId; |
||||
object.objectSubId = 0; |
||||
|
||||
SetSecurityLabel(&object, SEPGSQL_LABEL_TAG, ncontext); |
||||
|
||||
pfree(ncontext); |
||||
pfree(tcontext); |
||||
} |
||||
|
||||
/*
|
||||
* sepgsql_database_relabel |
||||
* |
||||
* It checks privileges to relabel the supplied database with the `seclabel' |
||||
*/ |
||||
void |
||||
sepgsql_database_relabel(Oid databaseId, const char *seclabel) |
||||
{ |
||||
ObjectAddress object; |
||||
char *audit_name; |
||||
|
||||
object.classId = DatabaseRelationId; |
||||
object.objectId = databaseId; |
||||
object.objectSubId = 0; |
||||
audit_name = getObjectDescription(&object); |
||||
|
||||
/*
|
||||
* check db_database:{setattr relabelfrom} permission |
||||
*/ |
||||
sepgsql_avc_check_perms(&object, |
||||
SEPG_CLASS_DB_DATABASE, |
||||
SEPG_DB_DATABASE__SETATTR | |
||||
SEPG_DB_DATABASE__RELABELFROM, |
||||
audit_name, |
||||
true); |
||||
/*
|
||||
* check db_database:{relabelto} permission |
||||
*/ |
||||
sepgsql_avc_check_perms_label(seclabel, |
||||
SEPG_CLASS_DB_DATABASE, |
||||
SEPG_DB_DATABASE__RELABELTO, |
||||
audit_name, |
||||
true); |
||||
pfree(audit_name); |
||||
} |
Loading…
Reference in new issue