#include "postgres.h"
#include "access/genam.h"
#include "access/heapam.h"
#include "access/htup_details.h"
#include "access/sysattr.h"
#include "catalog/dependency.h"
#include "catalog/indexing.h"
#include "catalog/pg_database.h"
#include "catalog/pg_namespace.h"
#include "commands/seclabel.h"
#include "lib/stringinfo.h"
#include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/lsyscache.h"
#include "utils/tqual.h"
#include "sepgsql.h"
Go to the source code of this file.
Functions | |
void | sepgsql_schema_post_create (Oid namespaceId) |
void | sepgsql_schema_drop (Oid namespaceId) |
void | sepgsql_schema_relabel (Oid namespaceId, const char *seclabel) |
static bool | check_schema_perms (Oid namespaceId, uint32 required, bool abort_on_violation) |
void | sepgsql_schema_setattr (Oid namespaceId) |
bool | sepgsql_schema_search (Oid namespaceId, bool abort_on_violation) |
void | sepgsql_schema_add_name (Oid namespaceId) |
void | sepgsql_schema_remove_name (Oid namespaceId) |
void | sepgsql_schema_rename (Oid namespaceId) |
static bool check_schema_perms | ( | Oid | namespaceId, | |
uint32 | required, | |||
bool | abort_on_violation | |||
) | [static] |
Definition at line 180 of file schema.c.
References getObjectIdentity(), pfree(), SEPG_CLASS_DB_SCHEMA, and sepgsql_avc_check_perms().
Referenced by sepgsql_schema_add_name(), sepgsql_schema_remove_name(), sepgsql_schema_rename(), sepgsql_schema_search(), and sepgsql_schema_setattr().
{ ObjectAddress object; char *audit_name; bool result; object.classId = NamespaceRelationId; object.objectId = namespaceId; object.objectSubId = 0; audit_name = getObjectIdentity(&object); result = sepgsql_avc_check_perms(&object, SEPG_CLASS_DB_SCHEMA, required, audit_name, abort_on_violation); pfree(audit_name); return result; }
void sepgsql_schema_add_name | ( | Oid | namespaceId | ) |
Definition at line 218 of file schema.c.
References check_schema_perms(), and SEPG_DB_SCHEMA__ADD_NAME.
Referenced by sepgsql_proc_setattr(), and sepgsql_relation_setattr().
{ check_schema_perms(namespaceId, SEPG_DB_SCHEMA__ADD_NAME, true); }
void sepgsql_schema_drop | ( | Oid | namespaceId | ) |
Definition at line 115 of file schema.c.
References getObjectIdentity(), pfree(), SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__DROP, and sepgsql_avc_check_perms().
Referenced by sepgsql_object_access().
{ ObjectAddress object; char *audit_name; /* * check db_schema:{drop} permission */ object.classId = NamespaceRelationId; object.objectId = namespaceId; object.objectSubId = 0; audit_name = getObjectIdentity(&object); sepgsql_avc_check_perms(&object, SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__DROP, audit_name, true); pfree(audit_name); }
void sepgsql_schema_post_create | ( | Oid | namespaceId | ) |
Definition at line 38 of file schema.c.
References AccessShareLock, appendStringInfo(), BTEqualStrategyNumber, StringInfoData::data, DatabaseRelationId, elog, ERROR, GETSTRUCT, heap_close, heap_open(), HeapTupleIsValid, initStringInfo(), MyDatabaseId, NamespaceOidIndexId, NamespaceRelationId, NameStr, ObjectIdAttributeNumber, ObjectIdGetDatum, pfree(), quote_identifier(), ScanKeyInit(), SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__CREATE, sepgsql_avc_check_perms_label(), sepgsql_compute_create(), sepgsql_get_client_label(), sepgsql_get_label(), SEPGSQL_LABEL_TAG, SetSecurityLabel(), SnapshotSelf, systable_beginscan(), systable_endscan(), and systable_getnext().
Referenced by sepgsql_object_access().
{ Relation rel; ScanKeyData skey; SysScanDesc sscan; HeapTuple tuple; char *tcontext; char *ncontext; const char *nsp_name; ObjectAddress object; Form_pg_namespace nspForm; StringInfoData audit_name; /* * Compute a default security label when we create a new schema object * under the working database. * * XXX - uncoming version of libselinux supports to take object name to * handle special treatment on default security label; such as special * label on "pg_temp" schema. */ rel = heap_open(NamespaceRelationId, AccessShareLock); ScanKeyInit(&skey, ObjectIdAttributeNumber, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(namespaceId)); sscan = systable_beginscan(rel, NamespaceOidIndexId, true, SnapshotSelf, 1, &skey); tuple = systable_getnext(sscan); if (!HeapTupleIsValid(tuple)) elog(ERROR, "catalog lookup failed for namespace %u", namespaceId); nspForm = (Form_pg_namespace) GETSTRUCT(tuple); nsp_name = NameStr(nspForm->nspname); if (strncmp(nsp_name, "pg_temp_", 8) == 0) nsp_name = "pg_temp"; else if (strncmp(nsp_name, "pg_toast_temp_", 14) == 0) nsp_name = "pg_toast_temp"; tcontext = sepgsql_get_label(DatabaseRelationId, MyDatabaseId, 0); ncontext = sepgsql_compute_create(sepgsql_get_client_label(), tcontext, SEPG_CLASS_DB_SCHEMA, nsp_name); /* * check db_schema:{create} */ initStringInfo(&audit_name); appendStringInfo(&audit_name, "%s", quote_identifier(nsp_name)); sepgsql_avc_check_perms_label(ncontext, SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__CREATE, audit_name.data, true); systable_endscan(sscan); heap_close(rel, AccessShareLock); /* * Assign the default security label on a new procedure */ object.classId = NamespaceRelationId; object.objectId = namespaceId; object.objectSubId = 0; SetSecurityLabel(&object, SEPGSQL_LABEL_TAG, ncontext); pfree(ncontext); pfree(tcontext); }
void sepgsql_schema_relabel | ( | Oid | namespaceId, | |
const char * | seclabel | |||
) |
Definition at line 143 of file schema.c.
References getObjectIdentity(), pfree(), SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__RELABELFROM, SEPG_DB_SCHEMA__RELABELTO, SEPG_DB_SCHEMA__SETATTR, sepgsql_avc_check_perms(), and sepgsql_avc_check_perms_label().
Referenced by sepgsql_object_relabel().
{ ObjectAddress object; char *audit_name; object.classId = NamespaceRelationId; object.objectId = namespaceId; object.objectSubId = 0; audit_name = getObjectIdentity(&object); /* * check db_schema:{setattr relabelfrom} permission */ sepgsql_avc_check_perms(&object, SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__SETATTR | SEPG_DB_SCHEMA__RELABELFROM, audit_name, true); /* * check db_schema:{relabelto} permission */ sepgsql_avc_check_perms_label(seclabel, SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__RELABELTO, audit_name, true); pfree(audit_name); }
void sepgsql_schema_remove_name | ( | Oid | namespaceId | ) |
Definition at line 224 of file schema.c.
References check_schema_perms(), and SEPG_DB_SCHEMA__REMOVE_NAME.
Referenced by sepgsql_proc_setattr(), and sepgsql_relation_setattr().
{ check_schema_perms(namespaceId, SEPG_DB_SCHEMA__REMOVE_NAME, true); }
void sepgsql_schema_rename | ( | Oid | namespaceId | ) |
Definition at line 230 of file schema.c.
References check_schema_perms(), SEPG_DB_SCHEMA__ADD_NAME, and SEPG_DB_SCHEMA__REMOVE_NAME.
Referenced by sepgsql_proc_setattr(), and sepgsql_relation_setattr().
{ check_schema_perms(namespaceId, SEPG_DB_SCHEMA__ADD_NAME | SEPG_DB_SCHEMA__REMOVE_NAME, true); }
Definition at line 210 of file schema.c.
References check_schema_perms(), and SEPG_DB_SCHEMA__SEARCH.
Referenced by sepgsql_object_access().
{ return check_schema_perms(namespaceId, SEPG_DB_SCHEMA__SEARCH, abort_on_violation); }
void sepgsql_schema_setattr | ( | Oid | namespaceId | ) |
Definition at line 203 of file schema.c.
References check_schema_perms(), and SEPG_DB_SCHEMA__SETATTR.
Referenced by sepgsql_object_access().
{ check_schema_perms(namespaceId, SEPG_DB_SCHEMA__SETATTR, true); }