Exemple #1
0
/* ID mapping - bug in computing max id for slice range */
void test_map_id_2922(void **state)
{
    const char* TEST_2922_FIRST_SID = TEST_DOM_SID"-0";
    /* Last SID = first SID + (default) rangesize -1 */
    const char* TEST_2922_LAST_SID = TEST_DOM_SID"-199999";
    /* Last SID = first SID + rangesize */
    const char* TEST_2922_LAST_SID_PLUS_ONE = TEST_DOM_SID"-200000";
    struct test_ctx *test_ctx;
    enum idmap_error_code err;
    uint32_t id;
    char *sid = NULL;

    test_ctx = talloc_get_type(*state, struct test_ctx);

    assert_non_null(test_ctx);

    /* Min UNIX ID to SID */
    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MIN_ID, &sid);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_string_equal(sid, TEST_2922_FIRST_SID);
    sss_idmap_free_sid(test_ctx->idmap_ctx, sid);

    /* First SID to UNIX ID */
    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_FIRST_SID, &id);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_int_equal(id, TEST_2922_MIN_ID);

    /* Max UNIX ID to SID */
    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID, &sid);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_string_equal(sid, TEST_2922_LAST_SID);
    sss_idmap_free_sid(test_ctx->idmap_ctx, sid);

    /* Last SID to UNIX ID */
    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_LAST_SID, &id);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_int_equal(id, TEST_2922_MAX_ID);

    /* Max UNIX ID + 1 to SID */
    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID + 1,
                                &sid);
    assert_int_equal(err, IDMAP_NO_DOMAIN);

    /* Last SID + 1 to UNIX ID */
    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx,
                                TEST_2922_LAST_SID_PLUS_ONE, &id);
    /* Auto adding new ranges is disable in this test.  */
    assert_int_equal(err, IDMAP_NO_RANGE);
}
Exemple #2
0
void test_map_id_sec_slices(void **state)
{
    struct test_ctx *test_ctx;
    enum idmap_error_code err;
    uint32_t id;
    char *sid = NULL;

    test_ctx = talloc_get_type(*state, struct test_ctx);

    assert_non_null(test_ctx);

    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"1-1", &id);
    assert_int_equal(err, IDMAP_NO_DOMAIN);

    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"-4000000",
                                &id);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_int_equal(id, 575600000);

    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_OFFSET - 1, &sid);
    assert_int_equal(err, IDMAP_NO_DOMAIN);

    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"-0", &id);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_int_equal(id, TEST_RANGE_MIN);

    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, id, &sid);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_string_equal(sid, TEST_DOM_SID"-0");
    sss_idmap_free_sid(test_ctx->idmap_ctx, sid);

    err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx,
                                TEST_DOM_SID"-"TEST_OFFSET_STR, &id);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_int_equal(id, TEST_RANGE_MIN+TEST_OFFSET);

    err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, id, &sid);
    assert_int_equal(err, IDMAP_SUCCESS);
    assert_string_equal(sid, TEST_DOM_SID"-"TEST_OFFSET_STR);
    sss_idmap_free_sid(test_ctx->idmap_ctx, sid);
}
Exemple #3
0
static errno_t
add_sids_from_rid_array_to_hash_table(struct dom_sid *dom_sid,
                                      struct samr_RidWithAttributeArray *groups,
                                      struct sss_idmap_ctx *idmap_ctx,
                                      hash_table_t *sid_table)
{
    enum idmap_error_code err;
    char *dom_sid_str = NULL;
    size_t dom_sid_str_len;
    char *sid_str = NULL;
    char *rid_start;
    hash_key_t key;
    hash_value_t value;
    int ret;
    size_t c;
    TALLOC_CTX *tmp_ctx = NULL;

    tmp_ctx = talloc_new(NULL);
    if (tmp_ctx == NULL) {
        DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
        return ENOMEM;
    }

    key.type = HASH_KEY_STRING;
    value.type = HASH_VALUE_ULONG;

    err = sss_idmap_smb_sid_to_sid(idmap_ctx, dom_sid, &dom_sid_str);
    if (err != IDMAP_SUCCESS) {
        DEBUG(SSSDBG_OP_FAILURE, "sss_idmap_smb_sid_to_sid failed.\n");
        ret = EFAULT;
        goto done;
    }

    dom_sid_str_len = strlen(dom_sid_str);
    sid_str = talloc_zero_size(tmp_ctx, dom_sid_str_len + 12);
    if (sid_str == NULL) {
        DEBUG(SSSDBG_OP_FAILURE, "talloc_zero_size failed.\n");
        ret = ENOMEM;
        goto done;
    }
    rid_start = sid_str + dom_sid_str_len;

    memcpy(sid_str, dom_sid_str, dom_sid_str_len);

    for (c = 0; c < groups->count; c++) {
        memset(rid_start, '\0', 12);
        ret = snprintf(rid_start, 12, "-%lu",
                       (unsigned long) groups->rids[c].rid);
        if (ret < 0 || ret > 12) {
            DEBUG(SSSDBG_OP_FAILURE, "snprintf failed.\n");
            ret = EIO;
            goto done;
        }

        key.str = sid_str;
        value.ul = 0;

        ret = hash_enter(sid_table, &key, &value);
        if (ret != HASH_SUCCESS) {
            DEBUG(SSSDBG_OP_FAILURE, "hash_enter failed [%d][%s].\n",
                                      ret, hash_error_string(ret));
            ret = EIO;
            goto done;
        }

    }

    ret = EOK;

done:
    sss_idmap_free_sid(idmap_ctx, dom_sid_str);
    talloc_free(tmp_ctx);

    return ret;
}