Просмотр исходного кода

Add sqlite3_set_authorizer hook

mingodad 10 лет назад
Родитель
Сommit
fdc9607023
2 измененных файлов с 164 добавлено и 11 удалено
  1. 160 11
      SquiLu-ext/sq_sqlite3.cpp
  2. 4 0
      SquiLu-ext/sq_sqlite3.h

+ 160 - 11
SquiLu-ext/sq_sqlite3.cpp

@@ -1423,6 +1423,8 @@ static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb)
             sq_release(sdb->v, &sdb->trace_udata);
             sq_release(sdb->v, &sdb->trace_udata);
             sq_release(sdb->v, &sdb->update_hook_cb);
             sq_release(sdb->v, &sdb->update_hook_cb);
             sq_release(sdb->v, &sdb->update_hook_udata);
             sq_release(sdb->v, &sdb->update_hook_udata);
+            sq_release(sdb->v, &sdb->authorizer_hook_cb);
+            sq_release(sdb->v, &sdb->authorizer_hook_udata);
             sq_release(sdb->v, &sdb->null_value);
             sq_release(sdb->v, &sdb->null_value);
 
 
             sq_free(sdb, sizeof(sq_sqlite3_sdb));
             sq_free(sdb, sizeof(sq_sqlite3_sdb));
@@ -1460,6 +1462,8 @@ static SQRESULT sq_sqlite3_constructor(HSQUIRRELVM v)
     sq_resetobject(&sdb->trace_udata);
     sq_resetobject(&sdb->trace_udata);
     sq_resetobject(&sdb->update_hook_cb);
     sq_resetobject(&sdb->update_hook_cb);
     sq_resetobject(&sdb->update_hook_udata);
     sq_resetobject(&sdb->update_hook_udata);
+    sq_resetobject(&sdb->authorizer_hook_cb);
+    sq_resetobject(&sdb->authorizer_hook_udata);
     sq_resetobject(&sdb->null_value);
     sq_resetobject(&sdb->null_value);
 
 
     sq_setinstanceup(v, 1, sdb);
     sq_setinstanceup(v, 1, sdb);
@@ -1697,10 +1701,10 @@ static SQRESULT sq_sqlite3_rekey(HSQUIRRELVM v)
 ** Params: userdata
 ** Params: userdata
 ** returns: 0 to return immediatly and return SQLITE_ABORT, non-zero to continue
 ** returns: 0 to return immediatly and return SQLITE_ABORT, non-zero to continue
 */
 */
