acl.c
来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 2,543 行 · 第 1/5 页
C
2,543 行
{ char *priv_type; priv_type = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(priv_type_text))); /* * Return mode from priv_type string */ if (pg_strcasecmp(priv_type, "SELECT") == 0) return ACL_SELECT; if (pg_strcasecmp(priv_type, "SELECT WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_SELECT); if (pg_strcasecmp(priv_type, "INSERT") == 0) return ACL_INSERT; if (pg_strcasecmp(priv_type, "INSERT WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_INSERT); if (pg_strcasecmp(priv_type, "UPDATE") == 0) return ACL_UPDATE; if (pg_strcasecmp(priv_type, "UPDATE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_UPDATE); if (pg_strcasecmp(priv_type, "DELETE") == 0) return ACL_DELETE; if (pg_strcasecmp(priv_type, "DELETE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_DELETE); if (pg_strcasecmp(priv_type, "REFERENCES") == 0) return ACL_REFERENCES; if (pg_strcasecmp(priv_type, "REFERENCES WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_REFERENCES); if (pg_strcasecmp(priv_type, "TRIGGER") == 0) return ACL_TRIGGER; if (pg_strcasecmp(priv_type, "TRIGGER WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_TRIGGER); if (pg_strcasecmp(priv_type, "RULE") == 0) return 0; /* ignore old RULE privileges */ if (pg_strcasecmp(priv_type, "RULE WITH GRANT OPTION") == 0) return 0; 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 OID, 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); Oid roleid; Oid databaseoid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); databaseoid = convert_database_name(databasename); mode = convert_database_priv_string(priv_type_text); aclresult = pg_database_aclcheck(databaseoid, roleid, 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); Oid roleid; Oid databaseoid; AclMode mode; AclResult aclresult; roleid = GetUserId(); databaseoid = convert_database_name(databasename); mode = convert_database_priv_string(priv_type_text); aclresult = pg_database_aclcheck(databaseoid, roleid, 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); Oid roleid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); mode = convert_database_priv_string(priv_type_text); aclresult = pg_database_aclcheck(databaseoid, roleid, 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); Oid roleid; AclMode mode; AclResult aclresult; roleid = GetUserId(); mode = convert_database_priv_string(priv_type_text); aclresult = pg_database_aclcheck(databaseoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_id_name * Check user privileges on a database given * roleid, text databasename, and text priv name. */Datumhas_database_privilege_id_name(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(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, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_database_privilege_id_id * Check user privileges on a database given * roleid, database oid, and text priv name. */Datumhas_database_privilege_id_id(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(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, roleid, 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 (pg_strcasecmp(priv_type, "CREATE") == 0) return ACL_CREATE; if (pg_strcasecmp(priv_type, "CREATE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_CREATE); if (pg_strcasecmp(priv_type, "TEMPORARY") == 0) return ACL_CREATE_TEMP; if (pg_strcasecmp(priv_type, "TEMPORARY WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP); if (pg_strcasecmp(priv_type, "TEMP") == 0) return ACL_CREATE_TEMP; if (pg_strcasecmp(priv_type, "TEMP WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP); if (pg_strcasecmp(priv_type, "CONNECT") == 0) return ACL_CONNECT; if (pg_strcasecmp(priv_type, "CONNECT WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_CONNECT); 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 OID, 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); Oid roleid; Oid functionoid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); functionoid = convert_function_name(functionname); mode = convert_function_priv_string(priv_type_text); aclresult = pg_proc_aclcheck(functionoid, roleid, 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); Oid roleid; Oid functionoid; AclMode mode; AclResult aclresult; roleid = GetUserId(); functionoid = convert_function_name(functionname); mode = convert_function_priv_string(priv_type_text); aclresult = pg_proc_aclcheck(functionoid, roleid, 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); Oid roleid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); mode = convert_function_priv_string(priv_type_text); aclresult = pg_proc_aclcheck(functionoid, roleid, 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); Oid roleid; AclMode mode; AclResult aclresult; roleid = GetUserId(); mode = convert_function_priv_string(priv_type_text); aclresult = pg_proc_aclcheck(functionoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_id_name * Check user privileges on a function given * roleid, text functionname, and text priv name. */Datumhas_function_privilege_id_name(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(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, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_function_privilege_id_id * Check user privileges on a function given * roleid, function oid, and text priv name. */Datumhas_function_privilege_id_id(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); Oid functionoid = PG_GETARG_OID(1); text *priv_type_text = PG_GETARG_TEXT_P(2); AclMode mode; AclResult aclresult; mode = convert_function_priv_string(priv_type_text); aclresult = pg_proc_aclcheck(functionoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * Support routines for has_function_privilege family. *//* * Given a function name expressed as a string, look it up and return Oid */static Oidconvert_function_name(text *functionname){ char *funcname; Oid oid; funcname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(functionname))); oid = DatumGetObjectId(DirectFunctionCall1(regprocedurein, CStringGetDatum(funcname))); if (!OidIsValid(oid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("function \"%s\" does not exist", funcname))); return oid;}/* * convert_function_priv_string * Convert text string to AclMode value. */static AclModeconvert_function_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 (pg_strcasecmp(priv_type, "EXECUTE") == 0) return ACL_EXECUTE; if (pg_strcasecmp(priv_type, "EXECUTE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_EXECUTE); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized privilege type: \"%s\"", priv_type))); return ACL_NO_RIGHTS; /* keep compiler quiet */}/* * has_language_privilege variants * These are all named "has_language_privilege" at the SQL level. * They take various combinations of language name, language OID, * user name, user OID, or implicit user = current_user. * * The result is a boolean value: true if user has the indicated * privilege, false if not. *//* * has_language_privilege_name_name * Check user privileges on a language given * name username, text languagename, and text priv name. */Datumhas_language_privilege_name_name(PG_FUNCTION_ARGS){ Name username = PG_GETARG_NAME(0); text *languagename = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid roleid; Oid languageoid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); languageoid = convert_language_name(languagename); mode = convert_language_priv_string(priv_type_text); aclresult = pg_language_aclcheck(languageoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_language_privilege_name
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?