1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-18 02:02:55 +03:00

Add SET SESSION AUTHORIZATION command.

This commit is contained in:
Peter Eisentraut
2001-05-08 21:06:43 +00:00
parent c50aa9db70
commit 1c1c58c76c
10 changed files with 179 additions and 16 deletions

View File

@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.47 2001/03/29 19:03:57 petere Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.48 2001/05/08 21:06:42 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -721,6 +721,8 @@ SetPGVariable(const char *name, const char *value)
parse_server_encoding(mvalue);
else if (strcasecmp(name, "seed") == 0)
parse_random_seed(mvalue);
else if (strcasecmp(name, "session_authorization") == 0)
SetSessionAuthorization(value);
else
SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET);

View File

@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.223 2001/05/07 00:43:23 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.224 2001/05/08 21:06:42 petere Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -259,7 +259,7 @@ static void doNegateFloat(Value *v);
%type <ival> Iconst
%type <str> Sconst, comment_text
%type <str> UserId, opt_boolean, var_value, zone_value
%type <str> UserId, opt_boolean, var_value, zone_value, Ident_or_Sconst
%type <str> ColId, ColLabel, TokenId
%type <node> TableConstraint
@@ -292,7 +292,7 @@ static void doNegateFloat(Value *v);
*/
/* Keywords (in SQL92 reserved words) */
%token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC, AT,
%token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC, AT, AUTHORIZATION,
BEGIN_TRANS, BETWEEN, BOTH, BY,
CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
COALESCE, COLLATE, COLUMN, COMMIT,
@@ -761,6 +761,13 @@ VariableSetStmt: SET ColId TO var_value
n->value = $3;
$$ = (Node *) n;
}
| SET SESSION AUTHORIZATION Ident_or_Sconst
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = "session_authorization";
n->value = $4;
$$ = (Node *) n;
}
;
opt_level: READ COMMITTED { $$ = "committed"; }
@@ -837,6 +844,10 @@ opt_encoding: Sconst { $$ = $1; }
| /*EMPTY*/ { $$ = NULL; }
;
Ident_or_Sconst: IDENT { $$ = $1; }
| SCONST { $$ = $1; }
VariableShowStmt: SHOW ColId
{
VariableShowStmt *n = makeNode(VariableShowStmt);
@@ -5459,6 +5470,7 @@ TokenId: ABSOLUTE { $$ = "absolute"; }
| AGGREGATE { $$ = "aggregate"; }
| ALTER { $$ = "alter"; }
| AT { $$ = "at"; }
| AUTHORIZATION { $$ = "authorization"; }
| BACKWARD { $$ = "backward"; }
| BEFORE { $$ = "before"; }
| BEGIN_TRANS { $$ = "begin"; }

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.91 2001/05/07 00:43:23 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.92 2001/05/08 21:06:43 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -44,6 +44,7 @@ static ScanKeyword ScanKeywords[] = {
{"as", AS},
{"asc", ASC},
{"at", AT},
{"authorization", AUTHORIZATION},
{"backward", BACKWARD},
{"before", BEFORE},
{"begin", BEGIN_TRANS},

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.65 2001/04/16 02:42:01 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.66 2001/05/08 21:06:43 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -354,6 +354,7 @@ convertstr(unsigned char *buff, int len, int dest)
static Oid CurrentUserId = InvalidOid;
static Oid SessionUserId = InvalidOid;
static bool AuthenticatedUserIsSuperuser = false;
/*
* This function is relevant for all privilege checks.
@@ -397,7 +398,7 @@ SetSessionUserId(Oid newid)
void
SetSessionUserIdFromUserName(const char *username)
InitializeSessionUserId(const char *username)
{
HeapTuple userTup;
@@ -407,6 +408,9 @@ SetSessionUserIdFromUserName(const char *username)
*/
AssertState(!IsBootstrapProcessingMode());
/* call only once */
AssertState(!OidIsValid(SessionUserId));
userTup = SearchSysCache(SHADOWNAME,
PointerGetDatum(username),
0, 0, 0);
@@ -415,6 +419,29 @@ SetSessionUserIdFromUserName(const char *username)
SetSessionUserId(((Form_pg_shadow) GETSTRUCT(userTup))->usesysid);
AuthenticatedUserIsSuperuser = ((Form_pg_shadow) GETSTRUCT(userTup))->usesuper;
ReleaseSysCache(userTup);
}
void SetSessionAuthorization(const char * username)
{
HeapTuple userTup;
if (!AuthenticatedUserIsSuperuser)
elog(ERROR, "permission denied");
userTup = SearchSysCache(SHADOWNAME,
PointerGetDatum(username),
0, 0, 0);
if (!HeapTupleIsValid(userTup))
elog(ERROR, "user \"%s\" does not exist", username);
SetSessionUserId(((Form_pg_shadow) GETSTRUCT(userTup))->usesysid);
SetUserId(((Form_pg_shadow) GETSTRUCT(userTup))->usesysid);
ReleaseSysCache(userTup);
}

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.84 2001/04/21 18:29:29 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.85 2001/05/08 21:06:43 petere Exp $
*
*
*-------------------------------------------------------------------------
@@ -341,7 +341,7 @@ InitPostgres(const char *dbname, const char *username)
if (bootstrap)
SetSessionUserId(geteuid());
else
SetSessionUserIdFromUserName(username);
InitializeSessionUserId(username);
/*
* Unless we are bootstrapping, double-check that InitMyDatabaseInfo()