#include "db/problems.h" #include "db/records.h" #include "db/sets.h" #include "server/auth.h" #include "server/config.h" #include "server/study.h" #include "server/types.h" #include "hash/hash.h" #include "db/auth.h" #include #include #include #include #include void signal_handler(int signal) { printf("Recieved signal %d.\n", signal); exit(0); } void cleanup(void) { if (admin_session) free(admin_session); if (secret) free(secret); close_sets_db(); close_records_db(); close_problems_db(); close_user_db(); printf("Cleanup.\n"); } int reset_admin_password() { char* random_password = kqm_random_password(16); printf("Admin password is `%s`, " "this password will not be showed again, " "please save it well by yourself.\n", random_password); int flag = set_admin_password(random_password); if (!flag) { printf("cannot set admin password hash\n"); } free(random_password); return flag; } int init_admin_password() { int result; int flag = has_admin_password(&result); if (flag) { if (!result) { flag = reset_admin_password(); } } else { printf("cannot check admin password hash\n"); } return flag; } int init_db() { if (!open_user_db()) { fprintf(stderr, "cannot open user database\n"); return 1; } if (!open_problems_db()) { fprintf(stderr, "cannot open problems database"); return 1; } if (!open_records_db()) { fprintf(stderr, "cannot open records database\n"); return 1; } if (!open_sets_db()) { fprintf(stderr, "cannot open problems set database\n"); return 1; } } int main(int argc, char** argv) { if (atexit(cleanup)) { printf("cannot register cleanup function\n"); return 1; } int flag = 0; flag |= SIG_ERR == signal(SIGINT, signal_handler); flag |= SIG_ERR == signal(SIGTERM, signal_handler); flag |= SIG_ERR == signal(SIGABRT, signal_handler); flag |= SIG_ERR == signal(SIGSEGV, signal_handler); if (flag) { printf("cannot register signal handler\n"); return 1; } if (!init_db()) { return 1; } if (!init_admin_password()) { fprintf(stderr, "cannot init admin password hash\n"); return 1; } if (argc > 1) { if (!strcmp(argv[1], "repasswd")) { int flag = reset_admin_password(); if (!flag) { fprintf(stderr, "cannot reset admin password\n"); } return !flag; } } config_t config; flag = config_read(&config, "configs/config.json"); if (!flag) { fprintf(stderr, "cannot read config file\n"); config_dtor(&config); return 1; } if (config.server_port > 65535 || config.server_port <= 0) { printf("invalid server_port: %d\n", config.server_port); config_dtor(&config); return 1; } secret = config.secret; config.secret = NULL; config_dtor(&config); char server_port_str[6]; snprintf(server_port_str, sizeof(server_port_str), "%d", config.server_port); const char* options[] = {"document_root", "./www", "listening_ports", server_port_str, "error_log_file", "logs/civetweb.log", NULL}; mg_callbacks callbacks; mg_context* ctx; memset(&callbacks, 0, sizeof(callbacks)); ctx = mg_start(&callbacks, NULL, options); mg_set_request_handler(ctx, "/api/auth/login", user_login_handler, NULL); mg_set_request_handler(ctx, "/api/auth/register", user_register_handler, NULL); mg_set_request_handler(ctx, "/api/auth/delete", user_delete_handler, NULL); mg_set_request_handler(ctx, "/api/auth/repasswd", user_repasswd_handler, NULL); mg_set_request_handler(ctx, "/api/auth/logout", user_logout_handler, NULL); mg_set_request_handler(ctx, "/api/auth/permission", user_permission_handler, NULL); mg_set_request_handler(ctx, "/api/auth/admin", admin_handler, NULL); mg_set_request_handler(ctx, "/api/study/problems", problems_handler, NULL); mg_set_request_handler(ctx, "/api/study/records", records_handler, NULL); mg_set_request_handler(ctx, "/api/study/sets", sets_handler, NULL); printf("Server started on port(s) %s\n", mg_get_option(ctx, "listening_ports")); getchar(); mg_stop(ctx); }