Ejemplo n.º 1
0
/**
 * Create a path to the per-player settings directory.
 * @param path
 * Path inside the per-player settings directory.
 * @return
 * New path. Must be freed.
 */
char *file_path_player(const char *path)
{
    StringBuffer *sb;

    HARD_ASSERT(path != NULL);

    sb = file_path_server_internal();

    SOFT_ASSERT_LABEL(*cpl.account != '\0', done, "Account name is empty.");
    SOFT_ASSERT_LABEL(*cpl.name != '\0', done, "Player name is empty.");

    stringbuffer_append_printf(sb, "%s/%s/%s", cpl.account, cpl.name, path);

done:
    return stringbuffer_finish(sb);
}
Ejemplo n.º 2
0
/**
 * Parse a single metaserver data node within a 'server' node.
 *
 * @param node
 * The data node.
 * @param server
 * Allocated server structure.
 * @return
 * True on success, false on failure.
 */
static bool
parse_metaserver_data_node (xmlNodePtr node, server_struct *server)
{
    HARD_ASSERT(node != NULL);
    HARD_ASSERT(server != NULL);

    xmlChar *content = xmlNodeGetContent(node);
    SOFT_ASSERT_LABEL(content != NULL && *content != '\0',
                      error,
                      "Parsing error");

    if (XML_STR_EQUAL(node->name, "Hostname")) {
        SOFT_ASSERT_LABEL(server->hostname == NULL, error, "Parsing error");
        server->hostname = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "Port")) {
        SOFT_ASSERT_LABEL(server->port == 0, error, "Parsing error");
        server->port = atoi((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "PortCrypto")) {
        SOFT_ASSERT_LABEL(server->port_crypto == -1, error, "Parsing error");
        server->port_crypto = atoi((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "Name")) {
        SOFT_ASSERT_LABEL(server->name == NULL, error, "Parsing error");
        server->name = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "PlayersCount")) {
        SOFT_ASSERT_LABEL(server->player == 0, error, "Parsing error");
        server->player = atoi((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "Version")) {
        SOFT_ASSERT_LABEL(server->version == NULL, error, "Parsing error");
        server->version = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "TextComment")) {
        SOFT_ASSERT_LABEL(server->desc == NULL, error, "Parsing error");
        server->desc = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "CertificatePublicKey")) {
        SOFT_ASSERT_LABEL(server->cert_pubkey == NULL, error, "Parsing error");
        server->cert_pubkey = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "Certificate")) {
        SOFT_ASSERT_LABEL(server->cert == NULL, error, "Parsing error");
        server->cert = estrdup((const char *) content);
    } else if (XML_STR_EQUAL(node->name, "CertificateSignature")) {
        SOFT_ASSERT_LABEL(server->cert_sig == NULL, error, "Parsing error");
        unsigned char *sig;
        size_t sig_len;
        if (!math_base64_decode((const char *) content, &sig, &sig_len)) {
            LOG(ERROR, "Error decoding BASE64 certificate signature");
            goto error;
        }

        server->cert_sig = sig;
        server->cert_sig_len = sig_len;
    } else {
        LOG(DEVEL, "Unrecognized node: %s", (const char *) node->name);
    }

    bool ret = true;
    goto out;

error:
    ret = false;

out:
    if (content != NULL) {
        xmlFree(content);
    }

    return ret;
}