-static int db_progress_callback(void *user)
+static int db_progress_callback(void *udata)
 {
 {
     SQInteger result = 1; /* abort by default */
     SQInteger result = 1; /* abort by default */
-    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
+    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)udata;
     HSQUIRRELVM v = sdb->v;
     HSQUIRRELVM v = sdb->v;
     int top = sq_gettop(v);
     int top = sq_gettop(v);
 
 
@@ -1770,9 +1774,9 @@ static SQRESULT sq_sqlite3_progress_handler(HSQUIRRELVM v)
 ** callback function:
 ** callback function:
 ** Params: userdata, sql
 ** Params: userdata, sql
 */
 */
-static void db_trace_callback(void *user, const char *sql)
+static void db_trace_callback(void *udata, const char *sql)
 {
 {
-    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
+    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)udata;
     HSQUIRRELVM v = sdb->v;
     HSQUIRRELVM v = sdb->v;
     int top = sq_gettop(v);
     int top = sq_gettop(v);
 
 
@@ -1838,10 +1842,10 @@ static SQRESULT sq_sqlite3_trace(HSQUIRRELVM v)
 ** callback function:
 ** callback function:
 ** Params: userdata, sql
 ** Params: userdata, sql
 */
 */
-static void db_update_hook_callback(void *user, int update_type,
+static void db_update_hook_callback(void *udata, int update_type,
                 char const *db_name, char const *table_name, sqlite3_int64 rowid)
                 char const *db_name, char const *table_name, sqlite3_int64 rowid)
 {
 {
-    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
+    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)udata;
     HSQUIRRELVM v = sdb->v;
     HSQUIRRELVM v = sdb->v;
     int top = sq_gettop(v);
     int top = sq_gettop(v);
 
 
@@ -1897,6 +1901,114 @@ static SQRESULT sq_sqlite3_update_hook(HSQUIRRELVM v)
     return 0;
     return 0;
 }
 }
 
 
+/*
+** authorizer hook callback:
+** Params: database, callback function, userdata
+**
+** callback function:
+** Params: userdata, sql
+*/
+#if 0
+/******************************************* 3rd ************ 4th ***********/
+#define SQLITE_CREATE_INDEX          1   /* Index Name      Table Name      */
+#define SQLITE_CREATE_TABLE          2   /* Table Name      NULL            */
+#define SQLITE_CREATE_TEMP_INDEX     3   /* Index Name      Table Name      */
+#define SQLITE_CREATE_TEMP_TABLE     4   /* Table Name      NULL            */
+#define SQLITE_CREATE_TEMP_TRIGGER   5   /* Trigger Name    Table Name      */
+#define SQLITE_CREATE_TEMP_VIEW      6   /* View Name       NULL            */
+#define SQLITE_CREATE_TRIGGER        7   /* Trigger Name    Table Name      */
+#define SQLITE_CREATE_VIEW           8   /* View Name       NULL            */
+#define SQLITE_DELETE                9   /* Table Name      NULL            */
+#define SQLITE_DROP_INDEX           10   /* Index Name      Table Name      */
+#define SQLITE_DROP_TABLE           11   /* Table Name      NULL            */
+#define SQLITE_DROP_TEMP_INDEX      12   /* Index Name      Table Name      */
+#define SQLITE_DROP_TEMP_TABLE      13   /* Table Name      NULL            */
+#define SQLITE_DROP_TEMP_TRIGGER    14   /* Trigger Name    Table Name      */
+#define SQLITE_DROP_TEMP_VIEW       15   /* View Name       NULL            */
+#define SQLITE_DROP_TRIGGER         16   /* Trigger Name    Table Name      */
+#define SQLITE_DROP_VIEW            17   /* View Name       NULL            */
+#define SQLITE_INSERT               18   /* Table Name      NULL            */
+#define SQLITE_PRAGMA               19   /* Pragma Name     1st arg or NULL */
+#define SQLITE_READ                 20   /* Table Name      Column Name     */
+#define SQLITE_SELECT               21   /* NULL            NULL            */
+#define SQLITE_TRANSACTION          22   /* Operation       NULL            */
+#define SQLITE_UPDATE               23   /* Table Name      Column Name     */
+#define SQLITE_ATTACH               24   /* Filename        NULL            */
+#define SQLITE_DETACH               25   /* Database Name   NULL            */
+#define SQLITE_ALTER_TABLE          26   /* Database Name   Table Name      */
+#define SQLITE_REINDEX              27   /* Index Name      NULL            */
+#define SQLITE_ANALYZE              28   /* Table Name      NULL            */
+#define SQLITE_CREATE_VTABLE        29   /* Table Name      Module Name     */
+#define SQLITE_DROP_VTABLE          30   /* Table Name      Module Name     */
+#define SQLITE_FUNCTION             31   /* NULL            Function Name   */
+#define SQLITE_SAVEPOINT            32   /* Operation       Savepoint Name  */
+#define SQLITE_COPY                  0   /* No longer used */
+#define SQLITE_RECURSIVE            33   /* NULL            NULL            */
+#endif
+static int db_authorizer_hook_callback(void *udata, int action_code,
+                char const *param3, char const *param4,
+                char const *param5, char const *param6)
+{
+    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)udata;
+    HSQUIRRELVM v = sdb->v;
+    int top = sq_gettop(v);
+    SQInteger result = SQLITE_OK;
+
+    /* setup squirrel callback call */
+    sq_pushobject(v, sdb->authorizer_hook_cb);
+    sq_pushroottable(v);
+    sq_pushobject(v, sdb->authorizer_hook_udata);
+    sq_pushinteger(v, action_code);
+    sq_pushstring(v, param3, -1);
+    sq_pushstring(v, param4, -1);
+    sq_pushstring(v, param5, -1);
+    sq_pushstring(v, param6, -1);
+
+    /* call lua function */
+    /* ignore any error generated by this function */
+    if (sq_call(v, 7, SQTrue, SQFalse) == SQ_OK)
+        sq_getinteger(v, -1, &result);
+
+    sq_settop(v, top);
+    return result;
+}
+
+static SQRESULT sq_sqlite3_set_authorizer(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    GET_sqlite3_INSTANCE();
+
+    if (_top_ < 2 || sq_gettype(v, 2) == OT_NULL)
+    {
+        sq_release(v, &sdb->authorizer_hook_cb);
+        sq_release(v, &sdb->authorizer_hook_udata);
+
+        sq_resetobject(&sdb->authorizer_hook_cb);
+        sq_resetobject(&sdb->authorizer_hook_udata);
+
+        /* clear trace handler */
+        sqlite3_set_authorizer(self, NULL, NULL);
+    }
+    else
+    {
+        if(sq_gettype(v, 2) != OT_CLOSURE)
+            return sq_throwerror(v, _SC("invalid fisrt parameter expected closure"));
+
+        sq_getstackobj(v, 2, &sdb->authorizer_hook_cb);
+        sq_addref(v, &sdb->authorizer_hook_cb);
+        if(_top_ > 2)
+        {
+            sq_getstackobj(v, 3, &sdb->authorizer_hook_udata);
+            sq_addref(v, &sdb->authorizer_hook_udata);
+        }
+
+        /* set authorizer_hook callback */
+        sqlite3_set_authorizer(self, db_authorizer_hook_callback, sdb);
+    }
+
+    return 0;
+}
+
 /*
 /*
 ** busy handler:
 ** busy handler:
 ** Params: database, callback function, userdata
 ** Params: database, callback function, userdata
@@ -1905,10 +2017,10 @@ static SQRESULT sq_sqlite3_update_hook(HSQUIRRELVM v)
 ** Params: userdata, number of tries
 ** Params: userdata, number of tries
 ** returns: 0 to return immediatly and return SQLITE_BUSY, non-zero to try again
 ** returns: 0 to return immediatly and return SQLITE_BUSY, non-zero to try again
 */
 */
