math/src/main.c
2025-01-04 21:12:46 +08:00

176 lines
4.6 KiB
C

#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 <civetweb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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);
}