diff --git a/.gitea/workflows/actions.yaml b/.gitea/workflows/actions.yaml index 380ea7c..ab2d2b8 100644 --- a/.gitea/workflows/actions.yaml +++ b/.gitea/workflows/actions.yaml @@ -9,7 +9,7 @@ jobs: - name: Check out repository code uses: actions/checkout@v3 - name: Building binary with make - run: make -j$(nproc) + run: make USE_SQLITE3=1 -j$(nproc) - name: Testing binary run: make test @@ -25,7 +25,7 @@ jobs: run: | mkdir build && \ cd build && \ - cmake .. && \ + cmake -DUSE_SQLITE3=ON .. && \ make -j$(nproc) - name: Testing binary run: | @@ -41,7 +41,7 @@ jobs: uses: actions/checkout@v3 - name: Building binary with meson run: | - meson setup build && \ + meson setup build -Duse_sqlite3=true && \ ninja -C build - name: Testing binary run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 705d992..c7f4435 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,11 +10,21 @@ include_directories(./src/lib/ ${SQLite3_INCLUDE_DIRS}) FILE(GLOB_RECURSE SOURCES src/*.c) -find_package(SQLite3 REQUIRED) +option(USE_SQLITE3 "Enable SQLite3 support" OFF) + +if(USE_SQLITE3) + find_package(SQLite3 REQUIRED) + pkg_check_modules(SQLITE3 REQUIRED sqlite3) + add_definitions(-DUSE_SQLITE3) +endif() add_executable( auth_service ${SOURCES} ) -target_link_libraries(auth_service ssl crypto sqlite3 pthread) +if(USE_SQLITE3) + target_link_libraries(auth_service ssl crypto sqlite3 pthread) +else() + target_link_libraries(auth_service ssl crypto pthread) +endif() diff --git a/Makefile b/Makefile index e1bf876..d2dfa18 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,19 @@ CC = gcc CFLAGS = -Wall -g -std=gnu2x -DMG_TLS=MG_TLS_OPENSSL -ffunction-sections -fdata-sections LDFLAGS = -Wl,--gc-sections -LIBS = -lpthread -lcrypto -lssl -lsqlite3 INCLUDES = -I./src/lib -I./src SRCS = $(wildcard src/*/*.c src/*.c) OBJS = $(SRCS:.c=.o) TARGET = auth_service BUILD_DIR=./build CROSS_COMPILE = +LIBS = -lpthread -lcrypto -lssl +USE_SQLITE3 ?= 0 + +ifeq ($(USE_SQLITE3), 1) + CFLAGS += -DUSE_SQLITE3 + LIBS += -lsqlite3 +endif all: $(TARGET) diff --git a/meson.build b/meson.build index da3fb9a..6c91083 100644 --- a/meson.build +++ b/meson.build @@ -1,8 +1,20 @@ project('auth_service', 'c', default_options: ['c_std=gnu2x']) include_dirs = include_directories('src', 'src/lib') -deps = [dependency('openssl'), dependency('sqlite3')] -extra_c_args = [ '-ffunction-sections', '-fdata-sections' ] -extra_c_link_args = [ '-Wl,--gc-sections' ] +deps = [dependency('openssl')] +extra_c_args = ['-ffunction-sections', '-fdata-sections'] +extra_c_link_args = ['-Wl,--gc-sections'] + +sqlite3_dep = dependency('sqlite3', required: false) +use_sqlite3 = get_option('use_sqlite3') + +if use_sqlite3 + if not sqlite3_dep.found() + error('SQLite3 requested but not found') + endif + deps += sqlite3_dep + add_project_arguments('-DUSE_SQLITE3', language: 'c') +endif + executable( 'auth_service', 'src/main.c', @@ -38,5 +50,5 @@ executable( include_directories: include_dirs, dependencies: deps, c_args: extra_c_args, - link_args: extra_c_link_args + link_args: extra_c_link_args, ) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..ddd46af --- /dev/null +++ b/meson_options.txt @@ -0,0 +1 @@ +option('use_sqlite3', type: 'boolean', value: false, description: 'Enable SQLite3 support') diff --git a/src/database.c b/src/database.c index 18e89cf..11ebe10 100644 --- a/src/database.c +++ b/src/database.c @@ -7,20 +7,27 @@ #include "config.h" #include "sql.h" -sqlite3* db = nullptr; +#ifdef USE_SQLITE3 +sqlite3 *db = nullptr; pthread_mutex_t db_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif void init_db() { +#ifdef USE_SQLITE3 if (sqlite3_open(cm_get_parameter_as_string(config, "database"), &db) != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } +#else + return; +#endif } void migrate_db() { - char* err_msg = 0; +#ifdef USE_SQLITE3 + char *err_msg = 0; pthread_mutex_lock(&db_mutex); if (sqlite3_exec(db, CREATE_TABLE_USERS, nullptr, nullptr, &err_msg) != SQLITE_OK) { @@ -30,18 +37,21 @@ void migrate_db() { exit(1); } pthread_mutex_unlock(&db_mutex); +#else + return; +#endif } // Вспомогательная функция для экранирования специальных символов в JSON -char* json_escape(const char* str) { +char *json_escape(const char *str) { if (!str) return NULL; size_t len = strlen(str); // Выделяем память с запасом (каждый символ может быть экранирован) - char* escaped = malloc(len * 6 + 1); + char *escaped = malloc(len * 6 + 1); if (!escaped) return NULL; - char* p = escaped; + char *p = escaped; for (size_t i = 0; i < len; i++) { switch (str[i]) { case '\"': @@ -74,7 +84,7 @@ char* json_escape(const char* str) { break; default: if (str[i] < 0x20) { - sprintf(p, "\\u%04x", (unsigned char)str[i]); + sprintf(p, "\\u%04x", (unsigned char) str[i]); p += 6; } else { *p++ = str[i]; @@ -84,4 +94,4 @@ char* json_escape(const char* str) { *p = '\0'; return escaped; -} \ No newline at end of file +} diff --git a/src/database.h b/src/database.h index 09aa3b3..5011be9 100644 --- a/src/database.h +++ b/src/database.h @@ -1,11 +1,13 @@ #pragma once #include -#include -extern sqlite3* db; +#ifdef USE_SQLITE3 +#include +extern sqlite3 *db; extern pthread_mutex_t db_mutex; +#endif void init_db(); void migrate_db(); -char* json_escape(const char* str); \ No newline at end of file +char *json_escape(const char *str); diff --git a/src/db_delete_user.c b/src/db_delete_user.c index 5781098..cc65f87 100644 --- a/src/db_delete_user.c +++ b/src/db_delete_user.c @@ -3,6 +3,7 @@ #include "user.h" bool db_delete_user(const int id) { +#ifdef USE_SQLITE3 pthread_mutex_lock(&db_mutex); if (!db) { fprintf(stderr, "Database not initialized\n"); @@ -42,4 +43,7 @@ bool db_delete_user(const int id) { pthread_mutex_unlock(&db_mutex); return true; +#else + return true; +#endif } diff --git a/src/db_get_all_users.c b/src/db_get_all_users.c index 9afe5da..c51c9bd 100644 --- a/src/db_get_all_users.c +++ b/src/db_get_all_users.c @@ -5,6 +5,7 @@ #include "user.h" char *db_get_all_users() { +#ifdef USE_SQLITE3 pthread_mutex_lock(&db_mutex); if (!db) { fprintf(stderr, "Database not initialized\n"); @@ -41,9 +42,9 @@ char *db_get_all_users() { const unsigned char *group = sqlite3_column_text(stmt, 4); int is_superuser = sqlite3_column_int(stmt, 5); - char *escaped_username = json_escape((const char *)username); - char *escaped_email = json_escape((const char *)email); - char *escaped_group = json_escape((const char *)group); + char *escaped_username = json_escape((const char *) username); + char *escaped_email = json_escape((const char *) email); + char *escaped_group = json_escape((const char *) group); if (!escaped_username || !escaped_email || !escaped_group) { free(escaped_username); free(escaped_email); @@ -97,4 +98,7 @@ char *db_get_all_users() { sqlite3_finalize(stmt); pthread_mutex_unlock(&db_mutex); return result; -} \ No newline at end of file +#else + return ""; +#endif +} diff --git a/src/db_get_user_by_id.c b/src/db_get_user_by_id.c index 46776e5..6a82392 100644 --- a/src/db_get_user_by_id.c +++ b/src/db_get_user_by_id.c @@ -3,6 +3,7 @@ #include "user.h" User *db_get_user_by_id(const int id) { +#ifdef USE_SQLITE3 User *user = nullptr; pthread_mutex_lock(&db_mutex); if (!db) { @@ -27,8 +28,8 @@ User *db_get_user_by_id(const int id) { const unsigned char *db_password = sqlite3_column_text(stmt, 3); const unsigned char *db_group = sqlite3_column_text(stmt, 4); int db_is_superuser = sqlite3_column_int(stmt, 5); - user = new_user(id, (char *)db_username, (char *)db_password, - (char *)db_email, (char *)db_group, db_is_superuser); + user = new_user(id, (char *) db_username, (char *) db_password, + (char *) db_email, (char *) db_group, db_is_superuser); } if (rc != SQLITE_DONE) { @@ -41,4 +42,8 @@ User *db_get_user_by_id(const int id) { pthread_mutex_unlock(&db_mutex); return user; +#else + User *asdf = new_user(0, "asdf", "asdf", "asdf", "asdf", false); + return asdf; +#endif } diff --git a/src/db_get_user_by_username.c b/src/db_get_user_by_username.c index cd97d79..740f184 100644 --- a/src/db_get_user_by_username.c +++ b/src/db_get_user_by_username.c @@ -3,6 +3,7 @@ #include "user.h" User *db_get_user_by_username(const char *username) { +#ifdef USE_SQLITE3 User *user = nullptr; pthread_mutex_lock(&db_mutex); if (!db) { @@ -28,8 +29,8 @@ User *db_get_user_by_username(const char *username) { const unsigned char *db_password = sqlite3_column_text(stmt, 3); const unsigned char *db_group = sqlite3_column_text(stmt, 4); int db_is_superuser = sqlite3_column_int(stmt, 5); - user = new_user(id, (char *)db_username, (char *)db_password, - (char *)db_email, (char *)db_group, db_is_superuser); + user = new_user(id, (char *) db_username, (char *) db_password, + (char *) db_email, (char *) db_group, db_is_superuser); } if (rc != SQLITE_DONE) { @@ -41,4 +42,8 @@ User *db_get_user_by_username(const char *username) { pthread_mutex_unlock(&db_mutex); return user; +#else + User *asdf = new_user(0, "asdf", "asdf", "asdf", "asdf", false); + return asdf; +#endif } diff --git a/src/db_get_user_field_by_id.c b/src/db_get_user_field_by_id.c index 2cf849b..5ac0cd4 100644 --- a/src/db_get_user_field_by_id.c +++ b/src/db_get_user_field_by_id.c @@ -5,6 +5,7 @@ #include "user.h" char *db_get_user_field_by_id(const int id, const char *field) { +#ifdef USE_SQLITE3 char *password = nullptr; pthread_mutex_lock(&db_mutex); if (!db) { @@ -25,9 +26,9 @@ char *db_get_user_field_by_id(const int id, const char *field) { rc = sqlite3_step(stmt); if (rc == SQLITE_ROW) { const unsigned char *db_password = sqlite3_column_text(stmt, 0); - password = malloc(strlen((const char *)db_password) + 1); + password = malloc(strlen((const char *) db_password) + 1); if (password) { - strcpy(password, (const char *)db_password); + strcpy(password, (const char *) db_password); } sqlite3_finalize(stmt); } else if (rc == SQLITE_DONE) { @@ -43,4 +44,7 @@ char *db_get_user_field_by_id(const int id, const char *field) { } pthread_mutex_unlock(&db_mutex); return password; +#else + return ""; +#endif } diff --git a/src/db_get_users_from_file.c b/src/db_get_users_from_file.c index 79db265..a76bbd3 100644 --- a/src/db_get_users_from_file.c +++ b/src/db_get_users_from_file.c @@ -1,5 +1,5 @@ #include -#include +// #include #include "file.h" #include "user.h" diff --git a/src/db_insert_user.c b/src/db_insert_user.c index d293129..6812c95 100644 --- a/src/db_insert_user.c +++ b/src/db_insert_user.c @@ -5,6 +5,7 @@ User *db_insert_user(const char *username, const char *email, const char *password, const char *group, const bool *is_superuser) { +#ifdef USE_SQLITE3 pthread_mutex_lock(&db_mutex); if (!db) { fprintf(stderr, "Databse not initialized\n"); @@ -60,4 +61,8 @@ User *db_insert_user(const char *username, const char *email, User *new_db_user = new_user(inserted_id, username, email, password, group, is_superuser); return new_db_user; +#else + User *asdf = new_user(0, "asdf", "asdf", "asdf", "asdf", false); + return asdf; +#endif } diff --git a/src/db_update_user.c b/src/db_update_user.c index 9215d22..4e9ca24 100644 --- a/src/db_update_user.c +++ b/src/db_update_user.c @@ -5,6 +5,7 @@ User *db_update_user(const int userid, const char *username, const char *email, const char *password, const char *group, const bool *is_superuser) { +#ifdef USE_SQLITE3 pthread_mutex_lock(&db_mutex); if (!db) { fprintf(stderr, "Databse not initialized\n"); @@ -52,4 +53,8 @@ User *db_update_user(const int userid, const char *username, const char *email, } pthread_mutex_unlock(&db_mutex); return new_user(userid, username, email, password, group, is_superuser); +#else + User *asdf = new_user(0, "asdf", "asdf", "asdf", "asdf", false); + return asdf; +#endif } diff --git a/src/db_update_user_field.c b/src/db_update_user_field.c index 2fb94fa..7f8c31e 100644 --- a/src/db_update_user_field.c +++ b/src/db_update_user_field.c @@ -3,6 +3,7 @@ #include "user.h" bool db_update_user_field(const int id, const char *field, const char *value) { +#ifdef USE_SQLITE3 pthread_mutex_lock(&db_mutex); if (!db || !field || !value) { fprintf(stderr, "invalid parameters\n"); @@ -32,4 +33,7 @@ bool db_update_user_field(const int id, const char *field, const char *value) { } pthread_mutex_unlock(&db_mutex); return sqlite3_changes(db) > 0; +#else + return 0; +#endif } diff --git a/src/main.c b/src/main.c index 15bbb67..a0e3754 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,9 @@ #include #include + +#ifdef USE_SQLITE3 #include +#endif #include "config.h" #include "cors.h" @@ -67,7 +70,7 @@ int main(void) { migrate_db(); const char *default_users_filename = cm_get_parameter_as_string(config, "default_users_file"); - if (default_users_filename) db_get_users_from_file("users.json"); + if (default_users_filename) db_get_users_from_file(default_users_filename); struct mg_mgr mgr; mg_log_set(MG_LL_DEBUG); diff --git a/src/user.h b/src/user.h index 85fb364..381dacc 100644 --- a/src/user.h +++ b/src/user.h @@ -2,7 +2,10 @@ #include #include + +#ifdef USE_SQLITE3 #include +#endif #define HTTP_HEADERS \ "Content-Type: application/json\r\nAccess-Control-Allow-Origin: *\r\n"