mirror of
https://github.com/haiwen/ccnet-server.git
synced 2025-07-17 15:11:02 +00:00
291 lines
8.0 KiB
C
291 lines
8.0 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
#include "common.h"
|
|
|
|
#include <signal.h>
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
#include <time.h>
|
|
|
|
#include "getgateway.h"
|
|
#include "utils.h"
|
|
#include "net.h"
|
|
#include "rsa.h"
|
|
|
|
#include "server-session.h"
|
|
#include "peer.h"
|
|
#include "peer-mgr.h"
|
|
#include "perm-mgr.h"
|
|
#include "packet-io.h"
|
|
#include "connect-mgr.h"
|
|
#include "message.h"
|
|
#include "message-manager.h"
|
|
#include "proc-factory.h"
|
|
#include "algorithms.h"
|
|
#include "ccnet-config.h"
|
|
#include "user-mgr.h"
|
|
#include "group-mgr.h"
|
|
#include "org-mgr.h"
|
|
#include "job-mgr.h"
|
|
|
|
#define DEBUG_FLAG CCNET_DEBUG_OTHER
|
|
#include "log.h"
|
|
#define CCNET_DB "ccnet.db"
|
|
|
|
G_DEFINE_TYPE (CcnetServerSession, ccnet_server_session, CCNET_TYPE_SESSION);
|
|
|
|
static int load_database_config (CcnetSession *session);
|
|
static int server_session_prepare (CcnetSession *session);
|
|
static void server_session_start (CcnetSession *session);
|
|
static void on_peer_auth_done (CcnetSession *session, CcnetPeer *peer);
|
|
|
|
|
|
static void
|
|
ccnet_server_session_class_init (CcnetServerSessionClass *klass)
|
|
{
|
|
CcnetSessionClass *session_class = CCNET_SESSION_CLASS (klass);
|
|
|
|
session_class->prepare = server_session_prepare;
|
|
session_class->start = server_session_start;
|
|
session_class->on_peer_auth_done = on_peer_auth_done;
|
|
}
|
|
|
|
static void
|
|
ccnet_server_session_init (CcnetServerSession *server_session)
|
|
{
|
|
CcnetSession *session = (CcnetSession *)server_session;
|
|
server_session->user_mgr = ccnet_user_manager_new (session);
|
|
server_session->group_mgr = ccnet_group_manager_new (session);
|
|
server_session->org_mgr = ccnet_org_manager_new (session);
|
|
}
|
|
|
|
CcnetServerSession *
|
|
ccnet_server_session_new (const char *config_dir_r)
|
|
{
|
|
return g_object_new (CCNET_TYPE_SERVER_SESSION, NULL);
|
|
}
|
|
|
|
int
|
|
server_session_prepare (CcnetSession *session)
|
|
{
|
|
CcnetServerSession *server_session = (CcnetServerSession *)session;
|
|
char *service_url = NULL;
|
|
|
|
service_url = ccnet_key_file_get_string (session->keyf, "General", "SERVICE_URL");
|
|
session->base.service_url = service_url;
|
|
|
|
if (load_database_config (session) < 0) {
|
|
ccnet_warning ("Failed to load database config.\n");
|
|
return -1;
|
|
}
|
|
|
|
/* */
|
|
char *enc;
|
|
enc = ccnet_key_file_get_string (session->keyf, "NETWORK", "ENCRYPT_CHANNEL");
|
|
if (enc && g_ascii_strncasecmp(enc, "false", 5) == 0)
|
|
session->encrypt_channel = 0;
|
|
else
|
|
/* encrypt channel on default */
|
|
session->encrypt_channel = 1;
|
|
|
|
if (ccnet_user_manager_prepare (server_session->user_mgr) < 0)
|
|
return -1;
|
|
|
|
if (ccnet_group_manager_prepare (server_session->group_mgr) < 0)
|
|
return -1;
|
|
|
|
if (ccnet_org_manager_prepare (server_session->org_mgr) < 0)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
server_session_start (CcnetSession *session)
|
|
{
|
|
g_signal_connect (session->peer_mgr, "peer-auth-done",
|
|
G_CALLBACK(on_peer_auth_done), NULL);
|
|
}
|
|
|
|
#define DEFAULT_MAX_CONNECTIONS 100
|
|
|
|
static int init_sqlite_database (CcnetSession *session)
|
|
{
|
|
char *db_path;
|
|
|
|
db_path = g_build_path ("/", session->config_dir, CCNET_DB, NULL);
|
|
session->db = ccnet_db_new_sqlite (db_path);
|
|
if (!session->db) {
|
|
g_warning ("Failed to open database.\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#ifdef HAVE_MYSQL
|
|
|
|
#define MYSQL_DEFAULT_PORT 3306
|
|
|
|
static int init_mysql_database (CcnetSession *session)
|
|
{
|
|
char *host, *user, *passwd, *db, *unix_socket, *charset;
|
|
int port;
|
|
gboolean use_ssl = FALSE;
|
|
int max_connections = 0;
|
|
|
|
host = ccnet_key_file_get_string (session->keyf, "Database", "HOST");
|
|
user = ccnet_key_file_get_string (session->keyf, "Database", "USER");
|
|
passwd = ccnet_key_file_get_string (session->keyf, "Database", "PASSWD");
|
|
db = ccnet_key_file_get_string (session->keyf, "Database", "DB");
|
|
|
|
if (!host) {
|
|
g_warning ("DB host not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!user) {
|
|
g_warning ("DB user not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!passwd) {
|
|
g_warning ("DB passwd not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!db) {
|
|
g_warning ("DB name not set in config.\n");
|
|
return -1;
|
|
}
|
|
|
|
GError *error = NULL;
|
|
port = g_key_file_get_integer (session->keyf, "Database", "PORT", &error);
|
|
if (error) {
|
|
g_clear_error (&error);
|
|
port = MYSQL_DEFAULT_PORT;
|
|
}
|
|
|
|
unix_socket = ccnet_key_file_get_string (session->keyf,
|
|
"Database", "UNIX_SOCKET");
|
|
use_ssl = g_key_file_get_boolean (session->keyf, "Database", "USE_SSL", NULL);
|
|
|
|
charset = ccnet_key_file_get_string (session->keyf,
|
|
"Database", "CONNECTION_CHARSET");
|
|
|
|
max_connections = g_key_file_get_integer (session->keyf,
|
|
"Database", "MAX_CONNECTIONS",
|
|
&error);
|
|
if (error || max_connections < 0) {
|
|
max_connections = DEFAULT_MAX_CONNECTIONS;
|
|
g_clear_error (&error);
|
|
}
|
|
|
|
session->db = ccnet_db_new_mysql (host, port, user, passwd, db, unix_socket, use_ssl, charset, max_connections);
|
|
if (!session->db) {
|
|
g_warning ("Failed to open database.\n");
|
|
return -1;
|
|
}
|
|
|
|
g_free (host);
|
|
g_free (user);
|
|
g_free (passwd);
|
|
g_free (db);
|
|
g_free (unix_socket);
|
|
g_free (charset);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_POSTGRESQL
|
|
|
|
static int init_pgsql_database (CcnetSession *session)
|
|
{
|
|
char *host, *user, *passwd, *db, *unix_socket;
|
|
unsigned int port;
|
|
|
|
host = ccnet_key_file_get_string (session->keyf, "Database", "HOST");
|
|
user = ccnet_key_file_get_string (session->keyf, "Database", "USER");
|
|
passwd = ccnet_key_file_get_string (session->keyf, "Database", "PASSWD");
|
|
db = ccnet_key_file_get_string (session->keyf, "Database", "DB");
|
|
|
|
if (!host) {
|
|
g_warning ("DB host not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!user) {
|
|
g_warning ("DB user not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!passwd) {
|
|
g_warning ("DB passwd not set in config.\n");
|
|
return -1;
|
|
}
|
|
if (!db) {
|
|
g_warning ("DB name not set in config.\n");
|
|
return -1;
|
|
}
|
|
|
|
GError *error = NULL;
|
|
port = g_key_file_get_integer (session->keyf, "Database", "PORT", &error);
|
|
if (error) {
|
|
port = 0;
|
|
g_clear_error (&error);
|
|
}
|
|
unix_socket = ccnet_key_file_get_string (session->keyf,
|
|
"Database", "UNIX_SOCKET");
|
|
|
|
session->db = ccnet_db_new_pgsql (host, port, user, passwd, db, unix_socket,
|
|
DEFAULT_MAX_CONNECTIONS);
|
|
if (!session->db) {
|
|
g_warning ("Failed to open database.\n");
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
static int
|
|
load_database_config (CcnetSession *session)
|
|
{
|
|
int ret;
|
|
char *engine;
|
|
gboolean create_tables = FALSE;
|
|
|
|
engine = ccnet_key_file_get_string (session->keyf, "Database", "ENGINE");
|
|
if (!engine || strncasecmp (engine, DB_SQLITE, sizeof(DB_SQLITE)) == 0) {
|
|
ccnet_debug ("Use database sqlite\n");
|
|
ret = init_sqlite_database (session);
|
|
}
|
|
#ifdef HAVE_MYSQL
|
|
else if (strncasecmp (engine, DB_MYSQL, sizeof(DB_MYSQL)) == 0) {
|
|
ccnet_debug ("Use database Mysql\n");
|
|
ret = init_mysql_database (session);
|
|
}
|
|
#endif
|
|
#ifdef HAVE_POSTGRESQL
|
|
else if (strncasecmp (engine, DB_PGSQL, sizeof(DB_PGSQL)) == 0) {
|
|
ccnet_debug ("Use database PostgreSQL\n");
|
|
ret = init_pgsql_database (session);
|
|
}
|
|
#endif
|
|
else {
|
|
ccnet_warning ("Unknown database type: %s.\n", engine);
|
|
ret = -1;
|
|
}
|
|
if (ret == 0) {
|
|
if (g_key_file_has_key (session->keyf, "Database", "CREATE_TABLES", NULL))
|
|
create_tables = g_key_file_get_boolean (session->keyf, "Database", "CREATE_TABLES", NULL);
|
|
session->create_tables = create_tables;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
static void
|
|
on_peer_auth_done (CcnetSession *session, CcnetPeer *peer)
|
|
{
|
|
ccnet_peer_manager_send_ready_message (session->peer_mgr, peer);
|
|
}
|