SQLite Forum

sqlite user authentication in c++ project
Login
I'm trying to build a sqlite database with user authentication enabled.
Following instruction from 
https://www.sqlite.org/src/doc/trunk/ext/userauth/user-auth.txt, 
attemps to read or write will fail if sqlite_user_authenticate returns error. 
However the program continued to create table and insert values to the database.
Does anyone know the problem? 
Appreciated!

How I implemented user_authentication:
I appended sqlite3userauth.h to the end of sqlite3.h
and userauth.c to the end of sqlite3.c
and compiled with 
gcc -DSQLITE_USER_AUTHENTICATION -c sqlite3.c -lpthread -ldl -o sqlite3.o
ar rcs libsqlite3.a sqlite3.o
so in my c++ project I link the libsqlite3.a as a lib.

Below is my test code:
int sqlite_user()
{
	sqlite3 *db;
	const char* dir = "sqluser.db";
	int rc=0;
	rc = sqlite3_open_v2(dir, &db,SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
	if(rc)
		fprintf(stderr, "Error Open Database %s\n", sqlite3_errmsg(db));
	else
		fprintf(stdout, "Database opended\n");

	const char* usrName = "zzw";
	const char* pw = "1111";

	rc = sqlite3_user_add(db, usrName, pw, 4, 1);
	if(rc!=SQLITE_OK)
		fprintf(stderr, "Error Create User %s\n", sqlite3_errmsg(db));
	else
		fprintf(stdout,"add user done\n");


	rc = sqlite3_user_authenticate(db, usrName, "1112", 4);
	if(rc!=SQLITE_OK)
		fprintf(stderr, "Error authenticate  %s\n", sqlite3_errmsg(db)); else
		fprintf(stdout, "user authorized\n");

	const char* tbName = "TESTTABLE("\
		"ID 	TEXT 	PRIMARY 	KEY 	NOT NULL,"\
		"CONTENT 			TEXT	NOT NULL);";
	
	string tablePrefix = "CREATE TABLE IF NOT EXISTS \t";
        ostringstream str1;
        str1<<tablePrefix<<tbName ;
        string sql = str1.str();

        int rc =0;
        rc = sqlite3_open(dir, &db);
        if(rc)
            fprintf(stderr,"Error Open Database %s\n", sqlite3_errmsg(db));
 
        char* msgErr;
           rc = sqlite3_exec(db, sql.c_str(), NULL, 0, &msgErr);
        if(rc!=SQLITE_OK)
        {
             fprintf(stderr,"Error Create Table %s\n", sqlite3_errmsg(db));
             sqlite3_free(msgErr);
         }
         else
         fprintf(stderr, "Table created successfully \n");


	char* sql;
	sql = "INSERT INTO TESTTABLE (ID, CONTENT)"\
		"VALUES('X1', 'SSS1');";
	char *errMsg=0;
	rc = sqlite3_exec(db, sql, 0,0,&errMsg);
	
	if(rc!=SQLITE_OK)
		fprintf(stderr, "error insert %s\n", sqlite3_errmsg(db));
	else 
		fprintf(stdout, "insert done\n");
	

	sqlite3_close(db);	
	

	return 0;
}