/* * Attempt to modify an objectSID DSDB_CONTROL_REPLICATED_UPDATE_OID not set * this should fail with LDB_ERR_UNWILLING_TO_PERFORM */ static void test_modify_of_objectSID_not_replicated(void **state) { struct ldbtest_ctx *test_ctx = talloc_get_type_abort(*state, struct ldbtest_ctx); struct ldb_context *ldb = test_ctx->ldb; struct ldb_message *msg = ldb_msg_new(test_ctx); struct ldb_request *request = NULL; int rc; msg->dn = ldb_dn_new(msg, ldb, "dc=test"); add_sid(msg, LOCAL_SID); rc = ldb_build_mod_req( &request, test_ctx->ldb, test_ctx, msg, NULL, NULL, ldb_op_default_callback, NULL); assert_int_equal(rc, LDB_SUCCESS); assert_non_null(request); rc = unique_object_sids_modify(test_ctx->module, request); assert_int_equal(rc, LDB_ERR_UNWILLING_TO_PERFORM); }
/* * Attempt to modify an objectSID DSDB_CONTROL_REPLICATED_UPDATE_OID set * this should succeed */ static void test_modify_of_objectSID_replicated(void **state) { struct ldbtest_ctx *test_ctx = talloc_get_type_abort(*state, struct ldbtest_ctx); struct ldb_context *ldb = test_ctx->ldb; struct ldb_message *msg = ldb_msg_new(test_ctx); struct ldb_message_element *el = NULL; struct ldb_request *request = NULL; struct ldb_request *original_request = NULL; int rc; msg->dn = ldb_dn_new(msg, ldb, "dc=test"); add_sid(msg, LOCAL_SID); rc = ldb_build_mod_req( &request, test_ctx->ldb, test_ctx, msg, NULL, NULL, ldb_op_default_callback, NULL); assert_int_equal(rc, LDB_SUCCESS); assert_non_null(request); original_request = request; rc = ldb_request_add_control( request, DSDB_CONTROL_REPLICATED_UPDATE_OID, false, NULL); assert_int_equal(rc, LDB_SUCCESS); rc = unique_object_sids_modify(test_ctx->module, request); assert_int_equal(rc, LDB_SUCCESS); /* * Check that a copy of the request was passed to the next module * and not the original request */ assert_ptr_not_equal(last_request, original_request); /* * Check the flag was set on the request passed to the next * module */ el = ldb_msg_find_element(last_request->op.add.message, "objectSID"); assert_non_null(el); assert_true(el->flags & LDB_FLAG_INTERNAL_FORCE_UNIQUE_INDEX); /* * Check the flag was not set on the original request */ el = ldb_msg_find_element(request->op.add.message, "objectSID"); assert_non_null(el); assert_false(el->flags & LDB_FLAG_INTERNAL_FORCE_UNIQUE_INDEX); }
/* * The object is not in the current local domain so it should NOT have * DB_FLAG_INTERNAL_UNIQUE_VALUE set */ static void test_objectSID_not_in_domain(void **state) { struct ldbtest_ctx *test_ctx = talloc_get_type_abort(*state, struct ldbtest_ctx); struct ldb_context *ldb = test_ctx->ldb; struct ldb_message *msg = ldb_msg_new(test_ctx); struct ldb_message_element *el = NULL; struct ldb_request *request = NULL; struct ldb_request *original_request = NULL; int rc; msg->dn = ldb_dn_new(msg, ldb, "dc=test"); add_sid(msg, FOREIGN_SID); rc = ldb_build_add_req( &request, test_ctx->ldb, test_ctx, msg, NULL, NULL, ldb_op_default_callback, NULL); assert_int_equal(rc, LDB_SUCCESS); assert_non_null(request); original_request = request; rc = unique_object_sids_add(test_ctx->module, request); assert_int_equal(rc, LDB_SUCCESS); /* * Check that the original request was passed to the next module * and not a copy */ assert_ptr_equal(last_request, original_request); /* * Check that the flag was not set on the objectSID element */ el = ldb_msg_find_element(msg, "objectSID"); assert_non_null(el); assert_false(el->flags & LDB_FLAG_INTERNAL_FORCE_UNIQUE_INDEX); }
static int dusb_write(int dir, uint8_t data) { static uint8_t array[20]; static int i = 0; static unsigned long state = 1; static uint16_t src_addr, src_id; static uint16_t dst_addr, dst_id; static uint8_t data_size, ack, sq; static int cnt; static uint8_t ascii[HEXDUMP_SIZE+1]; if (logfile == NULL) return -1; array[i++ % 16] = data; switch(state) // Finite State Machine { case 1: // unused case 2: break; case 3: // source address break; case 4: src_addr = (((uint16_t)(array[2])) << 8) | ((uint16_t)(array[3])); fprintf(logfile, "%04x:", src_addr); add_addr(addr_found, src_addr, &af); break; case 5: // source service id break; case 6: src_id = (((uint16_t)(array[4])) << 8) | ((uint16_t)(array[5])); fprintf(logfile, "%04x->", src_id); add_sid(sid_found, src_id, &sif); break; case 7: // destination address break; case 8: dst_addr = (((uint16_t)(array[6])) << 8) | ((uint16_t)(array[7])); fprintf(logfile, "%04x:", dst_addr); add_addr(addr_found, dst_addr, &af); break; case 9: // destination service id break; case 10: dst_id = (((uint16_t)(array[8])) << 8) | ((uint16_t)(array[9])); fprintf(logfile, "%04x ", dst_id); add_sid(sid_found, src_id, &sif); break; case 11: break; // data checksum case 12: break; case 13: // data size data_size = array[12]; break; case 14: // acknowledgment ack = array[13]; fprintf(logfile, "AK=%02x ", ack); break; case 15: // sequence number sq = array[14]; fprintf(logfile, "SQ=%02x ", sq); break; case 16: // header checksum fprintf(logfile, "(%3i bytes) ", data_size); cnt = 0; fprintf(logfile, "\t\t\t\t\t%s (%s) ==> %s (%s)\n", name_of_addr(src_addr), name_of_sid(src_id), name_of_addr(dst_addr), name_of_sid(dst_id)); if(data_size == 0) state = 0; break; default: if(!cnt) fprintf(logfile, "\t\t"); fprintf(logfile, "%02X ", data); ascii[cnt % HEXDUMP_SIZE] = data; if(!(++cnt % HEXDUMP_SIZE)) { fprintf(logfile, " | "); for(i = 0; i < HEXDUMP_SIZE; i++) fprintf(logfile, "%c", isalnum(ascii[i]) ? ascii[i] : '.'); fprintf(logfile, "\n\t\t"); } if(--data_size == 0) { for(i = 0; i < HEXDUMP_SIZE - (cnt%HEXDUMP_SIZE); i++) fprintf(logfile, " "); fprintf(logfile, " | "); for(i = 0; i < (cnt%HEXDUMP_SIZE); i++) fprintf(logfile, "%c", isalnum(ascii[i]) ? ascii[i] : '.'); fprintf(logfile, "\n"); state = 0; } break; } if(state == 0) { fprintf(logfile, "\n"); i = 0; } state++; return 0; }