mirror of
https://github.com/haiwen/ccnet-server.git
synced 2025-09-16 14:59:56 +00:00
support python3 (#35)
* use searpc-named-pipe-transport * delete unused files * remove not threaded rpc * use NamedPipeClient * remove not threaded rpc * remove unused code * remove unused rpc function * remove unused code and source files * Add name of rpc named pipe to ccent.h.
This commit is contained in:
committed by
Jiaqiang Xu
parent
f014fc5263
commit
9a1858aea5
@@ -15,10 +15,6 @@
|
||||
|
||||
#include "ccnet-object.h"
|
||||
|
||||
#include "processors/rpcserver-proc.h"
|
||||
#ifdef CCNET_SERVER
|
||||
#include "processors/threaded-rpcserver-proc.h"
|
||||
#endif
|
||||
#include "searpc-server.h"
|
||||
#include "ccnet-config.h"
|
||||
|
||||
@@ -36,109 +32,24 @@
|
||||
extern CcnetSession *session;
|
||||
|
||||
#include <searpc.h>
|
||||
#include <searpc-named-pipe-transport.h>
|
||||
|
||||
#include "searpc-signature.h"
|
||||
#include "searpc-marshal.h"
|
||||
|
||||
void
|
||||
#define CCNET_SOCKET_NAME "ccnet-rpc.sock"
|
||||
|
||||
int
|
||||
ccnet_start_rpc(CcnetSession *session)
|
||||
{
|
||||
searpc_server_init (register_marshals);
|
||||
|
||||
searpc_create_service ("ccnet-rpcserver");
|
||||
ccnet_proc_factory_register_processor (session->proc_factory,
|
||||
"ccnet-rpcserver",
|
||||
CCNET_TYPE_RPCSERVER_PROC);
|
||||
|
||||
#ifdef CCNET_SERVER
|
||||
searpc_create_service ("ccnet-threaded-rpcserver");
|
||||
ccnet_proc_factory_register_processor (session->proc_factory,
|
||||
"ccnet-threaded-rpcserver",
|
||||
CCNET_TYPE_THREADED_RPCSERVER_PROC);
|
||||
#endif
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_list_peers,
|
||||
"list_peers",
|
||||
searpc_signature_string__void());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_list_resolving_peers,
|
||||
"list_resolving_peers",
|
||||
searpc_signature_objlist__void());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_get_peers_by_role,
|
||||
"get_peers_by_role",
|
||||
searpc_signature_objlist__string());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_get_peer,
|
||||
"get_peer",
|
||||
searpc_signature_object__string());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_get_peer_by_idname,
|
||||
"get_peer_by_idname",
|
||||
searpc_signature_object__string());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_update_peer_address,
|
||||
"update_peer_address",
|
||||
searpc_signature_int__string_string_int());
|
||||
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_get_session_info,
|
||||
"get_session_info",
|
||||
searpc_signature_object__void());
|
||||
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_add_client,
|
||||
"add_client",
|
||||
searpc_signature_int__string());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_add_role,
|
||||
"add_role",
|
||||
searpc_signature_int__string_string());
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_remove_role,
|
||||
"remove_role",
|
||||
searpc_signature_int__string_string());
|
||||
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_get_config,
|
||||
"get_config",
|
||||
searpc_signature_string__string());
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_set_config,
|
||||
"set_config",
|
||||
searpc_signature_int__string_string());
|
||||
|
||||
/* RSA encrypt a message with peer's public key. */
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_pubkey_encrypt,
|
||||
"pubkey_encrypt",
|
||||
searpc_signature_string__string_string());
|
||||
|
||||
/* RSA decrypt a message with my private key. */
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_privkey_decrypt,
|
||||
"privkey_decrypt",
|
||||
searpc_signature_string__string());
|
||||
|
||||
#ifdef CCNET_SERVER
|
||||
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_list_peer_stat,
|
||||
"list_peer_stat",
|
||||
searpc_signature_objlist__void());
|
||||
|
||||
|
||||
searpc_server_register_function ("ccnet-threaded-rpcserver",
|
||||
ccnet_rpc_add_emailuser,
|
||||
"add_emailuser",
|
||||
@@ -200,18 +111,6 @@ ccnet_start_rpc(CcnetSession *session)
|
||||
"get_emailusers_in_list",
|
||||
searpc_signature_objlist__string_string());
|
||||
|
||||
/* RSA sign a message with my private key. */
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_sign_message,
|
||||
"sign_message",
|
||||
searpc_signature_string__string());
|
||||
|
||||
/* Verify a message with a peer's public key */
|
||||
searpc_server_register_function ("ccnet-rpcserver",
|
||||
ccnet_rpc_verify_message,
|
||||
"verify_message",
|
||||
searpc_signature_int__string_string_string());
|
||||
|
||||
searpc_server_register_function ("ccnet-threaded-rpcserver",
|
||||
ccnet_rpc_create_group,
|
||||
"create_group",
|
||||
@@ -413,248 +312,17 @@ ccnet_start_rpc(CcnetSession *session)
|
||||
|
||||
#endif /* CCNET_SERVER */
|
||||
|
||||
}
|
||||
|
||||
char *
|
||||
ccnet_rpc_list_peers(GError **error)
|
||||
{
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
GList *peer_list, *ptr;
|
||||
GString *result;
|
||||
CcnetPeer *peer;
|
||||
|
||||
peer_list = ccnet_peer_manager_get_peer_list(peer_mgr);
|
||||
if (peer_list == NULL) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Failed to get peer list");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = g_string_new("");
|
||||
ptr = peer_list;
|
||||
while (ptr) {
|
||||
peer = ptr->data;
|
||||
g_string_append_printf(result, "%s\n", peer->id);
|
||||
ptr = ptr->next;
|
||||
}
|
||||
g_list_free(peer_list);
|
||||
|
||||
return g_string_free(result, FALSE);
|
||||
}
|
||||
|
||||
GList *
|
||||
ccnet_rpc_list_resolving_peers (GError **error)
|
||||
{
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
return ccnet_peer_manager_get_resolve_peers(peer_mgr);
|
||||
}
|
||||
|
||||
GList *
|
||||
ccnet_rpc_get_peers_by_role(const char *role, GError **error)
|
||||
{
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
return ccnet_peer_manager_get_peers_with_role (peer_mgr, role);
|
||||
}
|
||||
|
||||
|
||||
GObject *
|
||||
ccnet_rpc_get_peer(const char *peer_id, GError **error)
|
||||
{
|
||||
if (!peer_id)
|
||||
return NULL;
|
||||
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
CcnetPeer *peer = ccnet_peer_manager_get_peer(peer_mgr, peer_id);
|
||||
return (GObject*)peer;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_update_peer_address (const char *peer_id,
|
||||
const char *addr,
|
||||
int port,
|
||||
GError **error)
|
||||
{
|
||||
if (!peer_id || !addr || port <= 0 || port > 65536) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Invalid arguments");
|
||||
char *path = g_build_filename (session->config_dir, CCNET_SOCKET_NAME, NULL);
|
||||
SearpcNamedPipeServer *server = searpc_create_named_pipe_server (path);
|
||||
if (!server) {
|
||||
ccnet_warning ("Failed to create named pipe server.\n");
|
||||
g_free (path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
CcnetPeer *peer = ccnet_peer_manager_get_peer (session->peer_mgr, peer_id);
|
||||
if (!peer) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ccnet_peer_manager_set_peer_public_addr (session->peer_mgr, peer, addr, port);
|
||||
g_object_unref (peer);
|
||||
|
||||
return 0;
|
||||
return searpc_named_pipe_server_start (server);
|
||||
}
|
||||
|
||||
GObject *
|
||||
ccnet_rpc_get_peer_by_idname(const char *idname, GError **error)
|
||||
{
|
||||
if (!idname)
|
||||
return NULL;
|
||||
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
CcnetPeer *peer = ccnet_peer_manager_get_peer(peer_mgr, idname);
|
||||
if (!peer)
|
||||
peer = ccnet_peer_manager_get_peer_by_name (peer_mgr, idname);
|
||||
if (peer) {
|
||||
return (GObject*)peer;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GObject *
|
||||
ccnet_rpc_get_session_info(GError **error)
|
||||
{
|
||||
g_object_ref (session);
|
||||
return (GObject*)session;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_add_client(const char *peer_id, GError **error)
|
||||
{
|
||||
CcnetPeerManager *mgr = session->peer_mgr;
|
||||
CcnetPeer *peer;
|
||||
|
||||
if (strlen(peer_id) != 40) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Peer ID must be of length 40");
|
||||
return -1;
|
||||
}
|
||||
|
||||
peer = ccnet_peer_manager_get_peer (mgr, peer_id);
|
||||
if (!peer) {
|
||||
peer = ccnet_peer_new (peer_id);
|
||||
ccnet_peer_manager_add_peer (mgr, peer);
|
||||
}
|
||||
|
||||
ccnet_peer_manager_add_role (mgr, peer, "MyClient");
|
||||
g_object_unref (peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_add_role(const char *peer_id, const char *role, GError **error)
|
||||
{
|
||||
CcnetPeerManager *mgr = session->peer_mgr;
|
||||
CcnetPeer *peer;
|
||||
|
||||
if (!peer_id || strlen(peer_id) != 40) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Peer ID must be of length 40");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!role || strlen(role) <= 2) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Invalid role");
|
||||
return -1;
|
||||
}
|
||||
|
||||
peer = ccnet_peer_manager_get_peer (mgr, peer_id);
|
||||
if (!peer) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "No such peer");
|
||||
return -1;
|
||||
}
|
||||
ccnet_peer_manager_add_role (mgr, peer, role);
|
||||
|
||||
g_object_unref (peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_remove_role(const char *peer_id, const char *role, GError **error)
|
||||
{
|
||||
CcnetPeerManager *mgr = session->peer_mgr;
|
||||
CcnetPeer *peer;
|
||||
|
||||
if (!peer_id || strlen(peer_id) != 40) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Peer ID must be of length 40");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!role || strlen(role) <= 2) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Invalid role");
|
||||
return -1;
|
||||
}
|
||||
|
||||
peer = ccnet_peer_manager_get_peer (mgr, peer_id);
|
||||
if (!peer) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "No such peer");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ccnet_peer_manager_remove_role (mgr, peer, role);
|
||||
|
||||
g_object_unref (peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
ccnet_rpc_get_config (const char *key, GError **error)
|
||||
{
|
||||
return ccnet_session_config_get_string (session, key);
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_set_config (const char *key, const char *value, GError **error)
|
||||
{
|
||||
return ccnet_session_config_set_string (session, key, value);
|
||||
}
|
||||
|
||||
char *
|
||||
ccnet_rpc_pubkey_encrypt (const char *msg_base64, const char *peer_id, GError **error)
|
||||
{
|
||||
unsigned char *msg;
|
||||
gsize msg_len;
|
||||
CcnetPeer *peer;
|
||||
unsigned char *enc_msg;
|
||||
int enc_msg_len;
|
||||
char *ret;
|
||||
|
||||
peer = ccnet_peer_manager_get_peer (session->peer_mgr, peer_id);
|
||||
if (!peer) {
|
||||
g_warning ("Cannot find peer %s.\n", peer_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
msg = g_base64_decode (msg_base64, &msg_len);
|
||||
|
||||
enc_msg = public_key_encrypt (peer->pubkey, msg, (int)msg_len, &enc_msg_len);
|
||||
|
||||
ret = g_base64_encode (enc_msg, enc_msg_len);
|
||||
|
||||
g_free (msg);
|
||||
g_free (enc_msg);
|
||||
g_object_unref (peer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *
|
||||
ccnet_rpc_privkey_decrypt (const char *msg_base64, GError **error)
|
||||
{
|
||||
unsigned char *msg;
|
||||
gsize msg_len;
|
||||
unsigned char *dec_msg;
|
||||
int dec_msg_len;
|
||||
char *ret;
|
||||
|
||||
msg = g_base64_decode (msg_base64, &msg_len);
|
||||
|
||||
dec_msg = private_key_decrypt (session->privkey, msg, (int)msg_len, &dec_msg_len);
|
||||
|
||||
if (dec_msg_len < 0) {
|
||||
g_warning ("Failed to decrypt message with RSA priv key.\n");
|
||||
g_set_error (error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Failed to decrypt");
|
||||
g_free (msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = g_base64_encode (dec_msg, dec_msg_len);
|
||||
|
||||
g_free (msg);
|
||||
g_free (dec_msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CCNET_SERVER
|
||||
|
||||
@@ -662,48 +330,6 @@ ccnet_rpc_privkey_decrypt (const char *msg_base64, GError **error)
|
||||
#include "group-mgr.h"
|
||||
#include "org-mgr.h"
|
||||
|
||||
|
||||
GList *
|
||||
ccnet_rpc_list_peer_stat (GError **error)
|
||||
{
|
||||
GList *res = NULL;
|
||||
GList *ptr, *peer_list;
|
||||
CcnetPeer *peer;
|
||||
CcnetPeerManager *peer_mgr = session->peer_mgr;
|
||||
|
||||
peer_list = ccnet_peer_manager_get_peer_list(peer_mgr);
|
||||
if (peer_list == NULL) {
|
||||
g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Failed to get peer list");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = peer_list;
|
||||
while (ptr) {
|
||||
peer = ptr->data;
|
||||
if (peer->is_self) {
|
||||
ptr = ptr->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
guint proc_num = g_hash_table_size (peer->processors);
|
||||
|
||||
CcnetPeerStat* stat = ccnet_peer_stat_new ();
|
||||
g_object_set (stat, "id", peer->id,
|
||||
"name", peer->name,
|
||||
"ip", peer->addr_str,
|
||||
"encrypt", peer->encrypt_channel,
|
||||
"last_up", (gint64) peer->last_up,
|
||||
"proc_num", (int)proc_num,
|
||||
NULL);
|
||||
res = g_list_prepend (res, stat);
|
||||
ptr = ptr->next;
|
||||
}
|
||||
g_list_free(peer_list);
|
||||
|
||||
return g_list_reverse (res);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ccnet_rpc_add_emailuser (const char *email, const char *passwd,
|
||||
int is_staff, int is_active, GError **error)
|
||||
@@ -965,55 +591,6 @@ ccnet_rpc_get_superusers (GError **error)
|
||||
return ccnet_user_manager_get_superusers(user_mgr);
|
||||
}
|
||||
|
||||
char *
|
||||
ccnet_rpc_sign_message (const char *message, GError **error)
|
||||
{
|
||||
unsigned char *sig;
|
||||
unsigned int sig_len;
|
||||
char *sigret;
|
||||
|
||||
sig = g_new0(unsigned char, RSA_size(session->privkey));
|
||||
|
||||
if (!RSA_sign (NID_sha1, (const unsigned char *)message, strlen(message),
|
||||
sig, &sig_len, session->privkey)) {
|
||||
g_warning ("Failed to sign message: %lu.\n", ERR_get_error());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sigret = g_base64_encode (sig, sig_len);
|
||||
g_free (sig);
|
||||
|
||||
return sigret;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_verify_message (const char *message,
|
||||
const char *sig_base64,
|
||||
const char *peer_id,
|
||||
GError **error)
|
||||
{
|
||||
unsigned char *sig;
|
||||
gsize sig_len;
|
||||
CcnetPeer *peer;
|
||||
|
||||
sig = g_base64_decode (sig_base64, &sig_len);
|
||||
|
||||
peer = ccnet_peer_manager_get_peer (session->peer_mgr, peer_id);
|
||||
if (!peer) {
|
||||
g_warning ("Cannot find peer %s.\n", peer_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!RSA_verify (NID_sha1, (const unsigned char *)message, strlen(message),
|
||||
sig, (guint)sig_len, peer->pubkey)) {
|
||||
g_object_unref (peer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_object_unref (peer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ccnet_rpc_create_group (const char *group_name, const char *user_name,
|
||||
const char *type, int parent_group_id, GError **error)
|
||||
|
Reference in New Issue
Block a user