-static int db_busy_callback(void *user, int tries)
+static int db_busy_callback(void *udata, int tries)
 {
 {
     SQBool retry = SQFalse; /* abort by default */
     SQBool retry = SQFalse; /* abort by default */
-    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)user;
+    sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb*)udata;
     HSQUIRRELVM v = sdb->v;
     HSQUIRRELVM v = sdb->v;
     int top = sq_gettop(v);
     int top = sq_gettop(v);
 
 
@@ -2516,6 +2628,7 @@ static SQRegFunction sq_sqlite3_methods[] =
     _DECL_FUNC(progress_handler,  -2, _SC("x i|o c .")),
     _DECL_FUNC(progress_handler,  -2, _SC("x i|o c .")),
     _DECL_FUNC(trace,  -2, _SC("x c|o .")),
     _DECL_FUNC(trace,  -2, _SC("x c|o .")),
     _DECL_FUNC(update_hook,  -2, _SC("x c|o .")),
     _DECL_FUNC(update_hook,  -2, _SC("x c|o .")),
+    _DECL_FUNC(set_authorizer,  -2, _SC("x c|o .")),
     _DECL_FUNC(busy_handler,  -2, _SC("x c|o .")),
     _DECL_FUNC(busy_handler,  -2, _SC("x c|o .")),
     _DECL_FUNC(busy_timeout,  2, _SC("xi")),
     _DECL_FUNC(busy_timeout,  2, _SC("xi")),
     _DECL_FUNC(create_function,  -4, _SC("xsic.")),
     _DECL_FUNC(create_function,  -4, _SC("xsic.")),
