8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
* NOTES
14
14
* See acl.h.
@@ -223,7 +223,7 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt)
223
223
if (stmt -> is_grant
224
224
&& !pg_class_ownercheck (relOid , GetUserId ())
225
225
&& 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 );
227
227
228
228
/* Not sensible to grant on an index */
229
229
if (pg_class_tuple -> relkind == RELKIND_INDEX )
@@ -329,7 +329,8 @@ ExecuteGrantStmt_Database(GrantStmt *stmt)
329
329
if (stmt -> is_grant
330
330
&& pg_database_tuple -> datdba != GetUserId ()
331
331
&& 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 ));
333
334
334
335
/*
335
336
* If there's no ACL, create a default.
@@ -424,7 +425,7 @@ ExecuteGrantStmt_Function(GrantStmt *stmt)
424
425
if (stmt -> is_grant
425
426
&& !pg_proc_ownercheck (oid , GetUserId ())
426
427
&& 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 ,
428
429
NameStr (pg_proc_tuple -> proname ));
429
430
430
431
/*
@@ -525,7 +526,8 @@ ExecuteGrantStmt_Language(GrantStmt *stmt)
525
526
if (stmt -> is_grant
526
527
&& !superuser ()
527
528
&& 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 ));
529
531
530
532
/*
531
533
* If there's no ACL, create a default.
@@ -619,7 +621,8 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt)
619
621
if (stmt -> is_grant
620
622
&& !pg_namespace_ownercheck (HeapTupleGetOid (tuple ), GetUserId ())
621
623
&& 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 );
623
626
624
627
/*
625
628
* If there's no ACL, create a default using the
@@ -848,9 +851,59 @@ aclcheck(Acl *acl, AclId userid, AclMode mode)
848
851
849
852
/*
850
853
* 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.
851
857
*/
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
+
852
904
void
853
- aclcheck_error (AclResult aclerr , const char * objectname )
905
+ aclcheck_error (AclResult aclerr , AclObjectKind objectkind ,
906
+ const char * objectname )
854
907
{
855
908
switch (aclerr )
856
909
{
@@ -860,12 +913,12 @@ aclcheck_error(AclResult aclerr, const char *objectname)
860
913
case ACLCHECK_NO_PRIV :
861
914
ereport (ERROR ,
862
915
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
863
- errmsg ("permission denied for \"%s\"" , objectname )));
916
+ errmsg (no_priv_msg [ objectkind ] , objectname )));
864
917
break ;
865
918
case ACLCHECK_NOT_OWNER :
866
919
ereport (ERROR ,
867
920
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
868
- errmsg ("must be owner of \"%s\"" , objectname )));
921
+ errmsg (not_owner_msg [ objectkind ] , objectname )));
869
922
break ;
870
923
default :
871
924
elog (ERROR , "unrecognized AclResult: %d" , (int ) aclerr );
0 commit comments