diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/acl.c | 2 | ||||
-rw-r--r-- | src/backend/utils/adt/name.c | 4 | ||||
-rw-r--r-- | src/backend/utils/adt/regproc.c | 104 | ||||
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 2 | ||||
-rw-r--r-- | src/backend/utils/cache/catcache.c | 1 | ||||
-rw-r--r-- | src/backend/utils/init/miscinit.c | 24 |
6 files changed, 125 insertions, 12 deletions
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 7701fc5ac07..e7aecc95c97 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -4878,7 +4878,7 @@ check_is_member_of_role(Oid member, Oid role) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be member of role \"%s\"", - GetUserNameFromId(role)))); + GetUserNameFromId(role, false)))); } /* diff --git a/src/backend/utils/adt/name.c b/src/backend/utils/adt/name.c index b6c6e393358..58261275614 100644 --- a/src/backend/utils/adt/name.c +++ b/src/backend/utils/adt/name.c @@ -263,13 +263,13 @@ namestrcmp(Name name, const char *str) Datum current_user(PG_FUNCTION_ARGS) { - PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId())))); + PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId(), false)))); } Datum session_user(PG_FUNCTION_ARGS) { - PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId())))); + PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId(), false)))); } diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index 11d663b295d..8b5672875c2 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -40,6 +40,7 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/tqual.h" +#include "utils/acl.h" static char *format_operator_internal(Oid operator_oid, bool force_qualify); static char *format_procedure_internal(Oid procedure_oid, bool force_qualify); @@ -1553,6 +1554,109 @@ regdictionarysend(PG_FUNCTION_ARGS) return oidsend(fcinfo); } +/* + * regrolein - converts "rolename" to role OID + * + * We also accept a numeric OID, for symmetry with the output routine. + * + * '-' signifies unknown (OID 0). In all other cases, the input must + * match an existing pg_authid entry. + * + * This function is not needed in bootstrap mode, so we don't worry about + * making it work then. + */ +Datum +regrolein(PG_FUNCTION_ARGS) +{ + char *role_name_or_oid = PG_GETARG_CSTRING(0); + Oid result; + + /* '-' ? */ + if (strcmp(role_name_or_oid, "-") == 0) + PG_RETURN_OID(InvalidOid); + + /* Numeric OID? */ + if (role_name_or_oid[0] >= '0' && + role_name_or_oid[0] <= '9' && + strspn(role_name_or_oid, "0123456789") == strlen(role_name_or_oid)) + { + result = DatumGetObjectId(DirectFunctionCall1(oidin, + CStringGetDatum(role_name_or_oid))); + PG_RETURN_OID(result); + } + + /* Normal case: see if the name matches any pg_authid entry. */ + result = get_role_oid(role_name_or_oid, false); + + PG_RETURN_OID(result); +} + +/* + * to_regrole - converts "rolename" to role OID + * + * If the name is not found, we return NULL. + */ +Datum +to_regrole(PG_FUNCTION_ARGS) +{ + char *role_name = PG_GETARG_CSTRING(0); + Oid result; + + result = get_role_oid(role_name, true); + + if (OidIsValid(result)) + PG_RETURN_OID(result); + else + PG_RETURN_NULL(); +} + +/* + * regroleout - converts role OID to "role_name" + */ +Datum +regroleout(PG_FUNCTION_ARGS) +{ + Oid roleoid = PG_GETARG_OID(0); + char *result; + + + if (roleoid == InvalidOid) + { + result = pstrdup("-"); + PG_RETURN_CSTRING(result); + } + + result = GetUserNameFromId(roleoid, true); + if (!result) + { + /* If OID doesn't match any role, return it numerically */ + result = (char *) palloc(NAMEDATALEN); + snprintf(result, NAMEDATALEN, "%u", roleoid); + } + PG_RETURN_CSTRING(result); +} + +/* + * regrolerecv - converts external binary format to regrole + */ +Datum +regrolerecv(PG_FUNCTION_ARGS) +{ + /* Exactly the same as oidrecv, so share code */ + return oidrecv(fcinfo); +} + +/* + * regrolesend - converts regrole to binary format + */ +Datum +regrolesend(PG_FUNCTION_ARGS) +{ + /* Exactly the same as oidsend, so share code */ + return oidsend(fcinfo); +} + + /* * text_regclass: convert text to regclass diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 4dd3f9fbce1..a28868c3130 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3619,6 +3619,7 @@ convert_to_scalar(Datum value, Oid valuetypid, double *scaledvalue, case REGTYPEOID: case REGCONFIGOID: case REGDICTIONARYOID: + case REGROLEOID: *scaledvalue = convert_numeric_to_scalar(value, valuetypid); *scaledlobound = convert_numeric_to_scalar(lobound, boundstypid); *scaledhibound = convert_numeric_to_scalar(hibound, boundstypid); @@ -3724,6 +3725,7 @@ convert_numeric_to_scalar(Datum value, Oid typid) case REGTYPEOID: case REGCONFIGOID: case REGDICTIONARYOID: + case REGROLEOID: /* we can treat OIDs as integers... */ return (double) DatumGetObjectId(value); } diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 1af43c6de67..9b7cc5eb764 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -150,6 +150,7 @@ GetCCHashEqFuncs(Oid keytype, PGFunction *hashfunc, RegProcedure *eqfunc) case REGTYPEOID: case REGCONFIGOID: case REGDICTIONARYOID: + case REGROLEOID: *hashfunc = hashoid; *eqfunc = F_OIDEQ; diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 1dc31535fd6..b0d85af14db 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -648,23 +648,29 @@ SetCurrentRoleId(Oid roleid, bool is_superuser) /* - * Get user name from user oid + * Get user name from user oid, returns NULL for nonexistent roleid if noerr + * is true. */ char * -GetUserNameFromId(Oid roleid) +GetUserNameFromId(Oid roleid, bool noerr) { HeapTuple tuple; char *result; tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid)); if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("invalid role OID: %u", roleid))); - - result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname)); - - ReleaseSysCache(tuple); + { + if (!noerr) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("invalid role OID: %u", roleid))); + result = NULL; + } + else + { + result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname)); + ReleaseSysCache(tuple); + } return result; } |