Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #4
0
 /// <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;
            }
        }