Add object TRUNCATE hook
All operations with acl permissions checks should have a corresponding hook so that, for example, mandatory access control (MAC) may be enforced by an extension. The command TRUNCATE is missing this hook, so add it. Patch by Yuli Khodorkovskiy with some editorialization by me. Based on the discussion not back-patched. A separate patch will exercise the hook in the sepgsql extension. Author: Yuli Khodorkovskiy Reviewed-by: Joe Conway Discussion: https://postgr.es/m/CAFL5wJcomybj1Xdw7qWmPJRpGuFukKgNrDb6uVBaCMgYS9dkaA%40mail.gmail.com
This commit is contained in:
parent
d1c866e57f
commit
f7a2002e82
@ -11,6 +11,7 @@
|
|||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "catalog/objectaccess.h"
|
#include "catalog/objectaccess.h"
|
||||||
|
#include "catalog/pg_class.h"
|
||||||
#include "catalog/pg_namespace.h"
|
#include "catalog/pg_namespace.h"
|
||||||
#include "catalog/pg_proc.h"
|
#include "catalog/pg_proc.h"
|
||||||
|
|
||||||
@ -64,6 +65,22 @@ RunObjectDropHook(Oid classId, Oid objectId, int subId,
|
|||||||
(void *) &drop_arg);
|
(void *) &drop_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RunObjectTruncateHook
|
||||||
|
*
|
||||||
|
* It is the entrypoint of OAT_TRUNCATE event
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
RunObjectTruncateHook(Oid objectId)
|
||||||
|
{
|
||||||
|
/* caller should check, but just in case... */
|
||||||
|
Assert(object_access_hook != NULL);
|
||||||
|
|
||||||
|
(*object_access_hook) (OAT_TRUNCATE,
|
||||||
|
RelationRelationId, objectId, 0,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RunObjectPostAlterHook
|
* RunObjectPostAlterHook
|
||||||
*
|
*
|
||||||
|
@ -1937,6 +1937,8 @@ truncate_check_rel(Oid relid, Form_pg_class reltuple)
|
|||||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||||
errmsg("permission denied: \"%s\" is a system catalog",
|
errmsg("permission denied: \"%s\" is a system catalog",
|
||||||
relname)));
|
relname)));
|
||||||
|
|
||||||
|
InvokeObjectTruncateHook(relid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,6 +37,10 @@
|
|||||||
* creation or altering, because OAT_POST_CREATE or OAT_POST_ALTER are
|
* creation or altering, because OAT_POST_CREATE or OAT_POST_ALTER are
|
||||||
* sufficient for extensions to track these kind of checks.
|
* sufficient for extensions to track these kind of checks.
|
||||||
*
|
*
|
||||||
|
* OAT_TRUNCATE should be invoked just before truncation of objects. This
|
||||||
|
* event is equivalent to truncate permission on a relation under the
|
||||||
|
* default access control mechanism.
|
||||||
|
*
|
||||||
* Other types may be added in the future.
|
* Other types may be added in the future.
|
||||||
*/
|
*/
|
||||||
typedef enum ObjectAccessType
|
typedef enum ObjectAccessType
|
||||||
@ -45,7 +49,8 @@ typedef enum ObjectAccessType
|
|||||||
OAT_DROP,
|
OAT_DROP,
|
||||||
OAT_POST_ALTER,
|
OAT_POST_ALTER,
|
||||||
OAT_NAMESPACE_SEARCH,
|
OAT_NAMESPACE_SEARCH,
|
||||||
OAT_FUNCTION_EXECUTE
|
OAT_FUNCTION_EXECUTE,
|
||||||
|
OAT_TRUNCATE
|
||||||
} ObjectAccessType;
|
} ObjectAccessType;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -131,6 +136,7 @@ extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId,
|
|||||||
bool is_internal);
|
bool is_internal);
|
||||||
extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,
|
extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,
|
||||||
int dropflags);
|
int dropflags);
|
||||||
|
extern void RunObjectTruncateHook(Oid objectId);
|
||||||
extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId,
|
extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId,
|
||||||
Oid auxiliaryId, bool is_internal);
|
Oid auxiliaryId, bool is_internal);
|
||||||
extern bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation);
|
extern bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation);
|
||||||
@ -160,6 +166,12 @@ extern void RunFunctionExecuteHook(Oid objectId);
|
|||||||
(dropflags)); \
|
(dropflags)); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
#define InvokeObjectTruncateHook(objectId) \
|
||||||
|
do { \
|
||||||
|
if (object_access_hook) \
|
||||||
|
RunObjectTruncateHook(objectId); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
#define InvokeObjectPostAlterHook(classId,objectId,subId) \
|
#define InvokeObjectPostAlterHook(classId,objectId,subId) \
|
||||||
InvokeObjectPostAlterHookArg((classId),(objectId),(subId), \
|
InvokeObjectPostAlterHookArg((classId),(objectId),(subId), \
|
||||||
InvalidOid,false)
|
InvalidOid,false)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user