/// <summary> /// Wait for the Dfs response packet from server. /// </summary> /// <param name="timeout">the pending time to get server's response</param> /// <param name="ntStatus">the status of the dfs referral response from the server.</param> /// <exception cref="System.InvalidOperationException">The transport is not connected.</exception> public DfscReferralResponsePacket ExpectPacket(TimeSpan timeout, out uint ntStatus) { byte[] payload; this.transport.ExpectDfscPayload(timeout, out ntStatus, out payload); DfscReferralResponsePacket packet = new DfscReferralResponsePacket(ntStatus, payload); return(packet); }
/// <summary> /// Retrieves the DFS Referrals from the RESP_GET_DFS_REFERRALS packet /// </summary> /// <typeparam name="T">The DFS referral response version expected to be returned</typeparam> /// <param name="dfscReferralResponse">The packet to retrieve the referrals</param> /// <param name="expectedVersion">The expected version of the referral responses</param> /// <returns>Returns the first DFS referral in the response packet</returns> public T[] RetrieveReferralEntries <T>(DfscReferralResponsePacket dfscReferralResponse, int expectedVersion) where T : struct { switch ((ReferralEntryType_Values)dfscReferralResponse.VersionNumber) { case ReferralEntryType_Values.DFS_REFERRAL_V1: DFS_REFERRAL_V1[] referralEntries_V1 = (DFS_REFERRAL_V1[])dfscReferralResponse.ReferralResponse.ReferralEntries; foreach (DFS_REFERRAL_V1 entry in referralEntries_V1) { entry.ToString(); } return((T[])(object)referralEntries_V1); case ReferralEntryType_Values.DFS_REFERRAL_V2: DFS_REFERRAL_V2[] referralEntries_V2 = (DFS_REFERRAL_V2[])dfscReferralResponse.ReferralResponse.ReferralEntries; foreach (DFS_REFERRAL_V2 entry in referralEntries_V2) { entry.ToString(); } return((T[])(object)referralEntries_V2); case ReferralEntryType_Values.DFS_REFERRAL_V3: expectedVersion++; //To automatically pass V4 site.Assertion goto case ReferralEntryType_Values.DFS_REFERRAL_V4; case ReferralEntryType_Values.DFS_REFERRAL_V4: if (dfscReferralResponse.IsNameListReferral) { DFS_REFERRAL_V3V4_NameListReferral[] referralEntries_V3V4_NameListReferral = (DFS_REFERRAL_V3V4_NameListReferral[])dfscReferralResponse.ReferralResponse.ReferralEntries; foreach (DFS_REFERRAL_V3V4_NameListReferral entry in referralEntries_V3V4_NameListReferral) { entry.ToString(); } return((T[])(object)referralEntries_V3V4_NameListReferral); } else { DFS_REFERRAL_V3V4_NonNameListReferral[] referralEntries_V3V4_NonNameListReferral = (DFS_REFERRAL_V3V4_NonNameListReferral[])dfscReferralResponse.ReferralResponse.ReferralEntries; foreach (DFS_REFERRAL_V3V4_NonNameListReferral entry in referralEntries_V3V4_NonNameListReferral) { entry.ToString(); } return((T[])(object)referralEntries_V3V4_NonNameListReferral); } default: throw new InvalidOperationException("The version number of Referral Entry is not correct."); } }
/// <summary> /// Verify response of DC referral request /// </summary> /// <param name="respPacket">Response packet of DC referral request</param> /// <param name="fqdnOrNetbios">If the domain name is FQDN format or NetBIOS format</param> private void VerifyResponse(DfscReferralResponsePacket respPacket, bool fqdnOrNetbios) { BaseTestSite.Assert.AreEqual((ushort)0, respPacket.ReferralResponse.PathConsumed, "PathConsumed must be set to 0"); BaseTestSite.Assert.AreEqual((ushort)0x0001, respPacket.ReferralResponse.NumberOfReferrals, "NumberOfReferrals must be set to 1"); DFS_REFERRAL_V3V4_NameListReferral[] respV3 = client.RetrieveReferralEntries<DFS_REFERRAL_V3V4_NameListReferral>(respPacket, (ushort)ReferralEntryType_Values.DFS_REFERRAL_V3); uint timeToLive = respV3[0].TimeToLive; bool containValidDC = false; string expectedDCName; string expectedSpecialName; if (fqdnOrNetbios) { expectedDCName = string.Format(@"\{0}.{1}", TestConfig.DCServerName, TestConfig.DomainFQDNName); expectedSpecialName = TestConfig.ValidFQDNPath; } else { expectedDCName = @"\" + TestConfig.DCServerName; expectedSpecialName = TestConfig.ValidNETBIOSPath; } foreach (DFS_REFERRAL_V3V4_NameListReferral entry in respV3) { if (!containValidDC) { foreach (string dcName in entry.DCNameArray) { BaseTestSite.Log.Add(LogEntryKind.Debug, "DC name is {0}", dcName); containValidDC = dcName.Equals(expectedDCName, StringComparison.OrdinalIgnoreCase); } } BaseTestSite.Assert.AreEqual(expectedSpecialName, entry.SpecialName, @"SpecialName must be \" + expectedSpecialName); BaseTestSite.Assert.AreEqual(timeToLive, entry.TimeToLive, "TimeToLive must be the same"); BaseTestSite.Assert.AreEqual((ushort)ReferralEntryType_Values.DFS_REFERRAL_V3, entry.VersionNumber, "VersionNumber must be set to " + ReferralEntryType_Values.DFS_REFERRAL_V3.ToString()); BaseTestSite.Assert.AreEqual(ReferralEntryFlags_Values.NameListReferral, entry.ReferralEntryFlags, "NameListReferral MUST be set to 1 for DC referral"); timeToLive = entry.TimeToLive; } BaseTestSite.Assert.IsTrue(containValidDC, "DCName must be " + expectedDCName); }
/// <summary> /// Retrieves the DFS Referrals from the RESP_GET_DFS_REFERRALS packet /// </summary> /// <typeparam name="T">The DFS referral response version expected to be returned</typeparam> /// <param name="dfscReferralResponse">The packet to retrieve the referrals</param> /// <param name="expectedVersion">The expected version of the referral responses</param> /// <returns>Returns the first DFS referral in the response packet</returns> public T RetrieveReferralEntriesFirstTarget <T>(DfscReferralResponsePacket dfscReferralResponse, int expectedVersion) where T : struct { return((T)(RetrieveReferralEntries <T>(dfscReferralResponse, expectedVersion))[0]); }
/// <summary> /// This function is only used to verify sysvol/root/link referral response. /// It can not verify the response of Domain/DC referral request. /// </summary> /// <param name="referralResponseType">Type of DFS referral response</param> /// <param name="entryType">Version of DFS referral</param> /// <param name="reqPath">The requested DFS Path to resolve</param> /// <param name="target">The resolved path</param> /// <param name="respPacket">Packet of DFS referral response</param> public void VerifyReferralResponse( ReferralResponseType referralResponseType, ReferralEntryType_Values entryType, string reqPath, string target, DfscReferralResponsePacket respPacket) { if (ReferralResponseType.DCReferralResponse == referralResponseType || ReferralResponseType.DomainReferralResponse == referralResponseType) return; baseTestSite.Assert.AreEqual((ushort)reqPath.Length * 2, respPacket.ReferralResponse.PathConsumed, "PathConsumed must be set to length in bytes of the DFS referral request path"); if (ReferralEntryType_Values.DFS_REFERRAL_V1 == entryType) { // Section 3.2.5.5 Receiving a Root Referral Request or Link Referral Request // For a DFS referral version 1, the ReferralServers and StorageServers bits of the referral entry MUST be set to 1. // Section 3.3.5.4 Receiving a sysvol Referral Request // If the MaxReferralLevel field in the request is 1, the ReferralServers and StorageServers fields MUST be set to 1. // Otherwise, the ReferralServers field MUST be set to 0 and the StorageServers field MUST be set to 1. baseTestSite.Assert.AreEqual(ReferralHeaderFlags.S, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.S, "For a DFS referral version 1, the StorageServers bit of the referral entry MUST be set to 1."); baseTestSite.Assert.AreEqual(ReferralHeaderFlags.R, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.R, "For a DFS referral version 1, the ReferralServers bit of the referral entry MUST be set to 1."); } else { // Section 3.2.5.5 Receiving a Root Referral Request or Link Referral Request // If DFS root targets are returned or if DFS link targets are returned, the StorageServers bit of the referral entry MUST be set to 1. // In all other cases, it MUST be set to 0. // Section 3.3.5.4 Receiving a sysvol Referral Request // If the MaxReferralLevel field in the request is 1, the ReferralServers and StorageServers fields MUST be set to 1. // Otherwise, the ReferralServers field MUST be set to 0 and the StorageServers field MUST be set to 1. // Check StorageServers bit if (ReferralResponseType.RootTarget == referralResponseType || ReferralResponseType.LinkTarget == referralResponseType || ReferralResponseType.SysvolReferralResponse == referralResponseType) { baseTestSite.Assert.AreEqual(ReferralHeaderFlags.S, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.S, "StorageServers bit of the referral entry MUST be set to 1."); } else { baseTestSite.Assert.AreNotEqual(ReferralHeaderFlags.S, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.S, "StorageServers bit of the referral entry MUST be set to 0."); } // Check ReferralServers bit if (ReferralResponseType.RootTarget == referralResponseType || ReferralResponseType.Interlink == referralResponseType) { baseTestSite.Assert.AreEqual(ReferralHeaderFlags.R, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.R, "ReferralServers bit of the referral entry MUST be set to 1."); } else { baseTestSite.Assert.AreNotEqual(ReferralHeaderFlags.R, respPacket.ReferralResponse.ReferralHeaderFlags & ReferralHeaderFlags.R, "ReferralServers bit of the referral entry MUST be set to 0."); } } uint timeToLive; bool containTarget = false; switch ((ReferralEntryType_Values)respPacket.VersionNumber) { case ReferralEntryType_Values.DFS_REFERRAL_V1: DFS_REFERRAL_V1[] referralEntries_V1 = (DFS_REFERRAL_V1[])respPacket.ReferralResponse.ReferralEntries; foreach (DFS_REFERRAL_V1 entry in referralEntries_V1) { baseTestSite.Assert.AreEqual((ushort)entryType, entry.VersionNumber, "VersionNumber must be set to " + entryType.ToString()); baseTestSite.Assert.AreEqual(0, entry.ReferralEntryFlags, "ReferralEntryFlags MUST be set to 0x0000 by the server and ignored on receipt by the client."); if (ReferralResponseType.RootTarget == referralResponseType) { baseTestSite.Assert.AreEqual(0x0001, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } else { baseTestSite.Assert.AreEqual(0, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } baseTestSite.Log.Add(LogEntryKind.Debug, "ShareName is {0}", entry.ShareName); if (!containTarget) containTarget = target.Equals(entry.ShareName, StringComparison.OrdinalIgnoreCase); } break; case ReferralEntryType_Values.DFS_REFERRAL_V2: DFS_REFERRAL_V2[] referralEntries_V2 = (DFS_REFERRAL_V2[])respPacket.ReferralResponse.ReferralEntries; timeToLive = referralEntries_V2[0].TimeToLive; foreach (DFS_REFERRAL_V2 entry in referralEntries_V2) { baseTestSite.Assert.AreEqual(timeToLive, entry.TimeToLive, "TimeToLive must be the same"); baseTestSite.Assert.AreEqual((ushort)entryType, entry.VersionNumber, "VersionNumber must be set to " + entryType.ToString()); baseTestSite.Assert.AreEqual(0, entry.ReferralEntryFlags, "ReferralEntryFlags MUST be set to 0x0000 by the server and ignored on receipt by the client."); if (ReferralResponseType.RootTarget == referralResponseType) { baseTestSite.Assert.AreEqual(0x0001, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } else { baseTestSite.Assert.AreEqual(0, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } baseTestSite.Assert.IsTrue(reqPath.Equals(entry.DFSPath, StringComparison.OrdinalIgnoreCase), "DFSPath must be {0}, actual is {1}", reqPath, entry.DFSPath); baseTestSite.Assert.IsTrue(reqPath.Equals(entry.DFSAlternatePath, StringComparison.OrdinalIgnoreCase), "DFSAlternatePath must be {0}, actual is {1}", reqPath, entry.DFSAlternatePath); baseTestSite.Log.Add(LogEntryKind.Debug, "DFSTargetPath is {0}", entry.DFSTargetPath); if (!containTarget) containTarget = target.Equals(entry.DFSTargetPath, StringComparison.OrdinalIgnoreCase); timeToLive = entry.TimeToLive; } break; case ReferralEntryType_Values.DFS_REFERRAL_V3: case ReferralEntryType_Values.DFS_REFERRAL_V4: DFS_REFERRAL_V3V4_NonNameListReferral[] referralEntries_V3V4 = (DFS_REFERRAL_V3V4_NonNameListReferral[])respPacket.ReferralResponse.ReferralEntries; timeToLive = referralEntries_V3V4[0].TimeToLive; bool firstTarget = true; foreach (DFS_REFERRAL_V3V4_NonNameListReferral entry in referralEntries_V3V4) { baseTestSite.Assert.AreEqual(timeToLive, entry.TimeToLive, "TimeToLive must be the same"); baseTestSite.Assert.AreEqual((ushort)entryType, entry.VersionNumber, "VersionNumber must be set to " + entryType.ToString()); if (ReferralResponseType.RootTarget == referralResponseType) { baseTestSite.Assert.AreEqual(0x0001, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } else { baseTestSite.Assert.AreEqual(0, entry.ServerType, "The ServerType field MUST be set to 0x0001 if root targets are returned." + "In all other cases, the ServerType field MUST be set to 0x0000."); } baseTestSite.Assert.IsTrue(reqPath.Equals(entry.DFSPath, StringComparison.OrdinalIgnoreCase), "DFSPath must be {0}, actual is {1}", reqPath, entry.DFSPath); baseTestSite.Assert.IsTrue(reqPath.Equals(entry.DFSAlternatePath, StringComparison.OrdinalIgnoreCase), "DFSAlternatePath must be {0}, actual is {1}", reqPath, entry.DFSAlternatePath); baseTestSite.Log.Add(LogEntryKind.Debug, "DFSTargetPath is {0}", entry.DFSTargetPath); if (!containTarget) { containTarget = target.Equals(entry.DFSTargetPath, StringComparison.OrdinalIgnoreCase); } timeToLive = entry.TimeToLive; if (ReferralEntryType_Values.DFS_REFERRAL_V3 == (ReferralEntryType_Values)respPacket.VersionNumber) continue; // skip TargetSetBoundary check for version 3. if (firstTarget) { baseTestSite.Assert.AreEqual(ReferralEntryFlags_Values.T, entry.ReferralEntryFlags, "TargetSetBoundary MUST be set to 1 for the first target."); firstTarget = false; } else { baseTestSite.Assert.AreEqual(ReferralEntryFlags_Values.None, entry.ReferralEntryFlags, "TargetSetBoundary MUST be set to 0 for other targets."); } } break; default: throw new InvalidOperationException("The version number of Referral Entry is not correct."); } baseTestSite.Assert.IsTrue(containTarget, "{0} response must contain {1}", Enum.GetName(typeof(ReferralResponseType), referralResponseType), target); }
/// <summary> /// Verify response of domain referral request /// </summary> /// <param name="respPacket">Response packet of DC referral request</param> private void VerifyResponse(DfscReferralResponsePacket respPacket) { BaseTestSite.Assert.AreEqual(0, respPacket.ReferralResponse.PathConsumed, "PathConsumed must be set to 0 for Domain Referral"); BaseTestSite.Assert.AreEqual(ReferralHeaderFlags.NONE, respPacket.ReferralResponse.ReferralHeaderFlags, "ReferralHeaderFlags must be set to 0 for Domain Referral"); DFS_REFERRAL_V3V4_NameListReferral[] respV3 = client.RetrieveReferralEntries<DFS_REFERRAL_V3V4_NameListReferral>(respPacket, (ushort)ReferralEntryType_Values.DFS_REFERRAL_V3); uint timeToLive = respV3[0].TimeToLive; foreach (DFS_REFERRAL_V3V4_NameListReferral entry in respV3) { BaseTestSite.Assert.IsTrue(entry.SpecialName.IndexOf(TestConfig.DomainNetBIOSName, StringComparison.OrdinalIgnoreCase) >= 0, "SpecialName must contain {0}, actual SpecialName is {1}", TestConfig.DomainNetBIOSName, entry.SpecialName); BaseTestSite.Assert.AreEqual(timeToLive, entry.TimeToLive, "TimeToLive must be the same"); BaseTestSite.Assert.AreEqual((ushort)ReferralEntryType_Values.DFS_REFERRAL_V3, entry.VersionNumber, "VersionNumber must be set to " + ReferralEntryType_Values.DFS_REFERRAL_V3.ToString()); BaseTestSite.Assert.AreEqual(0, entry.ExpandedNameOffset, "ExpandedNameOffSet must be set to 0"); BaseTestSite.Assert.AreEqual(ReferralEntryFlags_Values.NameListReferral, entry.ReferralEntryFlags & ReferralEntryFlags_Values.NameListReferral, "NameListReferral MUST be set to 1 for Domain referral"); BaseTestSite.Assert.AreEqual(0, entry.ServerType, "ServerType MUST be set to 0x0 for Domain referrals"); timeToLive = entry.TimeToLive; } }