Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c4cf7fb

Browse files
committed
Adjust 'permission denied' messages to be more useful and consistent.
1 parent a063d4b commit c4cf7fb

38 files changed

+377
-243
lines changed

src/backend/catalog/aclchk.c

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.84 2003/07/21 01:59:07 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.85 2003/08/01 00:15:19 tgl Exp $
1212
*
1313
* NOTES
1414
* See acl.h.
@@ -223,7 +223,7 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt)
223223
if (stmt->is_grant
224224
&& !pg_class_ownercheck(relOid, GetUserId())
225225
&& pg_class_aclcheck(relOid, GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK)
226-
aclcheck_error(ACLCHECK_NO_PRIV, relvar->relname);
226+
aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_CLASS, relvar->relname);
227227

228228
/* Not sensible to grant on an index */
229229
if (pg_class_tuple->relkind == RELKIND_INDEX)
@@ -329,7 +329,8 @@ ExecuteGrantStmt_Database(GrantStmt *stmt)
329329
if (stmt->is_grant
330330
&& pg_database_tuple->datdba != GetUserId()
331331
&& pg_database_aclcheck(HeapTupleGetOid(tuple), GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK)
332-
aclcheck_error(ACLCHECK_NO_PRIV, NameStr(pg_database_tuple->datname));
332+
aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_DATABASE,
333+
NameStr(pg_database_tuple->datname));
333334

334335
/*
335336
* If there's no ACL, create a default.
@@ -424,7 +425,7 @@ ExecuteGrantStmt_Function(GrantStmt *stmt)
424425
if (stmt->is_grant
425426
&& !pg_proc_ownercheck(oid, GetUserId())
426427
&& pg_proc_aclcheck(oid, GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK)
427-
aclcheck_error(ACLCHECK_NO_PRIV,
428+
aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_PROC,
428429
NameStr(pg_proc_tuple->proname));
429430

430431
/*
@@ -525,7 +526,8 @@ ExecuteGrantStmt_Language(GrantStmt *stmt)
525526
if (stmt->is_grant
526527
&& !superuser()
527528
&& pg_language_aclcheck(HeapTupleGetOid(tuple), GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK)
528-
aclcheck_error(ACLCHECK_NO_PRIV, NameStr(pg_language_tuple->lanname));
529+
aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_LANGUAGE,
530+
NameStr(pg_language_tuple->lanname));
529531

530532
/*
531533
* If there's no ACL, create a default.
@@ -619,7 +621,8 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt)
619621
if (stmt->is_grant
620622
&& !pg_namespace_ownercheck(HeapTupleGetOid(tuple), GetUserId())
621623
&& pg_namespace_aclcheck(HeapTupleGetOid(tuple), GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK)
622-
aclcheck_error(ACLCHECK_NO_PRIV, nspname);
624+
aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_NAMESPACE,
625+
nspname);
623626

624627
/*
625628
* If there's no ACL, create a default using the
@@ -848,9 +851,59 @@ aclcheck(Acl *acl, AclId userid, AclMode mode)
848851

849852
/*
850853
* Standardized reporting of aclcheck permissions failures.
854+
*
855+
* Note: we do not double-quote the %s's below, because many callers
856+
* supply strings that might be already quoted.
851857
*/
858+
859+
static const char * const no_priv_msg[MAX_ACL_KIND] =
860+
{
861+
/* ACL_KIND_CLASS */
862+
gettext_noop("permission denied for relation %s"),
863+
/* ACL_KIND_DATABASE */
864+
gettext_noop("permission denied for database %s"),
865+
/* ACL_KIND_PROC */
866+
gettext_noop("permission denied for function %s"),
867+
/* ACL_KIND_OPER */
868+
gettext_noop("permission denied for operator %s"),
869+
/* ACL_KIND_TYPE */
870+
gettext_noop("permission denied for type %s"),
871+
/* ACL_KIND_LANGUAGE */
872+
gettext_noop("permission denied for language %s"),
873+
/* ACL_KIND_NAMESPACE */
874+
gettext_noop("permission denied for schema %s"),
875+
/* ACL_KIND_OPCLASS */
876+
gettext_noop("permission denied for operator class %s"),
877+
/* ACL_KIND_CONVERSION */
878+
gettext_noop("permission denied for conversion %s")
879+
};
880+
881+
static const char * const not_owner_msg[MAX_ACL_KIND] =
882+
{
883+
/* ACL_KIND_CLASS */
884+
gettext_noop("must be owner of relation %s"),
885+
/* ACL_KIND_DATABASE */
886+
gettext_noop("must be owner of database %s"),
887+
/* ACL_KIND_PROC */
888+
gettext_noop("must be owner of function %s"),
889+
/* ACL_KIND_OPER */
890+
gettext_noop("must be owner of operator %s"),
891+
/* ACL_KIND_TYPE */
892+
gettext_noop("must be owner of type %s"),
893+
/* ACL_KIND_LANGUAGE */
894+
gettext_noop("must be owner of language %s"),
895+
/* ACL_KIND_NAMESPACE */
896+
gettext_noop("must be owner of schema %s"),
897+
/* ACL_KIND_OPCLASS */
898+
gettext_noop("must be owner of operator class %s"),
899+
/* ACL_KIND_CONVERSION */
900+
gettext_noop("must be owner of conversion %s")
901+
};
902+
903+
852904
void
853-
aclcheck_error(AclResult aclerr, const char *objectname)
905+
aclcheck_error(AclResult aclerr, AclObjectKind objectkind,
906+
const char *objectname)
854907
{
855908
switch (aclerr)
856909
{
@@ -860,12 +913,12 @@ aclcheck_error(AclResult aclerr, const char *objectname)
860913
case ACLCHECK_NO_PRIV:
861914
ereport(ERROR,
862915
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
863-
errmsg("permission denied for \"%s\"", objectname)));
916+
errmsg(no_priv_msg[objectkind], objectname)));
864917
break;
865918
case ACLCHECK_NOT_OWNER:
866919
ereport(ERROR,
867920
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
868-
errmsg("must be owner of \"%s\"", objectname)));
921+
errmsg(not_owner_msg[objectkind], objectname)));
869922
break;
870923
default:
871924
elog(ERROR, "unrecognized AclResult: %d", (int) aclerr);

