diff options
author | drh <drh@noemail.net> | 2003-01-13 23:27:31 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2003-01-13 23:27:31 +0000 |
commit | e5f9c6442f4277bc6bc29987cbc3df5c1ff55514 (patch) | |
tree | ebee71ac3e0d646809368ac165f753b560981ee9 /src/trigger.c | |
parent | 1962bda76414921a526663e16d11602ce46dc212 (diff) | |
download | sqlite-e5f9c6442f4277bc6bc29987cbc3df5c1ff55514.tar.gz sqlite-e5f9c6442f4277bc6bc29987cbc3df5c1ff55514.zip |
Revise the sqlite_set_authorizer API to provide more detailed information
about the SQL statement being authorized. Only partially tested so far. (CVS 830)
FossilOrigin-Name: 45de93f913a18026a45de6254963dbcd1b0f1a19
Diffstat (limited to 'src/trigger.c')
-rw-r--r-- | src/trigger.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/src/trigger.c b/src/trigger.c index 079a4c2f8..ce00c2b05 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -49,8 +49,7 @@ void sqliteCreateTrigger( ){ Trigger *nt; Table *tab; - - if( sqliteAuthCommand(pParse, "CREATE", "TRIGGER") ) goto trigger_cleanup; + char *zName = 0; /* Name of the trigger */ /* Check that: ** 1. the trigger name does not already exist. @@ -59,16 +58,12 @@ void sqliteCreateTrigger( ** 4. That we are not trying to create an INSTEAD OF trigger on a table. ** 5. That we are not trying to create a BEFORE or AFTER trigger on a view. */ - { - char *tmp_str = sqliteStrNDup(pName->z, pName->n); - if( sqliteHashFind(&(pParse->db->trigHash), tmp_str, pName->n + 1) ){ - sqliteSetNString(&pParse->zErrMsg, "trigger ", -1, - pName->z, pName->n, " already exists", -1, 0); - sqliteFree(tmp_str); - pParse->nErr++; - goto trigger_cleanup; - } - sqliteFree(tmp_str); + zName = sqliteStrNDup(pName->z, pName->n); + if( sqliteHashFind(&(pParse->db->trigHash), zName, pName->n + 1) ){ + sqliteSetNString(&pParse->zErrMsg, "trigger ", -1, + pName->z, pName->n, " already exists", -1, 0); + pParse->nErr++; + goto trigger_cleanup; } { char *tmp_str = sqliteStrNDup(pTableName->z, pTableName->n); @@ -104,9 +99,15 @@ void sqliteCreateTrigger( " trigger on table: ", -1, pTableName->z, pTableName->n, 0); goto trigger_cleanup; } - if( sqliteAuthInsert(pParse, SCHEMA_TABLE(tab->isTemp), 1) ){ - goto trigger_cleanup; +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_CREATE_TRIGGER; + if( tab->isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; + if( sqliteAuthCheck(pParse, code, zName, tab->zName) ){ + goto trigger_cleanup; + } } +#endif } if (tr_tm == TK_INSTEAD){ @@ -116,7 +117,8 @@ void sqliteCreateTrigger( /* Build the Trigger object */ nt = (Trigger*)sqliteMalloc(sizeof(Trigger)); if( nt==0 ) goto trigger_cleanup; - nt->name = sqliteStrNDup(pName->z, pName->n); + nt->name = zName; + zName = 0; nt->table = sqliteStrNDup(pTableName->z, pTableName->n); if( sqlite_malloc_failed ) goto trigger_cleanup; nt->op = op; @@ -179,6 +181,7 @@ void sqliteCreateTrigger( trigger_cleanup: + sqliteFree(zName); sqliteIdListDelete(pColumns); sqliteExprDelete(pWhen); sqliteDeleteTriggerStep(pStepList); @@ -342,7 +345,6 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){ Table *pTable; Vdbe *v; - if( sqliteAuthCommand(pParse, "DROP", "TRIGGER") ) return; zName = sqliteStrNDup(pName->z, pName->n); /* ensure that the trigger being dropped exists */ @@ -355,11 +357,17 @@ void sqliteDropTrigger(Parse *pParse, Token *pName, int nested){ } pTable = sqliteFindTable(pParse->db, pTrigger->table); assert(pTable); - if( sqliteAuthDelete(pParse, SCHEMA_TABLE(pTable->isTemp), 1) ){ - sqliteFree(zName); - return; +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_TRIGGER; + if( pTable->isTemp ) code = SQLITE_DROP_TEMP_TRIGGER; + if( sqliteAuthCheck(pParse, code, pTrigger->name, pTable->zName) || + sqliteAuthCheck(pParse, SQLITE_DELETE, SCHEMA_TABLE(pTable->isTemp),0) ){ + sqliteFree(zName); + return; + } } - +#endif /* * If this is not an "explain", then delete the trigger structure. |