source: trunk/src/3rdparty/sqlite/auth.c@ 205

Last change on this file since 205 was 205, checked in by rudi, 14 years ago

Added SQLite 2.8.17 sources. This allows to build at least one of the sql drivers / plugins.

File size: 6.9 KB
Line 
1/*
2** 2003 January 11
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains code used to implement the sqlite_set_authorizer()
13** API. This facility is an optional feature of the library. Embedded
14** systems that do not need this facility may omit it by recompiling
15** the library with -DSQLITE_OMIT_AUTHORIZATION=1
16**
17** $Id: auth.c,v 1.12.2.2 2004/09/09 13:54:30 drh Exp $
18*/
19#include "sqliteInt.h"
20
21/*
22** All of the code in this file may be omitted by defining a single
23** macro.
24*/
25#ifndef SQLITE_OMIT_AUTHORIZATION
26
27/*
28** Set or clear the access authorization function.
29**
30** The access authorization function is be called during the compilation
31** phase to verify that the user has read and/or write access permission on
32** various fields of the database. The first argument to the auth function
33** is a copy of the 3rd argument to this routine. The second argument
34** to the auth function is one of these constants:
35**
36** SQLITE_COPY
37** SQLITE_CREATE_INDEX
38** SQLITE_CREATE_TABLE
39** SQLITE_CREATE_TEMP_INDEX
40** SQLITE_CREATE_TEMP_TABLE
41** SQLITE_CREATE_TEMP_TRIGGER
42** SQLITE_CREATE_TEMP_VIEW
43** SQLITE_CREATE_TRIGGER
44** SQLITE_CREATE_VIEW
45** SQLITE_DELETE
46** SQLITE_DROP_INDEX
47** SQLITE_DROP_TABLE
48** SQLITE_DROP_TEMP_INDEX
49** SQLITE_DROP_TEMP_TABLE
50** SQLITE_DROP_TEMP_TRIGGER
51** SQLITE_DROP_TEMP_VIEW
52** SQLITE_DROP_TRIGGER
53** SQLITE_DROP_VIEW
54** SQLITE_INSERT
55** SQLITE_PRAGMA
56** SQLITE_READ
57** SQLITE_SELECT
58** SQLITE_TRANSACTION
59** SQLITE_UPDATE
60**
61** The third and fourth arguments to the auth function are the name of
62** the table and the column that are being accessed. The auth function
63** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If
64** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY
65** means that the SQL statement will never-run - the sqlite_exec() call
66** will return with an error. SQLITE_IGNORE means that the SQL statement
67** should run but attempts to read the specified column will return NULL
68** and attempts to write the column will be ignored.
69**
70** Setting the auth function to NULL disables this hook. The default
71** setting of the auth function is NULL.
72*/
73int sqlite_set_authorizer(
74 sqlite *db,
75 int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
76 void *pArg
77){
78 db->xAuth = xAuth;
79 db->pAuthArg = pArg;
80 return SQLITE_OK;
81}
82
83/*
84** Write an error message into pParse->zErrMsg that explains that the
85** user-supplied authorization function returned an illegal value.
86*/
87static void sqliteAuthBadReturnCode(Parse *pParse, int rc){
88 sqliteErrorMsg(pParse, "illegal return value (%d) from the "
89 "authorization function - should be SQLITE_OK, SQLITE_IGNORE, "
90 "or SQLITE_DENY", rc);
91 pParse->rc = SQLITE_MISUSE;
92}
93
94/*
95** The pExpr should be a TK_COLUMN expression. The table referred to
96** is in pTabList or else it is the NEW or OLD table of a trigger.
97** Check to see if it is OK to read this particular column.
98**
99** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN
100** instruction into a TK_NULL. If the auth function returns SQLITE_DENY,
101** then generate an error.
102*/
103void sqliteAuthRead(
104 Parse *pParse, /* The parser context */
105 Expr *pExpr, /* The expression to check authorization on */
106 SrcList *pTabList /* All table that pExpr might refer to */
107){
108 sqlite *db = pParse->db;
109 int rc;
110 Table *pTab; /* The table being read */
111 const char *zCol; /* Name of the column of the table */
112 int iSrc; /* Index in pTabList->a[] of table being read */
113 const char *zDBase; /* Name of database being accessed */
114 TriggerStack *pStack; /* The stack of current triggers */
115
116 if( db->xAuth==0 ) return;
117 assert( pExpr->op==TK_COLUMN );
118 for(iSrc=0; iSrc<pTabList->nSrc; iSrc++){
119 if( pExpr->iTable==pTabList->a[iSrc].iCursor ) break;
120 }
121 if( iSrc>=0 && iSrc<pTabList->nSrc ){
122 pTab = pTabList->a[iSrc].pTab;
123 }else if( (pStack = pParse->trigStack)!=0 ){
124 /* This must be an attempt to read the NEW or OLD pseudo-tables
125 ** of a trigger.
126 */
127 assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx );
128 pTab = pStack->pTab;
129 }else{
130 return;
131 }
132 if( pTab==0 ) return;
133 if( pExpr->iColumn>=0 ){
134 assert( pExpr->iColumn<pTab->nCol );
135 zCol = pTab->aCol[pExpr->iColumn].zName;
136 }else if( pTab->iPKey>=0 ){
137 assert( pTab->iPKey<pTab->nCol );
138 zCol = pTab->aCol[pTab->iPKey].zName;
139 }else{
140 zCol = "ROWID";
141 }
142 assert( pExpr->iDb<db->nDb );
143 zDBase = db->aDb[pExpr->iDb].zName;
144 rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol, zDBase,
145 pParse->zAuthContext);
146 if( rc==SQLITE_IGNORE ){
147 pExpr->op = TK_NULL;
148 }else if( rc==SQLITE_DENY ){
149 if( db->nDb>2 || pExpr->iDb!=0 ){
150 sqliteErrorMsg(pParse, "access to %s.%s.%s is prohibited",
151 zDBase, pTab->zName, zCol);
152 }else{
153 sqliteErrorMsg(pParse, "access to %s.%s is prohibited", pTab->zName,zCol);
154 }
155 pParse->rc = SQLITE_AUTH;
156 }else if( rc!=SQLITE_OK ){
157 sqliteAuthBadReturnCode(pParse, rc);
158 }
159}
160
161/*
162** Do an authorization check using the code and arguments given. Return
163** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY
164** is returned, then the error count and error message in pParse are
165** modified appropriately.
166*/
167int sqliteAuthCheck(
168 Parse *pParse,
169 int code,
170 const char *zArg1,
171 const char *zArg2,
172 const char *zArg3
173){
174 sqlite *db = pParse->db;
175 int rc;
176
177 if( db->init.busy || db->xAuth==0 ){
178 return SQLITE_OK;
179 }
180 rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext);
181 if( rc==SQLITE_DENY ){
182 sqliteErrorMsg(pParse, "not authorized");
183 pParse->rc = SQLITE_AUTH;
184 }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){
185 rc = SQLITE_DENY;
186 sqliteAuthBadReturnCode(pParse, rc);
187 }
188 return rc;
189}
190
191/*
192** Push an authorization context. After this routine is called, the
193** zArg3 argument to authorization callbacks will be zContext until
194** popped. Or if pParse==0, this routine is a no-op.
195*/
196void sqliteAuthContextPush(
197 Parse *pParse,
198 AuthContext *pContext,
199 const char *zContext
200){
201 pContext->pParse = pParse;
202 if( pParse ){
203 pContext->zAuthContext = pParse->zAuthContext;
204 pParse->zAuthContext = zContext;
205 }
206}
207
208/*
209** Pop an authorization context that was previously pushed
210** by sqliteAuthContextPush
211*/
212void sqliteAuthContextPop(AuthContext *pContext){
213 if( pContext->pParse ){
214 pContext->pParse->zAuthContext = pContext->zAuthContext;
215 pContext->pParse = 0;
216 }
217}
218
219#endif /* SQLITE_OMIT_AUTHORIZATION */
Note: See TracBrowser for help on using the repository browser.