void                    server::store_key( const std::string& name, const stored_key& k )
 {
    auto cur_rec = fetch_record( name );
    FC_ASSERT( k.encrypted_key.size() < 1024*16 );
    FC_ASSERT( cur_rec.master_key == k.get_signee()  );
    my->_key_data.store( name, k );
 }
   bool server::update_record( const signed_name_record& r )
   { try {
      FC_ASSERT( my->_pending.size() < 20000 );
      FC_ASSERT( fc::trim_and_normalize_spaces( r.name ) == r.name );
      FC_ASSERT( fc::to_lower( r.name ) == r.name );
      FC_ASSERT( r.difficulty() >= my->_current_block.difficulty, "",
                 ("r.difficulty",r.difficulty())("current_difficulty",my->_current_block.difficulty));
      FC_ASSERT( my->_current_block_id == r.prev_block_id     );
      FC_ASSERT( r.get_signee() == r.master_key );

      auto pending_itr = my->_pending.find( r.name );
      FC_ASSERT( pending_itr == my->_pending.end()         );
      auto hist = fetch_history( r.name ); 
      if( hist.updates.size() == 0 )
      {
         my->_pending[r.name] = r;
         return true;
      }

      auto old_record  = fetch_record( hist.updates.back() );
      FC_ASSERT( old_record.master_key == r.master_key )
      FC_ASSERT( r.first_update == old_record.first_update );
      FC_ASSERT( r.last_update  > old_record.last_update );
      FC_ASSERT( fc::time_point::now() > fc::time_point(r.last_update) );
      FC_ASSERT( (fc::time_point::now() - fc::time_point(r.last_update)) < fc::seconds( 120 ) );
      my->_pending[r.name] = r;
      return true;
   } FC_RETHROW_EXCEPTIONS( warn, "unable to update record ${rec}", ("rec",r) ) }
   signed_name_record      server::fetch_record( const std::string& name )
   {
      auto pending_itr = my->_pending.find( name );
      if( pending_itr != my->_pending.end() )
         return pending_itr->second;
      auto hist= fetch_history( name ); 
      FC_ASSERT( hist.updates.size() > 0 );

      auto old_block   = fetch_block( hist.updates.back().block_num );
      return fetch_record( hist.updates.back() );
      FC_ASSERT( old_block.records.size() > hist.updates.back().record_num );
      return old_block.records[hist.updates.back().record_num];
   }
Example #4
0
static int hidp_add_connection(const struct input_device *idev,
				const struct input_conn *iconn)
{
	struct hidp_connadd_req *req;
	struct fake_hid *fake_hid;
	struct fake_input *fake;
	sdp_record_t *rec;
	char src_addr[18], dst_addr[18];
	int err;

	req = g_new0(struct hidp_connadd_req, 1);
	req->ctrl_sock = g_io_channel_unix_get_fd(iconn->ctrl_io);
	req->intr_sock = g_io_channel_unix_get_fd(iconn->intr_io);
	req->flags     = 0;
	req->idle_to   = iconn->timeout;

	ba2str(&idev->src, src_addr);
	ba2str(&idev->dst, dst_addr);

	rec = fetch_record(src_addr, dst_addr, idev->handle);
	if (!rec) {
		error("Rejected connection from unknown device %s", dst_addr);
		err = -EPERM;
		goto cleanup;
	}

	extract_hid_record(rec, req);
	sdp_record_free(rec);

	read_device_id(src_addr, dst_addr, NULL,
				&req->vendor, &req->product, &req->version);

	fake_hid = get_fake_hid(req->vendor, req->product);
	if (fake_hid) {
		fake = g_new0(struct fake_input, 1);
		fake->connect = fake_hid_connect;
		fake->disconnect = fake_hid_disconnect;
		fake->priv = fake_hid;
		err = fake_hid_connadd(fake, iconn->intr_io, fake_hid);
		goto cleanup;
	}

	if (idev->name)
		strncpy(req->name, idev->name, sizeof(req->name) - 1);

	/* Encryption is mandatory for keyboards */
	if (req->subclass & 0x40) {
		err = bt_acl_encrypt(&idev->src, &idev->dst, encrypt_completed, req);
		if (err == 0) {
			/* Waiting async encryption */
			return 0;
		} else if (err != -EALREADY) {
			error("bt_acl_encrypt(): %s(%d)", strerror(-err), -err);
			goto cleanup;
		}
	}

	err = ioctl_connadd(req);

cleanup:
	free(req->rd_data);
	g_free(req);

	return err;
}
 signed_name_record      server::fetch_record_by_key( const std::string& key_b58 )
 {
    auto name = my->_key_to_name.fetch( key_b58 );
    return fetch_record( name );
 }
Example #6
0
static int hidp_add_connection(struct input_device *idev,
					struct input_conn *iconn)
{
	struct hidp_connadd_req *req;
	struct fake_hid *fake_hid;
	struct fake_input *fake;
	sdp_record_t *rec;
	char src_addr[18], dst_addr[18];
	GError *gerr = NULL;
	int err;

	DBG("idev %p", idev);

	req = g_new0(struct hidp_connadd_req, 1);
	req->ctrl_sock = g_io_channel_unix_get_fd(iconn->ctrl_io);
	req->intr_sock = g_io_channel_unix_get_fd(iconn->intr_io);
	req->flags     = 0;
	req->idle_to   = iconn->timeout;

	ba2str(&idev->src, src_addr);
	ba2str(&idev->dst, dst_addr);

	rec = fetch_record(src_addr, dst_addr, idev->handle);
	if (!rec) {
		error("Rejected connection from unknown device %s", dst_addr);
		err = -EPERM;
		goto cleanup;
	}

	extract_hid_record(rec, req);
	extract_hid_props(idev, rec);
	sdp_record_free(rec);

	req->vendor = btd_device_get_vendor(idev->device);
	req->product = btd_device_get_product(idev->device);
	req->version = btd_device_get_version(idev->device);

	fake_hid = get_fake_hid(req->vendor, req->product);
	if (fake_hid) {
		err = 0;
		fake = g_new0(struct fake_input, 1);
		fake->connect = fake_hid_connect;
		fake->disconnect = fake_hid_disconnect;
		fake->priv = fake_hid;
		fake->idev = idev;
		fake = fake_hid_connadd(fake, iconn->intr_io, fake_hid);
		if (fake == NULL)
			err = -ENOMEM;
		else
			fake->flags |= FI_FLAG_CONNECTED;
		goto cleanup;
	}

	if (idev->name)
		strncpy(req->name, idev->name, sizeof(req->name) - 1);

	/* Encryption is mandatory for keyboards */
	if (req->subclass & 0x40) {
		struct btd_adapter *adapter = device_get_adapter(idev->device);

		err = btd_adapter_encrypt_link(adapter, (bdaddr_t *) &idev->dst,
						encrypt_completed, req);
		if (err == 0) {
			/* Waiting async encryption */
			return 0;
		}

		if (err == -ENOSYS)
			goto nosys;

		if (err != -EALREADY) {
			error("encrypt_link: %s (%d)", strerror(-err), -err);
			goto cleanup;
		}
	}

	err = ioctl_connadd(req);

cleanup:
	free(req->rd_data);
	g_free(req);

	return err;

nosys:
	if (!bt_io_set(iconn->intr_io, BT_IO_L2CAP, &gerr,
				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
				BT_IO_OPT_INVALID)) {
		error("btio: %s", gerr->message);
		g_error_free(gerr);
		goto cleanup;
	}

	iconn->req = req;
	iconn->sec_watch = g_io_add_watch(iconn->intr_io, G_IO_OUT,
							encrypt_notify, iconn);
	return 0;
}