diff --git a/TODO.md b/TODO.md index 365ac48..37d60e3 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,5 @@ ## Tasks -# Testing - -- [ ] Tests for the server module - # Development plans - [ ] make print_log to write a file log - [ ] Remove file when error while saving the data in DB @@ -11,26 +7,10 @@ - [ ] Unified list of exit codes ## Features - -- [x] Database integration -- [x] Paging in the file list -- [x] Get files in FS by their hash -- [x] Registration -- [x] Encrypt passwords in DB -- [x] Registration: Error when username or email is already used +- [ ] Sorting in the file list - [ ] Check correctness of email - [ ] Message to admin -- [x] Advanced folder structure in the storage - [ ] File encryption - [ ] Connection encryption - [ ] Advanced rights for files -- [ ] Multithreading - -## Done - -- [x] Switch to SQLite -- [x] Close the DB correctly in any quit case (also by SIGTERM) -- [x] Get rid of unsigned integers -- [x] Check registration -- [x] Auto create a database when one is missing -- [x] Show date in server log \ No newline at end of file +- [ ] Multithreading \ No newline at end of file diff --git a/src/components/session/session.c b/src/components/session/session.c index 35211bc..1dadbef 100644 --- a/src/components/session/session.c +++ b/src/components/session/session.c @@ -2,14 +2,12 @@ /* Copyright (c) 2026 Oleksandr Zhylin */ #include "session.h" -#include -#include -#include -#include -#include #include +#include #include #include +#include +#include #include #include #include @@ -19,6 +17,8 @@ #include #include #include +#include +#include session *make_new_session(int fd, struct sockaddr_in *from, char *wm); @@ -206,14 +206,16 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) { case OP_UPLOAD_DESCRIPTION: res = file_upload_description(sess, line, s_d); if (res) { - if (db_save_file(sess)) { + if (db_save_file(sess->file, sess->uid)) { session_send_string(sess, "File \"%s\" is saved!\04\n", sess->file->name); - clear_file_from_sess(sess); - sess->state = OP_WAIT; } else { - // TODO: error case + session_send_string(sess, "Error while saving the file %s!\04\n", + sess->file->name); + unlink(sess->file->path); } + clear_file_from_sess(sess); + sess->state = OP_WAIT; } break; case OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE: diff --git a/src/db/db.h b/src/db/db.h index 7ccc9a3..3dc90cc 100644 --- a/src/db/db.h +++ b/src/db/db.h @@ -47,7 +47,7 @@ typedef struct { enum db_cb_resp { db_no_result, db_success, db_err, db_fail }; /* fail: the problem is on the user's side; no error */ int32_t init_db_connection(); -int32_t db_save_file(session *s); +int32_t db_save_file(s_file_t *sfP, int uid); int32_t db_user_auth(i_auth_t *credentials, o_auth_t *response); s_file_t *db_get_file(i_get_file_db *arg); int32_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start, diff --git a/src/db/db_postgresql.c b/src/db/db_postgresql.c index 8d09ab7..cc8ad5d 100644 --- a/src/db/db_postgresql.c +++ b/src/db/db_postgresql.c @@ -3,9 +3,7 @@ /* TODO: variadic function for preparing parameters */ -#include "../main.h" -#include "../utils.h" -#include "db_common.h" +#include #include #include #include @@ -18,6 +16,8 @@ #include #include #include +#include "utils.h" +#include "db_common.h" #define UNUSED(x) (void)(x) #define Q_LEN 128 @@ -198,15 +198,14 @@ int32_t db_user_create(i_db_user_create *args) { return ret_value; } -int32_t db_save_file(session *s) { +int32_t db_save_file(s_file_t *sf, int uid) { const char *paramValues[6]; int paramFormats[6]; int paramLengths[6]; /* int collision_id = 0; */ - s_file_t *sf = s->file; char empty_str[] = ""; - int32_t uid_n = htonl(s->uid); + int32_t uid_n = htonl(uid); size_t size_n = htobe64(sf->size); int32_t hash_n = htonl(sf->hash); int32_t perm_n = htonl(sf->permissions); diff --git a/src/db/db_sqlite.c b/src/db/db_sqlite.c index 246d985..0f6a8f1 100644 --- a/src/db/db_sqlite.c +++ b/src/db/db_sqlite.c @@ -3,7 +3,6 @@ #include #include -#include "db_common.h" #include #include #include @@ -16,6 +15,7 @@ #include #include #include +#include "db_common.h" #define UNUSED(x) (void)(x) #define Q_LEN 128 @@ -284,8 +284,7 @@ enum db_cb_resp db_save_file_cb(sqlite3_stmt *stmt, void *resp) { return res; }; -int32_t db_save_file(session *s) { - s_file_t *sfP = s->file; +int32_t db_save_file(s_file_t *sfP, int uid) { struct db_save_file_data resp_data = {.id = 0}; const char empty_str[] = ""; enum db_cb_resp res = db_no_result; @@ -296,7 +295,7 @@ int32_t db_save_file(session *s) { "hash, description, permissions) " "VALUES ($1, $2, $3, date(), $4, $5, $6) " "RETURNING id", - db_save_file_cb, &resp_data, arg_types, s->uid, sfP->name, + db_save_file_cb, &resp_data, arg_types, uid, sfP->name, sfP->size, sfP->hash, sfP->description != NULL ? sfP->description : empty_str, sfP->permissions);