예제 #1
0
/**
 * generic acl checking for different methods (basic set of methods supported)
 * returns null if no err
 */
static dav_error *check_methods(request_rec *r, const dav_resource *resource,
                                davacl_dir_cfg *conf)
{
    const dav_hooks_repository *repos = REPOS(conf);

    if (repos == NULL || resource == NULL)
	return dav_acl_privilege_error(r, "unknown", NULL);

    switch (r->method_number) {
    default:
	if (r->method_number == iM_ACL) {
	    return check_acl(r, resource, conf, repos);
	}
	else if (r->method_number == iM_HEAD) {
	    return check_get(r, resource, conf, repos);
	}
	else {
	    TRACE(r, "Unknown methdod:%d", r->method_number);
	    return NULL;
	}
	break;

    case M_PUT:
	return check_put(r, resource, conf, repos);

    case M_PROPPATCH:
	return check_proppatch(r, resource, conf, repos);

    case M_MKCOL:
	return check_mkcol(r, resource, conf, repos);

    case M_PROPFIND:
	/* done with individual properties within dav_get_props() and
	 * dav_get_allprops */
	return NULL;

    case M_DELETE:
	return check_delete(r, resource, conf, repos);

    case M_OPTIONS:
    case M_GET:
	return check_get(r, resource, conf, repos);

    case M_COPY:
	return check_copy(r, resource, conf, repos);

    case M_MOVE:
	return check_move(r, resource, conf, repos);

    case M_LOCK:
	return check_lock(r, resource, conf, repos);

    case M_UNLOCK:
	return check_unlock(r, resource, conf, repos);
    }
}
void dns_cli::process_command(const std::string& cmd, const std::string& args)
{
    std::vector<std::string> argv;
    boost::split(argv, args, boost::is_any_of(" "), boost::token_compress_on);
    //std::stringstream ss(args); TODO: Unnecessary?

    const dns_db_ptr db = std::dynamic_pointer_cast<dns_db>(client()->get_chain());
    const dns_wallet_ptr wallet = std::dynamic_pointer_cast<dns_wallet>(client()->get_wallet());

    if (cmd == "bid_on_domain")
    {
        if (check_unlock())
        {
            FC_ASSERT(argv.size() == 3); // cmd name amount
            std::string name = argv[1];
            asset bid = asset(uint64_t(atoi(argv[2].c_str())));
            signed_transactions tx_pool;

            auto tx = wallet->bid_on_domain(name, bid, tx_pool, *db);

            client()->broadcast_transaction(tx);
        }
    }
    else if (cmd == "auction_domain")
    {
        if (check_unlock())
        {
            FC_ASSERT(argv.size() == 3); // cmd name price
            std::string name = argv[1];
            asset price = asset(uint64_t(atoi(argv[2].c_str())));
            signed_transactions tx_pool;

            auto tx = wallet->auction_domain(name, price, tx_pool, *db);

            client()->broadcast_transaction(tx);
        }
    }
    else if (cmd == "transfer_domain")
    {
        if (check_unlock())
        {
            FC_ASSERT(argv.size() == 3); // cmd name to
            std::string name = argv[1];
            auto to_owner = bts::blockchain::address(argv[2]);
            signed_transactions tx_pool;

            auto tx = wallet->transfer_domain(name, to_owner, tx_pool, *db);

            client()->broadcast_transaction(tx);
        }
    }
    else if (cmd == "update_domain_record")
    {
        if (check_unlock())
        {
            FC_ASSERT(argv.size() == 3); // cmd name path
            std::string name = argv[1];
            asset bid = asset(uint64_t(atoi(argv[2].c_str())));
            signed_transactions tx_pool;

            auto tx = wallet->bid_on_domain(name, bid, tx_pool, *db);

            client()->broadcast_transaction(tx);
        }

        // convert arbitrary json value to string..., this validates that it parses
        // properly.
        //fc::variant val = fc::json::from_string(json_value);
    }
    else if (cmd == "list_active_auctions")
    {
        FC_ASSERT(argv.size() == 1);

        auto active_auctions = get_active_auctions(*db);

        for (auto output : active_auctions)
        {
            auto dns_output = to_domain_output(output);

            std::cout << "[" << output.amount.get_rounded_amount() << "] " << dns_output.name << "\n";
        }
    }
    else if (cmd == "lookup_domain_record")
    {
        FC_ASSERT(argv.size() == 2);
        std::string name = argv[1];

        auto value = lookup_value(name, *db);
        std::string record;
        from_variant(value, record);

        std::cout << record << "\n";
    }
    else
    {
        cli::process_command(cmd, args);
    }
}