📄 acl.c
字号:
* current_user is assumed */Datumhas_language_privilege_id(PG_FUNCTION_ARGS){ Oid languageoid = PG_GETARG_OID(0); text *priv_type_text = PG_GETARG_TEXT_P(1); Oid roleid; AclMode mode; AclResult aclresult; roleid = GetUserId(); mode = convert_language_priv_string(priv_type_text); aclresult = pg_language_aclcheck(languageoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_language_privilege_id_name * Check user privileges on a language given * roleid, text languagename, and text priv name. */Datumhas_language_privilege_id_name(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); text *languagename = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid languageoid; AclMode mode; AclResult aclresult; 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_id_id * Check user privileges on a language given * roleid, language oid, and text priv name. */Datumhas_language_privilege_id_id(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); Oid languageoid = PG_GETARG_OID(1); text *priv_type_text = PG_GETARG_TEXT_P(2); AclMode mode; AclResult aclresult; mode = convert_language_priv_string(priv_type_text); aclresult = pg_language_aclcheck(languageoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * Support routines for has_language_privilege family. *//* * Given a language name expressed as a string, look it up and return Oid */static Oidconvert_language_name(text *languagename){ char *langname; Oid oid; langname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(languagename))); oid = GetSysCacheOid(LANGNAME, CStringGetDatum(langname), 0, 0, 0); if (!OidIsValid(oid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("language \"%s\" does not exist", langname))); return oid;}/* * convert_language_priv_string * Convert text string to AclMode value. */static AclModeconvert_language_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, "USAGE") == 0) return ACL_USAGE; if (pg_strcasecmp(priv_type, "USAGE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_USAGE); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized privilege type: \"%s\"", priv_type))); return ACL_NO_RIGHTS; /* keep compiler quiet */}/* * has_schema_privilege variants * These are all named "has_schema_privilege" at the SQL level. * They take various combinations of schema name, schema 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_schema_privilege_name_name * Check user privileges on a schema given * name username, text schemaname, and text priv name. */Datumhas_schema_privilege_name_name(PG_FUNCTION_ARGS){ Name username = PG_GETARG_NAME(0); text *schemaname = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid roleid; Oid schemaoid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); schemaoid = convert_schema_name(schemaname); mode = convert_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_schema_privilege_name * Check user privileges on a schema given * text schemaname and text priv name. * current_user is assumed */Datumhas_schema_privilege_name(PG_FUNCTION_ARGS){ text *schemaname = PG_GETARG_TEXT_P(0); text *priv_type_text = PG_GETARG_TEXT_P(1); Oid roleid; Oid schemaoid; AclMode mode; AclResult aclresult; roleid = GetUserId(); schemaoid = convert_schema_name(schemaname); mode = convert_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_schema_privilege_name_id * Check user privileges on a schema given * name usename, schema oid, and text priv name. */Datumhas_schema_privilege_name_id(PG_FUNCTION_ARGS){ Name username = PG_GETARG_NAME(0); Oid schemaoid = 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_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_schema_privilege_id * Check user privileges on a schema given * schema oid, and text priv name. * current_user is assumed */Datumhas_schema_privilege_id(PG_FUNCTION_ARGS){ Oid schemaoid = PG_GETARG_OID(0); text *priv_type_text = PG_GETARG_TEXT_P(1); Oid roleid; AclMode mode; AclResult aclresult; roleid = GetUserId(); mode = convert_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_schema_privilege_id_name * Check user privileges on a schema given * roleid, text schemaname, and text priv name. */Datumhas_schema_privilege_id_name(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); text *schemaname = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid schemaoid; AclMode mode; AclResult aclresult; schemaoid = convert_schema_name(schemaname); mode = convert_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_schema_privilege_id_id * Check user privileges on a schema given * roleid, schema oid, and text priv name. */Datumhas_schema_privilege_id_id(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); Oid schemaoid = PG_GETARG_OID(1); text *priv_type_text = PG_GETARG_TEXT_P(2); AclMode mode; AclResult aclresult; mode = convert_schema_priv_string(priv_type_text); aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * Support routines for has_schema_privilege family. *//* * Given a schema name expressed as a string, look it up and return Oid */static Oidconvert_schema_name(text *schemaname){ char *nspname; Oid oid; nspname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(schemaname))); oid = GetSysCacheOid(NAMESPACENAME, CStringGetDatum(nspname), 0, 0, 0); if (!OidIsValid(oid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_SCHEMA), errmsg("schema \"%s\" does not exist", nspname))); return oid;}/* * convert_schema_priv_string * Convert text string to AclMode value. */static AclModeconvert_schema_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, "USAGE") == 0) return ACL_USAGE; if (pg_strcasecmp(priv_type, "USAGE WITH GRANT OPTION") == 0) return ACL_GRANT_OPTION_FOR(ACL_USAGE); ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized privilege type: \"%s\"", priv_type))); return ACL_NO_RIGHTS; /* keep compiler quiet */}/* * has_tablespace_privilege variants * These are all named "has_tablespace_privilege" at the SQL level. * They take various combinations of tablespace name, tablespace 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_tablespace_privilege_name_name * Check user privileges on a tablespace given * name username, text tablespacename, and text priv name. */Datumhas_tablespace_privilege_name_name(PG_FUNCTION_ARGS){ Name username = PG_GETARG_NAME(0); text *tablespacename = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid roleid; Oid tablespaceoid; AclMode mode; AclResult aclresult; roleid = get_roleid_checked(NameStr(*username)); tablespaceoid = convert_tablespace_name(tablespacename); mode = convert_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_tablespace_privilege_name * Check user privileges on a tablespace given * text tablespacename and text priv name. * current_user is assumed */Datumhas_tablespace_privilege_name(PG_FUNCTION_ARGS){ text *tablespacename = PG_GETARG_TEXT_P(0); text *priv_type_text = PG_GETARG_TEXT_P(1); Oid roleid; Oid tablespaceoid; AclMode mode; AclResult aclresult; roleid = GetUserId(); tablespaceoid = convert_tablespace_name(tablespacename); mode = convert_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_tablespace_privilege_name_id * Check user privileges on a tablespace given * name usename, tablespace oid, and text priv name. */Datumhas_tablespace_privilege_name_id(PG_FUNCTION_ARGS){ Name username = PG_GETARG_NAME(0); Oid tablespaceoid = 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_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_tablespace_privilege_id * Check user privileges on a tablespace given * tablespace oid, and text priv name. * current_user is assumed */Datumhas_tablespace_privilege_id(PG_FUNCTION_ARGS){ Oid tablespaceoid = PG_GETARG_OID(0); text *priv_type_text = PG_GETARG_TEXT_P(1); Oid roleid; AclMode mode; AclResult aclresult; roleid = GetUserId(); mode = convert_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_tablespace_privilege_id_name * Check user privileges on a tablespace given * roleid, text tablespacename, and text priv name. */Datumhas_tablespace_privilege_id_name(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); text *tablespacename = PG_GETARG_TEXT_P(1); text *priv_type_text = PG_GETARG_TEXT_P(2); Oid tablespaceoid; AclMode mode; AclResult aclresult; tablespaceoid = convert_tablespace_name(tablespacename); mode = convert_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * has_tablespace_privilege_id_id * Check user privileges on a tablespace given * roleid, tablespace oid, and text priv name. */Datumhas_tablespace_privilege_id_id(PG_FUNCTION_ARGS){ Oid roleid = PG_GETARG_OID(0); Oid tablespaceoid = PG_GETARG_OID(1); text *priv_type_text = PG_GETARG_TEXT_P(2); AclMode mode; AclResult aclresult; mode = convert_tablespace_priv_string(priv_type_text); aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode); PG_RETURN_BOOL(aclresult == ACLCHECK_OK);}/* * Support routines for has_tablespace_privilege family. *//* * Given a tablespace name expressed as a string, look it up and return Oid */static Oidconvert_tablespace_name(text *tablespacename){ char *spcname; Oid oid; spcname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(tablespacename))); oid = get_tablespace_oid(spcname); if (!OidIsValid(oid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("tablespace \"%s\" does not exist", spcname))); return oid;}/* * convert_tablespace_priv_string * Convert text string to AclMode value. */static AclModeconvert_tablespace_priv_string(text *priv_type_text){ char *priv_typ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -