Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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);
}
Beispiel #8
0
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;
}
Beispiel #9
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;
}
Beispiel #10
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);
}