finishes registration process
This commit is contained in:
@@ -7,7 +7,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
// TODO: синхронизовать c C++
|
|
||||||
void process_client_command(char *line, session *sess, server_data_t *s_d) {
|
void process_client_command(char *line, session *sess, server_data_t *s_d) {
|
||||||
char arg_1[32];
|
char arg_1[32];
|
||||||
char arg_2[32];
|
char arg_2[32];
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#define UNUSED(x) (void)(x)
|
#define UNUSED(x) (void)(x)
|
||||||
#define Q_LEN 128
|
#define Q_LEN 128
|
||||||
|
#define BIN 1
|
||||||
|
#define TEXT 0
|
||||||
|
|
||||||
static PGconn *conn = NULL;
|
static PGconn *conn = NULL;
|
||||||
static PGresult *res = NULL;
|
static PGresult *res = NULL;
|
||||||
@@ -91,7 +93,7 @@ int init_db_connection() {
|
|||||||
return exit_query(0);
|
return exit_query(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int db_user_auth(i_auth_t *credentials, o_auth_t *response) {
|
int32_t db_user_auth(i_auth_t *credentials, o_auth_t *response) {
|
||||||
const char *paramValues[1];
|
const char *paramValues[1];
|
||||||
paramValues[0] = credentials->name;
|
paramValues[0] = credentials->name;
|
||||||
|
|
||||||
@@ -108,13 +110,38 @@ int db_user_auth(i_auth_t *credentials, o_auth_t *response) {
|
|||||||
if (!strcmp(pass, credentials->pass)) {
|
if (!strcmp(pass, credentials->pass)) {
|
||||||
response->privileges = PQgetvalue(res, 0, 3)[0];
|
response->privileges = PQgetvalue(res, 0, 3)[0];
|
||||||
response->uid = atoi(PQgetvalue(res, 0, 0));
|
response->uid = atoi(PQgetvalue(res, 0, 0));
|
||||||
|
clearRes();
|
||||||
|
char u_buf[128];
|
||||||
|
sprintf(u_buf, "UPDATE users SET last_login = NOW() WHERE id = %u",
|
||||||
|
response->uid);
|
||||||
|
res = PQexec(conn, u_buf);
|
||||||
|
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
||||||
|
return exit_query(3);
|
||||||
return exit_query(0);
|
return exit_query(0);
|
||||||
}
|
}
|
||||||
return exit_query(2);
|
return exit_query(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BIN 1
|
int32_t db_user_create(i_db_user_create *args) {
|
||||||
#define TEXT 0
|
const char *paramValues[3];
|
||||||
|
paramValues[0] = args->uname;
|
||||||
|
paramValues[1] = args->pass;
|
||||||
|
paramValues[2] = args->email;
|
||||||
|
uint32_t ret_value;
|
||||||
|
|
||||||
|
res = PQexecParams(
|
||||||
|
conn,
|
||||||
|
"INSERT INTO users (username, password, email, privileges, created_at, last_login)"
|
||||||
|
" VALUES ($1, $2, $3, 1, NOW(), NOW()) RETURNING id",
|
||||||
|
3, NULL, paramValues, NULL, NULL, TEXT);
|
||||||
|
|
||||||
|
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
||||||
|
return exit_query(-1);
|
||||||
|
|
||||||
|
ret_value = atoi(PQgetvalue(res, 0, 0));
|
||||||
|
clearRes();
|
||||||
|
return ret_value;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t db_save_file(session *s) {
|
int32_t db_save_file(session *s) {
|
||||||
const char *paramValues[6];
|
const char *paramValues[6];
|
||||||
@@ -189,10 +216,11 @@ s_file_t *db_get_file(i_get_file_db *arg) {
|
|||||||
|
|
||||||
paramValues[0] = value;
|
paramValues[0] = value;
|
||||||
|
|
||||||
sprintf(query,
|
sprintf(
|
||||||
"SELECT files.id, user_id, name, size, description, permissions, hash "
|
query,
|
||||||
"FROM files JOIN users ON user_id = users.id WHERE files.%s = $1%n",
|
"SELECT files.id, user_id, name, size, description, permissions, hash "
|
||||||
s_field, &q_len);
|
"FROM files JOIN users ON user_id = users.id WHERE files.%s = $1%n",
|
||||||
|
s_field, &q_len);
|
||||||
|
|
||||||
res = PQexecParams(conn, query, 1, NULL, paramValues, NULL, NULL, TEXT);
|
res = PQexecParams(conn, query, 1, NULL, paramValues, NULL, NULL, TEXT);
|
||||||
|
|
||||||
@@ -303,7 +331,7 @@ uint64_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start,
|
|||||||
clearRes();
|
clearRes();
|
||||||
|
|
||||||
res = PQexec(conn, "SELECT COUNT(id) "
|
res = PQexec(conn, "SELECT COUNT(id) "
|
||||||
"FROM files "); // TODO: finish
|
"FROM files ");
|
||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
if (PQresultStatus(res) != PGRES_TUPLES_OK && !PQntuples(res))
|
||||||
return exit_query_2(0);
|
return exit_query_2(0);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t user_id;
|
uint32_t user_id;
|
||||||
char name[64];
|
char name[FILE_NAME_LEN];
|
||||||
} i_get_file_db;
|
} i_get_file_db;
|
||||||
|
|
||||||
enum sort_direction { ASC, DESC };
|
enum sort_direction { ASC, DESC };
|
||||||
@@ -28,17 +28,24 @@ enum sort_by { ID, NAME, CREATED_AT, USER_ID };
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t user_id; // TODO: implement
|
uint32_t user_id; // TODO: implement
|
||||||
char name[12]; // TODO: implement
|
char name[FILE_NAME_LEN]; // TODO: implement
|
||||||
uint32_t limit;
|
uint32_t limit;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
enum sort_by sort_by;
|
enum sort_by sort_by;
|
||||||
enum sort_direction sort_direction;
|
enum sort_direction sort_direction;
|
||||||
} i_get_files_db;
|
} i_get_files_db;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char uname[UNAME_LEN];
|
||||||
|
char pass[PASS_LEN];
|
||||||
|
char email[EMAIL_LEN];
|
||||||
|
} i_db_user_create;
|
||||||
|
|
||||||
int32_t init_db_connection();
|
int32_t init_db_connection();
|
||||||
int32_t db_save_file(session *s);
|
int32_t db_save_file(session *s);
|
||||||
int32_t db_user_auth(i_auth_t *credentials, o_auth_t *response);
|
int32_t db_user_auth(i_auth_t *credentials, o_auth_t *response);
|
||||||
s_file_t *db_get_file(i_get_file_db *arg);
|
s_file_t *db_get_file(i_get_file_db *arg);
|
||||||
uint64_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start,
|
uint64_t db_get_files_data(i_get_files_db *arg, fl_t **fl_start,
|
||||||
uint64_t *full_count);
|
uint64_t *full_count);
|
||||||
|
int32_t db_user_create(i_db_user_create *);
|
||||||
#endif
|
#endif
|
||||||
+9
-8
@@ -1,9 +1,10 @@
|
|||||||
client.o: src/client.c src/client.h src/main.h src/file_p.h src/session.h
|
client.o: src/client.c src/client.h src/main.h src/types.h src/file_p.h \
|
||||||
db.o: src/db.c src/db.h src/main.h
|
src/session.h
|
||||||
file_p.o: src/file_p.c src/file_p.h src/main.h src/db.h \
|
db.o: src/db.c src/db.h src/main.h src/types.h
|
||||||
|
file_p.o: src/file_p.c src/file_p.h src/main.h src/types.h src/db.h \
|
||||||
src/libs/murmur3/murmur3.h src/session.h
|
src/libs/murmur3/murmur3.h src/session.h
|
||||||
main.o: src/main.c src/main.h src/server.h src/db.h
|
main.o: src/main.c src/main.h src/types.h src/server.h src/db.h
|
||||||
server.o: src/server.c src/main.h src/session.h src/user.h
|
server.o: src/server.c src/main.h src/types.h src/session.h src/user.h
|
||||||
session.o: src/session.c src/session.h src/main.h src/client.h src/db.h \
|
session.o: src/session.c src/session.h src/main.h src/types.h \
|
||||||
src/file_p.h src/user.h
|
src/client.h src/db.h src/file_p.h src/user.h
|
||||||
user.o: src/user.c src/main.h src/session.h src/db.h
|
user.o: src/user.c src/db.h src/main.h src/types.h src/session.h
|
||||||
|
|||||||
+4
-4
@@ -2,6 +2,7 @@
|
|||||||
#define MAIN_H
|
#define MAIN_H
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "types.h"
|
||||||
#define PORT 2000
|
#define PORT 2000
|
||||||
#define MAX_CONNECTIONS 1024
|
#define MAX_CONNECTIONS 1024
|
||||||
#define INBUFSIZE 1024
|
#define INBUFSIZE 1024
|
||||||
@@ -24,7 +25,6 @@ enum sess_states {
|
|||||||
OP_WAIT,
|
OP_WAIT,
|
||||||
OP_UPLOAD,
|
OP_UPLOAD,
|
||||||
OP_UPLOAD_DESCRIPTION,
|
OP_UPLOAD_DESCRIPTION,
|
||||||
OP_REGISTER,
|
|
||||||
ERR,
|
ERR,
|
||||||
FIN
|
FIN
|
||||||
};
|
};
|
||||||
@@ -70,14 +70,14 @@ typedef struct session {
|
|||||||
unsigned long from_ip;
|
unsigned long from_ip;
|
||||||
unsigned short from_port;
|
unsigned short from_port;
|
||||||
char buf[INBUFSIZE];
|
char buf[INBUFSIZE];
|
||||||
int buf_used;
|
uint32_t buf_used;
|
||||||
enum sess_states state;
|
enum sess_states state;
|
||||||
enum error_reason reason;
|
enum error_reason reason;
|
||||||
char privileges;
|
char privileges;
|
||||||
char *uname;
|
char *uname;
|
||||||
uint32_t uid;
|
uint32_t uid;
|
||||||
int fd;
|
int32_t fd;
|
||||||
int sd; /* session descriptor */
|
int32_t sd; /* session descriptor */
|
||||||
s_file_t *file;
|
s_file_t *file;
|
||||||
fl_t *fl_start;
|
fl_t *fl_start;
|
||||||
fl_t *fl_current;
|
fl_t *fl_current;
|
||||||
|
|||||||
+1
-5
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
session *make_new_session(int fd, struct sockaddr_in *from, char *wm);
|
session *make_new_session(int fd, struct sockaddr_in *from, char *wm);
|
||||||
|
|
||||||
int accept_client(int ls, session *connections[], char *wm) {
|
int32_t accept_client(int ls, session *connections[], char *wm) {
|
||||||
int sd;
|
int sd;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t len = sizeof(addr);
|
socklen_t len = sizeof(addr);
|
||||||
@@ -83,7 +83,6 @@ int session_do_read(session *sess, char **read_str) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: синхронизовать c C++
|
|
||||||
int query_extract_from_buf(session *sess, char **output_line) {
|
int query_extract_from_buf(session *sess, char **output_line) {
|
||||||
char *line;
|
char *line;
|
||||||
int pos = -1;
|
int pos = -1;
|
||||||
@@ -162,9 +161,6 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) {
|
|||||||
process_client_command(line, sess, s_d);
|
process_client_command(line, sess, s_d);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_REGISTER:
|
|
||||||
// TODO:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
/* } */
|
/* } */
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#ifndef D_TYPES_H
|
||||||
|
#define D_TYPES_H
|
||||||
|
|
||||||
|
/* user */
|
||||||
|
#define EMAIL_LEN 256
|
||||||
|
#define UNAME_LEN 51
|
||||||
|
#define PASS_LEN 51
|
||||||
|
/* file */
|
||||||
|
#define FILE_NAME_LEN 65
|
||||||
|
|
||||||
|
#endif
|
||||||
+28
-10
@@ -1,24 +1,43 @@
|
|||||||
|
#include "db.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "db.h"
|
|
||||||
|
|
||||||
int process_user_name(char *uname, session *sess) {
|
int32_t create_user(session *sess, char *line) {
|
||||||
if (!strncmp(uname, "exit", sizeof "exit")) {
|
i_db_user_create p;
|
||||||
|
uint32_t privileges;
|
||||||
|
uint32_t res;
|
||||||
|
if (sscanf(line, "register %s %s %s", p.uname, p.pass, p.email) == 3) {
|
||||||
|
res = db_user_create(&p);
|
||||||
|
if (res) {
|
||||||
|
sess->state = OP_WAIT;
|
||||||
|
sess->uname = malloc(strlen(p.uname));
|
||||||
|
strcpy(sess->uname, p.uname);
|
||||||
|
sess->uid = res;
|
||||||
|
sess->privileges = 1; // by default
|
||||||
|
session_send_string(sess, "ok");
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t process_user_name(char *line, session *sess) {
|
||||||
|
if (!strncmp(line, "exit", sizeof "exit")) {
|
||||||
sess->state = ERR;
|
sess->state = ERR;
|
||||||
sess->reason = EXIT;
|
sess->reason = EXIT;
|
||||||
session_send_string(sess, "Bye!");
|
session_send_string(sess, "Bye!");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(uname, "register", sizeof "register"-1)) {
|
if (!strncmp(line, "register", sizeof "register" - 1)) {
|
||||||
sess->state = OP_REGISTER;
|
return create_user(sess, line);
|
||||||
return 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(uname, "anonymous", sizeof "anonymous")) {
|
if (!strncmp(line, "anonymous", sizeof "anonymous")) {
|
||||||
sess->uname = malloc(sizeof "anonymous");
|
sess->uname = malloc(sizeof "anonymous");
|
||||||
strcpy(sess->uname, "anonymous");
|
strcpy(sess->uname, "anonymous");
|
||||||
sess->state = OP_WAIT;
|
sess->state = OP_WAIT;
|
||||||
@@ -26,8 +45,8 @@ int process_user_name(char *uname, session *sess) {
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
sess->uname = malloc(strlen(uname) + 1);
|
sess->uname = malloc(strlen(line) + 1);
|
||||||
strcpy(sess->uname, uname);
|
strcpy(sess->uname, line);
|
||||||
sess->state = OP_LOGIN_PSS;
|
sess->state = OP_LOGIN_PSS;
|
||||||
session_send_string(sess, "password> ");
|
session_send_string(sess, "password> ");
|
||||||
|
|
||||||
@@ -57,7 +76,6 @@ int login(session *sess, char *pass) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: синхронизовать c C++
|
|
||||||
/* returns 1 if session needs to be closed, 0 - in the opposite case */
|
/* returns 1 if session needs to be closed, 0 - in the opposite case */
|
||||||
int process_error(session *sess) {
|
int process_error(session *sess) {
|
||||||
if (sess->state == ERR) {
|
if (sess->state == ERR) {
|
||||||
|
|||||||
Reference in New Issue
Block a user