src/backend/catalog/namespace.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* Portions Copyright (c) 1994, Regents of the University of California
1414
*
1515
* IDENTIFICATION
16-
* $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.54 2003/07/21 01:59:09 tgl Exp $
16+
* $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.55 2003/08/01 00:15:19 tgl Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -1201,7 +1201,8 @@ LookupExplicitNamespace(const char *nspname)
12011201

12021202
aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE);
12031203
if (aclresult != ACLCHECK_OK)
1204-
aclcheck_error(aclresult, nspname);
1204+
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
1205+
nspname);
12051206

12061207
return namespaceId;
12071208
}
@@ -1624,7 +1625,7 @@ InitTempTableNamespace(void)
16241625
ACL_CREATE_TEMP) != ACLCHECK_OK)
16251626
ereport(ERROR,
16261627
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1627-
errmsg("not authorized to create temp tables in database \"%s\"",
1628+
errmsg("permission denied to create temp tables in database \"%s\"",
16281629
get_database_name(MyDatabaseId))));
16291630

16301631
snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId);

src/backend/catalog/pg_conversion.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.12 2003/07/28 00:09:14 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.13 2003/08/01 00:15:19 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -146,9 +146,8 @@ ConversionDrop(Oid conversionOid, DropBehavior behavior)
146146

147147
if (!superuser() &&
148148
((Form_pg_conversion) GETSTRUCT(tuple))->conowner != GetUserId())
149-
ereport(ERROR,
150-
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
151-
errmsg("permission denied")));
149+
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CONVERSION,
150+
NameStr(((Form_pg_conversion) GETSTRUCT(tuple))->conname));
152151

153152
ReleaseSysCache(tuple);
154153

src/backend/catalog/pg_operator.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.80 2003/07/21 01:59:11 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.81 2003/08/01 00:15:19 tgl Exp $
1212
*
1313
* NOTES
1414
* these routines moved here from commands/define.c and somewhat cleaned up.
@@ -732,7 +732,8 @@ get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId,
732732
aclresult = pg_namespace_aclcheck(otherNamespace, GetUserId(),
733733
ACL_CREATE);
734734
if (aclresult != ACLCHECK_OK)
735-
aclcheck_error(aclresult, get_namespace_name(otherNamespace));
735+
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
736+
get_namespace_name(otherNamespace));
736737

737738
other_oid = OperatorShellMake(otherName,
738739
otherNamespace,

src/backend/catalog/pg_proc.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.101 2003/07/21 01:59:11 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.102 2003/08/01 00:15:19 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -27,6 +27,7 @@
2727
#include "parser/parse_expr.h"
2828
#include "parser/parse_type.h"
2929
#include "tcop/tcopprot.h"
30+
#include "utils/acl.h"
3031
#include "utils/builtins.h"
3132
#include "utils/lsyscache.h"
3233
#include "utils/sets.h"
@@ -219,10 +220,8 @@ ProcedureCreate(const char *procedureName,
219220
errmsg("function \"%s\" already exists with same argument types",
220221
procedureName)));
221222
if (GetUserId() != oldproc->proowner && !superuser())
222-
ereport(ERROR,
223-
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
224-
errmsg("you do not have permission to replace function \"%s\"",
225-
procedureName)));
223+
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
224+
procedureName);
226225

