Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Forgot to include the new "auth.c" source file in the previous checkin. (CVS 828) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
7601916419489879fe963c83010b452c |
User & Date: | drh 2003-01-12 18:07:49.000 |
Context
2003-01-12
| ||
19:33 | The initial round of tests for the sqlite_set_authorizer() API. More are needed before release. Ticket #215. (CVS 829) (check-in: 5707b3d56e user: drh tags: trunk) | |
18:07 | Forgot to include the new "auth.c" source file in the previous checkin. (CVS 828) (check-in: 7601916419 user: drh tags: trunk) | |
18:02 | Initial check-in of the code for the new sqlite_set_authorizer() API function. The code is mostly untested at this point. (CVS 827) (check-in: 52d5007f64 user: drh tags: trunk) | |
Changes
Added src/auth.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | /* ** 2003 January 11 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains code used to implement the sqlite_set_authorizer() ** API. This facility is an optional feature of the library. Embedded ** systems that do not need this facility may omit it by recompiling ** the library with -DSQLITE_OMIT_AUTHORIZATION=1 ** ** $Id: auth.c,v 1.1 2003/01/12 18:07:49 drh Exp $ */ #include "sqliteInt.h" /* ** All of the code in this file may be omitted by defining a single ** macro. */ #ifndef SQLITE_OMIT_AUTHORIZATION /* ** Set or clear the access authorization function. ** ** The access authorization function is be called during the compilation ** phase to verify that the user has read and/or write access permission ** various fields of the database. The first argument to the auth function ** is a copy of the 3rd argument to this routine. The second argument ** to the auth function is one of these constants: ** ** SQLITE_READ_COLUMN ** SQLITE_WRITE_COLUMN ** SQLITE_DELETE_ROW ** SQLITE_INSERT_ROW ** ** The third and fourth arguments to the auth function are the name of ** the table and the column that are being accessed. The auth function ** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If ** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY ** means that the SQL statement will never-run - the sqlite_exec() call ** will return with an error. SQLITE_IGNORE means that the SQL statement ** should run but attempts to read the specified column will return NULL ** and attempts to write the column will be ignored. ** ** Setting the auth function to NULL disables this hook. The default ** setting of the auth function is NULL. */ int sqlite_set_authorizer( sqlite *db, int (*xAuth)(void*,int,const char*,const char*), void *pArg ){ db->xAuth = xAuth; db->pAuthArg = pArg; return SQLITE_OK; } /* ** Write an error message into pParse->zErrMsg that explains that the ** user-supplied authorization function returned an illegal value. */ static void sqliteAuthBadReturnCode(Parse *pParse, int rc){ char zBuf[20]; sprintf(zBuf, "(%d)", rc); sqliteSetString(&pParse->zErrMsg, "illegal return value ", zBuf, " from the authorization function - should to be SQLITE_OK, " "SQLITE_IGNORE, or SQLITE_DENY", 0); pParse->nErr++; } /* ** The pExpr should be a TK_COLUMN expression. The table referred to ** is in pTabList with an offset of base. Check to see if it is OK to read ** this particular column. ** ** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN ** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, ** then generate an error. */ void sqliteAuthRead( Parse *pParse, /* The parser context */ Expr *pExpr, /* The expression to check authorization on */ SrcList *pTabList, /* All table that pExpr might refer to */ int base /* Offset of pTabList relative to pExpr */ ){ sqlite *db = pParse->db; int rc; Table *pTab; const char *zCol; if( db->xAuth==0 ) return; assert( pExpr->op==TK_COLUMN ); assert( pExpr->iTable>=base && pExpr->iTable<base+pTabList->nSrc ); pTab = pTabList->a[pExpr->iTable-base].pTab; if( pTab==0 ) return; if( pExpr->iColumn>=0 ){ assert( pExpr->iColumn<pTab->nCol ); zCol = pTab->aCol[pExpr->iColumn].zName; }else if( pTab->iPKey>=0 ){ assert( pTab->iPKey<pTab->nCol ); zCol = pTab->aCol[pTab->iPKey].zName; }else{ zCol = "ROWID"; } rc = db->xAuth(db->pAuthArg, SQLITE_READ_COLUMN, pTab->zName, zCol); if( rc==SQLITE_IGNORE ){ pExpr->op = TK_NULL; }else if( rc==SQLITE_DENY ){ sqliteSetString(&pParse->zErrMsg,"access to ", pTab->zName, ".", zCol, " is prohibited", 0); pParse->nErr++; }else if( rc!=SQLITE_OK ){ sqliteAuthBadReturnCode(pParse, rc); } } /* ** Check the user-supplied authorization function to see if it is ok to ** delete rows from the table pTab. Return SQLITE_OK if it is. Return ** SQLITE_IGNORE if deletions should be silently omitted. Return SQLITE_DENY ** if an error is to be reported. In the last case, write the text of ** the error into pParse->zErrMsg. */ int sqliteAuthDelete(Parse *pParse, const char *zName, int forceError){ sqlite *db = pParse->db; int rc; if( db->xAuth==0 ){ return SQLITE_OK; } rc = db->xAuth(db->pAuthArg, SQLITE_DELETE_ROW, zName, ""); if( rc==SQLITE_DENY || (rc==SQLITE_IGNORE && forceError) ){ sqliteSetString(&pParse->zErrMsg,"deletion of rows from table ", zName, " is prohibited", 0); pParse->nErr++; }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ rc = SQLITE_DENY; sqliteAuthBadReturnCode(pParse, rc); } return rc; } /* ** Check the user-supplied authorization function to see if it is ok to ** insert rows from the table pTab. Return SQLITE_OK if it is. Return ** SQLITE_IGNORE if deletions should be silently omitted. Return SQLITE_DENY ** if an error is to be reported. In the last case, write the text of ** the error into pParse->zErrMsg. */ int sqliteAuthInsert(Parse *pParse, const char *zName, int forceError){ sqlite *db = pParse->db; int rc; if( db->xAuth==0 ){ return SQLITE_OK; } rc = db->xAuth(db->pAuthArg, SQLITE_INSERT_ROW, zName, ""); if( rc==SQLITE_DENY || (rc==SQLITE_IGNORE && forceError) ){ sqliteSetString(&pParse->zErrMsg,"insertion of rows from table ", zName, " is prohibited", 0); pParse->nErr++; }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ rc = SQLITE_DENY; sqliteAuthBadReturnCode(pParse, rc); } return rc; } /* ** Check to see if it is ok to modify column "j" of table pTab. ** Return SQLITE_OK, SQLITE_IGNORE, or SQLITE_DENY. */ int sqliteAuthWrite(Parse *pParse, Table *pTab, int j){ sqlite *db = pParse->db; int rc; if( db->xAuth==0 ) return SQLITE_OK; rc = db->xAuth(db->pAuthArg, SQLITE_WRITE_COLUMN, pTab->zName, pTab->aCol[j].zName); if( rc==SQLITE_DENY ){ sqliteSetString(&pParse->zErrMsg, "changes to ", pTab->zName, ".", pTab->aCol[j].zName, " are prohibited", 0); pParse->nErr++; }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ sqliteAuthBadReturnCode(pParse, rc); } return rc; } /* ** Check to see if it is ok to execute a special command such as ** COPY or VACUUM or ROLLBACK. */ int sqliteAuthCommand(Parse *pParse, const char *zCmd, const char *zArg1){ sqlite *db = pParse->db; int rc; if( db->xAuth==0 ) return SQLITE_OK; rc = db->xAuth(db->pAuthArg, SQLITE_COMMAND, zCmd, zArg1); if( rc==SQLITE_DENY ){ if( zArg1 && zArg1[0] ){ sqliteSetString(&pParse->zErrMsg, "execution of the ", zCmd, " ", zArg1, " command is prohibited", 0); }else{ sqliteSetString(&pParse->zErrMsg, "execution of the ", zCmd, " command is prohibited", 0); } pParse->nErr++; }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ sqliteAuthBadReturnCode(pParse, rc); } return rc; } #endif /* SQLITE_OMIT_AUTHORIZATION */ |