summaryrefslogtreecommitdiff
path: root/src/backend/catalog
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2000-09-06 14:15:31 +0000
committerPeter Eisentraut <peter_e@gmx.net>2000-09-06 14:15:31 +0000
commit6dc249610a87aa8b9dcc8baf4e64d2e14d02f548 (patch)
tree6ca1b864625ecf91a2887c8031a9fa91b5f9c5c5 /src/backend/catalog
parentdaf1e3a7026e367d630be3ac34ac0a9e7cf1340f (diff)
downloadpostgresql-6dc249610a87aa8b9dcc8baf4e64d2e14d02f548.tar.gz
Code cleanup of user name and user id handling in the backend. The current
user is now defined in terms of the user id, the user name is only computed upon request (for display purposes). This is kind of the opposite of the previous state, which would maintain the user name and compute the user id for permission checks. Besides perhaps saving a few cycles (integer vs string), this now creates a single point of attack for changing the user id during a connection, for purposes of "setuid" functions, etc.
Diffstat (limited to 'src/backend/catalog')
-rw-r--r--src/backend/catalog/aclchk.c77
1 files changed, 39 insertions, 38 deletions
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index 6be489a0c7..b5c9cf51a1 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.39 2000/07/31 22:39:13 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.40 2000/09/06 14:15:15 petere Exp $
*
* NOTES
* See acl.h.
@@ -355,21 +355,22 @@ aclcheck(char *relname, Acl *acl, AclId id, AclIdType idtype, AclMode mode)
}
int32
-pg_aclcheck(char *relname, char *usename, AclMode mode)
+pg_aclcheck(char *relname, Oid userid, AclMode mode)
{
HeapTuple tuple;
- AclId id;
Acl *acl = (Acl *) NULL;
int32 result;
+ char *usename;
Relation relation;
- tuple = SearchSysCacheTuple(SHADOWNAME,
- PointerGetDatum(usename),
+ tuple = SearchSysCacheTuple(SHADOWSYSID,
+ ObjectIdGetDatum(userid),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
- elog(ERROR, "pg_aclcheck: user \"%s\" not found",
- usename);
- id = (AclId) ((Form_pg_shadow) GETSTRUCT(tuple))->usesysid;
+ elog(ERROR, "pg_aclcheck: invalid user id %u",
+ (unsigned) userid);
+
+ usename = NameStr(((Form_pg_shadow) GETSTRUCT(tuple))->usename);
/*
* Deny anyone permission to update a system catalog unless
@@ -445,28 +446,28 @@ pg_aclcheck(char *relname, char *usename, AclMode mode)
}
heap_close(relation, RowExclusiveLock);
#endif
- result = aclcheck(relname, acl, id, (AclIdType) ACL_IDTYPE_UID, mode);
+ result = aclcheck(relname, acl, userid, (AclIdType) ACL_IDTYPE_UID, mode);
if (acl)
pfree(acl);
return result;
}
int32
-pg_ownercheck(const char *usename,
+pg_ownercheck(Oid userid,
const char *value,
int cacheid)
{
HeapTuple tuple;
- AclId user_id,
- owner_id = 0;
+ AclId owner_id = 0;
+ char *usename;
- tuple = SearchSysCacheTuple(SHADOWNAME,
- PointerGetDatum(usename),
+ tuple = SearchSysCacheTuple(SHADOWSYSID,
+ ObjectIdGetDatum(userid),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
- elog(ERROR, "pg_ownercheck: user \"%s\" not found",
- usename);
- user_id = (AclId) ((Form_pg_shadow) GETSTRUCT(tuple))->usesysid;
+ elog(ERROR, "pg_ownercheck: invalid user id %u",
+ (unsigned) userid);
+ usename = NameStr(((Form_pg_shadow) GETSTRUCT(tuple))->usename);
/*
* Superusers bypass all permission-checking.
@@ -513,26 +514,26 @@ pg_ownercheck(const char *usename,
break;
}
- return user_id == owner_id;
+ return userid == owner_id;
}
int32
-pg_func_ownercheck(char *usename,
+pg_func_ownercheck(Oid userid,
char *funcname,
int nargs,
Oid *arglist)
{
HeapTuple tuple;
- AclId user_id,
- owner_id;
+ AclId owner_id;
+ char *username;
- tuple = SearchSysCacheTuple(SHADOWNAME,
- PointerGetDatum(usename),
+ tuple = SearchSysCacheTuple(SHADOWSYSID,
+ ObjectIdGetDatum(userid),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
- elog(ERROR, "pg_func_ownercheck: user \"%s\" not found",
- usename);
- user_id = (AclId) ((Form_pg_shadow) GETSTRUCT(tuple))->usesysid;
+ elog(ERROR, "pg_func_ownercheck: invalid user id %u",
+ (unsigned) userid);
+ username = NameStr(((Form_pg_shadow) GETSTRUCT(tuple))->usename);
/*
* Superusers bypass all permission-checking.
@@ -541,7 +542,7 @@ pg_func_ownercheck(char *usename,
{
#ifdef ACLDEBUG_TRACE
elog(DEBUG, "pg_ownercheck: user \"%s\" is superuser",
- usename);
+ username);
#endif
return 1;
}
@@ -556,25 +557,25 @@ pg_func_ownercheck(char *usename,
owner_id = ((Form_pg_proc) GETSTRUCT(tuple))->proowner;
- return user_id == owner_id;
+ return userid == owner_id;
}
int32
-pg_aggr_ownercheck(char *usename,
+pg_aggr_ownercheck(Oid userid,
char *aggname,
Oid basetypeID)
{
HeapTuple tuple;
- AclId user_id,
- owner_id;
+ AclId owner_id;
+ char *username;
- tuple = SearchSysCacheTuple(SHADOWNAME,
- PointerGetDatum(usename),
+ tuple = SearchSysCacheTuple(SHADOWSYSID,
+ PointerGetDatum(userid),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
- elog(ERROR, "pg_aggr_ownercheck: user \"%s\" not found",
- usename);
- user_id = (AclId) ((Form_pg_shadow) GETSTRUCT(tuple))->usesysid;
+ elog(ERROR, "pg_aggr_ownercheck: invalid user id %u",
+ (unsigned) userid);
+ username = NameStr(((Form_pg_shadow) GETSTRUCT(tuple))->usename);
/*
* Superusers bypass all permission-checking.
@@ -583,7 +584,7 @@ pg_aggr_ownercheck(char *usename,
{
#ifdef ACLDEBUG_TRACE
elog(DEBUG, "pg_aggr_ownercheck: user \"%s\" is superuser",
- usename);
+ username);
#endif
return 1;
}
@@ -598,5 +599,5 @@ pg_aggr_ownercheck(char *usename,
owner_id = ((Form_pg_aggregate) GETSTRUCT(tuple))->aggowner;
- return user_id == owner_id;
+ return userid == owner_id;
}