📄 dfs.c
字号:
s.path = NULL; printf("Testing Enum level %u\n", level); status = dcerpc_dfs_Enum(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("Enum failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result) && !W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, r.out.result)) { printf("dfs_Enum failed - %s\n", win_errstr(r.out.result)); return false; } if (level == 1 && r.out.total) { int i; for (i=0;i<*r.out.total;i++) { const char *root = r.out.info->e.info1->s[i].path; if (!test_GetInfo(p, mem_ctx, root)) { ret = false; } } } return ret;}static bool test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx){ bool ret = true; uint16_t levels[] = {1, 2, 3, 4, 5, 6, 200, 300}; int i; for (i=0;i<ARRAY_SIZE(levels);i++) { if (!test_EnumLevel(p, mem_ctx, levels[i])) { ret = false; } } return ret;}static bool test_EnumEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host){ bool ret = true; uint16_t levels[] = {1, 2, 3, 4, 5, 6, 200, 300}; int i; for (i=0;i<ARRAY_SIZE(levels);i++) { if (!test_EnumLevelEx(p, mem_ctx, levels[i], host)) { ret = false; } } return ret;}static bool test_RemoveStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename){ struct dfs_RemoveStdRoot r; NTSTATUS status; printf("Testing RemoveStdRoot\n"); r.in.servername = host; r.in.rootshare = sharename; r.in.flags = 0; status = dcerpc_dfs_RemoveStdRoot(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("RemoveStdRoot failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_RemoveStdRoot failed - %s\n", win_errstr(r.out.result)); return false; } return true;}static bool test_AddStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename){ NTSTATUS status; struct dfs_AddStdRoot r; printf("Testing AddStdRoot\n"); r.in.servername = host; r.in.rootshare = sharename; r.in.comment = "standard dfs standalone DFS root created by smbtorture (dfs_AddStdRoot)"; r.in.flags = 0; status = dcerpc_dfs_AddStdRoot(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("AddStdRoot failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_AddStdRoot failed - %s\n", win_errstr(r.out.result)); return false; } return true;}static bool test_AddStdRootForced(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename){ NTSTATUS status; struct dfs_AddStdRootForced r; enum dfs_ManagerVersion version; printf("Testing AddStdRootForced\n"); if (!test_GetManagerVersion(p, mem_ctx, &version)) { return false; } r.in.servername = host; r.in.rootshare = sharename; r.in.comment = "standard dfs forced standalone DFS root created by smbtorture (dfs_AddStdRootForced)"; r.in.store = SMBTORTURE_DFS_PATHNAME; status = dcerpc_dfs_AddStdRootForced(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("AddStdRootForced failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_AddStdRootForced failed - %s\n", win_errstr(r.out.result)); IS_DFS_VERSION_UNSUPPORTED_CALL_W2K3(version, r.out.result); return false; } return test_RemoveStdRoot(p, mem_ctx, host, sharename);}static void test_cleanup_stdroot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct torture_context *tctx, const char *host, const char *sharename, const char *dir){ struct smbcli_state *cli; printf("Cleaning up StdRoot\n"); test_RemoveStdRoot(p, mem_ctx, host, sharename); test_NetShareDel(mem_ctx, tctx, host, sharename); torture_open_connection_share(mem_ctx, &cli, tctx, host, "C$", tctx->ev); test_DeleteDir(cli, dir); torture_close_connection(cli);}static bool test_StdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct torture_context *tctx, const char *host){ const char *sharename = SMBTORTURE_DFS_SHARENAME; const char *dir = SMBTORTURE_DFS_DIRNAME; const char *path = SMBTORTURE_DFS_PATHNAME; struct smbcli_state *cli; bool ret = true; printf("Testing StdRoot\n"); test_cleanup_stdroot(p, mem_ctx, tctx, host, sharename, dir); ret &= test_CreateDir(mem_ctx, &cli, tctx, host, "C$", dir); ret &= test_NetShareAdd(mem_ctx, tctx, host, sharename, path); ret &= test_AddStdRoot(p, mem_ctx, host, sharename); ret &= test_RemoveStdRoot(p, mem_ctx, host, sharename); ret &= test_AddStdRootForced(p, mem_ctx, host, sharename); ret &= test_NetShareDel(mem_ctx, tctx, host, sharename); ret &= test_DeleteDir(cli, dir); torture_close_connection(cli); return ret;}static bool test_GetDcAddress(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host){ NTSTATUS status; struct dfs_GetDcAddress r; uint8_t is_root = 0; uint32_t ttl = 0; const char *ptr; printf("Testing GetDcAddress\n"); ptr = host; r.in.servername = host; r.in.server_fullname = r.out.server_fullname = &ptr; r.in.is_root = r.out.is_root = &is_root; r.in.ttl = r.out.ttl = &ttl; status = dcerpc_dfs_GetDcAddress(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("GetDcAddress failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_GetDcAddress failed - %s\n", win_errstr(r.out.result)); return false; } return true;}static bool test_SetDcAddress(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host){ NTSTATUS status; struct dfs_SetDcAddress r; printf("Testing SetDcAddress\n"); r.in.servername = host; r.in.server_fullname = host; r.in.flags = 0; r.in.ttl = 1000; status = dcerpc_dfs_SetDcAddress(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("SetDcAddress failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_SetDcAddress failed - %s\n", win_errstr(r.out.result)); return false; } return true;}static bool test_DcAddress(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host){ if (!test_GetDcAddress(p, mem_ctx, host)) { return false; } if (!test_SetDcAddress(p, mem_ctx, host)) { return false; } return true;}static bool test_FlushFtTable(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename){ NTSTATUS status; struct dfs_FlushFtTable r; enum dfs_ManagerVersion version; printf("Testing FlushFtTable\n"); if (!test_GetManagerVersion(p, mem_ctx, &version)) { return false; } r.in.servername = host; r.in.rootshare = sharename; status = dcerpc_dfs_FlushFtTable(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("FlushFtTable failed - %s\n", nt_errstr(status)); return false; } else if (!W_ERROR_IS_OK(r.out.result)) { printf("dfs_FlushFtTable failed - %s\n", win_errstr(r.out.result)); IS_DFS_VERSION_UNSUPPORTED_CALL_W2K3(version, r.out.result); return false; } return true;}static bool test_FtRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host){ const char *sharename = SMBTORTURE_DFS_SHARENAME; return test_FlushFtTable(p, mem_ctx, host, sharename);}bool torture_rpc_dfs(struct torture_context *torture){ NTSTATUS status; struct dcerpc_pipe *p; bool ret = true; enum dfs_ManagerVersion version; const char *host = torture_setting_string(torture, "host", NULL); status = torture_rpc_connection(torture, &p, &ndr_table_netdfs); torture_assert_ntstatus_ok(torture, status, "Unable to connect"); ret &= test_GetManagerVersion(p, torture, &version); ret &= test_ManagerInitialize(p, torture, host); ret &= test_Enum(p, torture); ret &= test_EnumEx(p, torture, host); ret &= test_StdRoot(p, torture, torture, host); ret &= test_FtRoot(p, torture, host); ret &= test_DcAddress(p, torture, host); return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -