aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/acl.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2010-08-05 14:45:09 +0000
committerRobert Haas <rhaas@postgresql.org>2010-08-05 14:45:09 +0000
commit2a6ef3445c73473edb222abf108b323fb7f002dc (patch)
treeca6a6f51dcf5193303f466c4072b243e3f979227 /src/backend/utils/adt/acl.c
parent641459f26954b04f74d098a758b716297b6554ea (diff)
downloadpostgresql-2a6ef3445c73473edb222abf108b323fb7f002dc.tar.gz
postgresql-2a6ef3445c73473edb222abf108b323fb7f002dc.zip
Standardize get_whatever_oid functions for object types with
unqualified names. - Add a missing_ok parameter to get_tablespace_oid. - Avoid duplicating get_tablespace_od guts in objectNamesToOids. - Add a missing_ok parameter to get_database_oid. - Replace get_roleid and get_role_checked with get_role_oid. - Add get_namespace_oid, get_language_oid, get_am_oid. - Refactor existing code to use new interfaces. Thanks to KaiGai Kohei for the review.
Diffstat (limited to 'src/backend/utils/adt/acl.c')
-rw-r--r--src/backend/utils/adt/acl.c121
1 files changed, 56 insertions, 65 deletions
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index 79ca6c13724..41b410e2a62 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.157 2010/02/26 02:01:05 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.158 2010/08/05 14:45:04 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -22,6 +22,7 @@
#include "catalog/pg_type.h"
#include "catalog/pg_class.h"
#include "commands/dbcommands.h"
+#include "commands/proclang.h"
#include "commands/tablespace.h"
#include "foreign/foreign.h"
#include "funcapi.h"
@@ -324,7 +325,7 @@ aclparse(const char *s, AclItem *aip)
if (name[0] == '\0')
aip->ai_grantee = ACL_ID_PUBLIC;
else
- aip->ai_grantee = get_roleid_checked(name);
+ aip->ai_grantee = get_role_oid(name, false);
/*
* XXX Allow a degree of backward compatibility by defaulting the grantor
@@ -337,7 +338,7 @@ aclparse(const char *s, AclItem *aip)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("a name must follow the \"/\" sign")));
- aip->ai_grantor = get_roleid_checked(name2);
+ aip->ai_grantor = get_role_oid(name2, false);
}
else
{
@@ -1790,7 +1791,7 @@ has_table_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_table_priv_string(priv_type_text);
@@ -1839,7 +1840,7 @@ has_table_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_table_priv_string(priv_type_text);
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
@@ -1997,7 +1998,7 @@ has_sequence_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*rolename), false);
mode = convert_sequence_priv_string(priv_type_text);
sequenceoid = convert_table_name(sequencename);
if (get_rel_relkind(sequenceoid) != RELKIND_SEQUENCE)
@@ -2057,7 +2058,7 @@ has_sequence_privilege_name_id(PG_FUNCTION_ARGS)
AclResult aclresult;
char relkind;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_sequence_priv_string(priv_type_text);
relkind = get_rel_relkind(sequenceoid);
if (relkind == '\0')
@@ -2208,7 +2209,7 @@ has_any_column_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_column_priv_string(priv_type_text);
@@ -2265,7 +2266,7 @@ has_any_column_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_column_priv_string(priv_type_text);
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
@@ -2450,7 +2451,7 @@ has_column_privilege_name_name_name(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
- roleid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
colattnum = convert_column_name(tableoid, column);
mode = convert_column_priv_string(priv_type_text);
@@ -2478,7 +2479,7 @@ has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
- roleid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_column_priv_string(priv_type_text);
@@ -2505,7 +2506,7 @@ has_column_privilege_name_id_name(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
colattnum = convert_column_name(tableoid, column);
mode = convert_column_priv_string(priv_type_text);
@@ -2531,7 +2532,7 @@ has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_column_priv_string(priv_type_text);
privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
@@ -2822,7 +2823,7 @@ has_database_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
databaseoid = convert_database_name(databasename);
mode = convert_database_priv_string(priv_type_text);
@@ -2871,7 +2872,7 @@ has_database_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_database_priv_string(priv_type_text);
if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
@@ -2966,15 +2967,8 @@ static Oid
convert_database_name(text *databasename)
{
char *dbname = text_to_cstring(databasename);
- Oid oid;
- oid = get_database_oid(dbname);
- if (!OidIsValid(oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_DATABASE),
- errmsg("database \"%s\" does not exist", dbname)));
-
- return oid;
+ return get_database_oid(dbname, false);
}
/*
@@ -3027,7 +3021,7 @@ has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
fdwid = convert_foreign_data_wrapper_name(fdwname);
mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
@@ -3076,7 +3070,7 @@ has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
@@ -3209,7 +3203,7 @@ has_function_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
functionoid = convert_function_name(functionname);
mode = convert_function_priv_string(priv_type_text);
@@ -3258,7 +3252,7 @@ has_function_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_function_priv_string(priv_type_text);
if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
@@ -3409,7 +3403,7 @@ has_language_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
languageoid = convert_language_name(languagename);
mode = convert_language_priv_string(priv_type_text);
@@ -3458,7 +3452,7 @@ has_language_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_language_priv_string(priv_type_text);
if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
@@ -3553,15 +3547,8 @@ static Oid
convert_language_name(text *languagename)
{
char *langname = text_to_cstring(languagename);
- Oid oid;
- oid = GetSysCacheOid1(LANGNAME, CStringGetDatum(langname));
- if (!OidIsValid(oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("language \"%s\" does not exist", langname)));
-
- return oid;
+ return get_language_oid(langname, false);
}
/*
@@ -3607,7 +3594,7 @@ has_schema_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
schemaoid = convert_schema_name(schemaname);
mode = convert_schema_priv_string(priv_type_text);
@@ -3656,7 +3643,7 @@ has_schema_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_schema_priv_string(priv_type_text);
if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
@@ -3751,15 +3738,8 @@ static Oid
convert_schema_name(text *schemaname)
{
char *nspname = text_to_cstring(schemaname);
- Oid oid;
-
- oid = GetSysCacheOid1(NAMESPACENAME, CStringGetDatum(nspname));
- if (!OidIsValid(oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_SCHEMA),
- errmsg("schema \"%s\" does not exist", nspname)));
- return oid;
+ return get_namespace_oid(nspname, false);
}
/*
@@ -3807,7 +3787,7 @@ has_server_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
serverid = convert_server_name(servername);
mode = convert_server_priv_string(priv_type_text);
@@ -3856,7 +3836,7 @@ has_server_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_server_priv_string(priv_type_text);
aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
@@ -3989,7 +3969,7 @@ has_tablespace_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
tablespaceoid = convert_tablespace_name(tablespacename);
mode = convert_tablespace_priv_string(priv_type_text);
@@ -4038,7 +4018,7 @@ has_tablespace_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_tablespace_priv_string(priv_type_text);
aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
@@ -4124,16 +4104,8 @@ static Oid
convert_tablespace_name(text *tablespacename)
{
char *spcname = text_to_cstring(tablespacename);
- Oid oid;
- oid = get_tablespace_oid(spcname);
-
- if (!OidIsValid(oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("tablespace \"%s\" does not exist", spcname)));
-
- return oid;
+ return get_tablespace_oid(spcname, false);
}
/*
@@ -4178,8 +4150,8 @@ pg_has_role_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
- roleoid = get_roleid_checked(NameStr(*rolename));
+ roleid = get_role_oid(NameStr(*username), false);
+ roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@@ -4204,7 +4176,7 @@ pg_has_role_name(PG_FUNCTION_ARGS)
AclResult aclresult;
roleid = GetUserId();
- roleoid = get_roleid_checked(NameStr(*rolename));
+ roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@@ -4227,7 +4199,7 @@ pg_has_role_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleid = get_roleid_checked(NameStr(*username));
+ roleid = get_role_oid(NameStr(*username), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@@ -4273,7 +4245,7 @@ pg_has_role_id_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
- roleoid = get_roleid_checked(NameStr(*rolename));
+ roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@@ -4830,3 +4802,22 @@ select_best_grantor(Oid roleId, AclMode privileges,
}
}
}
+
+/*
+ * get_role_oid - Given a role name, look up the role's OID.
+ *
+ * If missing_ok is false, throw an error if tablespace name not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_role_oid(const char *rolname, bool missing_ok)
+{
+ Oid oid;
+
+ oid = GetSysCacheOid1(AUTHNAME, CStringGetDatum(rolname));
+ if (!OidIsValid(oid) && !missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("role \"%s\" does not exist", rolname)));
+ return oid;
+}