176 lines
4.6 KiB
C
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);
|
|
}
|