acl.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 1,969 行 · 第 1/4 页

C
1,969
字号
	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	int32		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = get_usesysid(NameStr(*username));	mode = convert_table_priv_string(priv_type_text);	aclresult = pg_class_aclcheck(tableoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_table_privilege_id *		Check user privileges on a table given *		table oid, and text priv name. *		current_user is assumed */Datumhas_table_privilege_id(PG_FUNCTION_ARGS){	Oid			tableoid = PG_GETARG_OID(0);	text	   *priv_type_text = PG_GETARG_TEXT_P(1);	AclId		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = GetUserId();	mode = convert_table_priv_string(priv_type_text);	aclresult = pg_class_aclcheck(tableoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_table_privilege_id_name *		Check user privileges on a table given *		usesysid, text tablename, and text priv name. */Datumhas_table_privilege_id_name(PG_FUNCTION_ARGS){	int32		usesysid = PG_GETARG_INT32(0);	text	   *tablename = PG_GETARG_TEXT_P(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	Oid			tableoid;	AclMode		mode;	AclResult	aclresult;	tableoid = convert_table_name(tablename);	mode = convert_table_priv_string(priv_type_text);	aclresult = pg_class_aclcheck(tableoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_table_privilege_id_id *		Check user privileges on a table given *		usesysid, table oid, and text priv name. */Datumhas_table_privilege_id_id(PG_FUNCTION_ARGS){	int32		usesysid = PG_GETARG_INT32(0);	Oid			tableoid = PG_GETARG_OID(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	AclMode		mode;	AclResult	aclresult;	mode = convert_table_priv_string(priv_type_text);	aclresult = pg_class_aclcheck(tableoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* *		Support routines for has_table_privilege family. *//* * Given a table name expressed as a string, look it up and return Oid */static Oidconvert_table_name(text *tablename){	RangeVar   *relrv;	relrv = makeRangeVarFromNameList(textToQualifiedNameList(tablename,												 "has_table_privilege"));	return RangeVarGetRelid(relrv, false);}/* * convert_table_priv_string *		Convert text string to AclMode value. */static AclModeconvert_table_priv_string(text *priv_type_text){	char	   *priv_type;	priv_type = DatumGetCString(DirectFunctionCall1(textout,									   PointerGetDatum(priv_type_text)));	/*	 * Return mode from priv_type string	 */	if (strcasecmp(priv_type, "SELECT") == 0)		return ACL_SELECT;	if (strcasecmp(priv_type, "SELECT WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_SELECT);	if (strcasecmp(priv_type, "INSERT") == 0)		return ACL_INSERT;	if (strcasecmp(priv_type, "INSERT WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_INSERT);	if (strcasecmp(priv_type, "UPDATE") == 0)		return ACL_UPDATE;	if (strcasecmp(priv_type, "UPDATE WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_UPDATE);	if (strcasecmp(priv_type, "DELETE") == 0)		return ACL_DELETE;	if (strcasecmp(priv_type, "DELETE WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_DELETE);	if (strcasecmp(priv_type, "RULE") == 0)		return ACL_RULE;	if (strcasecmp(priv_type, "RULE WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_RULE);	if (strcasecmp(priv_type, "REFERENCES") == 0)		return ACL_REFERENCES;	if (strcasecmp(priv_type, "REFERENCES WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_REFERENCES);	if (strcasecmp(priv_type, "TRIGGER") == 0)		return ACL_TRIGGER;	if (strcasecmp(priv_type, "TRIGGER WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_TRIGGER);	ereport(ERROR,			(errcode(ERRCODE_INVALID_PARAMETER_VALUE),			 errmsg("unrecognized privilege type: \"%s\"", priv_type)));	return ACL_NO_RIGHTS;		/* keep compiler quiet */}/* * has_database_privilege variants *		These are all named "has_database_privilege" at the SQL level. *		They take various combinations of database name, database OID, *		user name, user sysid, or implicit user = current_user. * *		The result is a boolean value: true if user has the indicated *		privilege, false if not. *//* * has_database_privilege_name_name *		Check user privileges on a database given *		name username, text databasename, and text priv name. */Datumhas_database_privilege_name_name(PG_FUNCTION_ARGS){	Name		username = PG_GETARG_NAME(0);	text	   *databasename = PG_GETARG_TEXT_P(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	int32		usesysid;	Oid			databaseoid;	AclMode		mode;	AclResult	aclresult;	usesysid = get_usesysid(NameStr(*username));	databaseoid = convert_database_name(databasename);	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_name *		Check user privileges on a database given *		text databasename and text priv name. *		current_user is assumed */Datumhas_database_privilege_name(PG_FUNCTION_ARGS){	text	   *databasename = PG_GETARG_TEXT_P(0);	text	   *priv_type_text = PG_GETARG_TEXT_P(1);	AclId		usesysid;	Oid			databaseoid;	AclMode		mode;	AclResult	aclresult;	usesysid = GetUserId();	databaseoid = convert_database_name(databasename);	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_name_id *		Check user privileges on a database given *		name usename, database oid, and text priv name. */Datumhas_database_privilege_name_id(PG_FUNCTION_ARGS){	Name		username = PG_GETARG_NAME(0);	Oid			databaseoid = PG_GETARG_OID(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	int32		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = get_usesysid(NameStr(*username));	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_id *		Check user privileges on a database given *		database oid, and text priv name. *		current_user is assumed */Datumhas_database_privilege_id(PG_FUNCTION_ARGS){	Oid			databaseoid = PG_GETARG_OID(0);	text	   *priv_type_text = PG_GETARG_TEXT_P(1);	AclId		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = GetUserId();	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_id_name *		Check user privileges on a database given *		usesysid, text databasename, and text priv name. */Datumhas_database_privilege_id_name(PG_FUNCTION_ARGS){	int32		usesysid = PG_GETARG_INT32(0);	text	   *databasename = PG_GETARG_TEXT_P(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	Oid			databaseoid;	AclMode		mode;	AclResult	aclresult;	databaseoid = convert_database_name(databasename);	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_id_id *		Check user privileges on a database given *		usesysid, database oid, and text priv name. */Datumhas_database_privilege_id_id(PG_FUNCTION_ARGS){	int32		usesysid = PG_GETARG_INT32(0);	Oid			databaseoid = PG_GETARG_OID(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	AclMode		mode;	AclResult	aclresult;	mode = convert_database_priv_string(priv_type_text);	aclresult = pg_database_aclcheck(databaseoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* *		Support routines for has_database_privilege family. *//* * Given a database name expressed as a string, look it up and return Oid */static Oidconvert_database_name(text *databasename){	char	   *dbname;	Oid			oid;	dbname = DatumGetCString(DirectFunctionCall1(textout,										 PointerGetDatum(databasename)));	oid = get_database_oid(dbname);	if (!OidIsValid(oid))		ereport(ERROR,				(errcode(ERRCODE_UNDEFINED_DATABASE),				 errmsg("database \"%s\" does not exist", dbname)));	return oid;}/* * convert_database_priv_string *		Convert text string to AclMode value. */static AclModeconvert_database_priv_string(text *priv_type_text){	char	   *priv_type;	priv_type = DatumGetCString(DirectFunctionCall1(textout,									   PointerGetDatum(priv_type_text)));	/*	 * Return mode from priv_type string	 */	if (strcasecmp(priv_type, "CREATE") == 0)		return ACL_CREATE;	if (strcasecmp(priv_type, "CREATE WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_CREATE);	if (strcasecmp(priv_type, "TEMPORARY") == 0)		return ACL_CREATE_TEMP;	if (strcasecmp(priv_type, "TEMPORARY WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP);	if (strcasecmp(priv_type, "TEMP") == 0)		return ACL_CREATE_TEMP;	if (strcasecmp(priv_type, "TEMP WITH GRANT OPTION") == 0)		return ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP);	ereport(ERROR,			(errcode(ERRCODE_INVALID_PARAMETER_VALUE),			 errmsg("unrecognized privilege type: \"%s\"", priv_type)));	return ACL_NO_RIGHTS;		/* keep compiler quiet */}/* * has_function_privilege variants *		These are all named "has_function_privilege" at the SQL level. *		They take various combinations of function name, function OID, *		user name, user sysid, or implicit user = current_user. * *		The result is a boolean value: true if user has the indicated *		privilege, false if not. *//* * has_function_privilege_name_name *		Check user privileges on a function given *		name username, text functionname, and text priv name. */Datumhas_function_privilege_name_name(PG_FUNCTION_ARGS){	Name		username = PG_GETARG_NAME(0);	text	   *functionname = PG_GETARG_TEXT_P(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	int32		usesysid;	Oid			functionoid;	AclMode		mode;	AclResult	aclresult;	usesysid = get_usesysid(NameStr(*username));	functionoid = convert_function_name(functionname);	mode = convert_function_priv_string(priv_type_text);	aclresult = pg_proc_aclcheck(functionoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_name *		Check user privileges on a function given *		text functionname and text priv name. *		current_user is assumed */Datumhas_function_privilege_name(PG_FUNCTION_ARGS){	text	   *functionname = PG_GETARG_TEXT_P(0);	text	   *priv_type_text = PG_GETARG_TEXT_P(1);	AclId		usesysid;	Oid			functionoid;	AclMode		mode;	AclResult	aclresult;	usesysid = GetUserId();	functionoid = convert_function_name(functionname);	mode = convert_function_priv_string(priv_type_text);	aclresult = pg_proc_aclcheck(functionoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_name_id *		Check user privileges on a function given *		name usename, function oid, and text priv name. */Datumhas_function_privilege_name_id(PG_FUNCTION_ARGS){	Name		username = PG_GETARG_NAME(0);	Oid			functionoid = PG_GETARG_OID(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	int32		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = get_usesysid(NameStr(*username));	mode = convert_function_priv_string(priv_type_text);	aclresult = pg_proc_aclcheck(functionoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_id *		Check user privileges on a function given *		function oid, and text priv name. *		current_user is assumed */Datumhas_function_privilege_id(PG_FUNCTION_ARGS){	Oid			functionoid = PG_GETARG_OID(0);	text	   *priv_type_text = PG_GETARG_TEXT_P(1);	AclId		usesysid;	AclMode		mode;	AclResult	aclresult;	usesysid = GetUserId();	mode = convert_function_priv_string(priv_type_text);	aclresult = pg_proc_aclcheck(functionoid, usesysid, mode);	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_id_name *		Check user privileges on a function given *		usesysid, text functionname, and text priv name. */Datumhas_function_privilege_id_name(PG_FUNCTION_ARGS){	int32		usesysid = PG_GETARG_INT32(0);	text	   *functionname = PG_GETARG_TEXT_P(1);	text	   *priv_type_text = PG_GETARG_TEXT_P(2);	Oid			functionoid;	AclMode		mode;	AclResult	aclresult;	functionoid = convert_function_name(functionname);	mode = convert_function_priv_string(priv_type_text);	aclresult = pg_proc_aclcheck(functionoid, usesysid, mode);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?