Exemple #1
0
 public ModelCreateLeaseRequest(
     CreateOptions_Values createOptions,
     RequestedOplockLevel_Values requestedOplockLevel_Values,
     ModelCreateContextRequest leaseContext,
     LeaseContextType leaseContextType)
     : base(0)
 {
     this.CreateOptions        = createOptions;
     this.RequestedOplockLevel = requestedOplockLevel_Values;
     this.LeaseContext         = leaseContext;
     this.ContextType          = leaseContextType;
 }
        public static void CreateRequest(ConnectTargetType connectTargetType, LeaseContextType leaseContextType,
                                         LeaseKeyType leaseKey, uint leaseState, LeaseFlagsValues leaseFlags, ParentLeaseKeyType parentLeaseKey)
        {
            Condition.IsTrue(state == ModelState.Connected);
            Condition.IsNull(request);

            // Limit these three less important paramters to reduce test case numbers.
            Combination.NWise(1, connectTargetType, leaseKey, leaseState);

            // Current leasing only supports to test leasing on the file. So limit the exploration.
            Condition.In(parentLeaseKey, ParentLeaseKeyType.EmptyParentLeaseKey, ParentLeaseKeyType.ValidParentLeaseKey);
            Combination.Pairwise(leaseFlags, parentLeaseKey);

            // If Conenction.Dialect is Smb2.002 or Smb2.1, then do not test Lease V2.
            Condition.IfThen(
                negotiateDialect == DialectRevision.Smb21 || negotiateDialect == DialectRevision.Smb2002,
                leaseContextType == LeaseContextType.LeaseV1);

            if (leaseContextType == LeaseContextType.LeaseV1)
            {
                request = new ModelCreateLeaseRequest(
                    (connectTargetType == ConnectTargetType.ConnectToDirectory) ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                    RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                    new ModelCreateRequestLease
                {
                    LeaseKey   = leaseKey,
                    LeaseState = leaseState,
                    LeaseFlags = leaseFlags
                },
                    leaseContextType);
            }
            else
            {
                request = new ModelCreateLeaseRequest(
                    (connectTargetType == ConnectTargetType.ConnectToDirectory) ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                    RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                    new ModelCreateRequestLeaseV2
                {
                    LeaseKey       = leaseKey,
                    LeaseState     = leaseState,
                    LeaseFlags     = leaseFlags,
                    ParentLeaseKey = parentLeaseKey
                },
                    leaseContextType);
            }
        }
        public static void CreateRequest(ConnectTargetType connectTargetType, LeaseContextType leaseContextType,
            LeaseKeyType leaseKey, uint leaseState, LeaseFlagsValues leaseFlags, ParentLeaseKeyType parentLeaseKey)
        {
            Condition.IsTrue(state == ModelState.Connected);
            Condition.IsNull(request);

            // Limit these three less important paramters to reduce test case numbers.
            Combination.NWise(1, connectTargetType, leaseKey, leaseState);

            // Current leasing only supports to test leasing on the file. So limit the exploration.
            Condition.In(parentLeaseKey, ParentLeaseKeyType.EmptyParentLeaseKey, ParentLeaseKeyType.ValidParentLeaseKey);
            Combination.Pairwise(leaseFlags, parentLeaseKey);

            // If Conenction.Dialect is Smb2.002 or Smb2.1, then do not test Lease V2.
            Condition.IfThen(
                negotiateDialect == DialectRevision.Smb21 || negotiateDialect == DialectRevision.Smb2002,
                leaseContextType == LeaseContextType.LeaseV1);

            if (leaseContextType == LeaseContextType.LeaseV1)
            {
                request = new ModelCreateLeaseRequest(
                    (connectTargetType == ConnectTargetType.ConnectToDirectory) ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                    RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                    new ModelCreateRequestLease
                    {
                        LeaseKey = leaseKey,
                        LeaseState = leaseState,
                        LeaseFlags = leaseFlags
                    },
                    leaseContextType);
            }
            else
            {
                request = new ModelCreateLeaseRequest(
                    (connectTargetType == ConnectTargetType.ConnectToDirectory) ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                    RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                    new ModelCreateRequestLeaseV2
                    {
                        LeaseKey = leaseKey,
                        LeaseState = leaseState,
                        LeaseFlags = leaseFlags,
                        ParentLeaseKey = parentLeaseKey
                    },
                    leaseContextType);
            }
        }
 public ModelCreateLeaseRequest(
     CreateOptions_Values createOptions,
     RequestedOplockLevel_Values requestedOplockLevel_Values,
     ModelCreateContextRequest leaseContext,
     LeaseContextType leaseContextType)
     : base(0)
 {
     this.CreateOptions = createOptions;
     this.RequestedOplockLevel = requestedOplockLevel_Values;
     this.LeaseContext = leaseContext;
     this.ContextType = leaseContextType;
 }
        public void CreateRequest(ConnectTargetType connectTargetType, LeaseContextType leaseContextType,
            LeaseKeyType leaseKey, uint leaseState, LeaseFlagsValues leaseFlags,
            ParentLeaseKeyType parentLeaseKey)
        {
            ValidateLeaseState(leaseState);

            uint status = 0;
            #region Fill Contexts
            LeaseKey = (leaseKey == LeaseKeyType.ValidLeaseKey ? Guid.NewGuid() : Guid.Empty);
            ParentLeaseKey = (parentLeaseKey == ParentLeaseKeyType.EmptyParentLeaseKey ? Guid.Empty : Guid.NewGuid());
            originalClient.IsDirectory = connectTargetType == ConnectTargetType.ConnectToDirectory;

            switch (leaseContextType)
            {
                case LeaseContextType.LeaseV1:
                    testConfig.CheckCreateContext(CreateContextTypeValue.SMB2_CREATE_REQUEST_LEASE);

                    originalClient.CreateContexts = new Smb2CreateContextRequest[]
                    {
                        new Smb2CreateRequestLease
                        {
                            LeaseKey = LeaseKey,
                            LeaseState = (LeaseStateValues)leaseState,
                            LeaseFlags = (uint)leaseFlags,
                        }
                    };
                    break;
                case LeaseContextType.LeaseV2:
                    testConfig.CheckCreateContext(CreateContextTypeValue.SMB2_CREATE_REQUEST_LEASE_V2);

                    originalClient.CreateContexts = new Smb2CreateContextRequest[]
                    {
                        new Smb2CreateRequestLeaseV2
                        {
                            LeaseKey = LeaseKey,
                            LeaseState = (LeaseStateValues)leaseState,
                            LeaseFlags = (uint)leaseFlags,
                            ParentLeaseKey = ParentLeaseKey,
                        }
                    };
                    break;
                default:
                    Site.Assume.Fail("Unexpected type: {0}", leaseContextType);
                    break;
            }
            #endregion

            Packet_Header header;
            CREATE_Response createResponse;
            Smb2CreateContextResponse[] serverCreateContexts;

            status = originalClient.Client.Create(1, 64, originalClient.Flags, originalClient.MessageId++, originalClient.SessionId, originalClient.TreeId, originalClient.File,
                AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE,
                ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE,
                (connectTargetType == ConnectTargetType.ConnectToDirectory) ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                CreateDisposition_Values.FILE_OPEN_IF,
                File_Attributes.NONE,
                ImpersonationLevel_Values.Impersonation,
                SecurityFlags_Values.NONE,
                RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                originalClient.CreateContexts,
                out originalClient.FileId,
                out serverCreateContexts,
                out header,
                out createResponse);

            #region Handle Create Response

            // 3.3.5.9.11   Handling the SMB2_CREATE_REQUEST_LEASE_V2 Create Context
            // If Connection.Dialect does not belong to the SMB 3.x dialect family or if RequestedOplockLevel is not SMB2_OPLOCK_LEVEL_LEASE, the server SHOULD<270> ignore the SMB2_CREATE_REQUEST_LEASE_V2 Create Context request.
            // <270> Section 3.3.5.9.11: Windows 8, Windows Server 2012, Windows 8.1,
            // and Windows Server 2012 R2 servers do not ignore the SMB2_CREATE_REQUEST_LEASE_V2 create context when Connection.Dialect is equal to "2.100" or if RequestedOplockLevel is not equal to SMB2_OPLOCK_LEVEL_LEASE.
            if (!Smb2Utility.IsSmb3xFamily(originalClient.Dialect) && leaseContextType == LeaseContextType.LeaseV2)
            {
                Smb2CreateResponseLeaseV2 leaseContext = null;
                if (serverCreateContexts != null)
                {
                    foreach (var context in serverCreateContexts)
                    {
                        if (context is Smb2CreateResponseLeaseV2)
                        {
                            leaseContext = context as Smb2CreateResponseLeaseV2;
                            break;
                        }
                    }
                }
                if (testConfig.Platform == Platform.NonWindows)
                {
                    Site.Assert.IsNull(leaseContext, "Create response should not include SMB2_CREATE_RESPONSE_LEASE_V2.");
                }
                else
                {
                    if (originalClient.Dialect == DialectRevision.Smb21
                        && (testConfig.Platform == Platform.WindowsServer2012
                            || testConfig.Platform == Platform.WindowsServer2012R2))
                    {
                        Site.Assert.IsNotNull(leaseContext, "Create response should include SMB2_CREATE_RESPONSE_LEASE_V2 when platform is Windows 8, Windows 2012 and Windows 2012R2 and dialect is equal to \"2.100\".");
                    }
                    else
                    {
                        Site.Assert.IsNull(leaseContext, "Create response should not include SMB2_CREATE_RESPONSE_LEASE_V2.");
                    }
                }
                // Bypass the situation to avoid Windows issues.
                this.CreateResponse(ModelSmb2Status.STATUS_SUCCESS, ReturnLeaseContextType.ReturnLeaseContextNotIncluded,
                    (uint)LeaseStateValues.SMB2_LEASE_NONE, LeaseFlagsValues.NONE, leasingConfig);
            }
            else if (status == Smb2Status.STATUS_SUCCESS)
            {
                if (leaseContextType == LeaseContextType.LeaseV1)
                {
                    if (serverCreateContexts != null)
                    {
                        Smb2CreateResponseLease leaseContext = null;
                        foreach (var context in serverCreateContexts)
                        {
                            if (context is Smb2CreateResponseLease)
                            {
                                leaseContext = context as Smb2CreateResponseLease;
                                break;
                            }
                        }
                        Site.Assert.IsNotNull(leaseContext, "Create response MUST include SMB2_CREATE_RESPONSE_LEASE.");

                        Site.Assert.AreEqual<Guid>(LeaseKey, leaseContext.LeaseKey, "Expect the LeaseKey in the response equals the LeaseKey in the request.");
                        Site.Assert.AreEqual<LeaseFlagsValues>(LeaseFlagsValues.NONE, leaseContext.LeaseFlags, "Expect the lease is not in breaking.");
                        Site.CaptureRequirementIfAreEqual<ulong>(0, leaseContext.LeaseDuration,
                            RequirementCategory.MUST_BE_ZERO.Id,
                            RequirementCategory.MUST_BE_ZERO.Description);

                        originalClient.LeaseState = leaseContext.LeaseState;
                        this.CreateResponse((ModelSmb2Status)status, ReturnLeaseContextType.ReturnLeaseContextIncluded,
                            (uint)leaseContext.LeaseState, leaseContext.LeaseFlags, leasingConfig);
                    }
                    else
                    {
                        this.CreateResponse((ModelSmb2Status)status, ReturnLeaseContextType.ReturnLeaseContextNotIncluded,
                            (uint)LeaseStateValues.SMB2_LEASE_NONE, LeaseFlagsValues.NONE,  leasingConfig);
                    }
                }
                else if (leaseContextType == LeaseContextType.LeaseV2)
                {
                    if (serverCreateContexts != null)
                    {
                        Smb2CreateResponseLeaseV2 leaseContext = null;
                        foreach (var context in serverCreateContexts)
                        {
                            if (context is Smb2CreateResponseLeaseV2)
                            {
                                leaseContext = context as Smb2CreateResponseLeaseV2;
                                break;
                            }
                        }
                        Site.Assert.IsNotNull(leaseContext, "Create response MUST include SMB2_CREATE_RESPONSE_LEASE_V2.");

                        Site.Assert.AreEqual<Guid>(LeaseKey, leaseContext.LeaseKey, "Expect the LeaseKey in the response equals the LeaseKey in the request.");
                        Site.Assert.IsTrue((leaseContext.Flags & LeaseFlagsValues.LEASE_FLAG_BREAK_IN_PROGRESS) == 0, "Expect the lease is not in breaking.");
                        Site.CaptureRequirementIfAreEqual<ulong>(0, leaseContext.LeaseDuration,
                            RequirementCategory.MUST_BE_ZERO.Id,
                            RequirementCategory.MUST_BE_ZERO.Description);
                        if ((leaseContext.Flags & LeaseFlagsValues.SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET) != 0)
                        {
                            Site.Assert.AreEqual<Guid>(ParentLeaseKey, leaseContext.ParentLeaseKey, "Expect the ParentLeaseKey in the response equals the ParentLeaseKey in the request.");
                        }
                        else
                        {
                            Site.Assert.AreEqual<Guid>(Guid.Empty, leaseContext.ParentLeaseKey, "Expect the ParentLeaseKey in the response is empty.");
                        }
                        // Epoch (2 bytes): A 16-bit unsigned integer incremented by the server on a lease state change.
                        Site.Assert.AreEqual<ulong>(1, leaseContext.Epoch, "Expect the Epoch in the response equals 1.");
                        if (testConfig.Platform == Platform.NonWindows)
                        {
                            // Reserved (2 bytes): This field MUST NOT be used and MUST be reserved. The server SHOULD<52> set this to 0, and the client MUST ignore it on receipt.
                            // <52> Section 2.2.14.2.11: Windows 8, Windows Server 2012, Windows 8.1, and Windows Server 2012 R2 set this field to an arbitrary value.
                            Site.CaptureRequirementIfAreEqual<ulong>(0, leaseContext.Reserved,
                                RequirementCategory.MUST_BE_ZERO.Id,
                                RequirementCategory.MUST_BE_ZERO.Description);
                        }

                        originalClient.LeaseState = leaseContext.LeaseState;
                        this.CreateResponse((ModelSmb2Status)status, ReturnLeaseContextType.ReturnLeaseContextIncluded,
                            (uint)leaseContext.LeaseState, leaseContext.Flags, leasingConfig);
                    }
                    else
                    {
                        this.CreateResponse((ModelSmb2Status)status, ReturnLeaseContextType.ReturnLeaseContextNotIncluded,
                            (uint)LeaseStateValues.SMB2_LEASE_NONE, LeaseFlagsValues.NONE, leasingConfig);
                    }
                }
                else
                {
                    Site.Assume.Fail("Unexpected type: {0}", leaseContextType);
                }
            }
            else
            {
                this.CreateResponse((ModelSmb2Status)status, ReturnLeaseContextType.ReturnLeaseContextNotIncluded,
                    (uint)LeaseStateValues.SMB2_LEASE_NONE, LeaseFlagsValues.NONE, leasingConfig);
            }
            #endregion

            #region Write Data
            if (status == Smb2Status.STATUS_SUCCESS && (connectTargetType == ConnectTargetType.ConnectToNonDirectory))
            {
                WRITE_Response writeResponse;
                byte[] data = Encoding.ASCII.GetBytes(Smb2Utility.CreateRandomString(1));
                status = originalClient.Client.Write(1, 1, originalClient.Flags, originalClient.MessageId++, originalClient.SessionId, originalClient.TreeId, 0, originalClient.FileId,
                    Channel_Values.CHANNEL_NONE, WRITE_Request_Flags_Values.None, new byte[0], data, out header, out writeResponse);
                originalClient.GrantedCredit = header.CreditRequestResponse;
                Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Write data to the file {0} failed with error code={1}", originalClient.File, Smb2Status.GetStatusCode(status));

                FLUSH_Response flushResponse;
                status = originalClient.Client.Flush(1, 1, originalClient.Flags, originalClient.MessageId++, originalClient.SessionId, originalClient.TreeId, originalClient.FileId,
                    out header, out flushResponse);
                originalClient.GrantedCredit = header.CreditRequestResponse;
                Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Flush data to the file {0} failed with error code={1}", originalClient.File, Smb2Status.GetStatusCode(status));
            }
            #endregion

            if (status == Smb2Status.STATUS_SUCCESS)
            {
                clients[(int)OperatorType.SameClientId].CreateContexts = originalClient.CreateContexts;
            }
        }