1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import pike.model
38 import pike.smb2
39 import pike.test
40 import pike.ntstatus
41 import random
42 import array
43
44 @pike.test.RequireDialect(pike.smb2.DIALECT_SMB3_0)
45 @pike.test.RequireCapabilities(pike.smb2.SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
46 @pike.test.RequireShareCapabilities(pike.smb2.SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
57
58
60 chan, tree = self.tree_connect()
61
62
63 handle1 = chan.create(tree,
64 'appinstanceid.txt',
65 access=pike.smb2.FILE_READ_DATA | pike.smb2.FILE_WRITE_DATA | pike.smb2.DELETE,
66 share=self.share_all,
67 disposition=pike.smb2.FILE_OPEN_IF,
68 options=pike.smb2.FILE_DELETE_ON_CLOSE,
69 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
70 lease_key = self.lease1,
71 lease_state = self.rwh,
72 durable=0,
73 persistent=True,
74 app_instance_id=self.app_instance_id1).result()
75
76 self.assertEqual(handle1.durable_flags, pike.smb2.SMB2_DHANDLE_FLAG_PERSISTENT)
77 self.assertEqual(handle1.lease.lease_state, self.rwh)
78
79 chan.close(handle1)
80
81
83 chan, tree = self.tree_connect()
84
85
86 handle1 = chan.create(tree,
87 'appinstanceid.txt',
88 share=self.share_all,
89 disposition=pike.smb2.FILE_OPEN_IF,
90 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
91 lease_key = self.lease1,
92 lease_state = self.rwh,
93 durable=0,
94 persistent=True,
95 app_instance_id=self.app_instance_id1).result()
96
97 self.assertEqual(handle1.durable_flags, pike.smb2.SMB2_DHANDLE_FLAG_PERSISTENT)
98 self.assertEqual(handle1.lease.lease_state, self.rwh)
99
100
101 chan.connection.close()
102
103 chan2, tree2 = self.tree_connect(client=pike.model.Client())
104
105
106 handle2 = chan2.create(tree,
107 'appinstanceid.txt',
108 access=pike.smb2.FILE_READ_DATA | pike.smb2.FILE_WRITE_DATA | pike.smb2.DELETE,
109 share=self.share_all,
110 disposition=pike.smb2.FILE_OPEN_IF,
111 options=pike.smb2.FILE_DELETE_ON_CLOSE,
112 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
113 lease_key = self.lease1,
114 lease_state = self.rwh,
115 durable=0,
116 persistent=True,
117 app_instance_id=self.app_instance_id1).result()
118
119 self.assertEqual(handle2.durable_flags, pike.smb2.SMB2_DHANDLE_FLAG_PERSISTENT)
120 self.assertEqual(handle2.lease.lease_state, self.rwh)
121
122 chan2.close(handle2)
123
124
125
127 chan, tree = self.tree_connect()
128
129
130 handle1 = chan.create(tree,
131 'appinstanceid.txt',
132 share=self.share_all,
133 disposition=pike.smb2.FILE_OPEN_IF,
134 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
135 lease_key = self.lease1,
136 lease_state = self.rwh,
137 durable=0,
138 persistent=True,
139 app_instance_id=self.app_instance_id1).result()
140
141 self.assertEqual(handle1.durable_flags, pike.smb2.SMB2_DHANDLE_FLAG_PERSISTENT)
142 self.assertEqual(handle1.lease.lease_state, self.rwh)
143
144
145 chan.connection.close()
146
147 chan2, tree2 = self.tree_connect()
148
149
150 with self.assert_error(pike.ntstatus.STATUS_FILE_NOT_AVAILABLE):
151 handle2 = chan2.create(tree,
152 'appinstanceid.txt',
153 access=pike.smb2.FILE_READ_DATA | pike.smb2.FILE_WRITE_DATA | pike.smb2.DELETE,
154 share=self.share_all,
155 disposition=pike.smb2.FILE_OPEN_IF,
156 options=pike.smb2.FILE_DELETE_ON_CLOSE,
157 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
158 lease_key = self.lease1,
159 lease_state = self.rwh,
160 durable=0,
161 persistent=True,
162 app_instance_id=self.app_instance_id1).result()
163
164
165 chan2.connection.close()
166
167 chan3, tree3 = self.tree_connect(client=pike.model.Client())
168
169
170 handle3 = chan3.create(tree,
171 'appinstanceid.txt',
172 access=pike.smb2.FILE_READ_DATA | pike.smb2.FILE_WRITE_DATA | pike.smb2.DELETE,
173 share=self.share_all,
174 disposition=pike.smb2.FILE_OPEN_IF,
175 options=pike.smb2.FILE_DELETE_ON_CLOSE,
176 oplock_level=pike.smb2.SMB2_OPLOCK_LEVEL_LEASE,
177 lease_key = self.lease1,
178 lease_state = self.rwh,
179 durable=0,
180 persistent=True,
181 app_instance_id=self.app_instance_id1).result()
182
183 self.assertEqual(handle3.durable_flags, pike.smb2.SMB2_DHANDLE_FLAG_PERSISTENT)
184 self.assertEqual(handle3.lease.lease_state, self.rwh)
185
186 chan3.close(handle3)
187