mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Teach sepgsql about database labels.
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 compile
This commit is contained in:
88
contrib/sepgsql/database.c
Normal file
88
contrib/sepgsql/database.c
Normal file
@ -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);
|
||||
}
|
Reference in New Issue
Block a user