227226
/*
228227
* Not okay to change the return type of the existing proc, since

src/backend/commands/aggregatecmds.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $Header: /cvsroot/pgsql/src/backend/commands/aggregatecmds.c,v 1.11 2003/07/20 21:56:32 tgl Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/commands/aggregatecmds.c,v 1.12 2003/08/01 00:15:19 tgl Exp $
1313
*
1414
* DESCRIPTION
1515
* The "DefineFoo" routines take the parse tree and pick out the
@@ -64,7 +64,8 @@ DefineAggregate(List *names, List *parameters)
6464
/* Check we have creation rights in target namespace */
6565
aclresult = pg_namespace_aclcheck(aggNamespace, GetUserId(), ACL_CREATE);
6666
if (aclresult != ACLCHECK_OK)
67-
aclcheck_error(aclresult, get_namespace_name(aggNamespace));
67+
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
68+
get_namespace_name(aggNamespace));
6869

6970
foreach(pl, parameters)
7071
{
@@ -191,7 +192,8 @@ RemoveAggregate(RemoveAggrStmt *stmt)
191192
if (!pg_proc_ownercheck(procOid, GetUserId()) &&
192193
!pg_namespace_ownercheck(((Form_pg_proc) GETSTRUCT(tup))->pronamespace,
193194
GetUserId()))
194-
aclcheck_error(ACLCHECK_NOT_OWNER, NameListToString(aggName));
195+
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
196+
NameListToString(aggName));
195197

196198
/* find_aggregate_func already checked it is an aggregate */
197199

@@ -269,12 +271,14 @@ RenameAggregate(List *name, TypeName *basetype, const char *newname)
269271

270272
/* must be owner */
271273
if (!pg_proc_ownercheck(procOid, GetUserId()))
272-
aclcheck_error(ACLCHECK_NOT_OWNER, NameListToString(name));
274+
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
275+
NameListToString(name));
273276

274277
/* must have CREATE privilege on namespace */
275278
aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
276279
if (aclresult != ACLCHECK_OK)
277-
aclcheck_error(aclresult, get_namespace_name(namespaceOid));
280+
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
281+
get_namespace_name(namespaceOid));
278282

279283
/* rename */
280284
namestrcpy(&(((Form_pg_proc) GETSTRUCT(tup))->proname), newname);

src/backend/commands/alter.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/alter.c,v 1.3 2003/07/22 19:00:07 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/alter.c,v 1.4 2003/08/01 00:15:19 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -102,7 +102,7 @@ ExecRenameStmt(RenameStmt *stmt)
102102
GetUserId(),
103103
ACL_CREATE);
104104
if (aclresult != ACLCHECK_OK)
105-
aclcheck_error(aclresult,
105+
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
106106
get_namespace_name(namespaceId));
107107

108108
renamerel(relid, stmt->newname);

src/backend/commands/cluster.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.111 2003/07/20 21:56:32 tgl Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.112 2003/08/01 00:15:19 tgl Exp $
1515
*
1616
*-------------------------------------------------------------------------
1717
*/
@@ -69,7 +69,6 @@ static void copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex);
6969
static List *get_indexattr_list(Relation OldHeap, Oid OldIndex);
7070
static void rebuild_indexes(Oid OIDOldHeap, List *indexes);
7171
static void swap_relfilenodes(Oid r1, Oid r2);
72-
static bool check_cluster_permitted(Oid relOid);
7372
static List *get_tables_to_cluster(MemoryContext cluster_context);
7473

7574

@@ -115,10 +114,9 @@ cluster(ClusterStmt *stmt)
115114
tableOid = RelationGetRelid(rel);
116115

117116
/* Check permissions */
118-
if (!check_cluster_permitted(tableOid))
119-
ereport(ERROR,
120-
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
121-
errmsg("permission denied")));
117+
if (!pg_class_ownercheck(tableOid, GetUserId()))
118+
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
119+
RelationGetRelationName(rel));
122120

123121
if (stmt->indexname == NULL)
124122
{
@@ -279,7 +277,7 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
279277
return;
280278

281279
/* Check that the user still owns the relation */
282-
if (!check_cluster_permitted(rvtc->tableOid))
280+
if (!pg_class_ownercheck(rvtc->tableOid, GetUserId()))
283281
return;
284282

285283
/*
@@ -850,17 +848,6 @@ swap_relfilenodes(Oid r1, Oid r2)
850848
heap_close(relRelation, RowExclusiveLock);
851849
}
852850

853-
/*
854-
* Checks if the user is allowed to cluster (ie, owns) the relation.
855-
* Superusers are allowed to cluster any table.
856-
*/
857-
static bool
858-
check_cluster_permitted(Oid relOid)
859-
{
860-
/* Superusers bypass this check */
861-
return pg_class_ownercheck(relOid, GetUserId());
862-
}
863-
864851
/*
865852
* Get a list of tables that the current user owns and
866853
* have indisclustered set. Return the list in a List * of rvsToCluster
@@ -894,7 +881,8 @@ get_tables_to_cluster(MemoryContext cluster_context)
894881
while ((indexTuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
895882
{
896883
index = (Form_pg_index) GETSTRUCT(indexTuple);
897-
if (!check_cluster_permitted(index->indrelid))
884+
885+
if (!pg_class_ownercheck(index->indrelid, GetUserId()))
898886
continue;
899887

900888
/*

0 commit comments

Comments
 (0)