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_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_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; }
void test_perm_manager() { CcnetPeer *peer; peer = ccnet_peer_manager_get_peer (session->peer_mgr, rendezvous); if (!peer) { fprintf (stderr, "Can't get peer. You should call setup first.\n"); exit (1); } char *argv[10]; argv[0] = "put-pubinfo"; argv[1] = NULL; g_assert (ccnet_perm_manager_check_permission ( session->perm_mgr, peer, "put-pubinfo", 0, 1, argv) == PERM_CHECK_OK); g_assert (ccnet_perm_manager_check_permission ( session->perm_mgr, peer, "ccnet-rpcserver", 0, 1, argv) == PERM_CHECK_ERROR); g_assert (ccnet_perm_manager_check_role_permission ( session->perm_mgr, "MyClient", "seafserv") == PERM_CHECK_OK); g_object_unref (peer); }
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; }
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; }
static void create_processor (CcnetPeer *peer, int req_id, int argc, char **argv) { CcnetSession *session = peer->manager->session; if (strcmp(argv[0], "remote") == 0) { /* we have check this before (in permission checking) */ g_assert (peer->is_local); CcnetPeer *remote_peer; remote_peer = ccnet_peer_manager_get_peer (peer->manager, argv[1]); if (!remote_peer) { ccnet_peer_send_response (peer, req_id, SC_UNKNOWN_PEER, SS_UNKNOWN_PEER, NULL, 0); ccnet_warning ("Unknown remote peer in invoking remote service\n"); return; } /* if (remote_peer->net_state == PEER_DOWN) { */ /* ccnet_peerSendResponse (peer, req_id, SC_PEER_UNREACHABLE, */ /* SS_PEER_UNREACHABLE, NULL, 0); */ /* ccnet_warning ("Unreachable remote peer in invoking remote service\n"); */ /* return; */ /* } */ /* To simplify caller's logic, we allow starting a remote processor to * local host. Translate this call into a local one. */ if (session->myself == remote_peer) { create_local_processor (peer, req_id, argc-2, argv+2); g_object_unref (remote_peer); return; } create_remote_processor (peer, remote_peer, req_id, argc-2, argv+2); g_object_unref (remote_peer); return; } create_local_processor (peer, req_id, argc, argv); }
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_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"); 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; }
static void myHandshakeDoneCB (CcnetHandshake *handshake, CcnetPacketIO *io, int is_connected, const char *peer_id, void *vmanager) { CcnetConnManager *manager = vmanager; CcnetPeerManager *peerMgr = manager->session->peer_mgr; CcnetPeer *peer; if (!is_connected) { if (ccnet_packet_io_is_incoming (io)) { ccnet_warning ("[conn] incoming handshake fails.\n"); ccnet_packet_io_free (io); return; } /* temporally use peer, so don't need to increase the reference */ peer = handshake->peer; if (peer->num_fails == 0) { /* print error for the first time */ ccnet_message ("[Conn] peer %s(%.10s) connection fails\n", peer->name, peer->id); } else { ccnet_debug ("[Conn] peer %s(%.10s) connection fails\n", peer->name, peer->id); } if (peer->net_state == PEER_CONNECTED) { ccnet_debug ("[Conn] But Peer %s(%.10s) is already connected me.\n", peer->name, peer->id); } else if (peer->net_state == PEER_DOWN){ ccnet_peer_shutdown(peer); } ccnet_packet_io_free (io); peer->num_fails++; peer->in_connection = 0; return; } if (!ccnet_packet_io_is_incoming (io)) { peer = handshake->peer; peer->in_connection = 0; if (peer->to_resolve) { if (!peer_id_valid(peer_id)) { /* TODO: Remove the peer */ ccnet_warning ("[Conn] Resolving: Received invalid peer id\n"); return; } ccnet_debug ("[Conn] Resolving: Peer %.8s is resolved\n", peer_id); memcpy (peer->id, peer_id, 40); peer->id[40] = '\0'; on_resolve_peer_connected (peer, io); return; } /* ref for using the peer below */ g_object_ref (peer); } else { /* incoming */ if (peer_id == NULL) { ccnet_warning ("Unknown peer (no-id) connecting\n"); ccnet_packet_io_free (io); return; } peer = ccnet_peer_manager_get_peer (peerMgr, peer_id); if (!peer) { ccnet_message ("Unknown peer %s connecting\n", peer_id); peer = ccnet_peer_new (peer_id); ccnet_peer_manager_add_peer (peerMgr, peer); set_peer_address_from_socket(peer, io); peer->last_up = time(NULL); on_unauthed_peer_connected (peer, io); g_object_unref (peer); return; } set_peer_address_from_socket(peer, io); peer->last_up = time(NULL); } /* hold a reference on the peer */ if (peer->net_state == PEER_CONNECTED) { ccnet_message ("[Conn] Peer %s (%.10s) is already connected. " "Discarding this handshake.\n", peer->name, peer->id); ccnet_packet_io_free (io); g_object_unref (peer); return; } ccnet_message ("[Conn] Peer %s (%.10s) connected\n", peer->name, peer->id); peer->num_fails = 0; on_peer_connected (peer, io); g_object_unref (peer); }