@@ -2637,9 +2750,45 @@ extern "C" {
         INT_CONST(v,SQLITE_NOTICE_RECOVER_WAL);
         INT_CONST(v,SQLITE_NOTICE_RECOVER_WAL);
         INT_CONST(v,SQLITE_NOTICE_RECOVER_ROLLBACK);
         INT_CONST(v,SQLITE_NOTICE_RECOVER_ROLLBACK);
         INT_CONST(v,SQLITE_WARNING_AUTOINDEX);
         INT_CONST(v,SQLITE_WARNING_AUTOINDEX);
-        INT_CONST(v,SQLITE_INSERT);
-        INT_CONST(v,SQLITE_UPDATE);
-        INT_CONST(v,SQLITE_DELETE);
+
+        /*Authorizer codes*/
+        INT_CONST(v, SQLITE_IGNORE);
+        INT_CONST(v, SQLITE_DENY);
+        INT_CONST(v, SQLITE_CREATE_INDEX);
+        INT_CONST(v, SQLITE_CREATE_TABLE);
+        INT_CONST(v, SQLITE_CREATE_TEMP_INDEX);
+        INT_CONST(v, SQLITE_CREATE_TEMP_TABLE);
+        INT_CONST(v, SQLITE_CREATE_TEMP_TRIGGER);
+        INT_CONST(v, SQLITE_CREATE_TEMP_VIEW);
+        INT_CONST(v, SQLITE_CREATE_TRIGGER);
+        INT_CONST(v, SQLITE_CREATE_VIEW);
+        INT_CONST(v, SQLITE_DELETE);
+        INT_CONST(v, SQLITE_DROP_INDEX);
+        INT_CONST(v, SQLITE_DROP_TABLE);
+        INT_CONST(v, SQLITE_DROP_TEMP_INDEX);
+        INT_CONST(v, SQLITE_DROP_TEMP_TABLE);
+        INT_CONST(v, SQLITE_DROP_TEMP_TRIGGER);
+        INT_CONST(v, SQLITE_DROP_TEMP_VIEW);
+        INT_CONST(v, SQLITE_DROP_TRIGGER);
+        INT_CONST(v, SQLITE_DROP_VIEW);
+        INT_CONST(v, SQLITE_INSERT);
+        INT_CONST(v, SQLITE_PRAGMA);
+        INT_CONST(v, SQLITE_READ);
+        INT_CONST(v, SQLITE_SELECT);
+        INT_CONST(v, SQLITE_TRANSACTION);
+        INT_CONST(v, SQLITE_UPDATE);
+        INT_CONST(v, SQLITE_ATTACH);
+        INT_CONST(v, SQLITE_DETACH);
+        INT_CONST(v, SQLITE_ALTER_TABLE);
+        INT_CONST(v, SQLITE_REINDEX);
+        INT_CONST(v, SQLITE_ANALYZE);
+        INT_CONST(v, SQLITE_CREATE_VTABLE);
+        INT_CONST(v, SQLITE_DROP_VTABLE);
+        INT_CONST(v, SQLITE_FUNCTION);
+        INT_CONST(v, SQLITE_SAVEPOINT);
+        INT_CONST(v, SQLITE_COPY);
+        INT_CONST(v, SQLITE_RECURSIVE);
+
         //push sqlite3_NULL as a member
         //push sqlite3_NULL as a member
         sq_pushstring(v, nullName,-1);
         sq_pushstring(v, nullName,-1);
         sq_pushobject(v, sqlite3_NULL);
         sq_pushobject(v, sqlite3_NULL);

+ 4 - 0
SquiLu-ext/sq_sqlite3.h

@@ -45,6 +45,10 @@ struct sq_sqlite3_sdb
 
 
     HSQOBJECT update_hook_cb;       /* update hook callback */
     HSQOBJECT update_hook_cb;       /* update hook callback */
     HSQOBJECT update_hook_udata;
     HSQOBJECT update_hook_udata;
+
+    HSQOBJECT authorizer_hook_cb;       /* update hook callback */
+    HSQOBJECT authorizer_hook_udata;
+
     HSQOBJECT null_value;
     HSQOBJECT null_value;
 };
 };