Codebase list pysmb / 38858a47-a141-4b15-b621-7621093dbc3c/main
Merge new upstream release 1.1.26. Kali Janitor 3 years ago
152 changed file(s) with 7767 addition(s) and 8543 deletion(s). Raw diff Collapse all Expand all
0 pysmb-1.1.26, 5 Jan 2019
1 ========================
2 - Prevents OperationError from being raised when listPath() operation does not
3 return any matching file results.
4 - SMBConnection is now a context manager #122.
5
6 pysmb-1.1.25, 28 July 2018
7 ========================
8 - Fix buggy support for search parameter in listPath() method. Add
9 SMB_FILE_ATTRIBUTE_INCL_NORMAL bit constant to include 'normal' files with
10 other file types in the returned result. From now on, pysmb defines a 'normal' file
11 as a file entry that is not read-only, not hidden, not system, not archive and
12 not a directory; it ignores other attributes like compression, indexed, sparse,
13 temporary and encryption. listPath() method will now include 'normal' files
14 using the default search parameter.
15 - Add isNormal property to SharedFile class to support test if the file is a
16 'normal' file (according to pysmb definition of 'normal' file).
17
18 pysmb-1.1.24, 19 July 2018
19 ========================
20 - Improve listPath implementation for SMB1
21 - Support for STATUS_PENDING responses across all SMB2 operations.
22
23 pysmb-1.1.23, 5 May 2018
24 ========================
25 - Fix bug in listShares() method which fails when the remote server has many shares.
26 - Improve echo() method to test and fail if the provided data to echo is not a bytes object.
27 - Fix bug in listPath() method where the path to query is not properly terminated.
28
29 pysmb-1.1.22, 17 Sep 2017
30 ========================
31 - Fix bug in getAttributes() method which should return only the filename
32 instead of the entire path for the filename property for the return result.
33
34 pysmb-1.1.21, 9 Sep 2017
35 ========================
36 - Fix bug where timestamp values for SMB1 getAttributes() response are not
37 converted properly from FILETIME to epoch time values.
38
39 pysmb-1.1.20, 13 Aug 2017
40 =========================
41 - Add getSecurity() method to support security descriptors query via SMB2
42 - Improve retrieveFile() and retrieveFileFromOffset() methods to allow file
43 retrievals over SMB2 even when the file is being locked on the server.
44 - Silently discards NMB SESSION_KEEPALIVE packets instead of raising warnings.
45 - SMB sessionID will be sent in ECHO requests to conform to SMB2 specs.
46 - Fix type errors for MD4 functions in python3.
47
048 pysmb-1.1.19, 13 Nov 2016
1 ========================
49 =========================
250 - Ignore STATUS_PENDING during delete and file store operations
351
452 pysmb-1.1.18, 9 Apr 2016
00
1 Copyright (C) 2001-2015 Michael Teo <miketeo (a) miketeo.net>
1 Copyright (C) 2001-2019 Michael Teo <miketeo (a) miketeo.net>
22
33 This software is provided 'as-is', without any express or implied warranty.
44 In no event will the author be held liable for any damages arising from the
0 include LICENSE
1 include CHANGELOG
2 recursive-include python2 *
3 recursive-exclude python2 *.pyc
4 recursive-exclude python2 *~
5 recursive-include python3 *
6 recursive-exclude python3 *.pyc
7 recursive-exclude python3 *~
8 recursive-include sphinx *
9 recursive-include docs *
10 recursive-exclude docs *.zip
00 Metadata-Version: 1.1
11 Name: pysmb
2 Version: 1.1.19
2 Version: 1.1.26
33 Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
44 Home-page: https://miketeo.net/projects/pysmb
55 Author: Michael Teo
1515 Classifier: Operating System :: Microsoft :: Windows
1616 Classifier: Operating System :: POSIX
1717 Classifier: Programming Language :: Python
18 Classifier: Programming Language :: Python :: 2.4
19 Classifier: Programming Language :: Python :: 2.5
20 Classifier: Programming Language :: Python :: 2.6
2118 Classifier: Programming Language :: Python :: 2.7
2219 Classifier: Programming Language :: Python :: 3
2320 Classifier: Topic :: Communications :: File Sharing
0 pysmb (1.1.26-0kali1) UNRELEASED; urgency=low
1 -- Kali Janitor <[email protected]> Sat, 03 Apr 2021 23:39:58 -0000
2
03 pysmb (1.1.19-0kali2) kali-dev; urgency=medium
14
25 [ Raphaƫl Hertzog ]
00 # Sphinx build info version 1
11 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
2 config: 8ec856095809db2990831edf01ebc5a4
2 config: 24e4dd110b51998b070280bf87a2d415
33 tags: 645f666f9bcd5a90fca523b33c5a78b7
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>Overview: module code &mdash; pysmb 1.1.18 documentation</title>
8 <title>Overview: module code &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 </head>
2727 <body role="document">
2828 <div class="related" role="navigation" aria-label="related navigation">
3131 <li class="right" style="margin-right: 10px">
3232 <a href="../genindex.html" title="General Index"
3333 accesskey="I">index</a></li>
34 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
34 <li class="right" >
35 <a href="../py-modindex.html" title="Python Module Index"
36 >modules</a> |</li>
37 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3538 </ul>
3639 </div>
3740 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
6063 <h1>All modules for which code is available</h1>
6164 <ul><li><a href="nmb/NetBIOS.html">nmb.NetBIOS</a></li>
6265 <li><a href="nmb/NetBIOSProtocol.html">nmb.NetBIOSProtocol</a></li>
63 <li><a href="smb/SMBConnection.html">smb.SMBConnection</a></li>
64 <li><a href="smb/SMBProtocol.html">smb.SMBProtocol</a></li>
65 <li><a href="smb/base.html">smb.base</a></li>
66 <li><a href="smb/security_descriptors.html">smb.security_descriptors</a></li>
6667 <li><a href="smb/smb_structs.html">smb.smb_structs</a></li>
6768 </ul>
6869
7778 <li class="right" style="margin-right: 10px">
7879 <a href="../genindex.html" title="General Index"
7980 >index</a></li>
80 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
81 <li class="right" >
82 <a href="../py-modindex.html" title="Python Module Index"
83 >modules</a> |</li>
84 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
8185 </ul>
8286 </div>
8387 <div class="footer" role="contentinfo">
84 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
88 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
8589 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
8690 </div>
8791 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>nmb.NetBIOS &mdash; pysmb 1.1.18 documentation</title>
8 <title>nmb.NetBIOS &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
2828 <body role="document">
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
35 <li class="right" >
36 <a href="../../py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3639 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3740 </ul>
3841 </div>
217220 <li class="right" style="margin-right: 10px">
218221 <a href="../../genindex.html" title="General Index"
219222 >index</a></li>
220 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
223 <li class="right" >
224 <a href="../../py-modindex.html" title="Python Module Index"
225 >modules</a> |</li>
226 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
221227 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
222228 </ul>
223229 </div>
224230 <div class="footer" role="contentinfo">
225 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
231 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
226232 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
227233 </div>
228234 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.18 documentation</title>
8 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
2828 <body role="document">
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
35 <li class="right" >
36 <a href="../../py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3639 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3740 </ul>
3841 </div>
209212 <li class="right" style="margin-right: 10px">
210213 <a href="../../genindex.html" title="General Index"
211214 >index</a></li>
212 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
215 <li class="right" >
216 <a href="../../py-modindex.html" title="Python Module Index"
217 >modules</a> |</li>
218 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
213219 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
214220 </ul>
215221 </div>
216222 <div class="footer" role="contentinfo">
217 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
223 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
218224 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
219225 </div>
220226 </body>
+0
-668
docs/html/_modules/smb/SMBConnection.html less more
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>smb.SMBConnection &mdash; pysmb 1.1.18 documentation</title>
9
10 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '../../',
16 VERSION: '1.1.18',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="../../_static/jquery.js"></script>
23 <script type="text/javascript" src="../../_static/underscore.js"></script>
24 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
26 <link rel="up" title="Module code" href="../index.html" />
27 </head>
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
30 <h3>Navigation</h3>
31 <ul>
32 <li class="right" style="margin-right: 10px">
33 <a href="../../genindex.html" title="General Index"
34 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
36 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
37 </ul>
38 </div>
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
40 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none" role="search">
42 <h3>Quick search</h3>
43 <form class="search" action="../../search.html" method="get">
44 <input type="text" name="q" />
45 <input type="submit" value="Go" />
46 <input type="hidden" name="check_keywords" value="yes" />
47 <input type="hidden" name="area" value="default" />
48 </form>
49 <p class="searchtip" style="font-size: 90%">
50 Enter search terms or a module, class or function name.
51 </p>
52 </div>
53 <script type="text/javascript">$('#searchbox').show(0);</script>
54 </div>
55 </div>
56
57 <div class="document">
58 <div class="documentwrapper">
59 <div class="bodywrapper">
60 <div class="body" role="main">
61
62 <h1>Source code for smb.SMBConnection</h1><div class="highlight"><pre>
63
64 <span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">select</span><span class="o">,</span> <span class="nn">socket</span><span class="o">,</span> <span class="nn">struct</span><span class="o">,</span> <span class="nn">errno</span>
65 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
66 <span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
67 <span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">SMB</span><span class="p">,</span> <span class="n">NotConnectedError</span><span class="p">,</span> <span class="n">NotReadyError</span><span class="p">,</span> <span class="n">SMBTimeout</span>
68
69
70 <div class="viewcode-block" id="SMBConnection"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">[docs]</a><span class="k">class</span> <span class="nc">SMBConnection</span><span class="p">(</span><span class="n">SMB</span><span class="p">):</span>
71
72 <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBConnection&#39;</span><span class="p">)</span>
73
74 <span class="c1">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
75 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
76 <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
77 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
78 <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
79 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
80
81 <div class="viewcode-block" id="SMBConnection.__init__"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
82 <span class="sd">&quot;&quot;&quot;</span>
83 <span class="sd"> Create a new SMBConnection instance.</span>
84
85 <span class="sd"> *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
86 <span class="sd"> File operations can only be proceeded after the connection has been authenticated successfully.</span>
87
88 <span class="sd"> Note that you need to call *connect* method to actually establish the SMB connection to the remote server and perform authentication.</span>
89
90 <span class="sd"> The default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
91 <span class="sd"> Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</span>
92
93 <span class="sd"> :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
94 <span class="sd"> You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``</span>
95 <span class="sd"> :param string remote_name: The NetBIOS machine name of the remote server.</span>
96 <span class="sd"> On windows, you can find out the machine name by right-clicking on the &quot;My Computer&quot; and selecting &quot;Properties&quot;.</span>
97 <span class="sd"> This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</span>
98 <span class="sd"> :param string domain: The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</span>
99 <span class="sd"> :param boolean use_ntlm_v2: Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.</span>
100 <span class="sd"> The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
101 <span class="sd"> Hence, we can only &quot;guess&quot; or try both algorithms.</span>
102 <span class="sd"> On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
103 <span class="sd"> :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
104 <span class="sd"> If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
105 <span class="sd"> If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
106 <span class="sd"> If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
107 <span class="sd"> :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
108 <span class="sd"> The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
109 <span class="sd"> &quot;&quot;&quot;</span>
110 <span class="n">SMB</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">use_ntlm_v2</span><span class="p">,</span> <span class="n">sign_options</span><span class="p">,</span> <span class="n">is_direct_tcp</span><span class="p">)</span>
111 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
112 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
113 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
114 <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span></div>
115
116 <span class="c1">#</span>
117 <span class="c1"># SMB (and its superclass) Methods</span>
118 <span class="c1">#</span>
119
120 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
121 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">True</span>
122
123 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
124 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">False</span>
125
126 <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
127 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span>
128 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
129 <span class="n">total_sent</span> <span class="o">=</span> <span class="mi">0</span>
130 <span class="k">while</span> <span class="n">total_sent</span> <span class="o">&lt;</span> <span class="n">data_len</span><span class="p">:</span>
131 <span class="n">sent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">total_sent</span><span class="p">:])</span>
132 <span class="k">if</span> <span class="n">sent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
133 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Server disconnected&#39;</span><span class="p">)</span>
134 <span class="n">total_sent</span> <span class="o">=</span> <span class="n">total_sent</span> <span class="o">+</span> <span class="n">sent</span>
135
136 <span class="c1">#</span>
137 <span class="c1"># Misc Properties</span>
138 <span class="c1">#</span>
139
140 <span class="nd">@property</span>
141 <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
142 <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection is using SMB2 protocol.&quot;&quot;&quot;</span>
143 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span>
144
145
146 <span class="c1">#</span>
147 <span class="c1"># Public Methods</span>
148 <span class="c1">#</span>
149
150 <div class="viewcode-block" id="SMBConnection.connect"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">139</span><span class="p">,</span> <span class="n">sock_family</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">60</span><span class="p">):</span>
151 <span class="sd">&quot;&quot;&quot;</span>
152 <span class="sd"> Establish the SMB connection to the remote SMB/CIFS server.</span>
153
154 <span class="sd"> You must call this method before attempting any of the file operations with the remote server.</span>
155 <span class="sd"> This method will block until the SMB connection has attempted at least one authentication.</span>
156
157 <span class="sd"> :return: A boolean value indicating the result of the authentication atttempt: True if authentication is successful; False, if otherwise.</span>
158 <span class="sd"> &quot;&quot;&quot;</span>
159 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
160 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
161
162 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
163 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">sock_family</span><span class="p">)</span>
164 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">settimeout</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
165 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="p">))</span>
166
167 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
168 <span class="k">try</span><span class="p">:</span>
169 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
170 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
171 <span class="k">else</span><span class="p">:</span>
172 <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
173 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
174 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
175 <span class="k">finally</span><span class="p">:</span>
176 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
177
178 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span></div>
179
180 <div class="viewcode-block" id="SMBConnection.close"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
181 <span class="sd">&quot;&quot;&quot;</span>
182 <span class="sd"> Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</span>
183 <span class="sd"> &quot;&quot;&quot;</span>
184 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
185 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
186 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span></div>
187
188 <div class="viewcode-block" id="SMBConnection.listShares"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listShares">[docs]</a> <span class="k">def</span> <span class="nf">listShares</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
189 <span class="sd">&quot;&quot;&quot;</span>
190 <span class="sd"> Retrieve a list of shared resources on remote server.</span>
191
192 <span class="sd"> :return: A list of :doc:`smb.base.SharedDevice&lt;smb_SharedDevice&gt;` instances describing the shared resource</span>
193 <span class="sd"> &quot;&quot;&quot;</span>
194 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
195 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
196
197 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
198
199 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
200 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
201 <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
202
203 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
204 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
205 <span class="k">raise</span> <span class="n">failure</span>
206
207 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
208 <span class="k">try</span><span class="p">:</span>
209 <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span><span class="p">(</span><span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
210 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
211 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
212 <span class="k">finally</span><span class="p">:</span>
213 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
214
215 <span class="k">return</span> <span class="n">results</span></div>
216
217 <div class="viewcode-block" id="SMBConnection.listPath"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath">[docs]</a> <span class="k">def</span> <span class="nf">listPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span>
218 <span class="n">search</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_READONLY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_DIRECTORY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_ARCHIVE</span><span class="p">,</span>
219 <span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
220 <span class="sd">&quot;&quot;&quot;</span>
221 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
222
223 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
224 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.</span>
225 <span class="sd"> :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).</span>
226 <span class="sd"> The default *search* value will query for all read-only, hidden, system, archive files and directories.</span>
227 <span class="sd"> :param string/unicode pattern: the filter to apply to the results before returning to the client.</span>
228 <span class="sd"> :return: A list of :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instances.</span>
229 <span class="sd"> &quot;&quot;&quot;</span>
230 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
231 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
232
233 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
234
235 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
236 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
237 <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
238
239 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
240 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
241 <span class="k">raise</span> <span class="n">failure</span>
242
243 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
244 <span class="k">try</span><span class="p">:</span>
245 <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">search</span> <span class="o">=</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
246 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
247 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
248 <span class="k">finally</span><span class="p">:</span>
249 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
250
251 <span class="k">return</span> <span class="n">results</span></div>
252
253 <div class="viewcode-block" id="SMBConnection.listSnapshots"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listSnapshots">[docs]</a> <span class="k">def</span> <span class="nf">listSnapshots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
254 <span class="sd">&quot;&quot;&quot;</span>
255 <span class="sd"> Retrieve a list of available snapshots (shadow copies) for *path*.</span>
256
257 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
258
259 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
260 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
261 <span class="sd"> :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone</span>
262 <span class="sd"> &quot;&quot;&quot;</span>
263 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
264 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
265
266 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
267
268 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
269 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
270 <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
271
272 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
273 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
274 <span class="k">raise</span> <span class="n">failure</span>
275
276 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
277 <span class="k">try</span><span class="p">:</span>
278 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
279 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
280 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
281 <span class="k">finally</span><span class="p">:</span>
282 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
283
284 <span class="k">return</span> <span class="n">results</span></div>
285
286 <div class="viewcode-block" id="SMBConnection.getAttributes"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.getAttributes">[docs]</a> <span class="k">def</span> <span class="nf">getAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
287 <span class="sd">&quot;&quot;&quot;</span>
288 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
289
290 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
291 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
292 <span class="sd"> :return: A :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
293 <span class="sd"> &quot;&quot;&quot;</span>
294 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
295 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
296
297 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
298
299 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">info</span><span class="p">):</span>
300 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
301 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
302
303 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
304 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
305 <span class="k">raise</span> <span class="n">failure</span>
306
307 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
308 <span class="k">try</span><span class="p">:</span>
309 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
310 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
311 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
312 <span class="k">finally</span><span class="p">:</span>
313 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
314
315 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
316
317 <div class="viewcode-block" id="SMBConnection.retrieveFile"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFile">[docs]</a> <span class="k">def</span> <span class="nf">retrieveFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
318 <span class="sd">&quot;&quot;&quot;</span>
319 <span class="sd"> Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
320
321 <span class="sd"> Use *retrieveFileFromOffset()* method if you wish to specify the offset to read from the remote *path* and/or the number of bytes to write to the *file_obj*.</span>
322
323 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
324 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
325 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
326 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
327 <span class="sd"> The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
328 <span class="sd"> &quot;&quot;&quot;</span>
329 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
330
331 <div class="viewcode-block" id="SMBConnection.retrieveFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFileFromOffset">[docs]</a> <span class="k">def</span> <span class="nf">retrieveFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span> <span class="o">=</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
332 <span class="sd">&quot;&quot;&quot;</span>
333 <span class="sd"> Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
334
335 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
336 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
337 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* up to *max_length* number of bytes.</span>
338 <span class="sd"> :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
339 <span class="sd"> :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
340 <span class="sd"> If zero, the method returns immediately after the file is opened successfully for reading.</span>
341 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
342 <span class="sd"> The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
343 <span class="sd"> &quot;&quot;&quot;</span>
344 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
345 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
346
347 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
348
349 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
350 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
351 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
352
353 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
354 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
355 <span class="k">raise</span> <span class="n">failure</span>
356
357 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
358 <span class="k">try</span><span class="p">:</span>
359 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
360 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
361 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
362 <span class="k">finally</span><span class="p">:</span>
363 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
364
365 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
366
367 <div class="viewcode-block" id="SMBConnection.storeFile"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFile">[docs]</a> <span class="k">def</span> <span class="nf">storeFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
368 <span class="sd">&quot;&quot;&quot;</span>
369 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
370 <span class="sd"> If the file already exists on the remote server, it will be truncated and overwritten.</span>
371
372 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
373 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created. Otherwise, it will be overwritten.</span>
374 <span class="sd"> If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
375 <span class="sd"> :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
376 <span class="sd"> :return: Number of bytes uploaded</span>
377 <span class="sd"> &quot;&quot;&quot;</span>
378 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">storeFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
379
380 <div class="viewcode-block" id="SMBConnection.storeFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFileFromOffset">[docs]</a> <span class="k">def</span> <span class="nf">storeFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
381 <span class="sd">&quot;&quot;&quot;</span>
382 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
383
384 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
385 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created.</span>
386 <span class="sd"> If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
387 <span class="sd"> :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
388 <span class="sd"> :param offset: Long integer value which specifies the offset in the remote server to start writing. First byte of the file is 0.</span>
389 <span class="sd"> :param truncate: Boolean value. If True and the file exists on the remote server, it will be truncated first before writing. Default is False.</span>
390 <span class="sd"> :return: the file position where the next byte will be written.</span>
391 <span class="sd"> &quot;&quot;&quot;</span>
392 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
393 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
394
395 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
396
397 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
398 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
399 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
400
401 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
402 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
403 <span class="k">raise</span> <span class="n">failure</span>
404
405 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
406 <span class="k">try</span><span class="p">:</span>
407 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="n">truncate</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
408 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
409 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
410 <span class="k">finally</span><span class="p">:</span>
411 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
412
413 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
414
415 <div class="viewcode-block" id="SMBConnection.deleteFiles"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteFiles">[docs]</a> <span class="k">def</span> <span class="nf">deleteFiles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
416 <span class="sd">&quot;&quot;&quot;</span>
417 <span class="sd"> Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</span>
418
419 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
420 <span class="sd"> :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
421 <span class="sd"> Wildcards may be used in th filename component of the path.</span>
422 <span class="sd"> If your path/filename contains non-English characters, you must pass in an unicode string.</span>
423 <span class="sd"> :return: None</span>
424 <span class="sd"> &quot;&quot;&quot;</span>
425 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
426 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
427
428 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
429 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
430
431 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
432 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
433 <span class="k">raise</span> <span class="n">failure</span>
434
435 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
436 <span class="k">try</span><span class="p">:</span>
437 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
438 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
439 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
440 <span class="k">finally</span><span class="p">:</span>
441 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
442
443 <div class="viewcode-block" id="SMBConnection.resetFileAttributes"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.resetFileAttributes">[docs]</a> <span class="k">def</span> <span class="nf">resetFileAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
444 <span class="sd">&quot;&quot;&quot;</span>
445 <span class="sd"> Reset file attributes of one or more regular files or folders.</span>
446 <span class="sd"> It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.</span>
447 <span class="sd"> This function is very helpful when deleting files/folders that are read-only.</span>
448 <span class="sd"> Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)</span>
449
450 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
451 <span class="sd"> :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
452 <span class="sd"> Wildcards may be used in the filename component of the path.</span>
453 <span class="sd"> If your path/filename contains non-English characters, you must pass in an unicode string.</span>
454 <span class="sd"> :return: None</span>
455 <span class="sd"> &quot;&quot;&quot;</span>
456 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
457 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
458
459 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
460 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
461
462 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
463 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
464 <span class="k">raise</span> <span class="n">failure</span>
465
466 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
467 <span class="k">try</span><span class="p">:</span>
468 <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
469 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
470 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
471 <span class="k">finally</span><span class="p">:</span>
472 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
473
474 <div class="viewcode-block" id="SMBConnection.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.createDirectory">[docs]</a> <span class="k">def</span> <span class="nf">createDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
475 <span class="sd">&quot;&quot;&quot;</span>
476 <span class="sd"> Creates a new directory *path* on the *service_name*.</span>
477
478 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
479 <span class="sd"> :param string/unicode path: The path of the new folder (relative to) the shared folder.</span>
480 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
481 <span class="sd"> :return: None</span>
482 <span class="sd"> &quot;&quot;&quot;</span>
483 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
484 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
485
486 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
487 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
488
489 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
490 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
491 <span class="k">raise</span> <span class="n">failure</span>
492
493 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
494 <span class="k">try</span><span class="p">:</span>
495 <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
496 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
497 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
498 <span class="k">finally</span><span class="p">:</span>
499 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
500
501 <div class="viewcode-block" id="SMBConnection.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteDirectory">[docs]</a> <span class="k">def</span> <span class="nf">deleteDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
502 <span class="sd">&quot;&quot;&quot;</span>
503 <span class="sd"> Delete the empty folder at *path* on *service_name*</span>
504
505 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
506 <span class="sd"> :param string/unicode path: The path of the to-be-deleted folder (relative to) the shared folder.</span>
507 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
508 <span class="sd"> :return: None</span>
509 <span class="sd"> &quot;&quot;&quot;</span>
510 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
511 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
512
513 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
514 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
515
516 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
517 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
518 <span class="k">raise</span> <span class="n">failure</span>
519
520 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
521 <span class="k">try</span><span class="p">:</span>
522 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
523 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
524 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
525 <span class="k">finally</span><span class="p">:</span>
526 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
527
528 <div class="viewcode-block" id="SMBConnection.rename"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.rename">[docs]</a> <span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
529 <span class="sd">&quot;&quot;&quot;</span>
530 <span class="sd"> Rename a file or folder at *old_path* to *new_path* shared at *service_name*. Note that this method cannot be used to rename file/folder across different shared folders</span>
531
532 <span class="sd"> *old_path* and *new_path* are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.</span>
533 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
534
535 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
536 <span class="sd"> :return: None</span>
537 <span class="sd"> &quot;&quot;&quot;</span>
538 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
539 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
540
541 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
542 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
543
544 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
545 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
546 <span class="k">raise</span> <span class="n">failure</span>
547
548 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
549 <span class="k">try</span><span class="p">:</span>
550 <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">)</span>
551 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
552 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
553 <span class="k">finally</span><span class="p">:</span>
554 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
555
556 <div class="viewcode-block" id="SMBConnection.echo"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.echo">[docs]</a> <span class="k">def</span> <span class="nf">echo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">10</span><span class="p">):</span>
557 <span class="sd">&quot;&quot;&quot;</span>
558 <span class="sd"> Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.</span>
559
560 <span class="sd"> :param string data: Data to send to the remote server.</span>
561 <span class="sd"> :return: The *data* parameter</span>
562 <span class="sd"> &quot;&quot;&quot;</span>
563 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
564 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
565
566 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
567
568 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
569 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
570 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
571
572 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
573 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
574 <span class="k">raise</span> <span class="n">failure</span>
575
576 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
577 <span class="k">try</span><span class="p">:</span>
578 <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">)</span>
579 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
580 <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
581 <span class="k">finally</span><span class="p">:</span>
582 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
583
584 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
585
586 <span class="c1">#</span>
587 <span class="c1"># Protected Methods</span>
588 <span class="c1">#</span>
589
590 <span class="k">def</span> <span class="nf">_pollForNetBIOSPacket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
591 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
592 <span class="n">read_len</span> <span class="o">=</span> <span class="mi">4</span>
593 <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
594
595 <span class="k">while</span> <span class="n">read_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
596 <span class="k">try</span><span class="p">:</span>
597 <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
598 <span class="k">raise</span> <span class="n">SMBTimeout</span>
599
600 <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
601 <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
602 <span class="k">raise</span> <span class="n">SMBTimeout</span>
603
604 <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
605 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
606 <span class="k">raise</span> <span class="n">NotConnectedError</span>
607
608 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
609 <span class="n">read_len</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
610 <span class="k">except</span> <span class="n">select</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
611 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ex</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</span><span class="p">):</span>
612 <span class="k">if</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINTR</span> <span class="ow">and</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EAGAIN</span><span class="p">:</span>
613 <span class="k">raise</span> <span class="n">ex</span>
614 <span class="k">else</span><span class="p">:</span>
615 <span class="k">raise</span> <span class="n">ex</span>
616
617 <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;BBH&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
618 <span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="mh">0x01</span><span class="p">:</span>
619 <span class="n">length</span> <span class="o">=</span> <span class="n">length</span> <span class="o">|</span> <span class="mh">0x10000</span>
620
621 <span class="n">read_len</span> <span class="o">=</span> <span class="n">length</span>
622 <span class="k">while</span> <span class="n">read_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
623 <span class="k">try</span><span class="p">:</span>
624 <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
625 <span class="k">raise</span> <span class="n">SMBTimeout</span>
626
627 <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
628 <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
629 <span class="k">raise</span> <span class="n">SMBTimeout</span>
630
631 <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
632 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
633 <span class="k">raise</span> <span class="n">NotConnectedError</span>
634
635 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
636 <span class="n">read_len</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
637 <span class="k">except</span> <span class="n">select</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
638 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ex</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</span><span class="p">):</span>
639 <span class="k">if</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINTR</span> <span class="ow">and</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EAGAIN</span><span class="p">:</span>
640 <span class="k">raise</span> <span class="n">ex</span>
641 <span class="k">else</span><span class="p">:</span>
642 <span class="k">raise</span> <span class="n">ex</span>
643
644 <span class="bp">self</span><span class="o">.</span><span class="n">feedData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
645 </pre></div>
646
647 </div>
648 </div>
649 </div>
650 <div class="clearer"></div>
651 </div>
652 <div class="related" role="navigation" aria-label="related navigation">
653 <h3>Navigation</h3>
654 <ul>
655 <li class="right" style="margin-right: 10px">
656 <a href="../../genindex.html" title="General Index"
657 >index</a></li>
658 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
659 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
660 </ul>
661 </div>
662 <div class="footer" role="contentinfo">
663 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
664 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
665 </div>
666 </body>
667 </html>āŽ
+0
-487
docs/html/_modules/smb/SMBProtocol.html less more
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>smb.SMBProtocol &mdash; pysmb 1.1.18 documentation</title>
9
10 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '../../',
16 VERSION: '1.1.18',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="../../_static/jquery.js"></script>
23 <script type="text/javascript" src="../../_static/underscore.js"></script>
24 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
26 <link rel="up" title="Module code" href="../index.html" />
27 </head>
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
30 <h3>Navigation</h3>
31 <ul>
32 <li class="right" style="margin-right: 10px">
33 <a href="../../genindex.html" title="General Index"
34 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
36 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
37 </ul>
38 </div>
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
40 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none" role="search">
42 <h3>Quick search</h3>
43 <form class="search" action="../../search.html" method="get">
44 <input type="text" name="q" />
45 <input type="submit" value="Go" />
46 <input type="hidden" name="check_keywords" value="yes" />
47 <input type="hidden" name="area" value="default" />
48 </form>
49 <p class="searchtip" style="font-size: 90%">
50 Enter search terms or a module, class or function name.
51 </p>
52 </div>
53 <script type="text/javascript">$('#searchbox').show(0);</script>
54 </div>
55 </div>
56
57 <div class="document">
58 <div class="documentwrapper">
59 <div class="bodywrapper">
60 <div class="body" role="main">
61
62 <h1>Source code for smb.SMBProtocol</h1><div class="highlight"><pre>
63
64 <span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">time</span>
65 <span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">defer</span>
66 <span class="kn">from</span> <span class="nn">twisted.internet.protocol</span> <span class="kn">import</span> <span class="n">ClientFactory</span><span class="p">,</span> <span class="n">Protocol</span>
67 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
68 <span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
69 <span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">SMB</span><span class="p">,</span> <span class="n">NotConnectedError</span><span class="p">,</span> <span class="n">NotReadyError</span><span class="p">,</span> <span class="n">SMBTimeout</span>
70
71
72 <span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span> <span class="s1">&#39;SMBProtocolFactory&#39;</span><span class="p">,</span> <span class="s1">&#39;NotConnectedError&#39;</span><span class="p">,</span> <span class="s1">&#39;NotReadyError&#39;</span> <span class="p">]</span>
73
74
75 <span class="k">class</span> <span class="nc">SMBProtocol</span><span class="p">(</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">SMB</span><span class="p">):</span>
76
77 <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBProtocol&#39;</span><span class="p">)</span>
78
79 <span class="c1">#</span>
80 <span class="c1"># Protocol Methods</span>
81 <span class="c1">#</span>
82
83 <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
84 <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">self</span>
85 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
86 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
87 <span class="k">else</span><span class="p">:</span>
88 <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
89
90 <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
91 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
92 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span>
93
94 <span class="k">def</span> <span class="nf">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
95 <span class="bp">self</span><span class="o">.</span><span class="n">feedData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
96
97 <span class="c1">#</span>
98 <span class="c1"># SMB (and its superclass) Methods</span>
99 <span class="c1">#</span>
100
101 <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
102 <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
103
104 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
105 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
106 <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
107 <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanupPendingRequests</span><span class="p">)</span>
108
109 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
110 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
111 <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
112
113 <span class="k">def</span> <span class="nf">onNMBSessionFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
114 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Cannot establish NetBIOS session. You might have provided a wrong remote_name&#39;</span><span class="p">)</span>
115
116 <span class="c1">#</span>
117 <span class="c1"># Protected Methods</span>
118 <span class="c1">#</span>
119
120 <span class="k">def</span> <span class="nf">_cleanupPendingRequests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
121 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
122 <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
123 <span class="n">to_remove</span> <span class="o">=</span> <span class="p">[]</span>
124 <span class="k">for</span> <span class="n">mid</span><span class="p">,</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
125 <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">:</span>
126 <span class="k">try</span><span class="p">:</span>
127 <span class="n">r</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">SMBTimeout</span><span class="p">())</span>
128 <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="k">pass</span>
129 <span class="n">to_remove</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mid</span><span class="p">)</span>
130
131 <span class="k">for</span> <span class="n">mid</span> <span class="ow">in</span> <span class="n">to_remove</span><span class="p">:</span>
132 <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span>
133
134 <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanupPendingRequests</span><span class="p">)</span>
135
136
137 <div class="viewcode-block" id="SMBProtocolFactory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory">[docs]</a><span class="k">class</span> <span class="nc">SMBProtocolFactory</span><span class="p">(</span><span class="n">ClientFactory</span><span class="p">):</span>
138
139 <span class="n">protocol</span> <span class="o">=</span> <span class="n">SMBProtocol</span>
140 <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBFactory&#39;</span><span class="p">)</span>
141
142 <span class="c1">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
143 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
144 <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
145 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
146 <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
147 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
148
149 <div class="viewcode-block" id="SMBProtocolFactory.__init__"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
150 <span class="sd">&quot;&quot;&quot;</span>
151 <span class="sd"> Create a new SMBProtocolFactory instance. You will pass this instance to *reactor.connectTCP()* which will then instantiate the TCP connection to the remote SMB/CIFS server.</span>
152 <span class="sd"> Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
153 <span class="sd"> Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</span>
154
155 <span class="sd"> *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
156 <span class="sd"> File operations can only be proceeded after the connection has been authenticated successfully.</span>
157
158 <span class="sd"> :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
159 <span class="sd"> You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``.</span>
160 <span class="sd"> :param string remote_name: The NetBIOS machine name of the remote server.</span>
161 <span class="sd"> On windows, you can find out the machine name by right-clicking on the &quot;My Computer&quot; and selecting &quot;Properties&quot;.</span>
162 <span class="sd"> This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</span>
163 <span class="sd"> :param string domain: The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</span>
164 <span class="sd"> :param boolean use_ntlm_v2: Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.</span>
165 <span class="sd"> The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
166 <span class="sd"> Hence, we can only &quot;guess&quot; or try both algorithms.</span>
167 <span class="sd"> On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
168 <span class="sd"> :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
169 <span class="sd"> If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
170 <span class="sd"> If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
171 <span class="sd"> If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
172 <span class="sd"> :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
173 <span class="sd"> The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
174 <span class="sd"> &quot;&quot;&quot;</span>
175 <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
176 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
177 <span class="bp">self</span><span class="o">.</span><span class="n">my_name</span> <span class="o">=</span> <span class="n">my_name</span>
178 <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">=</span> <span class="n">remote_name</span>
179 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">domain</span>
180 <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="n">use_ntlm_v2</span>
181 <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">=</span> <span class="n">sign_options</span>
182 <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span>
183 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1">#: The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</span></div>
184
185 <span class="c1">#</span>
186 <span class="c1"># Public Property</span>
187 <span class="c1">#</span>
188
189 <span class="nd">@property</span>
190 <span class="k">def</span> <span class="nf">isReady</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
191 <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection has connected to remote server, has successfully authenticated itself and is ready for file operations.&quot;&quot;&quot;</span>
192 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">)</span>
193
194 <span class="nd">@property</span>
195 <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
196 <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection is using SMB2 protocol.&quot;&quot;&quot;</span>
197 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">is_using_smb2</span>
198
199 <span class="c1">#</span>
200 <span class="c1"># Public Methods for Callbacks</span>
201 <span class="c1">#</span>
202
203 <div class="viewcode-block" id="SMBProtocolFactory.onAuthOK"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthOK">[docs]</a> <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
204 <span class="sd">&quot;&quot;&quot;</span>
205 <span class="sd"> Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
206 <span class="sd"> This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
207 <span class="sd"> File operations can proceed when this method has been called.</span>
208 <span class="sd"> &quot;&quot;&quot;</span>
209 <span class="k">pass</span></div>
210
211 <div class="viewcode-block" id="SMBProtocolFactory.onAuthFailed"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">[docs]</a> <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
212 <span class="sd">&quot;&quot;&quot;</span>
213 <span class="sd"> Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
214 <span class="sd"> This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
215
216 <span class="sd"> If you want to retry authenticating from this method,</span>
217 <span class="sd"> 1. Disconnect the underlying SMB connection (call ``self.instance.transport.loseConnection()``)</span>
218 <span class="sd"> 2. Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</span>
219 <span class="sd"> 3. Call ``reactor.connectTCP`` with the new instance to re-establish the SMB connection</span>
220 <span class="sd"> &quot;&quot;&quot;</span>
221 <span class="k">pass</span></div>
222
223 <span class="c1">#</span>
224 <span class="c1"># Public Methods</span>
225 <span class="c1">#</span>
226
227 <div class="viewcode-block" id="SMBProtocolFactory.listShares"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listShares">[docs]</a> <span class="k">def</span> <span class="nf">listShares</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
228 <span class="sd">&quot;&quot;&quot;</span>
229 <span class="sd"> Retrieve a list of shared resources on remote server.</span>
230
231 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
232 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedDevice&lt;smb_SharedDevice&gt;` instances.</span>
233 <span class="sd"> &quot;&quot;&quot;</span>
234 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
235 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
236
237 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
238 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listShares</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
239 <span class="k">return</span> <span class="n">d</span></div>
240
241 <div class="viewcode-block" id="SMBProtocolFactory.listPath"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listPath">[docs]</a> <span class="k">def</span> <span class="nf">listPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span>
242 <span class="n">search</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_READONLY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_DIRECTORY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_ARCHIVE</span><span class="p">,</span>
243 <span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
244 <span class="sd">&quot;&quot;&quot;</span>
245 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
246
247 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
248 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.</span>
249 <span class="sd"> :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).</span>
250 <span class="sd"> The default *search* value will query for all read-only, hidden, system, archive files and directories.</span>
251 <span class="sd"> :param string/unicode pattern: the filter to apply to the results before returning to the client.</span>
252 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
253 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instances.</span>
254 <span class="sd"> &quot;&quot;&quot;</span>
255 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
256 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
257
258 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
259 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listPath</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">search</span> <span class="o">=</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
260 <span class="k">return</span> <span class="n">d</span></div>
261
262 <div class="viewcode-block" id="SMBProtocolFactory.listSnapshots"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listSnapshots">[docs]</a> <span class="k">def</span> <span class="nf">listSnapshots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
263 <span class="sd">&quot;&quot;&quot;</span>
264 <span class="sd"> Retrieve a list of available snapshots (a.k.a. shadow copies) for *path*.</span>
265
266 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
267
268 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
269 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
270 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of python *datetime.DateTime*</span>
271 <span class="sd"> instances in GMT/UTC time zone</span>
272 <span class="sd"> &quot;&quot;&quot;</span>
273 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
274 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
275
276 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
277 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listSnapshots</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
278 <span class="k">return</span> <span class="n">d</span></div>
279
280 <div class="viewcode-block" id="SMBProtocolFactory.getAttributes"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">[docs]</a> <span class="k">def</span> <span class="nf">getAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
281 <span class="sd">&quot;&quot;&quot;</span>
282 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
283
284 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
285 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
286 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
287 <span class="sd"> &quot;&quot;&quot;</span>
288 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
289 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
290
291 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
292 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_getAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
293 <span class="k">return</span> <span class="n">d</span></div>
294
295 <div class="viewcode-block" id="SMBProtocolFactory.retrieveFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFile">[docs]</a> <span class="k">def</span> <span class="nf">retrieveFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
296 <span class="sd">&quot;&quot;&quot;</span>
297 <span class="sd"> Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
298
299 <span class="sd"> Use *retrieveFileFromOffset()* method if you need to specify the offset to read from the remote *path* and/or the maximum number of bytes to write to the *file_obj*.</span>
300
301 <span class="sd"> The meaning of the *timeout* parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size</span>
302 <span class="sd"> of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
303 <span class="sd"> The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
304
305 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
306 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
307 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
308 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 3-element tuple of ( *file_obj*, file attributes of the file on server, number of bytes written to *file_obj* ).</span>
309 <span class="sd"> The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
310 <span class="sd"> &quot;&quot;&quot;</span>
311 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
312
313 <div class="viewcode-block" id="SMBProtocolFactory.retrieveFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">[docs]</a> <span class="k">def</span> <span class="nf">retrieveFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span> <span class="o">=</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
314 <span class="sd">&quot;&quot;&quot;</span>
315 <span class="sd"> Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
316
317 <span class="sd"> The meaning of the *timeout* parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size</span>
318 <span class="sd"> of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
319 <span class="sd"> The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
320
321 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
322 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
323 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
324 <span class="sd"> :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
325 <span class="sd"> :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
326 <span class="sd"> If zero, the *Deferred* callback is invoked immediately after the file is opened successfully for reading.</span>
327 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 3-element tuple of ( *file_obj*, file attributes of the file on server, number of bytes written to *file_obj* ).</span>
328 <span class="sd"> The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
329 <span class="sd"> &quot;&quot;&quot;</span>
330 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
331 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
332
333 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
334 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
335 <span class="k">return</span> <span class="n">d</span></div>
336
337 <div class="viewcode-block" id="SMBProtocolFactory.storeFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.storeFile">[docs]</a> <span class="k">def</span> <span class="nf">storeFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
338 <span class="sd">&quot;&quot;&quot;</span>
339 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
340
341 <span class="sd"> The meaning of the *timeout* parameter will be different from other file operation methods. As the uploaded file usually exceeeds the maximum size</span>
342 <span class="sd"> of each SMB/CIFS data message, it will be packetized into a series of messages (usually about 60kBytes).</span>
343 <span class="sd"> The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and acknowledged</span>
344 <span class="sd"> by the remote SMB/CIFS server.</span>
345
346 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
347 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created. Otherwise, it will be overwritten.</span>
348 <span class="sd"> If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
349 <span class="sd"> :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
350 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 2-element tuple of ( *file_obj*, number of bytes uploaded ).</span>
351 <span class="sd"> &quot;&quot;&quot;</span>
352 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
353 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
354
355 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
356 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_storeFile</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
357 <span class="k">return</span> <span class="n">d</span></div>
358
359 <div class="viewcode-block" id="SMBProtocolFactory.deleteFiles"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteFiles">[docs]</a> <span class="k">def</span> <span class="nf">deleteFiles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
360 <span class="sd">&quot;&quot;&quot;</span>
361 <span class="sd"> Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</span>
362
363 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
364 <span class="sd"> :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
365 <span class="sd"> Wildcards may be used in th filename component of the path.</span>
366 <span class="sd"> If your path/filename contains non-English characters, you must pass in an unicode string.</span>
367 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
368 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path_file_pattern* parameter.</span>
369 <span class="sd"> &quot;&quot;&quot;</span>
370 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
371 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
372
373 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
374 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_deleteFiles</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
375 <span class="k">return</span> <span class="n">d</span></div>
376
377 <div class="viewcode-block" id="SMBProtocolFactory.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.createDirectory">[docs]</a> <span class="k">def</span> <span class="nf">createDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
378 <span class="sd">&quot;&quot;&quot;</span>
379 <span class="sd"> Creates a new directory *path* on the *service_name*.</span>
380
381 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
382 <span class="sd"> :param string/unicode path: The path of the new folder (relative to) the shared folder.</span>
383 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
384 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
385 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
386 <span class="sd"> &quot;&quot;&quot;</span>
387 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
388 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
389
390 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
391 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_createDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
392 <span class="k">return</span> <span class="n">d</span></div>
393
394 <div class="viewcode-block" id="SMBProtocolFactory.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">[docs]</a> <span class="k">def</span> <span class="nf">deleteDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
395 <span class="sd">&quot;&quot;&quot;</span>
396 <span class="sd"> Delete the empty folder at *path* on *service_name*</span>
397
398 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
399 <span class="sd"> :param string/unicode path: The path of the to-be-deleted folder (relative to) the shared folder.</span>
400 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
401 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
402 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
403 <span class="sd"> &quot;&quot;&quot;</span>
404 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
405 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
406
407 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
408 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_deleteDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
409 <span class="k">return</span> <span class="n">d</span></div>
410
411 <div class="viewcode-block" id="SMBProtocolFactory.rename"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.rename">[docs]</a> <span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">):</span>
412 <span class="sd">&quot;&quot;&quot;</span>
413 <span class="sd"> Rename a file or folder at *old_path* to *new_path* shared at *service_name*. Note that this method cannot be used to rename file/folder across different shared folders</span>
414
415 <span class="sd"> *old_path* and *new_path* are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.</span>
416 <span class="sd"> If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
417
418 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
419 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
420 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 2-element tuple of ( *old_path*, *new_path* ).</span>
421 <span class="sd"> &quot;&quot;&quot;</span>
422 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
423 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
424
425 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
426 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_rename</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
427 <span class="k">return</span> <span class="n">d</span></div>
428
429 <div class="viewcode-block" id="SMBProtocolFactory.echo"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.echo">[docs]</a> <span class="k">def</span> <span class="nf">echo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">10</span><span class="p">):</span>
430 <span class="sd">&quot;&quot;&quot;</span>
431 <span class="sd"> Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.</span>
432
433 <span class="sd"> :param string data: Data to send to the remote server.</span>
434 <span class="sd"> :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
435 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.</span>
436 <span class="sd"> &quot;&quot;&quot;</span>
437 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
438 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
439
440 <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
441 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_echo</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
442 <span class="k">return</span> <span class="n">d</span></div>
443
444 <div class="viewcode-block" id="SMBProtocolFactory.closeConnection"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.closeConnection">[docs]</a> <span class="k">def</span> <span class="nf">closeConnection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
445 <span class="sd">&quot;&quot;&quot;</span>
446 <span class="sd"> Disconnect from the remote SMB/CIFS server. The TCP connection will be closed at the earliest opportunity after this method returns.</span>
447
448 <span class="sd"> :return: None</span>
449 <span class="sd"> &quot;&quot;&quot;</span>
450 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
451 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
452
453 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span></div>
454
455 <span class="c1">#</span>
456 <span class="c1"># ClientFactory methods</span>
457 <span class="c1"># (Do not touch these unless you know what you are doing)</span>
458 <span class="c1">#</span>
459
460 <span class="k">def</span> <span class="nf">buildProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
461 <span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">my_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">)</span>
462 <span class="n">p</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">self</span>
463 <span class="k">return</span> <span class="n">p</span></div>
464 </pre></div>
465
466 </div>
467 </div>
468 </div>
469 <div class="clearer"></div>
470 </div>
471 <div class="related" role="navigation" aria-label="related navigation">
472 <h3>Navigation</h3>
473 <ul>
474 <li class="right" style="margin-right: 10px">
475 <a href="../../genindex.html" title="General Index"
476 >index</a></li>
477 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
478 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
479 </ul>
480 </div>
481 <div class="footer" role="contentinfo">
482 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
483 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
484 </div>
485 </body>
486 </html>āŽ
+0
-2746
docs/html/_modules/smb/base.html less more
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>smb.base &mdash; pysmb 1.1.18 documentation</title>
9
10 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '../../',
16 VERSION: '1.1.18',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="../../_static/jquery.js"></script>
23 <script type="text/javascript" src="../../_static/underscore.js"></script>
24 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
26 <link rel="up" title="Module code" href="../index.html" />
27 </head>
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
30 <h3>Navigation</h3>
31 <ul>
32 <li class="right" style="margin-right: 10px">
33 <a href="../../genindex.html" title="General Index"
34 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
36 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
37 </ul>
38 </div>
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
40 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none" role="search">
42 <h3>Quick search</h3>
43 <form class="search" action="../../search.html" method="get">
44 <input type="text" name="q" />
45 <input type="submit" value="Go" />
46 <input type="hidden" name="check_keywords" value="yes" />
47 <input type="hidden" name="area" value="default" />
48 </form>
49 <p class="searchtip" style="font-size: 90%">
50 Enter search terms or a module, class or function name.
51 </p>
52 </div>
53 <script type="text/javascript">$('#searchbox').show(0);</script>
54 </div>
55 </div>
56
57 <div class="document">
58 <div class="documentwrapper">
59 <div class="bodywrapper">
60 <div class="body" role="main">
61
62 <h1>Source code for smb.base</h1><div class="highlight"><pre>
63
64 <span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">binascii</span><span class="o">,</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">hmac</span>
65 <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
66 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
67 <span class="kn">from</span> <span class="nn">smb2_constants</span> <span class="kn">import</span> <span class="o">*</span>
68 <span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
69 <span class="kn">from</span> <span class="nn">smb2_structs</span> <span class="kn">import</span> <span class="o">*</span>
70 <span class="kn">from</span> <span class="nn">nmb.base</span> <span class="kn">import</span> <span class="n">NMBSession</span>
71 <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">convertFILETIMEtoEpoch</span>
72 <span class="kn">import</span> <span class="nn">ntlm</span><span class="o">,</span> <span class="nn">securityblob</span>
73
74 <span class="k">try</span><span class="p">:</span>
75 <span class="kn">import</span> <span class="nn">hashlib</span>
76 <span class="n">sha256</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span>
77 <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
78 <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">sha256</span>
79
80
81 <div class="viewcode-block" id="NotReadyError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotReadyError">[docs]</a><span class="k">class</span> <span class="nc">NotReadyError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
82 <span class="sd">&quot;&quot;&quot;Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)&quot;&quot;&quot;</span>
83 <span class="k">pass</span></div>
84
85 <div class="viewcode-block" id="NotConnectedError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotConnectedError">[docs]</a><span class="k">class</span> <span class="nc">NotConnectedError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
86 <span class="sd">&quot;&quot;&quot;Raised when underlying SMB connection has been disconnected or not connected yet&quot;&quot;&quot;</span>
87 <span class="k">pass</span></div>
88
89 <div class="viewcode-block" id="SMBTimeout"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.SMBTimeout">[docs]</a><span class="k">class</span> <span class="nc">SMBTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
90 <span class="sd">&quot;&quot;&quot;Raised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.&quot;&quot;&quot;</span>
91 <span class="k">pass</span></div>
92
93
94 <span class="k">def</span> <span class="nf">_convert_to_unicode</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
95 <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
96 <span class="n">string</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">)</span>
97 <span class="k">return</span> <span class="n">string</span>
98
99
100 <span class="k">class</span> <span class="nc">SMB</span><span class="p">(</span><span class="n">NMBSession</span><span class="p">):</span>
101 <span class="sd">&quot;&quot;&quot;</span>
102 <span class="sd"> This class represents a &quot;connection&quot; to the remote SMB/CIFS server.</span>
103 <span class="sd"> It is not meant to be used directly in an application as it does not have any network transport implementations.</span>
104
105 <span class="sd"> For application use, please refer to</span>
106 <span class="sd"> - L{SMBProtocol.SMBProtocolFactory&lt;smb.SMBProtocol&gt;} if you are using Twisted framework</span>
107
108 <span class="sd"> In [MS-CIFS], this class will contain attributes of Client, Client.Connection and Client.Session abstract data models.</span>
109
110 <span class="sd"> References:</span>
111 <span class="sd"> ===========</span>
112 <span class="sd"> - [MS-CIFS]: 3.2.1</span>
113 <span class="sd"> &quot;&quot;&quot;</span>
114
115 <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMB&#39;</span><span class="p">)</span>
116
117 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
118 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
119 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
120
121 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
122 <span class="n">NMBSession</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span><span class="p">)</span>
123 <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
124 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">password</span><span class="p">)</span>
125 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
126 <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">=</span> <span class="n">sign_options</span>
127 <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span>
128 <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="n">use_ntlm_v2</span> <span class="c1">#: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1</span>
129 <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">()</span>
130 <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span> <span class="o">=</span> <span class="bp">False</span> <span class="c1">#: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True</span>
131 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c1">#: MID mapped to _PendingRequest instance</span>
132 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c1">#: Share name mapped to TID</span>
133 <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">#: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages</span>
134
135 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">False</span>
136 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
137 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span> <span class="c1">#: True if the remote server accepts message signing. All outgoing messages will be signed. Simiar to IsSigningActive as described in [MS-CIFS] 3.2.1.2</span>
138 <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1">#: Session key for signing packets, if signing is active. Similar to SigningSessionKey as described in [MS-CIFS] 3.2.1.2</span>
139 <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1">#: Contains the challenge response for signing, if signing is active. Similar to SigningChallengeResponse as described in [MS-CIFS] 3.2.1.2</span>
140 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>
141 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="mi">0</span>
142 <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1">#: Similar to ClientNextSendSequenceNumber as described in [MS-CIFS] 3.2.1.2</span>
143
144 <span class="c1"># SMB1 and SMB2 attributes</span>
145 <span class="c1"># Note that the interpretations of the values may differ between SMB1 and SMB2 protocols</span>
146 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="mi">0</span>
147 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Initialized from the SecurityMode field of the SMB_COM_NEGOTIATE message</span>
148
149 <span class="c1"># SMB1 attributes</span>
150 <span class="c1"># Most of the following attributes will be initialized upon receipt of SMB_COM_NEGOTIATE message from server (via self._updateServerInfo_SMB1 method)</span>
151 <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="bp">False</span> <span class="c1">#: Similar to PlaintextAuthenticationPolicy in in [MS-CIFS] 3.2.1.1</span>
152 <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">=</span> <span class="mi">0</span>
153 <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to MaxBufferSize as described in [MS-CIFS] 3.2.1.1</span>
154 <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to MaxMpxCount as described in [MS-CIFS] 3.2.1.1</span>
155
156 <span class="c1"># SMB2 attributes</span>
157 <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to MaxReadSize as described in [MS-SMB2] 2.2.4</span>
158 <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4</span>
159 <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4</span>
160 <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1">#: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method</span>
161
162 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB1Methods</span><span class="p">()</span>
163
164 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication with remote machine &quot;</span><span class="si">%s</span><span class="s1">&quot; for user &quot;</span><span class="si">%s</span><span class="s1">&quot; will be using NTLM </span><span class="si">%s</span><span class="s1"> authentication (</span><span class="si">%s</span><span class="s1"> extended security)&#39;</span><span class="p">,</span>
165 <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
166 <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="ow">and</span> <span class="s1">&#39;v2&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;v1&#39;</span><span class="p">,</span>
167 <span class="p">(</span><span class="n">SUPPORT_EXTENDED_SECURITY</span> <span class="ow">and</span> <span class="s1">&#39;with&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;without&#39;</span><span class="p">)</span>
168
169
170 <span class="c1">#</span>
171 <span class="c1"># NMBSession Methods</span>
172 <span class="c1">#</span>
173
174 <span class="k">def</span> <span class="nf">onNMBSessionOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
175 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNegotiateRequest</span><span class="p">()))</span>
176
177 <span class="k">def</span> <span class="nf">onNMBSessionFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
178 <span class="k">pass</span>
179
180 <span class="k">def</span> <span class="nf">onNMBSessionMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
181 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
182 <span class="k">try</span><span class="p">:</span>
183 <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
184 <span class="k">except</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">:</span>
185 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Now switching over to SMB2 protocol communication&#39;</span><span class="p">)</span>
186 <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span> <span class="o">=</span> <span class="bp">True</span>
187 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Must reset messageID counter, or else remote SMB2 server will disconnect</span>
188 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB2Methods</span><span class="p">()</span>
189 <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span><span class="p">()</span>
190 <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
191
192 <span class="n">next_message_offset</span> <span class="o">=</span> <span class="mi">0</span>
193 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span><span class="p">:</span>
194 <span class="n">next_message_offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">next_command_offset</span>
195
196 <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
197 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span><span class="p">:</span>
198 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Received SMB message &quot;</span><span class="si">%s</span><span class="s1">&quot; (command:0x</span><span class="si">%2X</span><span class="s1"> flags:0x</span><span class="si">%02X</span><span class="s1"> flags2:0x</span><span class="si">%04X</span><span class="s1"> TID:</span><span class="si">%d</span><span class="s1"> UID:</span><span class="si">%d</span><span class="s1">)&#39;</span><span class="p">,</span>
199 <span class="n">SMB_COMMAND_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="s1">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span>
200 <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
201 <span class="k">else</span><span class="p">:</span>
202 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Received SMB2 message &quot;</span><span class="si">%s</span><span class="s1">&quot; (command:0x</span><span class="si">%04X</span><span class="s1"> flags:0x</span><span class="si">%04x</span><span class="s1">)&#39;</span><span class="p">,</span>
203 <span class="n">SMB2_COMMAND_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="s1">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span>
204 <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span><span class="p">)</span>
205 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="p">):</span>
206 <span class="c1"># We need to create a new instance instead of calling reset() because the instance could be captured in the message history.</span>
207 <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span><span class="p">()</span>
208
209 <span class="k">if</span> <span class="n">next_message_offset</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
210 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">next_message_offset</span><span class="p">:]</span>
211 <span class="k">else</span><span class="p">:</span>
212 <span class="k">break</span>
213
214 <span class="c1">#</span>
215 <span class="c1"># Public Methods for Overriding in Subclasses</span>
216 <span class="c1">#</span>
217
218 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
219 <span class="k">pass</span>
220
221 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
222 <span class="k">pass</span>
223
224 <span class="c1">#</span>
225 <span class="c1"># Protected Methods</span>
226 <span class="c1">#</span>
227
228 <span class="k">def</span> <span class="nf">_setupSMB1Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
229 <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMBMessage</span>
230 <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB1</span>
231 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB1</span>
232 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB1</span>
233 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB1</span>
234 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB1</span>
235 <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB1</span>
236 <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB1</span>
237 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB1</span>
238 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB1</span>
239 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB1</span>
240 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB1</span>
241 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile_SMB1</span>
242 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB1</span>
243 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles_SMB1</span>
244 <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes_SMB1</span>
245 <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory_SMB1</span>
246 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory_SMB1</span>
247 <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rename_SMB1</span>
248 <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB1</span>
249
250 <span class="k">def</span> <span class="nf">_setupSMB2Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
251 <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMB2Message</span>
252 <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB2</span>
253 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB2</span>
254 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB2</span>
255 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB2</span>
256 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB2</span>
257 <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB2</span>
258 <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB2</span>
259 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB2</span>
260 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB2</span>
261 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB2</span>
262 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB2</span>
263 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile_SMB2</span>
264 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB2</span>
265 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles_SMB2</span>
266 <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes_SMB2</span>
267 <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory_SMB2</span>
268 <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory_SMB2</span>
269 <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rename_SMB2</span>
270 <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB2</span>
271
272 <span class="k">def</span> <span class="nf">_getNextRPCCallID</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
273 <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span> <span class="o">+=</span> <span class="mi">1</span>
274 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span>
275
276 <span class="c1">#</span>
277 <span class="c1"># SMB2 Methods Family</span>
278 <span class="c1">#</span>
279
280 <span class="k">def</span> <span class="nf">_sendSMBMessage_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">smb_message</span><span class="p">):</span>
281 <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
282 <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB2</span><span class="p">()</span>
283
284 <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_NEGOTIATE</span> <span class="ow">and</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_ECHO</span><span class="p">:</span>
285 <span class="n">smb_message</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span>
286
287 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
288 <span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">SMB2_FLAGS_SIGNED</span>
289 <span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
290 <span class="n">smb_message</span><span class="o">.</span><span class="n">signature</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span><span class="p">,</span> <span class="n">raw_data</span><span class="p">,</span> <span class="n">sha256</span><span class="p">)</span><span class="o">.</span><span class="n">digest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>
291
292 <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
293 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;MID is </span><span class="si">%d</span><span class="s1">. Signature is </span><span class="si">%s</span><span class="s1">. Total raw message is </span><span class="si">%d</span><span class="s1"> bytes&#39;</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">signature</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">))</span>
294 <span class="k">else</span><span class="p">:</span>
295 <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
296 <span class="bp">self</span><span class="o">.</span><span class="n">sendNMBMessage</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">)</span>
297
298 <span class="k">def</span> <span class="nf">_getNextMID_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
299 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
300 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
301
302 <span class="k">def</span> <span class="nf">_updateState_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
303 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
304 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB2_COM_NEGOTIATE</span><span class="p">:</span>
305 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
306 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
307 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;SMB2 dialect negotiation successful&#39;</span><span class="p">)</span>
308 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="p">)</span>
309 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
310 <span class="k">else</span><span class="p">:</span>
311 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB2_COM_NEGOTIATE&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="p">,</span>
312 <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
313 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB2_COM_SESSION_SETUP</span><span class="p">:</span>
314 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
315 <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">session_id</span>
316 <span class="k">try</span><span class="p">:</span>
317 <span class="n">result</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeAuthResponseSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
318 <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_COMPLETED</span><span class="p">:</span>
319 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
320 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (on SMB2) successful!&#39;</span><span class="p">)</span>
321 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
322 <span class="k">else</span><span class="p">:</span>
323 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
324 <span class="k">except</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
325 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
326 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0xc0000016</span><span class="p">:</span> <span class="c1"># STATUS_MORE_PROCESSING_REQUIRED</span>
327 <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">session_id</span>
328 <span class="k">try</span><span class="p">:</span>
329 <span class="n">result</span><span class="p">,</span> <span class="n">ntlm_token</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeChallengeSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
330 <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_INCOMPLETE</span><span class="p">:</span>
331 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">)</span>
332 <span class="k">except</span> <span class="p">(</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">UnsupportedSecurityProvider</span> <span class="p">),</span> <span class="n">ex</span><span class="p">:</span>
333 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
334 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0xc000006d</span><span class="p">:</span> <span class="c1"># STATUS_LOGON_FAILURE</span>
335 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
336 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (on SMB2) failed. Please check username and password.&#39;</span><span class="p">)</span>
337 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
338 <span class="k">else</span><span class="p">:</span>
339 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_SESSION_SETUP_ANDX (with extended security)&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="p">,</span>
340 <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
341
342 <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
343 <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
344 <span class="n">req</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
345 <span class="k">return</span> <span class="bp">True</span>
346
347
348 <span class="k">def</span> <span class="nf">_updateServerInfo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
349 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
350 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
351 <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_transact_size</span>
352 <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_read_size</span>
353 <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_write_size</span>
354 <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="bp">False</span> <span class="c1"># SMB2 never allows plaintext authentication</span>
355
356
357 <span class="k">def</span> <span class="nf">_handleNegotiateResponse_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
358 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
359 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
360 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SessionSetupRequest</span><span class="p">(</span><span class="n">blob</span><span class="p">)))</span>
361
362
363 <span class="k">def</span> <span class="nf">_handleSessionChallenge_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">):</span>
364 <span class="n">server_challenge</span><span class="p">,</span> <span class="n">server_flags</span><span class="p">,</span> <span class="n">server_info</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">decodeChallengeMessage</span><span class="p">(</span><span class="n">ntlm_token</span><span class="p">)</span>
365
366 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
367
368 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">:</span>
369 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
370 <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span>
371 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
372 <span class="n">server_challenge</span><span class="p">,</span>
373 <span class="n">server_info</span><span class="p">,</span>
374 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
375
376 <span class="k">else</span><span class="p">:</span>
377 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
378 <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">server_challenge</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
379
380 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateAuthenticateMessage</span><span class="p">(</span><span class="n">server_flags</span><span class="p">,</span>
381 <span class="n">nt_challenge_response</span><span class="p">,</span>
382 <span class="n">lm_challenge_response</span><span class="p">,</span>
383 <span class="n">session_key</span><span class="p">,</span>
384 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
385 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
386
387 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">isEnabledFor</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">):</span>
388 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">))</span>
389 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">))</span>
390
391 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateAuthSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
392 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SessionSetupRequest</span><span class="p">(</span><span class="n">blob</span><span class="p">)))</span>
393
394 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">SMB2_NEGOTIATE_SIGNING_REQUIRED</span><span class="p">:</span>
395 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server requires all SMB messages to be signed&#39;</span><span class="p">)</span>
396 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">!=</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_NEVER</span><span class="p">)</span>
397 <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">SMB2_NEGOTIATE_SIGNING_ENABLED</span><span class="p">:</span>
398 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server supports SMB signing&#39;</span><span class="p">)</span>
399 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">==</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_WHEN_SUPPORTED</span><span class="p">)</span>
400 <span class="k">else</span><span class="p">:</span>
401 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span>
402
403 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
404 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing activated. All SMB messages will be signed.&quot;</span><span class="p">)</span>
405 <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="p">(</span><span class="n">session_key</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="o">*</span><span class="mi">16</span><span class="p">)[:</span><span class="mi">16</span><span class="p">]</span>
406 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">&amp;</span> <span class="n">CAP_EXTENDED_SECURITY</span><span class="p">:</span>
407 <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span>
408 <span class="k">else</span><span class="p">:</span>
409 <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="n">blob</span>
410 <span class="k">else</span><span class="p">:</span>
411 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</span><span class="p">)</span>
412
413
414 <span class="k">def</span> <span class="nf">_listShares_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
415 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
416 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
417
418 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
419 <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
420 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
421
422 <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
423 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="s1">&#39;srvsvc&#39;</span><span class="p">,</span>
424 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
425 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
426 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
427 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
428 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
429 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_OPEN_NO_RECALL</span><span class="p">,</span>
430 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">))</span>
431
432 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
433 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
434 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectSrvSvcCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
435 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
436
437 <span class="k">def</span> <span class="nf">connectSrvSvcCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
438 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
439 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
440 <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
441 <span class="c1"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
442 <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
443 <span class="n">data_bytes</span> <span class="o">=</span> \
444 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 0b 03 10 00 00 00 74 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
445 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
446 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
447 <span class="s2">b8 10 b8 10 00 00 00 00 02 00 00 00 00 00 01 00</span>
448 <span class="s2">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
449 <span class="s2">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
450 <span class="s2">2b 10 48 60 02 00 00 00 01 00 01 00 c8 4f 32 4b</span>
451 <span class="s2">70 16 d3 01 12 78 5a 47 bf 6e e1 88 03 00 00 00</span>
452 <span class="s2">2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00</span>
453 <span class="s2">01 00 00 00</span>
454 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
455 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2WriteRequest</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
456 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
457 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
458 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcBindCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
459 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
460 <span class="k">else</span><span class="p">:</span>
461 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to locate Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
462
463 <span class="k">def</span> <span class="nf">rpcBindCB</span><span class="p">(</span><span class="n">trans_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
464 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">trans_message</span><span class="p">)</span>
465 <span class="k">if</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
466 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">read_len</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="n">read_offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">))</span>
467 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span>
468 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
469 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcReadCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
470 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
471 <span class="k">else</span><span class="p">:</span>
472 <span class="n">closeFid</span><span class="p">(</span><span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s1">&#39;Failed to list shares: Unable to read from Server Service RPC endpoint&#39;</span><span class="p">)</span>
473
474 <span class="k">def</span> <span class="nf">rpcReadCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
475 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
476 <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
477 <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
478
479 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
480 <span class="n">remote_name</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\\\\</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span>
481 <span class="n">server_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">remote_name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
482 <span class="n">server_bytes_len</span> <span class="o">=</span> <span class="n">server_len</span> <span class="o">*</span> <span class="mi">2</span>
483 <span class="k">if</span> <span class="n">server_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
484 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
485 <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
486
487 <span class="c1"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
488 <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
489 <span class="n">data_bytes</span> <span class="o">=</span> \
490 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 00 03 10 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
491 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHI&#39;</span><span class="p">,</span> <span class="mi">72</span><span class="o">+</span><span class="n">server_bytes_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
492 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;4c 00 00 00 00 00 0f 00 00 00 02 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
493 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">server_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">server_len</span><span class="p">)</span> <span class="o">+</span> \
494 <span class="p">(</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> \
495 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
496 <span class="s2">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
497 <span class="s2">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
498 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
499 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2IoctlRequest</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="mh">0x0011C017</span><span class="p">,</span> <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x01</span><span class="p">,</span> <span class="n">max_out_size</span> <span class="o">=</span> <span class="mi">8196</span><span class="p">,</span> <span class="n">in_data</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">))</span>
500 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">tid</span>
501 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
502 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
503 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
504 <span class="k">else</span><span class="p">:</span>
505 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s1">&#39;Failed to list shares: Unable to bind to Server Service RPC endpoint&#39;</span><span class="p">)</span>
506
507 <span class="k">def</span> <span class="nf">listShareResultsCB</span><span class="p">(</span><span class="n">result_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
508 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result_message</span><span class="p">)</span>
509 <span class="k">if</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
510 <span class="c1"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
511 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">result_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span>
512
513 <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
514 <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
515 <span class="k">else</span><span class="p">:</span>
516 <span class="n">decodeResults</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
517 <span class="k">elif</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0x0103</span><span class="p">:</span> <span class="c1"># STATUS_PENDING</span>
518 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">result_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
519 <span class="k">else</span><span class="p">:</span>
520 <span class="n">closeFid</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
521 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
522
523 <span class="k">def</span> <span class="nf">decodeResults</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
524 <span class="n">shares_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">36</span><span class="p">:</span><span class="mi">40</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
525 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span> <span class="c1"># A list of SharedDevice instances</span>
526 <span class="n">offset</span> <span class="o">=</span> <span class="mi">36</span> <span class="o">+</span> <span class="mi">12</span> <span class="c1"># You need to study the byte stream to understand the meaning of these constants</span>
527 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
528 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedDevice</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="o">+</span><span class="mi">4</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>
529 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
530
531 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
532 <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
533 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
534 <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
535
536 <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
537 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
538 <span class="k">else</span><span class="p">:</span>
539 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
540
541 <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
542 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
543 <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
544
545 <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
546 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
547 <span class="k">else</span><span class="p">:</span>
548 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
549
550 <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
551 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
552
553 <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
554 <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span><span class="p">)</span>
555 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
556 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
557 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
558 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
559 <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
560
561 <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
562 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
563 <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
564 <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
565 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span>
566
567 <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
568 <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
569 <span class="k">else</span><span class="p">:</span>
570 <span class="n">decodeResults</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
571 <span class="k">else</span><span class="p">:</span>
572 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
573 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
574
575 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
576 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
577 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
578 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
579 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
580 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
581
582 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
583 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
584 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
585 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
586 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">],</span> <span class="n">messages_history</span><span class="p">))</span>
587
588 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
589 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
590 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
591 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
592 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
593 <span class="n">connectSrvSvc</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
594 <span class="k">else</span><span class="p">:</span>
595 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to connect to IPC$&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
596
597 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">path</span> <span class="p">)))</span>
598 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
599 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">)</span>
600 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
601 <span class="k">else</span><span class="p">:</span>
602 <span class="n">connectSrvSvc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">])</span>
603
604 <span class="k">def</span> <span class="nf">_listPath_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
605 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
606 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
607
608 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
609 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
610 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
611 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
612 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
613 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
614 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
615 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
616
617 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
618 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
619 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
620 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
621 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
622 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
623 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
624 <span class="s2">51 46 69 64 00 00 00 00</span>
625 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
626 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
627 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
628 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
629 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
630 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
631 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
632 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
633 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
634 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
635 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
636 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
637 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
638 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
639
640 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
641 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
642 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
643 <span class="n">sendQuery</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
644 <span class="k">else</span><span class="p">:</span>
645 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
646
647 <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_buf</span><span class="p">):</span>
648 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2QueryDirectoryRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span>
649 <span class="n">info_class</span> <span class="o">=</span> <span class="mh">0x03</span><span class="p">,</span> <span class="c1"># FileBothDirectoryInformation</span>
650 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
651 <span class="n">output_buf_len</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span><span class="p">))</span>
652 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
653 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
654 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">queryCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_buf</span> <span class="o">=</span> <span class="n">data_buf</span><span class="p">)</span>
655 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
656
657 <span class="k">def</span> <span class="nf">queryCB</span><span class="p">(</span><span class="n">query_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
658 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">query_message</span><span class="p">)</span>
659 <span class="k">if</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
660 <span class="n">data_buf</span> <span class="o">=</span> <span class="n">decodeQueryStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">query_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
661 <span class="n">sendQuery</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_buf</span><span class="p">)</span>
662 <span class="k">elif</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0x80000006</span><span class="n">L</span><span class="p">:</span> <span class="c1"># STATUS_NO_MORE_FILES</span>
663 <span class="n">closeFid</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
664 <span class="k">else</span><span class="p">:</span>
665 <span class="n">closeFid</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
666
667 <span class="k">def</span> <span class="nf">decodeQueryStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
668 <span class="c1"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
669 <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;IIQQQQQQIIIBB24s&#39;</span>
670 <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
671
672 <span class="n">data_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
673 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
674 <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
675 <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
676 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
677
678 <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
679 <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
680 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
681 <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
682
683 <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
684 <span class="k">if</span> <span class="n">offset2</span> <span class="o">+</span> <span class="n">filename_length</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
685 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
686
687 <span class="n">filename</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset2</span><span class="p">:</span><span class="n">offset2</span><span class="o">+</span><span class="n">filename_length</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
688 <span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
689 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedFile</span><span class="p">(</span><span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">create_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_access_time</span><span class="p">),</span>
690 <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_write_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_attr_change_time</span><span class="p">),</span>
691 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
692
693 <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
694 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
695 <span class="k">else</span><span class="p">:</span>
696 <span class="k">break</span>
697 <span class="k">return</span> <span class="s1">&#39;&#39;</span>
698
699 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
700 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
701 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
702 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
703 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
704 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
705
706 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
707 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
708 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
709 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
710 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
711
712 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
713 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
714 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
715 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
716 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
717 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
718 <span class="k">else</span><span class="p">:</span>
719 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
720
721 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
722 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
723 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
724 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
725 <span class="k">else</span><span class="p">:</span>
726 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
727
728 <span class="k">def</span> <span class="nf">_getAttributes_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
729 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
730 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
731
732 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
733 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
734 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
735 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
736 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
737 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
738 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
739
740 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
741 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
742 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
743 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
744 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
745 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
746 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
747 <span class="s2">51 46 69 64 00 00 00 00</span>
748 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
749 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
750 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
751 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
752 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
753 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
754 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
755 <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
756 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
757 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
758 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
759 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
760 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
761 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
762
763 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
764 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
765 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
766 <span class="n">p</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span>
767 <span class="n">info</span> <span class="o">=</span> <span class="n">SharedFile</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">create_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastaccess_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastwrite_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">change_time</span><span class="p">,</span>
768 <span class="n">p</span><span class="o">.</span><span class="n">file_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">allocation_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span>
769 <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
770 <span class="n">closeFid</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="p">)</span>
771 <span class="k">else</span><span class="p">:</span>
772 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open remote file object&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
773
774 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
775 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
776 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
777 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
778 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
779 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
780
781 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
782 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;info&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
783 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;info&#39;</span><span class="p">])</span>
784 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
785 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
786
787 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
788 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
789 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
790 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
791 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
792 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
793 <span class="k">else</span><span class="p">:</span>
794 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
795
796 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
797 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
798 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
799 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
800 <span class="k">else</span><span class="p">:</span>
801 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
802
803 <span class="k">def</span> <span class="nf">_retrieveFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
804 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
805
806 <span class="k">def</span> <span class="nf">_retrieveFileFromOffset_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
807 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
808 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
809
810 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
811 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
812 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
813 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
814 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
815 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
816 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
817 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
818
819 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
820 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
821 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
822 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
823 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
824 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
825 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
826 <span class="s2">51 46 69 64 00 00 00 00</span>
827 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
828 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
829 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
830 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
831 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span><span class="p">,</span>
832 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
833 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
834 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
835 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
836 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
837 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
838 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
839 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
840 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
841
842 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
843 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
844 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
845 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2QueryInfoRequest</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span>
846 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
847 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
848 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
849 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x16</span><span class="p">,</span> <span class="c1"># FileStreamInformation [MS-FSCC] 2.4</span>
850 <span class="n">input_buf</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
851 <span class="n">output_buf_len</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">))</span>
852 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
853 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
854 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">infoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
855 <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">)</span>
856 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
857 <span class="k">else</span><span class="p">:</span>
858 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
859
860 <span class="k">def</span> <span class="nf">infoCB</span><span class="p">(</span><span class="n">info_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
861 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info_message</span><span class="p">)</span>
862 <span class="k">if</span> <span class="n">info_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
863 <span class="n">file_len</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;Q&#39;</span><span class="p">,</span> <span class="n">info_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">8</span><span class="p">:</span><span class="mi">16</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
864 <span class="k">if</span> <span class="n">max_length</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">starting_offset</span> <span class="o">&gt;</span> <span class="n">file_len</span><span class="p">:</span>
865 <span class="n">closeFid</span><span class="p">(</span><span class="n">info_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
866 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="mi">0</span> <span class="p">))</span> <span class="c1"># Note that this is a tuple of 3-elements</span>
867 <span class="k">else</span><span class="p">:</span>
868 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">max_length</span>
869 <span class="k">if</span> <span class="n">remaining_len</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
870 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span>
871 <span class="k">if</span> <span class="n">starting_offset</span> <span class="o">+</span> <span class="n">remaining_len</span> <span class="o">&gt;</span> <span class="n">file_len</span><span class="p">:</span>
872 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span> <span class="o">-</span> <span class="n">starting_offset</span>
873 <span class="n">sendRead</span><span class="p">(</span><span class="n">info_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">])</span>
874 <span class="k">else</span><span class="p">:</span>
875 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve information on file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
876
877 <span class="k">def</span> <span class="nf">sendRead</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">):</span>
878 <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">)</span>
879 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
880 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
881 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
882 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
883 <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
884 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">remaining_len</span><span class="p">,</span>
885 <span class="n">read_len</span> <span class="o">=</span> <span class="n">read_len</span><span class="p">,</span>
886 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">)</span>
887
888 <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
889 <span class="c1"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
890 <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
891 <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
892 <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
893
894 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;remaining_len&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">data_len</span>
895
896 <span class="k">if</span> <span class="n">remaining_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
897 <span class="n">sendRead</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">])</span>
898 <span class="k">else</span><span class="p">:</span>
899 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">(</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span> <span class="p">))</span>
900 <span class="k">else</span><span class="p">:</span>
901 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
902 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
903
904 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
905 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
906 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
907 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
908 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
909 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
910
911 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
912 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;ret&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
913 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;ret&#39;</span><span class="p">])</span>
914 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
915 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
916
917 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
918 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
919 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
920 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
921 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
922 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
923 <span class="k">else</span><span class="p">:</span>
924 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
925
926 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
927 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
928 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
929 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
930 <span class="k">else</span><span class="p">:</span>
931 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
932
933 <span class="k">def</span> <span class="nf">_storeFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
934 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB2</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
935
936 <span class="k">def</span> <span class="nf">_storeFileFromOffset_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
937 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
938 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
939
940 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
941 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
942 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
943 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
944 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
945 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
946
947 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
948 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
949 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
950 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
951 <span class="s2">00 00 00 00 00 00 00 00 20 00 00 00 10 00 04 00</span>
952 <span class="s2">00 00 18 00 08 00 00 00 41 6c 53 69 00 00 00 00</span>
953 <span class="s2">85 62 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
954 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
955 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
956 <span class="s2">51 46 69 64 00 00 00 00</span>
957 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
958 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
959 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">ATTR_ARCHIVE</span><span class="p">,</span>
960 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
961 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
962 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
963 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
964 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
965 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OVERWRITE_IF</span> <span class="k">if</span> <span class="n">truncate</span> <span class="k">else</span> <span class="n">FILE_OPEN_IF</span><span class="p">,</span>
966 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
967 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
968 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
969 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
970 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
971
972 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
973 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
974 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
975 <span class="n">sendWrite</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">)</span>
976 <span class="k">else</span><span class="p">:</span>
977 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
978
979 <span class="k">def</span> <span class="nf">sendWrite</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
980 <span class="n">write_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span>
981 <span class="n">data</span> <span class="o">=</span> <span class="n">file_obj</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">write_count</span><span class="p">)</span>
982 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
983 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
984 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2WriteRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">offset</span><span class="p">))</span>
985 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
986 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
987 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">writeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="o">+</span><span class="n">data_len</span><span class="p">)</span>
988 <span class="k">else</span><span class="p">:</span>
989 <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">)</span>
990
991 <span class="k">def</span> <span class="nf">writeCB</span><span class="p">(</span><span class="n">write_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
992 <span class="c1"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</span>
993 <span class="k">if</span> <span class="n">write_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
994 <span class="n">sendWrite</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">])</span>
995 <span class="k">else</span><span class="p">:</span>
996 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">write_message</span><span class="p">)</span>
997 <span class="n">closeFid</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
998 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
999
1000 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1001 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1002 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1003 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1004 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
1005 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1006
1007 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1008 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1009 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="p">))</span> <span class="c1"># Note that this is a tuple of 2-elements</span>
1010 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1011 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1012
1013 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1014 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1015 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1016 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1017 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1018 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1019 <span class="k">else</span><span class="p">:</span>
1020 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1021
1022 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1023 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1024 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1025 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1026 <span class="k">else</span><span class="p">:</span>
1027 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1028
1029
1030 <span class="k">def</span> <span class="nf">_deleteFiles_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1031 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1032 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1033
1034 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1035 <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1036 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1037 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1038 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1039 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1040 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1041
1042 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1043 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1044 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1045 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1046 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1047 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1048 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1049 <span class="s2">51 46 69 64 00 00 00 00</span>
1050 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1051 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
1052 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1053 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span><span class="p">,</span>
1054 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
1055 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1056 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1057 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
1058 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1059 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1060 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1061 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1062 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
1063 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1064
1065 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1066 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
1067 <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1068 <span class="n">sendDelete</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1069 <span class="k">else</span><span class="p">:</span>
1070 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1071
1072 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1073 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
1074 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1075 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1076 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="c1"># SMB2_FILE_DISPOSITION_INFO</span>
1077 <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x01</span><span class="s1">&#39;</span><span class="p">))</span>
1078 <span class="sd">&#39;&#39;&#39;</span>
1079 <span class="sd"> Resources:</span>
1080 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc246560.aspx</span>
1081 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc232098.aspx</span>
1082 <span class="sd"> &#39;&#39;&#39;</span>
1083 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1084 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1085 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1086 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1087
1088 <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1089 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
1090 <span class="k">if</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1091 <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
1092 <span class="k">else</span><span class="p">:</span>
1093 <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
1094
1095 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1096 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1097 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1098 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1099 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1100 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1101
1102 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1103 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1104 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
1105 <span class="k">else</span><span class="p">:</span>
1106 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1107
1108 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1109 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1110 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1111 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1112 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1113 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1114 <span class="k">else</span><span class="p">:</span>
1115 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1116
1117 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1118 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1119 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1120 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1121 <span class="k">else</span><span class="p">:</span>
1122 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1123
1124 <span class="k">def</span> <span class="nf">_resetFileAttributes_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1125 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1126 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1127
1128 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1129 <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1130 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1131 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1132 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1133 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1134 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1135
1136 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1137 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1138 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1139 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1140 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1141 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1142 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1143 <span class="s2">51 46 69 64 00 00 00 00</span>
1144 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1145
1146 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
1147 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1148 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_WRITE_ATTRIBUTES</span><span class="p">,</span>
1149 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
1150 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1151 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1152 <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1153 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1154 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1155 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1156 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1157 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
1158 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1159
1160 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1161 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
1162 <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1163 <span class="n">sendReset</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1164 <span class="k">else</span><span class="p">:</span>
1165 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1166
1167 <span class="k">def</span> <span class="nf">sendReset</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1168 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
1169 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1170 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1171 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># FileBasicInformation</span>
1172 <span class="n">data</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;qqqqii&#39;</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mi">0</span><span class="p">)))</span> <span class="c1"># FILE_ATTRIBUTE_NORMAL</span>
1173 <span class="sd">&#39;&#39;&#39;</span>
1174 <span class="sd"> Resources:</span>
1175 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc246560.aspx</span>
1176 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc232064.aspx</span>
1177 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc232094.aspx</span>
1178 <span class="sd"> https://msdn.microsoft.com/en-us/library/cc232110.aspx</span>
1179 <span class="sd"> &#39;&#39;&#39;</span>
1180 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1181 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1182 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">resetCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1183 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1184
1185 <span class="k">def</span> <span class="nf">resetCB</span><span class="p">(</span><span class="n">reset_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1186 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">reset_message</span><span class="p">)</span>
1187 <span class="k">if</span> <span class="n">reset_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1188 <span class="n">closeFid</span><span class="p">(</span><span class="n">reset_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
1189 <span class="k">else</span><span class="p">:</span>
1190 <span class="n">closeFid</span><span class="p">(</span><span class="n">reset_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">reset_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
1191
1192 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1193 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1194 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1195 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1196 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1197 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1198
1199 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1200 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1201 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
1202 <span class="k">else</span><span class="p">:</span>
1203 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Reset failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1204
1205 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1206 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1207 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1208 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1209 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1210 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1211 <span class="k">else</span><span class="p">:</span>
1212 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1213
1214 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1215 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1216 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1217 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1218 <span class="k">else</span><span class="p">:</span>
1219 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1220
1221 <span class="k">def</span> <span class="nf">_createDirectory_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1222 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1223 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1224
1225 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1226 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1227 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1228 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1229 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1230 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1231 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1232
1233 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1234 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1235 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1236 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1237 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1238 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1239 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1240 <span class="s2">51 46 69 64 00 00 00 00</span>
1241 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1242 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
1243 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1244 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
1245 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1246 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1247 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1248 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1249 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_CREATE</span><span class="p">,</span>
1250 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1251 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1252 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1253 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
1254 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1255
1256 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1257 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
1258 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1259 <span class="n">closeFid</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1260 <span class="k">else</span><span class="p">:</span>
1261 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Create failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1262
1263 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1264 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1265 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1266 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1267 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
1268 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1269
1270 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1271 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
1272
1273 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1274 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1275 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1276 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1277 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1278 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1279 <span class="k">else</span><span class="p">:</span>
1280 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1281
1282 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1283 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1284 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1285 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1286 <span class="k">else</span><span class="p">:</span>
1287 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1288
1289 <span class="k">def</span> <span class="nf">_deleteDirectory_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1290 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1291 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1292
1293 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1294 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1295 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1296 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1297 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1298 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1299 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1300
1301 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1302 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1303 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1304 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1305 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1306 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1307 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1308 <span class="s2">51 46 69 64 00 00 00 00</span>
1309 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1310 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
1311 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1312 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span><span class="p">,</span>
1313 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
1314 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1315 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1316 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
1317 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1318 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1319 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1320 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1321 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
1322 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1323
1324 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1325 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
1326 <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1327 <span class="n">sendDelete</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1328 <span class="k">else</span><span class="p">:</span>
1329 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1330
1331 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1332 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
1333 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1334 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1335 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="c1"># SMB2_FILE_DISPOSITION_INFO</span>
1336 <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x01</span><span class="s1">&#39;</span><span class="p">))</span>
1337 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1338 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1339 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1340 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1341
1342 <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1343 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
1344 <span class="k">if</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1345 <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
1346 <span class="k">else</span><span class="p">:</span>
1347 <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
1348
1349 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1350 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1351 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1352 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1353 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1354 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1355
1356 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1357 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1358 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
1359 <span class="k">else</span><span class="p">:</span>
1360 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1361
1362 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1363 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1364 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1365 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1366 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1367 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1368 <span class="k">else</span><span class="p">:</span>
1369 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1370
1371 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1372 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1373 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1374 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1375 <span class="k">else</span><span class="p">:</span>
1376 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1377
1378 <span class="k">def</span> <span class="nf">_rename_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1379 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1380 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1381
1382 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1383 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1384
1385 <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1386 <span class="k">if</span> <span class="n">new_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1387 <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1388 <span class="k">if</span> <span class="n">new_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1389 <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1390
1391 <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1392 <span class="k">if</span> <span class="n">old_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1393 <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1394 <span class="k">if</span> <span class="n">old_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1395 <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1396
1397 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1398 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1399 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1400 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1401 <span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1402 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1403 <span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1404 <span class="s2">51 46 69 64 00 00 00 00</span>
1405 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1406 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">old_path</span><span class="p">,</span>
1407 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1408 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
1409 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
1410 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1411 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1412 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1413 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1414 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1415 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1416 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1417 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
1418 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1419
1420 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1421 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
1422 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1423 <span class="n">sendRename</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1424 <span class="k">else</span><span class="p">:</span>
1425 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file/directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1426
1427 <span class="k">def</span> <span class="nf">sendRename</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1428 <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="o">*</span><span class="mi">16</span> <span class="o">+</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">new_path</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">new_path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1429 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
1430 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1431 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1432 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="c1"># SMB2_FILE_RENAME_INFO</span>
1433 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
1434 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1435 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1436 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">renameCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1437 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1438
1439 <span class="k">def</span> <span class="nf">renameCB</span><span class="p">(</span><span class="n">rename_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1440 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rename_message</span><span class="p">)</span>
1441 <span class="k">if</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1442 <span class="n">closeFid</span><span class="p">(</span><span class="n">rename_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
1443 <span class="k">else</span><span class="p">:</span>
1444 <span class="n">closeFid</span><span class="p">(</span><span class="n">rename_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
1445
1446 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1447 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1448 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1449 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1450 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1451 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1452
1453 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1454 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1455 <span class="n">callback</span><span class="p">((</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span> <span class="p">))</span>
1456 <span class="k">else</span><span class="p">:</span>
1457 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Rename failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1458
1459 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1460 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1461 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1462 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1463 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1464 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1465 <span class="k">else</span><span class="p">:</span>
1466 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1467
1468 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1469 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1470 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1471 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1472 <span class="k">else</span><span class="p">:</span>
1473 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1474
1475 <span class="k">def</span> <span class="nf">_listSnapshots_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1476 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1477 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1478
1479 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1480 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1481 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1482 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
1483 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1484 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
1485 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1486
1487 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1488 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1489 <span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1490 <span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1491 <span class="s2">00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00</span>
1492 <span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1493 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1494 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
1495 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1496 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
1497 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
1498 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1499 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1500 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1501 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1502 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1503 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1504 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1505 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
1506 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1507
1508 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1509 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
1510 <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1511 <span class="n">sendEnumSnapshots</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1512 <span class="k">else</span><span class="p">:</span>
1513 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file/directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1514
1515 <span class="k">def</span> <span class="nf">sendEnumSnapshots</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1516 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2IoctlRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
1517 <span class="n">ctlcode</span> <span class="o">=</span> <span class="mh">0x00144064</span><span class="p">,</span> <span class="c1"># FSCTL_SRV_ENUMERATE_SNAPSHOTS</span>
1518 <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>
1519 <span class="n">in_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1520 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1521 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1522 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">enumSnapshotsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1523 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1524
1525 <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1526 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">enum_message</span><span class="p">)</span>
1527 <span class="k">if</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1528 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1529 <span class="n">snapshots_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
1530 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">snapshots_count</span><span class="p">):</span>
1531 <span class="n">s</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span><span class="p">[</span><span class="mi">12</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">:</span><span class="mi">12</span><span class="o">+</span><span class="mi">48</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1532 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="o">*</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="p">(</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">9</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="p">:</span><span class="mi">12</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">13</span><span class="p">:</span><span class="mi">15</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">16</span><span class="p">:</span><span class="mi">18</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">21</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">22</span><span class="p">:</span><span class="mi">24</span><span class="p">]</span> <span class="p">))))</span>
1533 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
1534 <span class="k">else</span><span class="p">:</span>
1535 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
1536
1537 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
1538 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1539 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1540 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1541 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
1542 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1543
1544 <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1545 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1546 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
1547 <span class="k">else</span><span class="p">:</span>
1548 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: List failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1549
1550 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
1551 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1552 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1553 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1554 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1555 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1556 <span class="k">else</span><span class="p">:</span>
1557 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
1558
1559 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
1560 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1561 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
1562 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1563 <span class="k">else</span><span class="p">:</span>
1564 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
1565
1566 <span class="k">def</span> <span class="nf">_echo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1567 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1568
1569 <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1570 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">echo_message</span><span class="p">)</span>
1571 <span class="k">if</span> <span class="n">echo_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1572 <span class="n">callback</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
1573 <span class="k">else</span><span class="p">:</span>
1574 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1575
1576 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2EchoRequest</span><span class="p">())</span>
1577 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1578 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">echoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
1579 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1580
1581
1582 <span class="c1">#</span>
1583 <span class="c1"># SMB1 Methods Family</span>
1584 <span class="c1">#</span>
1585
1586 <span class="k">def</span> <span class="nf">_sendSMBMessage_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">smb_message</span><span class="p">):</span>
1587 <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1588 <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB1</span><span class="p">()</span>
1589 <span class="k">if</span> <span class="ow">not</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
1590 <span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span>
1591 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
1592 <span class="n">smb_message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_SMB_SECURITY_SIGNATURE</span>
1593
1594 <span class="c1"># Increment the next_signing_id as described in [MS-CIFS] 3.2.4.1.3</span>
1595 <span class="n">smb_message</span><span class="o">.</span><span class="n">security</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span>
1596 <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span> <span class="o">+=</span> <span class="mi">2</span> <span class="c1"># All our defined messages currently have responses, so always increment by 2</span>
1597 <span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
1598
1599 <span class="n">md</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">MD5</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span><span class="p">)</span>
1600 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">:</span>
1601 <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">)</span>
1602 <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">raw_data</span><span class="p">)</span>
1603 <span class="n">signature</span> <span class="o">=</span> <span class="n">md</span><span class="o">.</span><span class="n">digest</span><span class="p">()[:</span><span class="mi">8</span><span class="p">]</span>
1604
1605 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;MID is </span><span class="si">%d</span><span class="s1">. Signing ID is </span><span class="si">%d</span><span class="s1">. Signature is </span><span class="si">%s</span><span class="s1">. Total raw message is </span><span class="si">%d</span><span class="s1"> bytes&#39;</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">security</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">signature</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">raw_data</span><span class="p">))</span>
1606 <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">raw_data</span><span class="p">[:</span><span class="mi">14</span><span class="p">]</span> <span class="o">+</span> <span class="n">signature</span> <span class="o">+</span> <span class="n">raw_data</span><span class="p">[</span><span class="mi">22</span><span class="p">:]</span>
1607 <span class="k">else</span><span class="p">:</span>
1608 <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
1609 <span class="bp">self</span><span class="o">.</span><span class="n">sendNMBMessage</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">)</span>
1610
1611 <span class="k">def</span> <span class="nf">_getNextMID_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1612 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
1613 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">&gt;=</span> <span class="mh">0xFFFF</span><span class="p">:</span> <span class="c1"># MID cannot be 0xFFFF. [MS-CIFS]: 2.2.1.6.2</span>
1614 <span class="c1"># We don&#39;t use MID of 0 as MID can be reused for SMB_COM_TRANSACTION2_SECONDARY messages</span>
1615 <span class="c1"># where if mid=0, _sendSMBMessage will re-assign new MID values again</span>
1616 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">1</span>
1617 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
1618
1619 <span class="k">def</span> <span class="nf">_updateState_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1620 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
1621 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_NEGOTIATE</span><span class="p">:</span>
1622 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1623 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
1624 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;SMB dialect negotiation successful (ExtendedSecurity:</span><span class="si">%s</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">)</span>
1625 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="p">)</span>
1626 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
1627 <span class="k">else</span><span class="p">:</span>
1628 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_NEGOTIATE&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span>
1629 <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
1630 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_SESSION_SETUP_ANDX</span><span class="p">:</span>
1631 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
1632 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1633 <span class="k">try</span><span class="p">:</span>
1634 <span class="n">result</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeAuthResponseSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
1635 <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_COMPLETED</span><span class="p">:</span>
1636 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;SMB uid is now </span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
1637 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
1638 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
1639 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (with extended security) successful!&#39;</span><span class="p">)</span>
1640 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
1641 <span class="k">else</span><span class="p">:</span>
1642 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;SMB_COM_SESSION_SETUP_ANDX status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
1643 <span class="k">except</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
1644 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
1645 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mh">0xc0000016</span><span class="p">:</span> <span class="c1"># STATUS_MORE_PROCESSING_REQUIRED</span>
1646 <span class="k">try</span><span class="p">:</span>
1647 <span class="n">result</span><span class="p">,</span> <span class="n">ntlm_token</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeChallengeSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
1648 <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_INCOMPLETE</span><span class="p">:</span>
1649 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">)</span>
1650 <span class="k">except</span> <span class="p">(</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">UnsupportedSecurityProvider</span> <span class="p">),</span> <span class="n">ex</span><span class="p">:</span>
1651 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
1652 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mh">0xc000006d</span><span class="p">:</span> <span class="c1"># STATUS_LOGON_FAILURE</span>
1653 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
1654 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.&#39;</span><span class="p">)</span>
1655 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
1656 <span class="k">else</span><span class="p">:</span>
1657 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_SESSION_SETUP_ANDX (with extended security)&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span>
1658 <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
1659 <span class="k">else</span><span class="p">:</span>
1660 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1661 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;SMB uid is now </span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
1662 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
1663 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
1664 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (without extended security) successful!&#39;</span><span class="p">)</span>
1665 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
1666 <span class="k">else</span><span class="p">:</span>
1667 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
1668 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (without extended security) failed. Please check username and password&#39;</span><span class="p">)</span>
1669 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
1670 <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_TREE_CONNECT_ANDX</span><span class="p">:</span>
1671 <span class="k">try</span><span class="p">:</span>
1672 <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span>
1673 <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
1674 <span class="k">pass</span>
1675 <span class="k">else</span><span class="p">:</span>
1676 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1677 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">tid</span>
1678
1679 <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
1680 <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
1681 <span class="n">req</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
1682 <span class="k">return</span> <span class="bp">True</span>
1683
1684
1685 <span class="k">def</span> <span class="nf">_updateServerInfo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
1686 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
1687 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
1688 <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_raw_size</span>
1689 <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_buffer_size</span>
1690 <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_mpx_count</span>
1691 <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_ENCRYPT_PASSWORDS</span><span class="p">)</span>
1692
1693 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span><span class="p">:</span>
1694 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;Remote server only supports plaintext authentication. Your password can be stolen easily over the network.&#39;</span><span class="p">)</span>
1695
1696
1697 <span class="k">def</span> <span class="nf">_handleSessionChallenge_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">):</span>
1698 <span class="k">assert</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span>
1699
1700 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
1701 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
1702
1703 <span class="n">server_challenge</span><span class="p">,</span> <span class="n">server_flags</span><span class="p">,</span> <span class="n">server_info</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">decodeChallengeMessage</span><span class="p">(</span><span class="n">ntlm_token</span><span class="p">)</span>
1704 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">:</span>
1705 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
1706 <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span>
1707 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
1708 <span class="n">server_challenge</span><span class="p">,</span>
1709 <span class="n">server_info</span><span class="p">,</span>
1710 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
1711
1712 <span class="k">else</span><span class="p">:</span>
1713 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
1714 <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">server_challenge</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
1715
1716 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateAuthenticateMessage</span><span class="p">(</span><span class="n">server_flags</span><span class="p">,</span>
1717 <span class="n">nt_challenge_response</span><span class="p">,</span>
1718 <span class="n">lm_challenge_response</span><span class="p">,</span>
1719 <span class="n">session_key</span><span class="p">,</span>
1720 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
1721 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
1722
1723 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">isEnabledFor</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">):</span>
1724 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">))</span>
1725 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">))</span>
1726
1727 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateAuthSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
1728 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__WithSecurityExtension</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">blob</span><span class="p">)))</span>
1729
1730 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_SECURITY_SIGNATURES_REQUIRE</span><span class="p">:</span>
1731 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server requires all SMB messages to be signed&#39;</span><span class="p">)</span>
1732 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">!=</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_NEVER</span><span class="p">)</span>
1733 <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_SECURITY_SIGNATURES_ENABLE</span><span class="p">:</span>
1734 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server supports SMB signing&#39;</span><span class="p">)</span>
1735 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">==</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_WHEN_SUPPORTED</span><span class="p">)</span>
1736 <span class="k">else</span><span class="p">:</span>
1737 <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span>
1738
1739 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
1740 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing activated. All SMB messages will be signed.&quot;</span><span class="p">)</span>
1741 <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="n">session_key</span>
1742 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">&amp;</span> <span class="n">CAP_EXTENDED_SECURITY</span><span class="p">:</span>
1743 <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span>
1744 <span class="k">else</span><span class="p">:</span>
1745 <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="n">blob</span>
1746 <span class="k">else</span><span class="p">:</span>
1747 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</span><span class="p">)</span>
1748
1749
1750 <span class="k">def</span> <span class="nf">_handleNegotiateResponse_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1751 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
1752 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
1753
1754 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span> <span class="ow">or</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">supportsExtendedSecurity</span><span class="p">:</span>
1755 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
1756 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
1757 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__WithSecurityExtension</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span> <span class="n">blob</span><span class="p">)))</span>
1758 <span class="k">else</span><span class="p">:</span>
1759 <span class="n">nt_password</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">challenge</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
1760 <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (without extended security) with challenge &quot;</span><span class="si">%s</span><span class="s1">&quot; and hashed password of &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span>
1761 <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">challenge</span><span class="p">),</span>
1762 <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_password</span><span class="p">))</span>
1763 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__NoSecurityExtension</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span>
1764 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
1765 <span class="n">nt_password</span><span class="p">,</span>
1766 <span class="bp">True</span><span class="p">,</span>
1767 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)))</span>
1768
1769 <span class="k">def</span> <span class="nf">_listShares_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1770 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1771 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1772
1773 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1774 <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
1775 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1776
1777 <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1778 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNTCreateAndxRequest</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">srvsvc&#39;</span><span class="p">,</span>
1779 <span class="n">flags</span> <span class="o">=</span> <span class="n">NT_CREATE_REQUEST_EXTENDED_RESPONSE</span><span class="p">,</span>
1780 <span class="n">access_mask</span> <span class="o">=</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_DATA</span><span class="p">,</span>
1781 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
1782 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1783 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_OPEN_NO_RECALL</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
1784 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1785 <span class="n">security_flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">))</span>
1786 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1787 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1788 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectSrvSvcCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
1789 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1790
1791 <span class="k">def</span> <span class="nf">connectSrvSvcCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1792 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
1793 <span class="k">if</span> <span class="ow">not</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1794 <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
1795 <span class="c1"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
1796 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HH&#39;</span><span class="p">,</span> <span class="mh">0x0026</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1797 <span class="c1"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
1798 <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
1799 <span class="n">data_bytes</span> <span class="o">=</span> \
1800 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 0b 03 10 00 00 00 48 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1801 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
1802 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1803 <span class="s2">b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00</span>
1804 <span class="s2">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
1805 <span class="s2">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
1806 <span class="s2">2b 10 48 60 02 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1807 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransactionRequest</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1808 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
1809 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1810 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">,</span>
1811 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
1812 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
1813 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1814 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcBindCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
1815 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1816 <span class="k">else</span><span class="p">:</span>
1817 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to locate Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1818
1819 <span class="k">def</span> <span class="nf">rpcBindCB</span><span class="p">(</span><span class="n">trans_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1820 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">trans_message</span><span class="p">)</span>
1821 <span class="k">if</span> <span class="ow">not</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1822 <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
1823
1824 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
1825 <span class="n">server_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
1826 <span class="n">server_bytes_len</span> <span class="o">=</span> <span class="n">server_len</span> <span class="o">*</span> <span class="mi">2</span>
1827 <span class="k">if</span> <span class="n">server_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
1828 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
1829 <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
1830
1831 <span class="c1"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
1832 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HH&#39;</span><span class="p">,</span> <span class="mh">0x0026</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
1833 <span class="c1"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
1834 <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
1835 <span class="n">data_bytes</span> <span class="o">=</span> \
1836 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 00 03 10 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1837 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHI&#39;</span><span class="p">,</span> <span class="mi">72</span><span class="o">+</span><span class="n">server_bytes_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
1838 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;4c 00 00 00 00 00 0f 00 00 00 02 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1839 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">server_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">server_len</span><span class="p">)</span> <span class="o">+</span> \
1840 <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> \
1841 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
1842 <span class="s2">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
1843 <span class="s2">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
1844 <span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1845 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransactionRequest</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1846 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
1847 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1848 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">,</span>
1849 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
1850 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span>
1851 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1852 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
1853 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1854 <span class="k">else</span><span class="p">:</span>
1855 <span class="n">closeFid</span><span class="p">(</span><span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
1856 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to bind to Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1857
1858 <span class="k">def</span> <span class="nf">listShareResultsCB</span><span class="p">(</span><span class="n">result_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1859 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result_message</span><span class="p">)</span>
1860 <span class="k">if</span> <span class="ow">not</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1861 <span class="c1"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
1862 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">result_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span>
1863
1864 <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1865 <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
1866 <span class="k">else</span><span class="p">:</span>
1867 <span class="n">decodeResults</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
1868 <span class="k">else</span><span class="p">:</span>
1869 <span class="n">closeFid</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
1870 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1871
1872 <span class="k">def</span> <span class="nf">decodeResults</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
1873 <span class="n">shares_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">36</span><span class="p">:</span><span class="mi">40</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
1874 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span> <span class="c1"># A list of SharedDevice instances</span>
1875 <span class="n">offset</span> <span class="o">=</span> <span class="mi">36</span> <span class="o">+</span> <span class="mi">12</span> <span class="c1"># You need to study the byte stream to understand the meaning of these constants</span>
1876 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
1877 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedDevice</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="o">+</span><span class="mi">4</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>
1878 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1879
1880 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
1881 <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
1882 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1883 <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1884
1885 <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
1886 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
1887 <span class="k">else</span><span class="p">:</span>
1888 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
1889
1890 <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
1891 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1892 <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1893
1894 <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
1895 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
1896 <span class="k">else</span><span class="p">:</span>
1897 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
1898
1899 <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
1900 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
1901
1902 <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
1903 <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
1904 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
1905 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1906 <span class="n">max_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">,</span>
1907 <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">))</span>
1908 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1909 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1910 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
1911
1912 <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1913 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
1914 <span class="k">if</span> <span class="ow">not</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1915 <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
1916 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span>
1917
1918 <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1919 <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
1920 <span class="k">else</span><span class="p">:</span>
1921 <span class="n">decodeResults</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
1922 <span class="k">else</span><span class="p">:</span>
1923 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
1924 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1925
1926 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
1927 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
1928 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1929 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1930 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1931
1932 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1933 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
1934 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1935 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
1936 <span class="n">connectSrvSvc</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
1937 <span class="k">else</span><span class="p">:</span>
1938 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to connect to IPC$&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1939
1940 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">path</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
1941 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1942 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">)</span>
1943 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1944
1945 <span class="k">def</span> <span class="nf">_listPath_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1946 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
1947 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
1948
1949 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
1950 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
1951 <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
1952 <span class="n">path</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
1953 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1954 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1955
1956 <span class="k">def</span> <span class="nf">sendFindFirst</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
1957 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0001</span><span class="p">)</span> <span class="c1"># TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1</span>
1958 <span class="n">params_bytes</span> <span class="o">=</span> \
1959 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHHI&#39;</span><span class="p">,</span>
1960 <span class="n">search</span><span class="p">,</span> <span class="c1"># SearchAttributes</span>
1961 <span class="mi">100</span><span class="p">,</span> <span class="c1"># SearchCount</span>
1962 <span class="mh">0x0006</span><span class="p">,</span> <span class="c1"># Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
1963 <span class="mh">0x0104</span><span class="p">,</span> <span class="c1"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
1964 <span class="mh">0x0000</span><span class="p">)</span> <span class="c1"># SearchStorageType</span>
1965 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
1966 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span> <span class="o">+</span> <span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1967 <span class="k">else</span><span class="p">:</span>
1968 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1969
1970 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
1971 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
1972 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1973 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
1974 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
1975 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1976 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
1977 <span class="n">m</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_DFS</span>
1978 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1979 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findFirstCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="n">support_dfs</span><span class="p">)</span>
1980 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
1981
1982 <span class="k">def</span> <span class="nf">decodeFindStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
1983 <span class="c1"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
1984 <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;IIQQQQQQIIIBB24s&#39;</span>
1985 <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
1986
1987 <span class="n">data_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
1988 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
1989 <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
1990 <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
1991 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
1992
1993 <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
1994 <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
1995 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
1996 <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
1997
1998 <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
1999 <span class="k">if</span> <span class="n">offset2</span> <span class="o">+</span> <span class="n">filename_length</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
2000 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
2001
2002 <span class="n">filename</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset2</span><span class="p">:</span><span class="n">offset2</span><span class="o">+</span><span class="n">filename_length</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2003 <span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2004 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedFile</span><span class="p">(</span><span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">create_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_access_time</span><span class="p">),</span>
2005 <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_write_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_attr_change_time</span><span class="p">),</span>
2006 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
2007
2008 <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
2009 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
2010 <span class="k">else</span><span class="p">:</span>
2011 <span class="k">break</span>
2012 <span class="k">return</span> <span class="s1">&#39;&#39;</span>
2013
2014 <span class="k">def</span> <span class="nf">findFirstCB</span><span class="p">(</span><span class="n">find_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2015 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">find_message</span><span class="p">)</span>
2016 <span class="k">if</span> <span class="ow">not</span> <span class="n">find_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2017 <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;total_count&#39;</span><span class="p">):</span>
2018 <span class="c1"># TRANS2_FIND_FIRST2 response. [MS-CIFS]: 2.2.6.2.2</span>
2019 <span class="n">sid</span><span class="p">,</span> <span class="n">search_count</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHHH&#39;</span><span class="p">,</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">params_bytes</span><span class="p">[:</span><span class="mi">10</span><span class="p">])</span>
2020 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;sid&#39;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s1">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s1">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s1">&#39;&#39;</span> <span class="p">})</span>
2021 <span class="k">else</span><span class="p">:</span>
2022 <span class="n">sid</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;sid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;last_name_offset&#39;</span><span class="p">]</span>
2023
2024 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
2025 <span class="k">if</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">:</span>
2026 <span class="n">d</span> <span class="o">=</span> <span class="n">decodeFindStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
2027 <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;data_count&#39;</span><span class="p">):</span>
2028 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span> <span class="o">!=</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">:</span>
2029 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;data_count&#39;</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span>
2030 <span class="s1">&#39;total_count&#39;</span><span class="p">:</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
2031 <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
2032 <span class="p">})</span>
2033 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
2034 <span class="k">else</span><span class="p">:</span>
2035 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
2036 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">])</span>
2037 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
2038 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]:</span>
2039 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
2040
2041 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
2042 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findFirstCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
2043 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
2044 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
2045 <span class="k">else</span><span class="p">:</span>
2046 <span class="n">sendFindNext</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;support_dfs&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
2047 <span class="k">else</span><span class="p">:</span>
2048 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve file list&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2049
2050 <span class="k">def</span> <span class="nf">sendFindNext</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">resume_key</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
2051 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0002</span><span class="p">)</span> <span class="c1"># TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1</span>
2052 <span class="n">params_bytes</span> <span class="o">=</span> \
2053 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHIH&#39;</span><span class="p">,</span>
2054 <span class="n">sid</span><span class="p">,</span> <span class="c1"># SID</span>
2055 <span class="mi">100</span><span class="p">,</span> <span class="c1"># SearchCount</span>
2056 <span class="mh">0x0104</span><span class="p">,</span> <span class="c1"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
2057 <span class="n">resume_key</span><span class="p">,</span> <span class="c1"># ResumeKey</span>
2058 <span class="mh">0x000a</span><span class="p">)</span> <span class="c1"># Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
2059 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
2060 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span> <span class="o">+</span> <span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2061 <span class="k">else</span><span class="p">:</span>
2062 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2063
2064 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
2065 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
2066 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2067 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
2068 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2069 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2070 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
2071 <span class="n">m</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_DFS</span>
2072 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2073 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findNextCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">sid</span> <span class="o">=</span> <span class="n">sid</span><span class="p">,</span> <span class="n">support_dfs</span> <span class="o">=</span> <span class="n">support_dfs</span><span class="p">)</span>
2074 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2075
2076 <span class="k">def</span> <span class="nf">findNextCB</span><span class="p">(</span><span class="n">find_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2077 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">find_message</span><span class="p">)</span>
2078 <span class="k">if</span> <span class="ow">not</span> <span class="n">find_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2079 <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;total_count&#39;</span><span class="p">):</span>
2080 <span class="c1"># TRANS2_FIND_NEXT2 response. [MS-CIFS]: 2.2.6.3.2</span>
2081 <span class="n">search_count</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHH&#39;</span><span class="p">,</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">params_bytes</span><span class="p">[:</span><span class="mi">8</span><span class="p">])</span>
2082 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s1">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s1">&#39;&#39;</span> <span class="p">})</span>
2083 <span class="k">else</span><span class="p">:</span>
2084 <span class="n">end_of_search</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;last_name_offset&#39;</span><span class="p">]</span>
2085
2086 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
2087 <span class="k">if</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">:</span>
2088 <span class="n">d</span> <span class="o">=</span> <span class="n">decodeFindStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
2089 <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;data_count&#39;</span><span class="p">):</span>
2090 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span> <span class="o">!=</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">:</span>
2091 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;data_count&#39;</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span>
2092 <span class="s1">&#39;total_count&#39;</span><span class="p">:</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
2093 <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
2094 <span class="p">})</span>
2095 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
2096 <span class="k">else</span><span class="p">:</span>
2097 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
2098 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">])</span>
2099 <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
2100 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]:</span>
2101 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
2102
2103 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
2104 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findNextCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
2105 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
2106 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
2107 <span class="k">else</span><span class="p">:</span>
2108 <span class="n">sendFindNext</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;sid&#39;</span><span class="p">],</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;support_dfs&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
2109 <span class="k">else</span><span class="p">:</span>
2110 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve file list&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2111
2112 <span class="k">def</span> <span class="nf">sendDFSReferral</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2113 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0010</span><span class="p">)</span> <span class="c1"># TRANS2_GET_DFS_REFERRAL sub-command. See [MS-CIFS]: 2.2.6.16.1</span>
2114 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1"># Max referral level 3</span>
2115 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2116
2117 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
2118 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
2119 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2120 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
2121 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2122 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2123 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2124 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">dfsReferralCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2125 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2126
2127 <span class="k">def</span> <span class="nf">dfsReferralCB</span><span class="p">(</span><span class="n">dfs_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2128 <span class="n">sendFindFirst</span><span class="p">(</span><span class="n">dfs_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
2129
2130 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2131 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2132 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2133 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2134 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2135 <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">optional_support</span> <span class="o">&amp;</span> <span class="n">SMB_TREE_CONNECTX_SUPPORT_DFS</span><span class="p">:</span>
2136 <span class="n">sendDFSReferral</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2137 <span class="k">else</span><span class="p">:</span>
2138 <span class="n">sendFindFirst</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
2139 <span class="k">else</span><span class="p">:</span>
2140 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2141
2142 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2143 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2144 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2145 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2146 <span class="k">else</span><span class="p">:</span>
2147 <span class="n">sendFindFirst</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2148
2149 <span class="k">def</span> <span class="nf">_getAttributes_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2150 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2151 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2152
2153 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
2154 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2155 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
2156 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
2157 <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
2158 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
2159 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2160
2161 <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2162 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0005</span><span class="p">)</span> <span class="c1"># TRANS2_QUERY_PATH_INFORMATION sub-command. See [MS-CIFS]: 2.2.6.6.1</span>
2163 <span class="n">params_bytes</span> <span class="o">=</span> \
2164 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HI&#39;</span><span class="p">,</span>
2165 <span class="mh">0x0107</span><span class="p">,</span> <span class="c1"># SMB_QUERY_FILE_ALL_INFO ([MS-CIFS] 2.2.2.3.3)</span>
2166 <span class="mh">0x0000</span><span class="p">)</span> <span class="c1"># Reserved</span>
2167 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2168
2169 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
2170 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">65535</span><span class="p">,</span>
2171 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2172 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
2173 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2174 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2175 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2176 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">queryCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2177 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2178
2179 <span class="k">def</span> <span class="nf">queryCB</span><span class="p">(</span><span class="n">query_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2180 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">query_message</span><span class="p">)</span>
2181 <span class="k">if</span> <span class="ow">not</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2182 <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;QQQQIIQQ&#39;</span>
2183 <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
2184 <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
2185 <span class="n">file_attributes</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">query_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[:</span><span class="n">info_size</span><span class="p">])</span>
2186
2187 <span class="n">info</span> <span class="o">=</span> <span class="n">SharedFile</span><span class="p">(</span><span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span>
2188 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
2189 <span class="n">callback</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
2190 <span class="k">else</span><span class="p">:</span>
2191 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2192
2193 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2194 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2195 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2196 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2197 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2198 <span class="n">sendQuery</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2199 <span class="k">else</span><span class="p">:</span>
2200 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2201
2202 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2203 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2204 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2205 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2206 <span class="k">else</span><span class="p">:</span>
2207 <span class="n">sendQuery</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2208
2209 <span class="k">def</span> <span class="nf">_retrieveFile_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2210 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
2211
2212 <span class="k">def</span> <span class="nf">_retrieveFileFromOffset_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2213 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2214 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2215
2216 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2217 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2218
2219 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2220 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
2221 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span> <span class="c1"># Sharing mode: Deny nothing to others</span>
2222 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span> <span class="c1"># Failed if file does not exist</span>
2223 <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">,</span>
2224 <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
2225 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2226 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2227 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2228 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2229
2230 <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2231 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
2232 <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2233 <span class="k">if</span> <span class="n">max_length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
2234 <span class="n">closeFid</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
2235 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="il">0L</span> <span class="p">))</span>
2236 <span class="k">else</span><span class="p">:</span>
2237 <span class="n">sendRead</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span><span class="p">)</span>
2238 <span class="k">else</span><span class="p">:</span>
2239 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2240
2241 <span class="k">def</span> <span class="nf">sendRead</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">):</span>
2242 <span class="n">read_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span>
2243 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
2244 <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
2245 <span class="n">max_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">,</span>
2246 <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mh">0xFFFF</span><span class="p">,</span> <span class="n">read_count</span><span class="p">)))</span>
2247 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2248 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2249 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">,</span>
2250 <span class="n">read_len</span> <span class="o">=</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">remaining_len</span><span class="p">)</span>
2251
2252 <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2253 <span class="c1"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
2254 <span class="k">if</span> <span class="ow">not</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2255 <span class="n">read_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span>
2256 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;remaining_len&#39;</span><span class="p">]</span>
2257 <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
2258 <span class="k">if</span> <span class="n">max_length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
2259 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="n">remaining_len</span><span class="p">:</span>
2260 <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="n">remaining_len</span><span class="p">])</span>
2261 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">remaining_len</span>
2262 <span class="n">remaining_len</span> <span class="o">=</span> <span class="mi">0</span>
2263 <span class="k">else</span><span class="p">:</span>
2264 <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
2265 <span class="n">remaining_len</span> <span class="o">-=</span> <span class="n">data_len</span>
2266 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
2267 <span class="k">else</span><span class="p">:</span>
2268 <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
2269 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
2270
2271 <span class="k">if</span> <span class="p">(</span><span class="n">max_length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">remaining_len</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="n">data_len</span> <span class="o">&lt;</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">):</span>
2272 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
2273 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">read_len</span> <span class="p">))</span> <span class="c1"># Note that this is a tuple of 3-elements</span>
2274 <span class="k">else</span><span class="p">:</span>
2275 <span class="n">sendRead</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span><span class="o">+</span><span class="n">data_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">)</span>
2276 <span class="k">else</span><span class="p">:</span>
2277 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
2278 <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
2279 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2280
2281 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
2282 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
2283 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2284 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2285 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2286
2287 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2288 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2289 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2290 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2291 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2292 <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2293 <span class="k">else</span><span class="p">:</span>
2294 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2295
2296 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2297 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2298 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2299 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2300 <span class="k">else</span><span class="p">:</span>
2301 <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2302
2303 <span class="k">def</span> <span class="nf">_storeFile_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2304 <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB1</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
2305
2306 <span class="k">def</span> <span class="nf">_storeFileFromOffset_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2307 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2308 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2309
2310 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2311 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2312
2313 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2314 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
2315 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0041</span><span class="p">,</span> <span class="c1"># Sharing mode: Deny nothing to others + Open for writing</span>
2316 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0012</span> <span class="k">if</span> <span class="n">truncate</span> <span class="k">else</span> <span class="mh">0x0011</span><span class="p">,</span> <span class="c1"># Create file if file does not exist. Overwrite or append depending on truncate parameter.</span>
2317 <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">,</span>
2318 <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
2319 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2320 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2321 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2322 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2323
2324 <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2325 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
2326 <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2327 <span class="n">sendWrite</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">)</span>
2328 <span class="k">else</span><span class="p">:</span>
2329 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2330
2331 <span class="k">def</span> <span class="nf">sendWrite</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
2332 <span class="c1"># For message signing, the total SMB message size must be not exceed the max_buffer_size. Non-message signing does not have this limitation</span>
2333 <span class="n">write_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span><span class="o">-</span><span class="mi">64</span><span class="p">))</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span><span class="p">,</span> <span class="mh">0xFFFF</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Need to minus 1 byte from 0xFFFF because of the first NULL byte in the ComWriteAndxRequest message data</span>
2334 <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">file_obj</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">write_count</span><span class="p">)</span>
2335 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
2336 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
2337 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComWriteAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">))</span>
2338 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2339 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2340 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">writeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="o">+</span><span class="n">data_len</span><span class="p">)</span>
2341 <span class="k">else</span><span class="p">:</span>
2342 <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
2343 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="p">))</span> <span class="c1"># Note that this is a tuple of 2-elements</span>
2344
2345 <span class="k">def</span> <span class="nf">writeCB</span><span class="p">(</span><span class="n">write_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2346 <span class="c1"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</span>
2347 <span class="k">if</span> <span class="ow">not</span> <span class="n">write_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2348 <span class="n">sendWrite</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">])</span>
2349 <span class="k">else</span><span class="p">:</span>
2350 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">write_message</span><span class="p">)</span>
2351 <span class="n">closeFid</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
2352 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2353
2354 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
2355 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
2356 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2357 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2358 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2359
2360 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2361 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2362 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2363 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2364 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2365 <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2366 <span class="k">else</span><span class="p">:</span>
2367 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2368
2369 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2370 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2371 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2372 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2373 <span class="k">else</span><span class="p">:</span>
2374 <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2375
2376 <span class="k">def</span> <span class="nf">_deleteFiles_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2377 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2378 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2379
2380 <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2381 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2382
2383 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2384 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComDeleteRequest</span><span class="p">(</span><span class="n">filename_pattern</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
2385 <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">))</span>
2386 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2387 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2388 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2389 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2390
2391 <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2392 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
2393 <span class="k">if</span> <span class="ow">not</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2394 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
2395 <span class="k">else</span><span class="p">:</span>
2396 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2397
2398 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2399 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2400 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2401 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2402 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2403 <span class="n">sendDelete</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2404 <span class="k">else</span><span class="p">:</span>
2405 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2406
2407 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2408 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2409 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2410 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2411 <span class="k">else</span><span class="p">:</span>
2412 <span class="n">sendDelete</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2413
2414 <span class="k">def</span> <span class="nf">_resetFileAttributes_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2415 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;resetFileAttributes is not yet implemented for SMB1&#39;</span><span class="p">)</span>
2416
2417 <span class="k">def</span> <span class="nf">_createDirectory_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2418 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2419 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2420
2421 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2422 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2423
2424 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2425 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCreateDirectoryRequest</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
2426 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2427 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2428 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2429 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2430
2431 <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2432 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
2433 <span class="k">if</span> <span class="ow">not</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2434 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
2435 <span class="k">else</span><span class="p">:</span>
2436 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Create failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2437
2438 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2439 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2440 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2441 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2442 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2443 <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2444 <span class="k">else</span><span class="p">:</span>
2445 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2446
2447 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2448 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2449 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2450 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2451 <span class="k">else</span><span class="p">:</span>
2452 <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2453
2454 <span class="k">def</span> <span class="nf">_deleteDirectory_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2455 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2456 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2457
2458 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2459 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2460
2461 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2462 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComDeleteDirectoryRequest</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
2463 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2464 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2465 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2466 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2467
2468 <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2469 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
2470 <span class="k">if</span> <span class="ow">not</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2471 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
2472 <span class="k">else</span><span class="p">:</span>
2473 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2474
2475 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2476 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2477 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2478 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2479 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2480 <span class="n">sendDelete</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2481 <span class="k">else</span><span class="p">:</span>
2482 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2483
2484 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2485 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2486 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2487 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2488 <span class="k">else</span><span class="p">:</span>
2489 <span class="n">sendDelete</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2490
2491 <span class="k">def</span> <span class="nf">_rename_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2492 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2493 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2494
2495 <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2496 <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2497 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2498
2499 <span class="k">def</span> <span class="nf">sendRename</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2500 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComRenameRequest</span><span class="p">(</span><span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">,</span>
2501 <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">,</span>
2502 <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">))</span>
2503 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2504 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2505 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">renameCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2506 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2507
2508 <span class="k">def</span> <span class="nf">renameCB</span><span class="p">(</span><span class="n">rename_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2509 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rename_message</span><span class="p">)</span>
2510 <span class="k">if</span> <span class="ow">not</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2511 <span class="n">callback</span><span class="p">((</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span> <span class="p">))</span> <span class="c1"># Note that this is a tuple of 2-elements</span>
2512 <span class="k">else</span><span class="p">:</span>
2513 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Rename failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2514
2515 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2516 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2517 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2518 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2519 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2520 <span class="n">sendRename</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2521 <span class="k">else</span><span class="p">:</span>
2522 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2523
2524 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2525 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2526 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2527 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2528 <span class="k">else</span><span class="p">:</span>
2529 <span class="n">sendRename</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2530
2531 <span class="k">def</span> <span class="nf">_listSnapshots_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2532 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2533 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2534
2535 <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
2536 <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
2537 <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
2538 <span class="n">path</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
2539 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2540 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2541
2542 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2543 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
2544 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span> <span class="c1"># Sharing mode: Deny nothing to others</span>
2545 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span> <span class="c1"># Failed if file does not exist</span>
2546 <span class="n">search_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2547 <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
2548 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2549 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2550 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2551 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2552
2553 <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2554 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
2555 <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2556 <span class="n">sendEnumSnapshots</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
2557 <span class="k">else</span><span class="p">:</span>
2558 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open path&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2559
2560 <span class="k">def</span> <span class="nf">sendEnumSnapshots</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
2561 <span class="c1"># [MS-CIFS]: 2.2.7.2</span>
2562 <span class="c1"># [MS-SMB]: 2.2.7.2.1</span>
2563 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;IHBB&#39;</span><span class="p">,</span>
2564 <span class="mh">0x00144064</span><span class="p">,</span> <span class="c1"># [MS-SMB]: 2.2.7.2.1</span>
2565 <span class="n">fid</span><span class="p">,</span> <span class="c1"># FID</span>
2566 <span class="mh">0x01</span><span class="p">,</span> <span class="c1"># IsFctl</span>
2567 <span class="mi">0</span><span class="p">)</span> <span class="c1"># IsFlags</span>
2568 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNTTransactRequest</span><span class="p">(</span><span class="n">function</span> <span class="o">=</span> <span class="mh">0x0002</span><span class="p">,</span> <span class="c1"># NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1</span>
2569 <span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2570 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mh">0xFFFF</span><span class="p">,</span>
2571 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2572 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2573 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2574 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2575 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">enumSnapshotsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
2576 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2577
2578 <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2579 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">enum_message</span><span class="p">)</span>
2580 <span class="k">if</span> <span class="ow">not</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2581 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2582 <span class="n">snapshots_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
2583 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">snapshots_count</span><span class="p">):</span>
2584 <span class="n">s</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">12</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">:</span><span class="mi">12</span><span class="o">+</span><span class="mi">48</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
2585 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="o">*</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="p">(</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">9</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="p">:</span><span class="mi">12</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">13</span><span class="p">:</span><span class="mi">15</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">16</span><span class="p">:</span><span class="mi">18</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">21</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">22</span><span class="p">:</span><span class="mi">24</span><span class="p">]</span> <span class="p">))))</span>
2586 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
2587 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
2588 <span class="k">else</span><span class="p">:</span>
2589 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
2590 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to list snapshots on path&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2591
2592 <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
2593 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
2594 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2595 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2596 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2597
2598 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
2599 <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2600 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
2601 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2602 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
2603 <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
2604 <span class="k">else</span><span class="p">:</span>
2605 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
2606
2607 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
2608 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2609 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
2610 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2611 <span class="k">else</span><span class="p">:</span>
2612 <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
2613
2614 <span class="k">def</span> <span class="nf">_echo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
2615 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2616
2617 <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2618 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">echo_message</span><span class="p">)</span>
2619 <span class="k">if</span> <span class="ow">not</span> <span class="n">echo_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2620 <span class="n">callback</span><span class="p">(</span><span class="n">echo_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
2621 <span class="k">else</span><span class="p">:</span>
2622 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
2623
2624 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComEchoRequest</span><span class="p">(</span><span class="n">echo_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
2625 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2626 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">echoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2627 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
2628
2629
2630 <div class="viewcode-block" id="SharedDevice"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice">[docs]</a><span class="k">class</span> <span class="nc">SharedDevice</span><span class="p">:</span>
2631 <span class="sd">&quot;&quot;&quot;</span>
2632 <span class="sd"> Contains information about a single shared device on the remote server.</span>
2633 <span class="sd"> &quot;&quot;&quot;</span>
2634
2635 <span class="c1"># The following constants are taken from [MS-SRVS]: 2.2.2.4</span>
2636 <span class="c1"># They are used to identify the type of shared resource from the results from the NetrShareEnum in Server Service RPC</span>
2637 <span class="n">DISK_TREE</span> <span class="o">=</span> <span class="mh">0x00</span>
2638 <span class="n">PRINT_QUEUE</span> <span class="o">=</span> <span class="mh">0x01</span>
2639 <span class="n">COMM_DEVICE</span> <span class="o">=</span> <span class="mh">0x02</span>
2640 <span class="n">IPC</span> <span class="o">=</span> <span class="mh">0x03</span>
2641
2642 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">comments</span><span class="p">):</span>
2643 <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">=</span> <span class="nb">type</span>
2644 <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="c1">#: An unicode string containing the name of the shared device</span>
2645 <span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="n">comments</span> <span class="c1">#: An unicode string containing the user description of the shared device</span>
2646
2647 <span class="nd">@property</span>
2648 <span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2649 <span class="sd">&quot;&quot;&quot;</span>
2650 <span class="sd"> Returns one of the following integral constants.</span>
2651 <span class="sd"> - SharedDevice.DISK_TREE</span>
2652 <span class="sd"> - SharedDevice.PRINT_QUEUE</span>
2653 <span class="sd"> - SharedDevice.COMM_DEVICE</span>
2654 <span class="sd"> - SharedDevice.IPC</span>
2655 <span class="sd"> &quot;&quot;&quot;</span>
2656 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span>
2657
2658 <span class="nd">@property</span>
2659 <span class="k">def</span> <span class="nf">isSpecial</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2660 <span class="sd">&quot;&quot;&quot;</span>
2661 <span class="sd"> Returns True if this shared device is a special share reserved for interprocess communication (IPC$)</span>
2662 <span class="sd"> or remote administration of the server (ADMIN$). Can also refer to administrative shares such as</span>
2663 <span class="sd"> C$, D$, E$, and so forth</span>
2664 <span class="sd"> &quot;&quot;&quot;</span>
2665 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0x80000000</span><span class="p">)</span>
2666
2667 <span class="nd">@property</span>
2668 <span class="k">def</span> <span class="nf">isTemporary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2669 <span class="sd">&quot;&quot;&quot;</span>
2670 <span class="sd"> Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</span>
2671 <span class="sd"> &quot;&quot;&quot;</span>
2672 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0x40000000</span><span class="p">)</span>
2673
2674 <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2675 <span class="k">return</span> <span class="s1">u&#39;Shared device: </span><span class="si">%s</span><span class="s1"> (type:0x</span><span class="si">%02x</span><span class="s1"> comments:</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="p">)</span></div>
2676
2677
2678 <div class="viewcode-block" id="SharedFile"><a class="viewcode-back" href="../../api/smb_SharedFile.html#smb.base.SharedFile">[docs]</a><span class="k">class</span> <span class="nc">SharedFile</span><span class="p">:</span>
2679 <span class="sd">&quot;&quot;&quot;</span>
2680 <span class="sd"> Contain information about a file/folder entry that is shared on the shared device.</span>
2681
2682 <span class="sd"> As an application developer, you should not need to instantiate a *SharedFile* instance directly in your application.</span>
2683 <span class="sd"> These *SharedFile* instances are usually returned via a call to *listPath* method in :doc:`smb.SMBProtocol.SMBProtocolFactory&lt;smb_SMBProtocolFactory&gt;`.</span>
2684
2685 <span class="sd"> If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond</span>
2686 <span class="sd"> to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains</span>
2687 <span class="sd"> one of these prohibited characters: &quot;\/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).</span>
2688 <span class="sd"> &quot;&quot;&quot;</span>
2689
2690 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
2691 <span class="bp">self</span><span class="o">.</span><span class="n">create_time</span> <span class="o">=</span> <span class="n">create_time</span> <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server</span>
2692 <span class="bp">self</span><span class="o">.</span><span class="n">last_access_time</span> <span class="o">=</span> <span class="n">last_access_time</span> <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server</span>
2693 <span class="bp">self</span><span class="o">.</span><span class="n">last_write_time</span> <span class="o">=</span> <span class="n">last_write_time</span> <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server</span>
2694 <span class="bp">self</span><span class="o">.</span><span class="n">last_attr_change_time</span> <span class="o">=</span> <span class="n">last_attr_change_time</span> <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server</span>
2695 <span class="bp">self</span><span class="o">.</span><span class="n">file_size</span> <span class="o">=</span> <span class="n">file_size</span> <span class="c1">#: File size in number of bytes</span>
2696 <span class="bp">self</span><span class="o">.</span><span class="n">alloc_size</span> <span class="o">=</span> <span class="n">alloc_size</span> <span class="c1">#: Total number of bytes allocated to store this file</span>
2697 <span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span> <span class="c1">#: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</span>
2698 <span class="bp">self</span><span class="o">.</span><span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span> <span class="c1">#: Unicode string containing the short name of this file (usually in 8.3 notation)</span>
2699 <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span> <span class="c1">#: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.</span>
2700
2701 <span class="nd">@property</span>
2702 <span class="k">def</span> <span class="nf">isDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2703 <span class="sd">&quot;&quot;&quot;A convenient property to return True if this file resource is a directory on the remote server&quot;&quot;&quot;</span>
2704 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">&amp;</span> <span class="n">ATTR_DIRECTORY</span><span class="p">)</span>
2705
2706 <span class="nd">@property</span>
2707 <span class="k">def</span> <span class="nf">isReadOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2708 <span class="sd">&quot;&quot;&quot;A convenient property to return True if this file resource is read-only on the remote server&quot;&quot;&quot;</span>
2709 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">&amp;</span> <span class="n">ATTR_READONLY</span><span class="p">)</span>
2710
2711 <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2712 <span class="k">return</span> <span class="s1">u&#39;Shared file: </span><span class="si">%s</span><span class="s1"> (FileSize:</span><span class="si">%d</span><span class="s1"> bytes, isDirectory:</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">isDirectory</span> <span class="p">)</span></div>
2713
2714
2715 <span class="k">class</span> <span class="nc">_PendingRequest</span><span class="p">:</span>
2716
2717 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2718 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="n">mid</span>
2719 <span class="bp">self</span><span class="o">.</span><span class="n">expiry_time</span> <span class="o">=</span> <span class="n">expiry_time</span>
2720 <span class="bp">self</span><span class="o">.</span><span class="n">callback</span> <span class="o">=</span> <span class="n">callback</span>
2721 <span class="bp">self</span><span class="o">.</span><span class="n">errback</span> <span class="o">=</span> <span class="n">errback</span>
2722 <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
2723 </pre></div>
2724
2725 </div>
2726 </div>
2727 </div>
2728 <div class="clearer"></div>
2729 </div>
2730 <div class="related" role="navigation" aria-label="related navigation">
2731 <h3>Navigation</h3>
2732 <ul>
2733 <li class="right" style="margin-right: 10px">
2734 <a href="../../genindex.html" title="General Index"
2735 >index</a></li>
2736 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
2737 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
2738 </ul>
2739 </div>
2740 <div class="footer" role="contentinfo">
2741 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
2742 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
2743 </div>
2744 </body>
2745 </html>āŽ
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>smb.security_descriptors &mdash; pysmb 1.1.25 documentation</title>
9
10 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '../../',
16 VERSION: '1.1.25',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="../../_static/jquery.js"></script>
23 <script type="text/javascript" src="../../_static/underscore.js"></script>
24 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
26 <link rel="up" title="Module code" href="../index.html" />
27 </head>
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
30 <h3>Navigation</h3>
31 <ul>
32 <li class="right" style="margin-right: 10px">
33 <a href="../../genindex.html" title="General Index"
34 accesskey="I">index</a></li>
35 <li class="right" >
36 <a href="../../py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
39 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
40 </ul>
41 </div>
42 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
43 <div class="sphinxsidebarwrapper">
44 <div id="searchbox" style="display: none" role="search">
45 <h3>Quick search</h3>
46 <form class="search" action="../../search.html" method="get">
47 <input type="text" name="q" />
48 <input type="submit" value="Go" />
49 <input type="hidden" name="check_keywords" value="yes" />
50 <input type="hidden" name="area" value="default" />
51 </form>
52 <p class="searchtip" style="font-size: 90%">
53 Enter search terms or a module, class or function name.
54 </p>
55 </div>
56 <script type="text/javascript">$('#searchbox').show(0);</script>
57 </div>
58 </div>
59
60 <div class="document">
61 <div class="documentwrapper">
62 <div class="bodywrapper">
63 <div class="body" role="main">
64
65 <h1>Source code for smb.security_descriptors</h1><div class="highlight"><pre>
66 <span class="sd">&quot;&quot;&quot;</span>
67 <span class="sd">This module implements security descriptors, and the partial structures</span>
68 <span class="sd">used in them, as specified in [MS-DTYP].</span>
69 <span class="sd">&quot;&quot;&quot;</span>
70
71 <span class="kn">import</span> <span class="nn">struct</span>
72
73
74 <span class="c1"># Security descriptor control flags</span>
75 <span class="c1"># [MS-DTYP]: 2.4.6</span>
76 <span class="n">SECURITY_DESCRIPTOR_OWNER_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0001</span>
77 <span class="n">SECURITY_DESCRIPTOR_GROUP_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0002</span>
78 <span class="n">SECURITY_DESCRIPTOR_DACL_PRESENT</span> <span class="o">=</span> <span class="mh">0x0004</span>
79 <span class="n">SECURITY_DESCRIPTOR_DACL_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0008</span>
80 <span class="n">SECURITY_DESCRIPTOR_SACL_PRESENT</span> <span class="o">=</span> <span class="mh">0x0010</span>
81 <span class="n">SECURITY_DESCRIPTOR_SACL_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0020</span>
82 <span class="n">SECURITY_DESCRIPTOR_SERVER_SECURITY</span> <span class="o">=</span> <span class="mh">0x0040</span>
83 <span class="n">SECURITY_DESCRIPTOR_DACL_TRUSTED</span> <span class="o">=</span> <span class="mh">0x0080</span>
84 <span class="n">SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED</span> <span class="o">=</span> <span class="mh">0x0100</span>
85 <span class="n">SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED</span> <span class="o">=</span> <span class="mh">0x0200</span>
86 <span class="n">SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED</span> <span class="o">=</span> <span class="mh">0x0400</span>
87 <span class="n">SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED</span> <span class="o">=</span> <span class="mh">0x0800</span>
88 <span class="n">SECURITY_DESCRIPTOR_DACL_PROTECTED</span> <span class="o">=</span> <span class="mh">0x1000</span>
89 <span class="n">SECURITY_DESCRIPTOR_SACL_PROTECTED</span> <span class="o">=</span> <span class="mh">0x2000</span>
90 <span class="n">SECURITY_DESCRIPTOR_RM_CONTROL_VALID</span> <span class="o">=</span> <span class="mh">0x4000</span>
91 <span class="n">SECURITY_DESCRIPTOR_SELF_RELATIVE</span> <span class="o">=</span> <span class="mh">0x8000</span>
92
93 <span class="c1"># ACE types</span>
94 <span class="c1"># [MS-DTYP]: 2.4.4.1</span>
95 <span class="n">ACE_TYPE_ACCESS_ALLOWED</span> <span class="o">=</span> <span class="mh">0x00</span>
96 <span class="n">ACE_TYPE_ACCESS_DENIED</span> <span class="o">=</span> <span class="mh">0x01</span>
97 <span class="n">ACE_TYPE_SYSTEM_AUDIT</span> <span class="o">=</span> <span class="mh">0x02</span>
98 <span class="n">ACE_TYPE_SYSTEM_ALARM</span> <span class="o">=</span> <span class="mh">0x03</span>
99 <span class="n">ACE_TYPE_ACCESS_ALLOWED_COMPOUND</span> <span class="o">=</span> <span class="mh">0x04</span>
100 <span class="n">ACE_TYPE_ACCESS_ALLOWED_OBJECT</span> <span class="o">=</span> <span class="mh">0x05</span>
101 <span class="n">ACE_TYPE_ACCESS_DENIED_OBJECT</span> <span class="o">=</span> <span class="mh">0x06</span>
102 <span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span> <span class="o">=</span> <span class="mh">0x07</span>
103 <span class="n">ACE_TYPE_SYSTEM_ALARM_OBJECT</span> <span class="o">=</span> <span class="mh">0x08</span>
104 <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK</span> <span class="o">=</span> <span class="mh">0x09</span>
105 <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0A</span>
106 <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0B</span>
107 <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0C</span>
108 <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0D</span>
109 <span class="n">ACE_TYPE_SYSTEM_ALARM_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0E</span>
110 <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0F</span>
111 <span class="n">ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x10</span>
112 <span class="n">ACE_TYPE_SYSTEM_MANDATORY_LABEL</span> <span class="o">=</span> <span class="mh">0x11</span>
113 <span class="n">ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE</span> <span class="o">=</span> <span class="mh">0x12</span>
114 <span class="n">ACE_TYPE_SYSTEM_SCOPED_POLICY_ID</span> <span class="o">=</span> <span class="mh">0x13</span>
115
116 <span class="c1"># ACE flags</span>
117 <span class="c1"># [MS-DTYP]: 2.4.4.1</span>
118 <span class="n">ACE_FLAG_OBJECT_INHERIT</span> <span class="o">=</span> <span class="mh">0x01</span>
119 <span class="n">ACE_FLAG_CONTAINER_INHERIT</span> <span class="o">=</span> <span class="mh">0x02</span>
120 <span class="n">ACE_FLAG_NO_PROPAGATE_INHERIT</span> <span class="o">=</span> <span class="mh">0x04</span>
121 <span class="n">ACE_FLAG_INHERIT_ONLY</span> <span class="o">=</span> <span class="mh">0x08</span>
122 <span class="n">ACE_FLAG_INHERITED</span> <span class="o">=</span> <span class="mh">0x10</span>
123 <span class="n">ACE_FLAG_SUCCESSFUL_ACCESS</span> <span class="o">=</span> <span class="mh">0x40</span>
124 <span class="n">ACE_FLAG_FAILED_ACCESS</span> <span class="o">=</span> <span class="mh">0x80</span>
125
126 <span class="c1"># Pre-defined well-known SIDs</span>
127 <span class="c1"># [MS-DTYP]: 2.4.2.4</span>
128 <span class="n">SID_NULL</span> <span class="o">=</span> <span class="s2">&quot;S-1-0-0&quot;</span>
129 <span class="n">SID_EVERYONE</span> <span class="o">=</span> <span class="s2">&quot;S-1-1-0&quot;</span>
130 <span class="n">SID_LOCAL</span> <span class="o">=</span> <span class="s2">&quot;S-1-2-0&quot;</span>
131 <span class="n">SID_CONSOLE_LOGON</span> <span class="o">=</span> <span class="s2">&quot;S-1-2-1&quot;</span>
132 <span class="n">SID_CREATOR_OWNER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-0&quot;</span>
133 <span class="n">SID_CREATOR_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-1&quot;</span>
134 <span class="n">SID_OWNER_SERVER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-2&quot;</span>
135 <span class="n">SID_GROUP_SERVER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-3&quot;</span>
136 <span class="n">SID_OWNER_RIGHTS</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-4&quot;</span>
137 <span class="n">SID_NT_AUTHORITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-5&quot;</span>
138 <span class="n">SID_DIALUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-1&quot;</span>
139 <span class="n">SID_NETWORK</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-2&quot;</span>
140 <span class="n">SID_BATCH</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-3&quot;</span>
141 <span class="n">SID_INTERACTIVE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-4&quot;</span>
142 <span class="n">SID_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-6&quot;</span>
143 <span class="n">SID_ANONYMOUS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-7&quot;</span>
144 <span class="n">SID_PROXY</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-8&quot;</span>
145 <span class="n">SID_ENTERPRISE_DOMAIN_CONTROLLERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-9&quot;</span>
146 <span class="n">SID_PRINCIPAL_SELF</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-10&quot;</span>
147 <span class="n">SID_AUTHENTICATED_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-11&quot;</span>
148 <span class="n">SID_RESTRICTED_CODE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-12&quot;</span>
149 <span class="n">SID_TERMINAL_SERVER_USER</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-13&quot;</span>
150 <span class="n">SID_REMOTE_INTERACTIVE_LOGON</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-14&quot;</span>
151 <span class="n">SID_THIS_ORGANIZATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-15&quot;</span>
152 <span class="n">SID_IUSR</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-17&quot;</span>
153 <span class="n">SID_LOCAL_SYSTEM</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-18&quot;</span>
154 <span class="n">SID_LOCAL_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-19&quot;</span>
155 <span class="n">SID_NETWORK_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-20&quot;</span>
156 <span class="n">SID_COMPOUNDED_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-21-0-0-0-496&quot;</span>
157 <span class="n">SID_CLAIMS_VALID</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-21-0-0-0-497&quot;</span>
158 <span class="n">SID_BUILTIN_ADMINISTRATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-544&quot;</span>
159 <span class="n">SID_BUILTIN_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-545&quot;</span>
160 <span class="n">SID_BUILTIN_GUESTS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-546&quot;</span>
161 <span class="n">SID_POWER_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-547&quot;</span>
162 <span class="n">SID_ACCOUNT_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-548&quot;</span>
163 <span class="n">SID_SERVER_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-549&quot;</span>
164 <span class="n">SID_PRINTER_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-550&quot;</span>
165 <span class="n">SID_BACKUP_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-551&quot;</span>
166 <span class="n">SID_REPLICATOR</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-552&quot;</span>
167 <span class="n">SID_ALIAS_PREW2KCOMPACC</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-554&quot;</span>
168 <span class="n">SID_REMOTE_DESKTOP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-555&quot;</span>
169 <span class="n">SID_NETWORK_CONFIGURATION_OPS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-556&quot;</span>
170 <span class="n">SID_INCOMING_FOREST_TRUST_BUILDERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-557&quot;</span>
171 <span class="n">SID_PERFMON_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-558&quot;</span>
172 <span class="n">SID_PERFLOG_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-559&quot;</span>
173 <span class="n">SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-560&quot;</span>
174 <span class="n">SID_TERMINAL_SERVER_LICENSE_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-561&quot;</span>
175 <span class="n">SID_DISTRIBUTED_COM_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-562&quot;</span>
176 <span class="n">SID_IIS_IUSRS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-568&quot;</span>
177 <span class="n">SID_CRYPTOGRAPHIC_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-569&quot;</span>
178 <span class="n">SID_EVENT_LOG_READERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-573&quot;</span>
179 <span class="n">SID_CERTIFICATE_SERVICE_DCOM_ACCESS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-574&quot;</span>
180 <span class="n">SID_RDS_REMOTE_ACCESS_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-575&quot;</span>
181 <span class="n">SID_RDS_ENDPOINT_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-576&quot;</span>
182 <span class="n">SID_RDS_MANAGEMENT_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-577&quot;</span>
183 <span class="n">SID_HYPER_V_ADMINS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-578&quot;</span>
184 <span class="n">SID_ACCESS_CONTROL_ASSISTANCE_OPS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-579&quot;</span>
185 <span class="n">SID_REMOTE_MANAGEMENT_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-580&quot;</span>
186 <span class="n">SID_WRITE_RESTRICTED_CODE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-33&quot;</span>
187 <span class="n">SID_NTLM_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-10&quot;</span>
188 <span class="n">SID_SCHANNEL_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-14&quot;</span>
189 <span class="n">SID_DIGEST_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-21&quot;</span>
190 <span class="n">SID_THIS_ORGANIZATION_CERTIFICATE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-65-1&quot;</span>
191 <span class="n">SID_NT_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-80&quot;</span>
192 <span class="n">SID_USER_MODE_DRIVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-84-0-0-0-0-0&quot;</span>
193 <span class="n">SID_LOCAL_ACCOUNT</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-113&quot;</span>
194 <span class="n">SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-114&quot;</span>
195 <span class="n">SID_OTHER_ORGANIZATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-1000&quot;</span>
196 <span class="n">SID_ALL_APP_PACKAGES</span> <span class="o">=</span> <span class="s2">&quot;S-1-15-2-1&quot;</span>
197 <span class="n">SID_ML_UNTRUSTED</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-0&quot;</span>
198 <span class="n">SID_ML_LOW</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-4096&quot;</span>
199 <span class="n">SID_ML_MEDIUM</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-8192&quot;</span>
200 <span class="n">SID_ML_MEDIUM_PLUS</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-8448&quot;</span>
201 <span class="n">SID_ML_HIGH</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-12288&quot;</span>
202 <span class="n">SID_ML_SYSTEM</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-16384&quot;</span>
203 <span class="n">SID_ML_PROTECTED_PROCESS</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-20480&quot;</span>
204 <span class="n">SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-1&quot;</span>
205 <span class="n">SID_SERVICE_ASSERTED_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-2&quot;</span>
206 <span class="n">SID_FRESH_PUBLIC_KEY_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-3&quot;</span>
207 <span class="n">SID_KEY_TRUST_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-4&quot;</span>
208 <span class="n">SID_KEY_PROPERTY_MFA</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-5&quot;</span>
209 <span class="n">SID_KEY_PROPERTY_ATTESTATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-6&quot;</span>
210
211
212 <div class="viewcode-block" id="SID"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.SID">[docs]</a><span class="k">class</span> <span class="nc">SID</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
213 <span class="sd">&quot;&quot;&quot;</span>
214 <span class="sd"> A Windows security identifier. Represents a single principal, such a</span>
215 <span class="sd"> user or a group, as a sequence of numbers consisting of the revision,</span>
216 <span class="sd"> identifier authority, and a variable-length list of subauthorities.</span>
217
218 <span class="sd"> See [MS-DTYP]: 2.4.2</span>
219 <span class="sd"> &quot;&quot;&quot;</span>
220 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">revision</span><span class="p">,</span> <span class="n">identifier_authority</span><span class="p">,</span> <span class="n">subauthorities</span><span class="p">):</span>
221 <span class="c1">#: Revision, should always be 1.</span>
222 <span class="bp">self</span><span class="o">.</span><span class="n">revision</span> <span class="o">=</span> <span class="n">revision</span>
223 <span class="c1">#: An integer representing the identifier authority.</span>
224 <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span> <span class="o">=</span> <span class="n">identifier_authority</span>
225 <span class="c1">#: A list of integers representing all subauthorities.</span>
226 <span class="bp">self</span><span class="o">.</span><span class="n">subauthorities</span> <span class="o">=</span> <span class="n">subauthorities</span>
227
228 <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
229 <span class="sd">&quot;&quot;&quot;</span>
230 <span class="sd"> String representation, as specified in [MS-DTYP]: 2.4.2.1</span>
231 <span class="sd"> &quot;&quot;&quot;</span>
232 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">32</span><span class="p">:</span>
233 <span class="n">id_auth</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%#x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span><span class="p">,)</span>
234 <span class="k">else</span><span class="p">:</span>
235 <span class="n">id_auth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span>
236 <span class="n">auths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">revision</span><span class="p">,</span> <span class="n">id_auth</span><span class="p">]</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">subauthorities</span>
237 <span class="k">return</span> <span class="s1">&#39;S-&#39;</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">subauth</span><span class="p">)</span> <span class="k">for</span> <span class="n">subauth</span> <span class="ow">in</span> <span class="n">auths</span><span class="p">)</span>
238
239 <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
240 <span class="k">return</span> <span class="s1">&#39;SID(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">),)</span>
241
242 <span class="nd">@classmethod</span>
243 <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">return_tail</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
244 <span class="n">revision</span><span class="p">,</span> <span class="n">subauth_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;BB&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])</span>
245 <span class="n">identifier_authority</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;Q&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\x00\x00</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
246 <span class="n">subauth_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">8</span><span class="p">:]</span>
247 <span class="n">subauthorities</span> <span class="o">=</span> <span class="p">[</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;L&#39;</span><span class="p">,</span> <span class="n">subauth_data</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="n">i</span> <span class="p">:</span> <span class="mi">4</span> <span class="o">*</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)])[</span><span class="mi">0</span><span class="p">]</span>
248 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">subauth_count</span><span class="p">)]</span>
249 <span class="n">sid</span> <span class="o">=</span> <span class="n">cls</span><span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">identifier_authority</span><span class="p">,</span> <span class="n">subauthorities</span><span class="p">)</span>
250 <span class="k">if</span> <span class="n">return_tail</span><span class="p">:</span>
251 <span class="k">return</span> <span class="n">sid</span><span class="p">,</span> <span class="n">subauth_data</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="n">subauth_count</span> <span class="p">:]</span>
252 <span class="k">return</span> <span class="n">sid</span></div>
253
254
255 <div class="viewcode-block" id="ACE"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.ACE">[docs]</a><span class="k">class</span> <span class="nc">ACE</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
256 <span class="sd">&quot;&quot;&quot;</span>
257 <span class="sd"> Represents a single access control entry.</span>
258
259 <span class="sd"> See [MS-DTYP]: 2.4.4</span>
260 <span class="sd"> &quot;&quot;&quot;</span>
261 <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBH&#39;</span>
262
263 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">additional_data</span><span class="p">):</span>
264 <span class="c1">#: An integer representing the type of the ACE. One of the</span>
265 <span class="c1">#: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field</span>
266 <span class="c1">#: from [MS-DTYP] 2.4.4.1.</span>
267 <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">type_</span>
268 <span class="c1">#: An integer bitmask with ACE flags, corresponds to the</span>
269 <span class="c1">#: ``AceFlags`` field.</span>
270 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
271 <span class="c1">#: An integer representing the ``ACCESS_MASK`` as specified in</span>
272 <span class="c1">#: [MS-DTYP] 2.4.3.</span>
273 <span class="bp">self</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span>
274 <span class="c1">#: The :class:`SID` of a trustee.</span>
275 <span class="bp">self</span><span class="o">.</span><span class="n">sid</span> <span class="o">=</span> <span class="n">sid</span>
276 <span class="c1">#: A dictionary of additional fields present in the ACE, depending</span>
277 <span class="c1">#: on the type. The following fields can be present:</span>
278 <span class="c1">#:</span>
279 <span class="c1">#: * ``flags``</span>
280 <span class="c1">#: * ``object_type``</span>
281 <span class="c1">#: * ``inherited_object_type``</span>
282 <span class="c1">#: * ``application_data``</span>
283 <span class="c1">#: * ``attribute_data``</span>
284 <span class="bp">self</span><span class="o">.</span><span class="n">additional_data</span> <span class="o">=</span> <span class="n">additional_data</span>
285
286 <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
287 <span class="k">return</span> <span class="s2">&quot;ACE(type=</span><span class="si">%#04x</span><span class="s2">, flags=</span><span class="si">%#04x</span><span class="s2">, mask=</span><span class="si">%#010x</span><span class="s2">, sid=</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span>
288 <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mask</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sid</span><span class="p">,</span>
289 <span class="p">)</span>
290
291 <span class="nd">@property</span>
292 <span class="k">def</span> <span class="nf">isInheritOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
293 <span class="sd">&quot;&quot;&quot;Convenience property which indicates if this ACE is inherit</span>
294 <span class="sd"> only, meaning that it doesn&#39;t apply to the object itself.&quot;&quot;&quot;</span>
295 <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">ACE_FLAG_INHERIT_ONLY</span><span class="p">)</span>
296
297 <span class="nd">@classmethod</span>
298 <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
299 <span class="n">header_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)</span>
300 <span class="n">header</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">header_size</span><span class="p">]</span>
301 <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
302
303 <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">size</span>
304
305 <span class="n">body</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">header_size</span><span class="p">:</span><span class="n">size</span><span class="p">]</span>
306 <span class="n">additional_data</span> <span class="o">=</span> <span class="p">{}</span>
307
308 <span class="c1"># In all ACE types, the mask immediately follows the header.</span>
309 <span class="n">mask</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">body</span><span class="p">[:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
310 <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">4</span><span class="p">:]</span>
311
312 <span class="c1"># All OBJECT-type ACEs contain additional flags, and two GUIDs as</span>
313 <span class="c1"># the following fields.</span>
314 <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ACE_TYPE_ACCESS_ALLOWED_OBJECT</span><span class="p">,</span>
315 <span class="n">ACE_TYPE_ACCESS_DENIED_OBJECT</span><span class="p">,</span>
316 <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span><span class="p">,</span>
317 <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span><span class="p">,</span>
318 <span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span><span class="p">,</span>
319 <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span><span class="p">):</span>
320 <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;flags&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">body</span><span class="p">[:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
321 <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;object_type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">20</span><span class="p">]</span>
322 <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;inherited_object_type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">20</span><span class="p">:</span><span class="mi">36</span><span class="p">]</span>
323 <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">36</span><span class="p">:]</span>
324
325 <span class="c1"># Then the SID in all types.</span>
326 <span class="n">sid</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="n">return_tail</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
327
328 <span class="c1"># CALLBACK-type ACEs (and for some obscure reason,</span>
329 <span class="c1"># SYSTEM_AUDIT_OBJECT) have a final tail of application data.</span>
330 <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK</span><span class="p">,</span>
331 <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK</span><span class="p">,</span>
332 <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span><span class="p">,</span>
333 <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span><span class="p">,</span>
334 <span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span><span class="p">,</span>
335 <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK</span><span class="p">,</span>
336 <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span><span class="p">):</span>
337 <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;application_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span>
338
339 <span class="c1"># SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.</span>
340 <span class="k">if</span> <span class="n">type_</span> <span class="o">==</span> <span class="n">ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE</span><span class="p">:</span>
341 <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;attribute_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span>
342
343 <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">additional_data</span><span class="p">)</span></div>
344
345
346 <div class="viewcode-block" id="ACL"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.ACL">[docs]</a><span class="k">class</span> <span class="nc">ACL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
347 <span class="sd">&quot;&quot;&quot;</span>
348 <span class="sd"> Access control list, encapsulating a sequence of access control</span>
349 <span class="sd"> entries.</span>
350
351 <span class="sd"> See [MS-DTYP]: 2.4.5</span>
352 <span class="sd"> &quot;&quot;&quot;</span>
353 <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHH&#39;</span>
354
355 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">revision</span><span class="p">,</span> <span class="n">aces</span><span class="p">):</span>
356 <span class="c1">#: Integer value of the revision.</span>
357 <span class="bp">self</span><span class="o">.</span><span class="n">revision</span> <span class="o">=</span> <span class="n">revision</span>
358 <span class="c1">#: List of :class:`ACE` instances.</span>
359 <span class="bp">self</span><span class="o">.</span><span class="n">aces</span> <span class="o">=</span> <span class="n">aces</span>
360
361 <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
362 <span class="k">return</span> <span class="s2">&quot;ACL(</span><span class="si">%r</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">aces</span><span class="p">,)</span>
363
364 <span class="nd">@classmethod</span>
365 <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
366 <span class="n">revision</span> <span class="o">=</span> <span class="bp">None</span>
367 <span class="n">aces</span> <span class="o">=</span> <span class="p">[]</span>
368
369 <span class="n">header_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)</span>
370 <span class="n">header</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">header_size</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="n">header_size</span><span class="p">:]</span>
371 <span class="n">revision</span><span class="p">,</span> <span class="n">sbz1</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">sbz2</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
372
373 <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">size</span>
374
375 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">count</span><span class="p">):</span>
376 <span class="n">ace_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="n">remaining</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
377 <span class="n">ace_data</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">remaining</span><span class="p">[:</span><span class="n">ace_size</span><span class="p">],</span> <span class="n">remaining</span><span class="p">[</span><span class="n">ace_size</span><span class="p">:]</span>
378 <span class="n">aces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ACE</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">ace_data</span><span class="p">))</span>
379
380 <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">aces</span><span class="p">)</span></div>
381
382
383 <div class="viewcode-block" id="SecurityDescriptor"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor">[docs]</a><span class="k">class</span> <span class="nc">SecurityDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
384 <span class="sd">&quot;&quot;&quot;</span>
385 <span class="sd"> Represents a security descriptor.</span>
386
387 <span class="sd"> See [MS-DTYP]: 2.4.6</span>
388 <span class="sd"> &quot;&quot;&quot;</span>
389
390 <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHIIII&#39;</span>
391
392 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">dacl</span><span class="p">,</span> <span class="n">sacl</span><span class="p">):</span>
393 <span class="c1">#: Integer bitmask of control flags. Corresponds to the</span>
394 <span class="c1">#: ``Control`` field in [MS-DTYP] 2.4.6.</span>
395 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
396 <span class="c1">#: Instance of :class:`SID` representing the owner user.</span>
397 <span class="bp">self</span><span class="o">.</span><span class="n">owner</span> <span class="o">=</span> <span class="n">owner</span>
398 <span class="c1">#: Instance of :class:`SID` representing the owner group.</span>
399 <span class="bp">self</span><span class="o">.</span><span class="n">group</span> <span class="o">=</span> <span class="n">group</span>
400 <span class="c1">#: Instance of :class:`ACL` representing the discretionary access</span>
401 <span class="c1">#: control list, which specifies access restrictions of an object.</span>
402 <span class="bp">self</span><span class="o">.</span><span class="n">dacl</span> <span class="o">=</span> <span class="n">dacl</span>
403 <span class="c1">#: Instance of :class:`ACL` representing the system access control</span>
404 <span class="c1">#: list, which specifies audit logging of an object.</span>
405 <span class="bp">self</span><span class="o">.</span><span class="n">sacl</span> <span class="o">=</span> <span class="n">sacl</span>
406
407 <span class="nd">@classmethod</span>
408 <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
409 <span class="n">owner</span> <span class="o">=</span> <span class="bp">None</span>
410 <span class="n">group</span> <span class="o">=</span> <span class="bp">None</span>
411 <span class="n">dacl</span> <span class="o">=</span> <span class="bp">None</span>
412 <span class="n">sacl</span> <span class="o">=</span> <span class="bp">None</span>
413
414 <span class="n">header</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)]</span>
415 <span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">sbz1</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">owner_offset</span><span class="p">,</span> <span class="n">group_offset</span><span class="p">,</span> <span class="n">sacl_offset</span><span class="p">,</span>
416 <span class="n">dacl_offset</span><span class="p">)</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
417
418 <span class="k">assert</span> <span class="n">revision</span> <span class="o">==</span> <span class="mi">1</span>
419 <span class="k">assert</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">SECURITY_DESCRIPTOR_SELF_RELATIVE</span>
420 <span class="k">for</span> <span class="n">offset</span> <span class="ow">in</span> <span class="p">(</span><span class="n">owner_offset</span><span class="p">,</span> <span class="n">group_offset</span><span class="p">,</span> <span class="n">sacl_offset</span><span class="p">,</span> <span class="n">dacl_offset</span><span class="p">):</span>
421 <span class="k">assert</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
422
423 <span class="k">if</span> <span class="n">owner_offset</span><span class="p">:</span>
424 <span class="n">owner</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">owner_offset</span><span class="p">:])</span>
425 <span class="k">if</span> <span class="n">group_offset</span><span class="p">:</span>
426 <span class="n">group</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">group_offset</span><span class="p">:])</span>
427 <span class="k">if</span> <span class="n">dacl_offset</span><span class="p">:</span>
428 <span class="n">dacl</span> <span class="o">=</span> <span class="n">ACL</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">dacl_offset</span><span class="p">:])</span>
429 <span class="k">if</span> <span class="n">sacl_offset</span><span class="p">:</span>
430 <span class="n">sacl</span> <span class="o">=</span> <span class="n">ACL</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">sacl_offset</span><span class="p">:])</span>
431
432 <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">flags</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">dacl</span><span class="p">,</span> <span class="n">sacl</span><span class="p">)</span></div>
433 </pre></div>
434
435 </div>
436 </div>
437 </div>
438 <div class="clearer"></div>
439 </div>
440 <div class="related" role="navigation" aria-label="related navigation">
441 <h3>Navigation</h3>
442 <ul>
443 <li class="right" style="margin-right: 10px">
444 <a href="../../genindex.html" title="General Index"
445 >index</a></li>
446 <li class="right" >
447 <a href="../../py-modindex.html" title="Python Module Index"
448 >modules</a> |</li>
449 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
450 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
451 </ul>
452 </div>
453 <div class="footer" role="contentinfo">
454 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
455 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
456 </div>
457 </body>
458 </html>āŽ
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>smb.smb_structs &mdash; pysmb 1.1.18 documentation</title>
8 <title>smb.smb_structs &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
2828 <body role="document">
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
35 <li class="right" >
36 <a href="../../py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3639 <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3740 </ul>
3841 </div>
7275 <span class="c1"># Set to True if you want to enable SMB2 protocol.</span>
7376 <span class="n">SUPPORT_SMB2</span> <span class="o">=</span> <span class="bp">True</span>
7477
78 <span class="c1"># Set to True if you want to enable SMB2.1 and above protocol.</span>
79 <span class="n">SUPPORT_SMB2x</span> <span class="o">=</span> <span class="bp">True</span>
80
7581 <span class="c1"># Supported dialects</span>
76 <span class="n">DIALECTS</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
77 <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span> <span class="n">name</span><span class="p">,</span> <span class="n">dialect</span> <span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">([</span> <span class="p">(</span> <span class="s1">&#39;NT_LAN_MANAGER_DIALECT&#39;</span><span class="p">,</span> <span class="s1">&#39;NT LM 0.12&#39;</span> <span class="p">),</span> <span class="p">]):</span>
78 <span class="n">DIALECTS</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dialect</span><span class="p">)</span>
79 <span class="nb">globals</span><span class="p">()[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
80
81 <span class="n">DIALECTS2</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
82 <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span> <span class="n">name</span><span class="p">,</span> <span class="n">dialect</span> <span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">([</span> <span class="p">(</span> <span class="s1">&#39;SMB2_DIALECT&#39;</span><span class="p">,</span> <span class="s1">&#39;SMB 2.002&#39;</span> <span class="p">)</span> <span class="p">]):</span>
83 <span class="n">DIALECTS2</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dialect</span><span class="p">)</span>
84 <span class="nb">globals</span><span class="p">()[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">DIALECTS</span><span class="p">)</span>
85
82 <span class="n">NT_LAN_MANAGER_DIALECT</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># &#39;NT LM 0.12&#39; is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)</span>
83
84 <span class="c1"># Return the list of support SMB dialects based on the SUPPORT_x constants</span>
85 <span class="k">def</span> <span class="nf">init_dialects_list</span><span class="p">():</span>
86 <span class="n">dialects</span> <span class="o">=</span> <span class="p">[</span> <span class="s1">&#39;NT LM 0.12&#39;</span> <span class="p">]</span>
87 <span class="k">if</span> <span class="n">SUPPORT_SMB2</span><span class="p">:</span>
88 <span class="n">dialects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;SMB 2.002&#39;</span><span class="p">)</span>
89 <span class="k">if</span> <span class="n">SUPPORT_SMB2x</span><span class="p">:</span>
90 <span class="n">dialects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;SMB 2.???&#39;</span><span class="p">)</span>
91 <span class="k">return</span> <span class="n">dialects</span>
8692
8793 <div class="viewcode-block" id="UnsupportedFeature"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.UnsupportedFeature">[docs]</a><span class="k">class</span> <span class="nc">UnsupportedFeature</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
8894 <span class="sd">&quot;&quot;&quot;</span>
170176 <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBMessage&#39;</span><span class="p">)</span>
171177 <span class="n">protocol</span> <span class="o">=</span> <span class="mi">1</span>
172178
173 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
179 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">payload</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
174180 <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
181 <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">conn</span>
175182 <span class="k">if</span> <span class="n">payload</span><span class="p">:</span>
176183 <span class="bp">self</span><span class="o">.</span><span class="n">payload</span> <span class="o">=</span> <span class="n">payload</span>
177184 <span class="bp">self</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">initMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
352359 <span class="k">def</span> <span class="nf">prepare</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
353360 <span class="k">assert</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span> <span class="o">==</span> <span class="bp">self</span>
354361 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
355 <span class="k">if</span> <span class="n">SUPPORT_SMB2</span><span class="p">:</span>
356 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</span> <span class="o">+</span> <span class="n">DIALECTS2</span><span class="p">))</span>
357 <span class="k">else</span><span class="p">:</span>
358 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</span><span class="p">))</span>
362 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">init_dialects_list</span><span class="p">()))</span>
359363
360364
361365 <span class="k">class</span> <span class="nc">ComNegotiateResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
13421346 <span class="sd"> - [MS-CIFS]: 2.2.4.39.1</span>
13431347 <span class="sd"> &quot;&quot;&quot;</span>
13441348
1345 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">echo_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">echo_count</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
1349 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">echo_data</span> <span class="o">=</span> <span class="n">b</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">echo_count</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
13461350 <span class="bp">self</span><span class="o">.</span><span class="n">echo_count</span> <span class="o">=</span> <span class="n">echo_count</span>
13471351 <span class="bp">self</span><span class="o">.</span><span class="n">echo_data</span> <span class="o">=</span> <span class="n">echo_data</span>
13481352
14931497 <li class="right" style="margin-right: 10px">
14941498 <a href="../../genindex.html" title="General Index"
14951499 >index</a></li>
1496 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
1500 <li class="right" >
1501 <a href="../../py-modindex.html" title="Python Module Index"
1502 >modules</a> |</li>
1503 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
14971504 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
14981505 </ul>
14991506 </div>
15001507 <div class="footer" role="contentinfo">
1501 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
1508 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
15021509 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
15031510 </div>
15041511 </body>
0
1 Security Descriptors
2 ====================
3
4 .. module:: smb.security_descriptors
5 :synopsis: Data structures used in Windows security descriptors.
6
7 This module implements security descriptors, and associated data
8 structures, as specified in `[MS-DTYP]`_.
9
10 .. autoclass:: SID
11 :members:
12
13 .. autoclass:: ACE
14 :members:
15
16 .. autoclass:: ACL
17 :members:
18
19 .. autoclass:: SecurityDescriptor
20 :members:
21
22 .. _[MS-DTYP]: https://msdn.microsoft.com/en-us/library/cc230273.aspx
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>NBNSProtocol Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>NBNSProtocol Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="NetBIOS class" href="nmb_NetBIOS.html" />
2727 <link rel="prev" title="Welcome to pysmbā€™s documentation!" href="../index.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="nmb_NetBIOS.html" title="NetBIOS class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="../index.html" title="Welcome to pysmbā€™s documentation!"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
185188 <a href="../genindex.html" title="General Index"
186189 >index</a></li>
187190 <li class="right" >
191 <a href="../py-modindex.html" title="Python Module Index"
192 >modules</a> |</li>
193 <li class="right" >
188194 <a href="nmb_NetBIOS.html" title="NetBIOS class"
189195 >next</a> |</li>
190196 <li class="right" >
191197 <a href="../index.html" title="Welcome to pysmbā€™s documentation!"
192198 >previous</a> |</li>
193 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
199 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
194200 </ul>
195201 </div>
196202 <div class="footer" role="contentinfo">
197 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
203 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
198204 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
199205 </div>
200206 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>NetBIOS class &mdash; pysmb 1.1.18 documentation</title>
8 <title>NetBIOS class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SMBConnection Class" href="smb_SMBConnection.html" />
2727 <link rel="prev" title="NBNSProtocol Class" href="nmb_NBNSProtocol.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_SMBConnection.html" title="SMBConnection Class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
189192 <a href="../genindex.html" title="General Index"
190193 >index</a></li>
191194 <li class="right" >
195 <a href="../py-modindex.html" title="Python Module Index"
196 >modules</a> |</li>
197 <li class="right" >
192198 <a href="smb_SMBConnection.html" title="SMBConnection Class"
193199 >next</a> |</li>
194200 <li class="right" >
195201 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
196202 >previous</a> |</li>
197 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
203 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
198204 </ul>
199205 </div>
200206 <div class="footer" role="contentinfo">
201 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
207 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
202208 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
203209 </div>
204210 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMBConnection Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>SMBConnection Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SMbHandler Class" href="smb_SMBHandler.html" />
2727 <link rel="prev" title="NetBIOS class" href="nmb_NetBIOS.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_SMBHandler.html" title="SMbHandler Class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="nmb_NetBIOS.html" title="NetBIOS class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
135138 Most SMB/CIFS servers have some sort of keepalive mechanism and impose a timeout limit.
136139 If the clients fail to respond within the timeout limit, the SMB/CIFS server may disconnect the client.</li>
137140 </ul>
138 <dl class="class">
139 <dt id="smb.SMBConnection.SMBConnection">
140 <em class="property">class </em><code class="descclassname">smb.SMBConnection.</code><code class="descname">SMBConnection</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection" title="Permalink to this definition">Ā¶</a></dt>
141 <dd><dl class="method">
142 <dt id="smb.SMBConnection.SMBConnection.__init__">
143 <code class="descname">__init__</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.__init__" title="Permalink to this definition">Ā¶</a></dt>
144 <dd><p>Create a new SMBConnection instance.</p>
145 <p><em>username</em> and <em>password</em> are the user credentials required to authenticate the underlying SMB connection with the remote server.
146 File operations can only be proceeded after the connection has been authenticated successfully.</p>
147 <p>Note that you need to call <em>connect</em> method to actually establish the SMB connection to the remote server and perform authentication.</p>
148 <p>The default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.
149 Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</p>
150 <table class="docutils field-list" frame="void" rules="none">
151 <col class="field-name" />
152 <col class="field-body" />
153 <tbody valign="top">
154 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
155 <li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
156 You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of <code class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></code></li>
157 <li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
158 On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
159 This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
160 <li><strong>domain</strong> (<em>string</em>) &#8211; The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</li>
161 <li><strong>use_ntlm_v2</strong> (<em>boolean</em>) &#8211; Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.
162 The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.
163 Hence, we can only &#8220;guess&#8221; or try both algorithms.
164 On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</li>
165 <li><strong>sign_options</strong> (<em>int</em>) &#8211; Determines whether SMB messages will be signed. Default is <em>SIGN_WHEN_REQUIRED</em>.
166 If <em>SIGN_WHEN_REQUIRED</em> (value=2), SMB messages will only be signed when remote server requires signing.
167 If <em>SIGN_WHEN_SUPPORTED</em> (value=1), SMB messages will be signed when remote server supports signing but not requires signing.
168 If <em>SIGN_NEVER</em> (value=0), SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</li>
169 <li><strong>is_direct_tcp</strong> (<em>boolean</em>) &#8211; Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.
170 The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</li>
171 </ul>
172 </td>
173 </tr>
174 </tbody>
175 </table>
176 </dd></dl>
177
178 <dl class="method">
179 <dt id="smb.SMBConnection.SMBConnection.close">
180 <code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.close" title="Permalink to this definition">Ā¶</a></dt>
181 <dd><p>Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</p>
182 </dd></dl>
183
184 <dl class="method">
185 <dt id="smb.SMBConnection.SMBConnection.connect">
186 <code class="descname">connect</code><span class="sig-paren">(</span><em>ip</em>, <em>port=139</em>, <em>sock_family=2</em>, <em>timeout=60</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.connect" title="Permalink to this definition">Ā¶</a></dt>
187 <dd><p>Establish the SMB connection to the remote SMB/CIFS server.</p>
188 <p>You must call this method before attempting any of the file operations with the remote server.
189 This method will block until the SMB connection has attempted at least one authentication.</p>
190 <table class="docutils field-list" frame="void" rules="none">
191 <col class="field-name" />
192 <col class="field-body" />
193 <tbody valign="top">
194 <tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">A boolean value indicating the result of the authentication atttempt: True if authentication is successful; False, if otherwise.</td>
195 </tr>
196 </tbody>
197 </table>
198 </dd></dl>
199
200 <dl class="method">
201 <dt id="smb.SMBConnection.SMBConnection.createDirectory">
202 <code class="descname">createDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.createDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.createDirectory" title="Permalink to this definition">Ā¶</a></dt>
203 <dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
204 <table class="docutils field-list" frame="void" rules="none">
205 <col class="field-name" />
206 <col class="field-body" />
207 <tbody valign="top">
208 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
209 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
210 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the new folder (relative to) the shared folder.
211 If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
212 </ul>
213 </td>
214 </tr>
215 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
216 </td>
217 </tr>
218 </tbody>
219 </table>
220 </dd></dl>
221
222 <dl class="method">
223 <dt id="smb.SMBConnection.SMBConnection.deleteDirectory">
224 <code class="descname">deleteDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.deleteDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.deleteDirectory" title="Permalink to this definition">Ā¶</a></dt>
225 <dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
226 <table class="docutils field-list" frame="void" rules="none">
227 <col class="field-name" />
228 <col class="field-body" />
229 <tbody valign="top">
230 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
231 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
232 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the to-be-deleted folder (relative to) the shared folder.
233 If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
234 </ul>
235 </td>
236 </tr>
237 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
238 </td>
239 </tr>
240 </tbody>
241 </table>
242 </dd></dl>
243
244 <dl class="method">
245 <dt id="smb.SMBConnection.SMBConnection.deleteFiles">
246 <code class="descname">deleteFiles</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.deleteFiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.deleteFiles" title="Permalink to this definition">Ā¶</a></dt>
247 <dd><p>Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</p>
248 <table class="docutils field-list" frame="void" rules="none">
249 <col class="field-name" />
250 <col class="field-body" />
251 <tbody valign="top">
252 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
253 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
254 <li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
255 Wildcards may be used in th filename component of the path.
256 If your path/filename contains non-English characters, you must pass in an unicode string.</li>
257 </ul>
258 </td>
259 </tr>
260 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
261 </td>
262 </tr>
263 </tbody>
264 </table>
265 </dd></dl>
266
267 <dl class="method">
268 <dt id="smb.SMBConnection.SMBConnection.echo">
269 <code class="descname">echo</code><span class="sig-paren">(</span><em>data</em>, <em>timeout=10</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.echo"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.echo" title="Permalink to this definition">Ā¶</a></dt>
270 <dd><p>Send an echo command containing <em>data</em> to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same <em>data</em>.</p>
271 <table class="docutils field-list" frame="void" rules="none">
272 <col class="field-name" />
273 <col class="field-body" />
274 <tbody valign="top">
275 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> (<em>string</em>) &#8211; Data to send to the remote server.</td>
276 </tr>
277 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">The <em>data</em> parameter</td>
278 </tr>
279 </tbody>
280 </table>
281 </dd></dl>
282
283 <dl class="method">
284 <dt id="smb.SMBConnection.SMBConnection.getAttributes">
285 <code class="descname">getAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.getAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.getAttributes" title="Permalink to this definition">Ā¶</a></dt>
286 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
287 <table class="docutils field-list" frame="void" rules="none">
288 <col class="field-name" />
289 <col class="field-body" />
290 <tbody valign="top">
291 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
292 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
293 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
294 </ul>
295 </td>
296 </tr>
297 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
298 </td>
299 </tr>
300 </tbody>
301 </table>
302 </dd></dl>
303
304 <dl class="method">
305 <dt id="smb.SMBConnection.SMBConnection.listPath">
306 <code class="descname">listPath</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listPath"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listPath" title="Permalink to this definition">Ā¶</a></dt>
307 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
308 <table class="docutils field-list" frame="void" rules="none">
309 <col class="field-name" />
310 <col class="field-body" />
311 <tbody valign="top">
312 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
313 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
314 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested to learn about its files/sub-folders.</li>
315 <li><strong>search</strong> (<em>integer</em>) &#8211; integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py).
316 The default <em>search</em> value will query for all read-only, hidden, system, archive files and directories.</li>
317 <li><strong>pattern</strong> (<em>string/unicode</em>) &#8211; the filter to apply to the results before returning to the client.</li>
318 </ul>
319 </td>
320 </tr>
321 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A list of <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instances.</p>
322 </td>
323 </tr>
324 </tbody>
325 </table>
326 </dd></dl>
327
328 <dl class="method">
329 <dt id="smb.SMBConnection.SMBConnection.listShares">
330 <code class="descname">listShares</code><span class="sig-paren">(</span><em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listShares"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listShares" title="Permalink to this definition">Ā¶</a></dt>
331 <dd><p>Retrieve a list of shared resources on remote server.</p>
332 <table class="docutils field-list" frame="void" rules="none">
333 <col class="field-name" />
334 <col class="field-body" />
335 <tbody valign="top">
336 <tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">A list of <a class="reference internal" href="smb_SharedDevice.html"><em>smb.base.SharedDevice</em></a> instances describing the shared resource</td>
337 </tr>
338 </tbody>
339 </table>
340 </dd></dl>
341
342 <dl class="method">
343 <dt id="smb.SMBConnection.SMBConnection.listSnapshots">
344 <code class="descname">listSnapshots</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listSnapshots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listSnapshots" title="Permalink to this definition">Ā¶</a></dt>
345 <dd><p>Retrieve a list of available snapshots (shadow copies) for <em>path</em>.</p>
346 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
347 <table class="docutils field-list" frame="void" rules="none">
348 <col class="field-name" />
349 <col class="field-body" />
350 <tbody valign="top">
351 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
352 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
353 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested in the list of available snapshots</li>
354 </ul>
355 </td>
356 </tr>
357 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A list of python <em>datetime.DateTime</em> instances in GMT/UTC time zone</p>
358 </td>
359 </tr>
360 </tbody>
361 </table>
362 </dd></dl>
363
364 <dl class="method">
365 <dt id="smb.SMBConnection.SMBConnection.rename">
366 <code class="descname">rename</code><span class="sig-paren">(</span><em>service_name</em>, <em>old_path</em>, <em>new_path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.rename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.rename" title="Permalink to this definition">Ā¶</a></dt>
367 <dd><p>Rename a file or folder at <em>old_path</em> to <em>new_path</em> shared at <em>service_name</em>. Note that this method cannot be used to rename file/folder across different shared folders</p>
368 <p><em>old_path</em> and <em>new_path</em> are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.
369 If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
370 <table class="docutils field-list" frame="void" rules="none">
371 <col class="field-name" />
372 <col class="field-body" />
373 <tbody valign="top">
374 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</td>
375 </tr>
376 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">None</td>
377 </tr>
378 </tbody>
379 </table>
380 </dd></dl>
381
382 <dl class="method">
383 <dt id="smb.SMBConnection.SMBConnection.resetFileAttributes">
384 <code class="descname">resetFileAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.resetFileAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.resetFileAttributes" title="Permalink to this definition">Ā¶</a></dt>
385 <dd><p>Reset file attributes of one or more regular files or folders.
386 It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
387 This function is very helpful when deleting files/folders that are read-only.
388 Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See <a class="reference external" href="https://msdn.microsoft.com/en-us/library/cc232110.aspx">https://msdn.microsoft.com/en-us/library/cc232110.aspx</a> for further information)</p>
389 <table class="docutils field-list" frame="void" rules="none">
390 <col class="field-name" />
391 <col class="field-body" />
392 <tbody valign="top">
393 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
394 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
395 <li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
396 Wildcards may be used in the filename component of the path.
397 If your path/filename contains non-English characters, you must pass in an unicode string.</li>
398 </ul>
399 </td>
400 </tr>
401 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
402 </td>
403 </tr>
404 </tbody>
405 </table>
406 </dd></dl>
407
408 <dl class="method">
409 <dt id="smb.SMBConnection.SMBConnection.retrieveFile">
410 <code class="descname">retrieveFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.retrieveFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.retrieveFile" title="Permalink to this definition">Ā¶</a></dt>
411 <dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
412 <p>Use <em>retrieveFileFromOffset()</em> method if you wish to specify the offset to read from the remote <em>path</em> and/or the number of bytes to write to the <em>file_obj</em>.</p>
413 <table class="docutils field-list" frame="void" rules="none">
414 <col class="field-name" />
415 <col class="field-body" />
416 <tbody valign="top">
417 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
418 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
419 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
420 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
421 </ul>
422 </td>
423 </tr>
424 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A 2-element tuple of ( file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
425 The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
426 </td>
427 </tr>
428 </tbody>
429 </table>
430 </dd></dl>
431
432 <dl class="method">
433 <dt id="smb.SMBConnection.SMBConnection.retrieveFileFromOffset">
434 <code class="descname">retrieveFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.retrieveFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.retrieveFileFromOffset" title="Permalink to this definition">Ā¶</a></dt>
435 <dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
436 <table class="docutils field-list" frame="void" rules="none">
437 <col class="field-name" />
438 <col class="field-body" />
439 <tbody valign="top">
440 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
441 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
442 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
443 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> up to <em>max_length</em> number of bytes.</li>
444 <li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
445 <li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
446 If zero, the method returns immediately after the file is opened successfully for reading.</li>
447 </ul>
448 </td>
449 </tr>
450 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A 2-element tuple of ( file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
451 The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
452 </td>
453 </tr>
454 </tbody>
455 </table>
456 </dd></dl>
457
458 <dl class="method">
459 <dt id="smb.SMBConnection.SMBConnection.storeFile">
460 <code class="descname">storeFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.storeFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.storeFile" title="Permalink to this definition">Ā¶</a></dt>
461 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.
462 If the file already exists on the remote server, it will be truncated and overwritten.</p>
463 <table class="docutils field-list" frame="void" rules="none">
464 <col class="field-name" />
465 <col class="field-body" />
466 <tbody valign="top">
467 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
468 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
469 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
470 If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
471 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
472 </ul>
473 </td>
474 </tr>
475 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Number of bytes uploaded</p>
476 </td>
477 </tr>
478 </tbody>
479 </table>
480 </dd></dl>
481
482 <dl class="method">
483 <dt id="smb.SMBConnection.SMBConnection.storeFileFromOffset">
484 <code class="descname">storeFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>truncate=False</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.storeFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.storeFileFromOffset" title="Permalink to this definition">Ā¶</a></dt>
485 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
486 <table class="docutils field-list" frame="void" rules="none">
487 <col class="field-name" />
488 <col class="field-body" />
489 <tbody valign="top">
490 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
491 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
492 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created.
493 If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
494 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
495 <li><strong>offset</strong> &#8211; Long integer value which specifies the offset in the remote server to start writing. First byte of the file is 0.</li>
496 <li><strong>truncate</strong> &#8211; Boolean value. If True and the file exists on the remote server, it will be truncated first before writing. Default is False.</li>
497 </ul>
498 </td>
499 </tr>
500 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">the file position where the next byte will be written.</p>
501 </td>
502 </tr>
503 </tbody>
504 </table>
505 </dd></dl>
506
507 <dl class="attribute">
508 <dt id="smb.SMBConnection.SMBConnection.SIGN_NEVER">
509 <code class="descname">SIGN_NEVER</code><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_NEVER" title="Permalink to this definition">Ā¶</a></dt>
510 <dd><p>SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</p>
511 </dd></dl>
512
513 <dl class="attribute">
514 <dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED">
515 <code class="descname">SIGN_WHEN_REQUIRED</code><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED" title="Permalink to this definition">Ā¶</a></dt>
516 <dd><p>SMB messages will only be signed when remote server requires signing.</p>
517 </dd></dl>
518
519 <dl class="attribute">
520 <dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED">
521 <code class="descname">SIGN_WHEN_SUPPORTED</code><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">Ā¶</a></dt>
522 <dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
523 </dd></dl>
524
525 <dl class="attribute">
526 <dt id="smb.SMBConnection.SMBConnection.isUsingSMB2">
527 <code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBConnection.SMBConnection.isUsingSMB2" title="Permalink to this definition">Ā¶</a></dt>
528 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
529 </dd></dl>
530
531 </dd></dl>
532
533141 </div>
534142 </div>
535143
546154 <a href="../genindex.html" title="General Index"
547155 >index</a></li>
548156 <li class="right" >
157 <a href="../py-modindex.html" title="Python Module Index"
158 >modules</a> |</li>
159 <li class="right" >
549160 <a href="smb_SMBHandler.html" title="SMbHandler Class"
550161 >next</a> |</li>
551162 <li class="right" >
552163 <a href="nmb_NetBIOS.html" title="NetBIOS class"
553164 >previous</a> |</li>
554 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
165 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
555166 </ul>
556167 </div>
557168 <div class="footer" role="contentinfo">
558 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
169 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
559170 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
560171 </div>
561172 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMbHandler Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>SMbHandler Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" />
2727 <link rel="prev" title="SMBConnection Class" href="smb_SMBConnection.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="smb_SMBConnection.html" title="SMBConnection Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
150153 <a href="../genindex.html" title="General Index"
151154 >index</a></li>
152155 <li class="right" >
156 <a href="../py-modindex.html" title="Python Module Index"
157 >modules</a> |</li>
158 <li class="right" >
153159 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
154160 >next</a> |</li>
155161 <li class="right" >
156162 <a href="smb_SMBConnection.html" title="SMBConnection Class"
157163 >previous</a> |</li>
158 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
164 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
159165 </ul>
160166 </div>
161167 <div class="footer" role="contentinfo">
162 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
168 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
163169 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
164170 </div>
165171 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SharedDevice Class" href="smb_SharedDevice.html" />
2727 <link rel="prev" title="SMbHandler Class" href="smb_SMBHandler.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_SharedDevice.html" title="SharedDevice Class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="smb_SMBHandler.html" title="SMbHandler Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
172175 <li>The <em>timeout</em> parameter in the file operation methods are not precise; it is accurate to within 1 second interval, i.e. with a timeout of 0.5 sec, pysmb might raise
173176 <em>SMBTimeout</em> exception after 1.5 sec.</li>
174177 </ul>
175 <dl class="class">
176 <dt id="smb.SMBProtocol.SMBProtocolFactory">
177 <em class="property">class </em><code class="descclassname">smb.SMBProtocol.</code><code class="descname">SMBProtocolFactory</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory" title="Permalink to this definition">Ā¶</a></dt>
178 <dd><dl class="method">
179 <dt id="smb.SMBProtocol.SMBProtocolFactory.__init__">
180 <code class="descname">__init__</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.__init__" title="Permalink to this definition">Ā¶</a></dt>
181 <dd><p>Create a new SMBProtocolFactory instance. You will pass this instance to <em>reactor.connectTCP()</em> which will then instantiate the TCP connection to the remote SMB/CIFS server.
182 Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.
183 Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</p>
184 <p><em>username</em> and <em>password</em> are the user credentials required to authenticate the underlying SMB connection with the remote server.
185 File operations can only be proceeded after the connection has been authenticated successfully.</p>
186 <table class="docutils field-list" frame="void" rules="none">
187 <col class="field-name" />
188 <col class="field-body" />
189 <tbody valign="top">
190 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
191 <li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
192 You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of <code class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></code>.</li>
193 <li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
194 On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
195 This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
196 <li><strong>domain</strong> (<em>string</em>) &#8211; The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</li>
197 <li><strong>use_ntlm_v2</strong> (<em>boolean</em>) &#8211; Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.
198 The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.
199 Hence, we can only &#8220;guess&#8221; or try both algorithms.
200 On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</li>
201 <li><strong>sign_options</strong> (<em>int</em>) &#8211; Determines whether SMB messages will be signed. Default is <em>SIGN_WHEN_REQUIRED</em>.
202 If <em>SIGN_WHEN_REQUIRED</em> (value=2), SMB messages will only be signed when remote server requires signing.
203 If <em>SIGN_WHEN_SUPPORTED</em> (value=1), SMB messages will be signed when remote server supports signing but not requires signing.
204 If <em>SIGN_NEVER</em> (value=0), SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</li>
205 <li><strong>is_direct_tcp</strong> (<em>boolean</em>) &#8211; Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.
206 The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</li>
207 </ul>
208 </td>
209 </tr>
210 </tbody>
211 </table>
212 </dd></dl>
213
214 <dl class="method">
215 <dt id="smb.SMBProtocol.SMBProtocolFactory.closeConnection">
216 <code class="descname">closeConnection</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.closeConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.closeConnection" title="Permalink to this definition">Ā¶</a></dt>
217 <dd><p>Disconnect from the remote SMB/CIFS server. The TCP connection will be closed at the earliest opportunity after this method returns.</p>
218 <table class="docutils field-list" frame="void" rules="none">
219 <col class="field-name" />
220 <col class="field-body" />
221 <tbody valign="top">
222 <tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">None</td>
223 </tr>
224 </tbody>
225 </table>
226 </dd></dl>
227
228 <dl class="method">
229 <dt id="smb.SMBProtocol.SMBProtocolFactory.createDirectory">
230 <code class="descname">createDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.createDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.createDirectory" title="Permalink to this definition">Ā¶</a></dt>
231 <dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
232 <table class="docutils field-list" frame="void" rules="none">
233 <col class="field-name" />
234 <col class="field-body" />
235 <tbody valign="top">
236 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
237 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
238 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the new folder (relative to) the shared folder.
239 If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
240 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
241 </ul>
242 </td>
243 </tr>
244 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path</em> parameter.</p>
245 </td>
246 </tr>
247 </tbody>
248 </table>
249 </dd></dl>
250
251 <dl class="method">
252 <dt id="smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">
253 <code class="descname">deleteDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.deleteDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory" title="Permalink to this definition">Ā¶</a></dt>
254 <dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
255 <table class="docutils field-list" frame="void" rules="none">
256 <col class="field-name" />
257 <col class="field-body" />
258 <tbody valign="top">
259 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
260 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
261 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the to-be-deleted folder (relative to) the shared folder.
262 If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
263 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
264 </ul>
265 </td>
266 </tr>
267 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path</em> parameter.</p>
268 </td>
269 </tr>
270 </tbody>
271 </table>
272 </dd></dl>
273
274 <dl class="method">
275 <dt id="smb.SMBProtocol.SMBProtocolFactory.deleteFiles">
276 <code class="descname">deleteFiles</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.deleteFiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.deleteFiles" title="Permalink to this definition">Ā¶</a></dt>
277 <dd><p>Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</p>
278 <table class="docutils field-list" frame="void" rules="none">
279 <col class="field-name" />
280 <col class="field-body" />
281 <tbody valign="top">
282 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
283 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
284 <li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
285 Wildcards may be used in th filename component of the path.
286 If your path/filename contains non-English characters, you must pass in an unicode string.</li>
287 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
288 </ul>
289 </td>
290 </tr>
291 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path_file_pattern</em> parameter.</p>
292 </td>
293 </tr>
294 </tbody>
295 </table>
296 </dd></dl>
297
298 <dl class="method">
299 <dt id="smb.SMBProtocol.SMBProtocolFactory.echo">
300 <code class="descname">echo</code><span class="sig-paren">(</span><em>data</em>, <em>timeout=10</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.echo"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.echo" title="Permalink to this definition">Ā¶</a></dt>
301 <dd><p>Send an echo command containing <em>data</em> to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same <em>data</em>.</p>
302 <table class="docutils field-list" frame="void" rules="none">
303 <col class="field-name" />
304 <col class="field-body" />
305 <tbody valign="top">
306 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
307 <li><strong>data</strong> (<em>string</em>) &#8211; Data to send to the remote server.</li>
308 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
309 </ul>
310 </td>
311 </tr>
312 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>data</em> parameter.</p>
313 </td>
314 </tr>
315 </tbody>
316 </table>
317 </dd></dl>
318
319 <dl class="method">
320 <dt id="smb.SMBProtocol.SMBProtocolFactory.getAttributes">
321 <code class="descname">getAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.getAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.getAttributes" title="Permalink to this definition">Ā¶</a></dt>
322 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
323 <table class="docutils field-list" frame="void" rules="none">
324 <col class="field-name" />
325 <col class="field-body" />
326 <tbody valign="top">
327 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
328 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
329 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
330 </ul>
331 </td>
332 </tr>
333 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
334 </td>
335 </tr>
336 </tbody>
337 </table>
338 </dd></dl>
339
340 <dl class="method">
341 <dt id="smb.SMBProtocol.SMBProtocolFactory.listPath">
342 <code class="descname">listPath</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listPath"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listPath" title="Permalink to this definition">Ā¶</a></dt>
343 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
344 <table class="docutils field-list" frame="void" rules="none">
345 <col class="field-name" />
346 <col class="field-body" />
347 <tbody valign="top">
348 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
349 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
350 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested to learn about its files/sub-folders.</li>
351 <li><strong>search</strong> (<em>integer</em>) &#8211; integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py).
352 The default <em>search</em> value will query for all read-only, hidden, system, archive files and directories.</li>
353 <li><strong>pattern</strong> (<em>string/unicode</em>) &#8211; the filter to apply to the results before returning to the client.</li>
354 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
355 </ul>
356 </td>
357 </tr>
358 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instances.</p>
359 </td>
360 </tr>
361 </tbody>
362 </table>
363 </dd></dl>
364
365 <dl class="method">
366 <dt id="smb.SMBProtocol.SMBProtocolFactory.listShares">
367 <code class="descname">listShares</code><span class="sig-paren">(</span><em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listShares"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listShares" title="Permalink to this definition">Ā¶</a></dt>
368 <dd><p>Retrieve a list of shared resources on remote server.</p>
369 <table class="docutils field-list" frame="void" rules="none">
370 <col class="field-name" />
371 <col class="field-body" />
372 <tbody valign="top">
373 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</td>
374 </tr>
375 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of <a class="reference internal" href="smb_SharedDevice.html"><em>smb.base.SharedDevice</em></a> instances.</td>
376 </tr>
377 </tbody>
378 </table>
379 </dd></dl>
380
381 <dl class="method">
382 <dt id="smb.SMBProtocol.SMBProtocolFactory.listSnapshots">
383 <code class="descname">listSnapshots</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listSnapshots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listSnapshots" title="Permalink to this definition">Ā¶</a></dt>
384 <dd><p>Retrieve a list of available snapshots (a.k.a. shadow copies) for <em>path</em>.</p>
385 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
386 <table class="docutils field-list" frame="void" rules="none">
387 <col class="field-name" />
388 <col class="field-body" />
389 <tbody valign="top">
390 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
391 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
392 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested in the list of available snapshots</li>
393 </ul>
394 </td>
395 </tr>
396 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of python <em>datetime.DateTime</em>
397 instances in GMT/UTC time zone</p>
398 </td>
399 </tr>
400 </tbody>
401 </table>
402 </dd></dl>
403
404 <dl class="method">
405 <dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">
406 <code class="descname">onAuthFailed</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.onAuthFailed"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed" title="Permalink to this definition">Ā¶</a></dt>
407 <dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
408 This method will be called when the server has replied that the SMB connection has been successfully authenticated.</p>
409 <dl class="docutils">
410 <dt>If you want to retry authenticating from this method,</dt>
411 <dd><ol class="first last arabic simple">
412 <li>Disconnect the underlying SMB connection (call <code class="docutils literal"><span class="pre">self.instance.transport.loseConnection()</span></code>)</li>
413 <li>Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</li>
414 <li>Call <code class="docutils literal"><span class="pre">reactor.connectTCP</span></code> with the new instance to re-establish the SMB connection</li>
415 </ol>
416 </dd>
417 </dl>
418 </dd></dl>
419
420 <dl class="method">
421 <dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthOK">
422 <code class="descname">onAuthOK</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.onAuthOK"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.onAuthOK" title="Permalink to this definition">Ā¶</a></dt>
423 <dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
424 This method will be called when the server has replied that the SMB connection has been successfully authenticated.
425 File operations can proceed when this method has been called.</p>
426 </dd></dl>
427
428 <dl class="method">
429 <dt id="smb.SMBProtocol.SMBProtocolFactory.rename">
430 <code class="descname">rename</code><span class="sig-paren">(</span><em>service_name</em>, <em>old_path</em>, <em>new_path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.rename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.rename" title="Permalink to this definition">Ā¶</a></dt>
431 <dd><p>Rename a file or folder at <em>old_path</em> to <em>new_path</em> shared at <em>service_name</em>. Note that this method cannot be used to rename file/folder across different shared folders</p>
432 <p><em>old_path</em> and <em>new_path</em> are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.
433 If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
434 <table class="docutils field-list" frame="void" rules="none">
435 <col class="field-name" />
436 <col class="field-body" />
437 <tbody valign="top">
438 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
439 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
440 <li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
441 </ul>
442 </td>
443 </tr>
444 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 2-element tuple of ( <em>old_path</em>, <em>new_path</em> ).</p>
445 </td>
446 </tr>
447 </tbody>
448 </table>
449 </dd></dl>
450
451 <dl class="method">
452 <dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFile">
453 <code class="descname">retrieveFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.retrieveFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.retrieveFile" title="Permalink to this definition">Ā¶</a></dt>
454 <dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
455 <p>Use <em>retrieveFileFromOffset()</em> method if you need to specify the offset to read from the remote <em>path</em> and/or the maximum number of bytes to write to the <em>file_obj</em>.</p>
456 <p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size
457 of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
458 The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</p>
459 <table class="docutils field-list" frame="void" rules="none">
460 <col class="field-name" />
461 <col class="field-body" />
462 <tbody valign="top">
463 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
464 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
465 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
466 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
467 </ul>
468 </td>
469 </tr>
470 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 3-element tuple of ( <em>file_obj</em>, file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
471 The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
472 </td>
473 </tr>
474 </tbody>
475 </table>
476 </dd></dl>
477
478 <dl class="method">
479 <dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">
480 <code class="descname">retrieveFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.retrieveFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset" title="Permalink to this definition">Ā¶</a></dt>
481 <dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
482 <p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size
483 of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
484 The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</p>
485 <table class="docutils field-list" frame="void" rules="none">
486 <col class="field-name" />
487 <col class="field-body" />
488 <tbody valign="top">
489 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
490 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
491 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
492 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
493 <li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
494 <li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
495 If zero, the <em>Deferred</em> callback is invoked immediately after the file is opened successfully for reading.</li>
496 </ul>
497 </td>
498 </tr>
499 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 3-element tuple of ( <em>file_obj</em>, file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
500 The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
501 </td>
502 </tr>
503 </tbody>
504 </table>
505 </dd></dl>
506
507 <dl class="method">
508 <dt id="smb.SMBProtocol.SMBProtocolFactory.storeFile">
509 <code class="descname">storeFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.storeFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.storeFile" title="Permalink to this definition">Ā¶</a></dt>
510 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
511 <p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the uploaded file usually exceeeds the maximum size
512 of each SMB/CIFS data message, it will be packetized into a series of messages (usually about 60kBytes).
513 The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and acknowledged
514 by the remote SMB/CIFS server.</p>
515 <table class="docutils field-list" frame="void" rules="none">
516 <col class="field-name" />
517 <col class="field-body" />
518 <tbody valign="top">
519 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
520 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
521 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
522 If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
523 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
524 </ul>
525 </td>
526 </tr>
527 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 2-element tuple of ( <em>file_obj</em>, number of bytes uploaded ).</p>
528 </td>
529 </tr>
530 </tbody>
531 </table>
532 </dd></dl>
533
534 <dl class="attribute">
535 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER">
536 <code class="descname">SIGN_NEVER</code><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER" title="Permalink to this definition">Ā¶</a></dt>
537 <dd><p>SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</p>
538 </dd></dl>
539
540 <dl class="attribute">
541 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED">
542 <code class="descname">SIGN_WHEN_REQUIRED</code><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED" title="Permalink to this definition">Ā¶</a></dt>
543 <dd><p>SMB messages will only be signed when remote server requires signing.</p>
544 </dd></dl>
545
546 <dl class="attribute">
547 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED">
548 <code class="descname">SIGN_WHEN_SUPPORTED</code><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">Ā¶</a></dt>
549 <dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
550 </dd></dl>
551
552 <dl class="attribute">
553 <dt id="smb.SMBProtocol.SMBProtocolFactory.instance">
554 <code class="descname">instance</code><em class="property"> = None</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.instance" title="Permalink to this definition">Ā¶</a></dt>
555 <dd><p>The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</p>
556 </dd></dl>
557
558 <dl class="attribute">
559 <dt id="smb.SMBProtocol.SMBProtocolFactory.isReady">
560 <code class="descname">isReady</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isReady" title="Permalink to this definition">Ā¶</a></dt>
561 <dd><p>A convenient property to return True if the underlying SMB connection has connected to remote server, has successfully authenticated itself and is ready for file operations.</p>
562 </dd></dl>
563
564 <dl class="attribute">
565 <dt id="smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">
566 <code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2" title="Permalink to this definition">Ā¶</a></dt>
567 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
568 </dd></dl>
569
570 </dd></dl>
571
572178 </div>
573179 </div>
574180
585191 <a href="../genindex.html" title="General Index"
586192 >index</a></li>
587193 <li class="right" >
194 <a href="../py-modindex.html" title="Python Module Index"
195 >modules</a> |</li>
196 <li class="right" >
588197 <a href="smb_SharedDevice.html" title="SharedDevice Class"
589198 >next</a> |</li>
590199 <li class="right" >
591200 <a href="smb_SMBHandler.html" title="SMbHandler Class"
592201 >previous</a> |</li>
593 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
202 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
594203 </ul>
595204 </div>
596205 <div class="footer" role="contentinfo">
597 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
206 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
598207 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
599208 </div>
600209 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SharedDevice Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>SharedDevice Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SharedFile Class" href="smb_SharedFile.html" />
2727 <link rel="prev" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_SharedFile.html" title="SharedFile Class"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
8083
8184 <div class="section" id="shareddevice-class">
8285 <h1>SharedDevice Class<a class="headerlink" href="#shareddevice-class" title="Permalink to this headline">Ā¶</a></h1>
83 <dl class="class">
84 <dt id="smb.base.SharedDevice">
85 <em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SharedDevice</code><span class="sig-paren">(</span><em>type</em>, <em>name</em>, <em>comments</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/base.html#SharedDevice"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedDevice" title="Permalink to this definition">Ā¶</a></dt>
86 <dd><p>Contains information about a single shared device on the remote server.</p>
87 <dl class="attribute">
88 <dt id="smb.base.SharedDevice.comments">
89 <code class="descname">comments</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.comments" title="Permalink to this definition">Ā¶</a></dt>
90 <dd><p>An unicode string containing the user description of the shared device</p>
91 </dd></dl>
92
93 <dl class="attribute">
94 <dt id="smb.base.SharedDevice.isSpecial">
95 <code class="descname">isSpecial</code><a class="headerlink" href="#smb.base.SharedDevice.isSpecial" title="Permalink to this definition">Ā¶</a></dt>
96 <dd><p>Returns True if this shared device is a special share reserved for interprocess communication (IPC$)
97 or remote administration of the server (ADMIN$). Can also refer to administrative shares such as
98 C$, D$, E$, and so forth</p>
99 </dd></dl>
100
101 <dl class="attribute">
102 <dt id="smb.base.SharedDevice.isTemporary">
103 <code class="descname">isTemporary</code><a class="headerlink" href="#smb.base.SharedDevice.isTemporary" title="Permalink to this definition">Ā¶</a></dt>
104 <dd><p>Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</p>
105 </dd></dl>
106
107 <dl class="attribute">
108 <dt id="smb.base.SharedDevice.name">
109 <code class="descname">name</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.name" title="Permalink to this definition">Ā¶</a></dt>
110 <dd><p>An unicode string containing the name of the shared device</p>
111 </dd></dl>
112
113 <dl class="attribute">
114 <dt id="smb.base.SharedDevice.type">
115 <code class="descname">type</code><a class="headerlink" href="#smb.base.SharedDevice.type" title="Permalink to this definition">Ā¶</a></dt>
116 <dd><dl class="docutils">
117 <dt>Returns one of the following integral constants.</dt>
118 <dd><ul class="first last simple">
119 <li>SharedDevice.DISK_TREE</li>
120 <li>SharedDevice.PRINT_QUEUE</li>
121 <li>SharedDevice.COMM_DEVICE</li>
122 <li>SharedDevice.IPC</li>
123 </ul>
124 </dd>
125 </dl>
126 </dd></dl>
127
128 </dd></dl>
129
13086 </div>
13187
13288
14298 <a href="../genindex.html" title="General Index"
14399 >index</a></li>
144100 <li class="right" >
101 <a href="../py-modindex.html" title="Python Module Index"
102 >modules</a> |</li>
103 <li class="right" >
145104 <a href="smb_SharedFile.html" title="SharedFile Class"
146105 >next</a> |</li>
147106 <li class="right" >
148107 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
149108 >previous</a> |</li>
150 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
109 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
151110 </ul>
152111 </div>
153112 <div class="footer" role="contentinfo">
154 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
113 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
155114 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
156115 </div>
157116 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SharedFile Class &mdash; pysmb 1.1.18 documentation</title>
8 <title>SharedFile Class &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
2626 <link rel="next" title="SMB Exceptions" href="smb_exceptions.html" />
2727 <link rel="prev" title="SharedDevice Class" href="smb_SharedDevice.html" />
2828 </head>
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
3740 <a href="smb_exceptions.html" title="SMB Exceptions"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="smb_SharedDevice.html" title="SharedDevice Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
8083
8184 <div class="section" id="sharedfile-class">
8285 <h1>SharedFile Class<a class="headerlink" href="#sharedfile-class" title="Permalink to this headline">Ā¶</a></h1>
83 <dl class="class">
84 <dt id="smb.base.SharedFile">
85 <em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SharedFile</code><span class="sig-paren">(</span><em>create_time</em>, <em>last_access_time</em>, <em>last_write_time</em>, <em>last_attr_change_time</em>, <em>file_size</em>, <em>alloc_size</em>, <em>file_attributes</em>, <em>short_name</em>, <em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/base.html#SharedFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedFile" title="Permalink to this definition">Ā¶</a></dt>
86 <dd><p>Contain information about a file/folder entry that is shared on the shared device.</p>
87 <p>As an application developer, you should not need to instantiate a <em>SharedFile</em> instance directly in your application.
88 These <em>SharedFile</em> instances are usually returned via a call to <em>listPath</em> method in <a class="reference internal" href="smb_SMBProtocolFactory.html"><em>smb.SMBProtocol.SMBProtocolFactory</em></a>.</p>
89 <p>If you encounter <em>SharedFile</em> instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
90 to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
91 one of these prohibited characters: &#8220;/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).</p>
92 <dl class="attribute">
93 <dt id="smb.base.SharedFile.alloc_size">
94 <code class="descname">alloc_size</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.alloc_size" title="Permalink to this definition">Ā¶</a></dt>
95 <dd><p>Total number of bytes allocated to store this file</p>
96 </dd></dl>
97
98 <dl class="attribute">
99 <dt id="smb.base.SharedFile.create_time">
100 <code class="descname">create_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.create_time" title="Permalink to this definition">Ā¶</a></dt>
101 <dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server</p>
102 </dd></dl>
103
104 <dl class="attribute">
105 <dt id="smb.base.SharedFile.file_attributes">
106 <code class="descname">file_attributes</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_attributes" title="Permalink to this definition">Ā¶</a></dt>
107 <dd><p>A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</p>
108 </dd></dl>
109
110 <dl class="attribute">
111 <dt id="smb.base.SharedFile.file_size">
112 <code class="descname">file_size</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_size" title="Permalink to this definition">Ā¶</a></dt>
113 <dd><p>File size in number of bytes</p>
114 </dd></dl>
115
116 <dl class="attribute">
117 <dt id="smb.base.SharedFile.filename">
118 <code class="descname">filename</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.filename" title="Permalink to this definition">Ā¶</a></dt>
119 <dd><p>Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.</p>
120 </dd></dl>
121
122 <dl class="attribute">
123 <dt id="smb.base.SharedFile.isDirectory">
124 <code class="descname">isDirectory</code><a class="headerlink" href="#smb.base.SharedFile.isDirectory" title="Permalink to this definition">Ā¶</a></dt>
125 <dd><p>A convenient property to return True if this file resource is a directory on the remote server</p>
126 </dd></dl>
127
128 <dl class="attribute">
129 <dt id="smb.base.SharedFile.isReadOnly">
130 <code class="descname">isReadOnly</code><a class="headerlink" href="#smb.base.SharedFile.isReadOnly" title="Permalink to this definition">Ā¶</a></dt>
131 <dd><p>A convenient property to return True if this file resource is read-only on the remote server</p>
132 </dd></dl>
133
134 <dl class="attribute">
135 <dt id="smb.base.SharedFile.last_access_time">
136 <code class="descname">last_access_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_access_time" title="Permalink to this definition">Ā¶</a></dt>
137 <dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server</p>
138 </dd></dl>
139
140 <dl class="attribute">
141 <dt id="smb.base.SharedFile.last_attr_change_time">
142 <code class="descname">last_attr_change_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_attr_change_time" title="Permalink to this definition">Ā¶</a></dt>
143 <dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server</p>
144 </dd></dl>
145
146 <dl class="attribute">
147 <dt id="smb.base.SharedFile.last_write_time">
148 <code class="descname">last_write_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_write_time" title="Permalink to this definition">Ā¶</a></dt>
149 <dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server</p>
150 </dd></dl>
151
152 <dl class="attribute">
153 <dt id="smb.base.SharedFile.short_name">
154 <code class="descname">short_name</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.short_name" title="Permalink to this definition">Ā¶</a></dt>
155 <dd><p>Unicode string containing the short name of this file (usually in 8.3 notation)</p>
156 </dd></dl>
157
158 </dd></dl>
159
16086 </div>
16187
16288
17298 <a href="../genindex.html" title="General Index"
17399 >index</a></li>
174100 <li class="right" >
101 <a href="../py-modindex.html" title="Python Module Index"
102 >modules</a> |</li>
103 <li class="right" >
175104 <a href="smb_exceptions.html" title="SMB Exceptions"
176105 >next</a> |</li>
177106 <li class="right" >
178107 <a href="smb_SharedDevice.html" title="SharedDevice Class"
179108 >previous</a> |</li>
180 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
109 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
181110 </ul>
182111 </div>
183112 <div class="footer" role="contentinfo">
184 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
113 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
185114 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
186115 </div>
187116 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMB Exceptions &mdash; pysmb 1.1.18 documentation</title>
8 <title>SMB Exceptions &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: '../',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="../_static/jquery.js"></script>
2323 <script type="text/javascript" src="../_static/underscore.js"></script>
2424 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
26 <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
26 <link rel="next" title="Security Descriptors" href="smb_security_descriptors.html" />
2727 <link rel="prev" title="SharedFile Class" href="smb_SharedFile.html" />
2828 </head>
2929 <body role="document">
3434 <a href="../genindex.html" title="General Index"
3535 accesskey="I">index</a></li>
3636 <li class="right" >
37 <a href="../extending.html" title="Extending pysmb For Other Frameworks"
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
40 <a href="smb_security_descriptors.html" title="Security Descriptors"
3841 accesskey="N">next</a> |</li>
3942 <li class="right" >
4043 <a href="smb_SharedFile.html" title="SharedFile Class"
4144 accesskey="P">previous</a> |</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4851 <p class="topless"><a href="smb_SharedFile.html"
4952 title="previous chapter">SharedFile Class</a></p>
5053 <h4>Next topic</h4>
51 <p class="topless"><a href="../extending.html"
52 title="next chapter">Extending pysmb For Other Frameworks</a></p>
54 <p class="topless"><a href="smb_security_descriptors.html"
55 title="next chapter">Security Descriptors</a></p>
5356 <div role="note" aria-label="source link">
5457 <h3>This Page</h3>
5558 <ul class="this-page-menu">
8083
8184 <div class="section" id="smb-exceptions">
8285 <h1>SMB Exceptions<a class="headerlink" href="#smb-exceptions" title="Permalink to this headline">Ā¶</a></h1>
83 <dl class="class">
84 <dt id="smb.base.SMBTimeout">
85 <em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SMBTimeout</code><a class="reference internal" href="../_modules/smb/base.html#SMBTimeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SMBTimeout" title="Permalink to this definition">Ā¶</a></dt>
86 <dd><p>Raised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.</p>
87 </dd></dl>
88
89 <dl class="class">
90 <dt id="smb.base.NotReadyError">
91 <em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">NotReadyError</code><a class="reference internal" href="../_modules/smb/base.html#NotReadyError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.NotReadyError" title="Permalink to this definition">Ā¶</a></dt>
92 <dd><p>Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)</p>
93 </dd></dl>
94
95 <dl class="class">
96 <dt id="smb.base.NotConnectedError">
97 <em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">NotConnectedError</code><a class="reference internal" href="../_modules/smb/base.html#NotConnectedError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.NotConnectedError" title="Permalink to this definition">Ā¶</a></dt>
98 <dd><p>Raised when underlying SMB connection has been disconnected or not connected yet</p>
99 </dd></dl>
100
10186 <dl class="class">
10287 <dt id="smb.smb_structs.UnsupportedFeature">
10388 <em class="property">class </em><code class="descclassname">smb.smb_structs.</code><code class="descname">UnsupportedFeature</code><a class="reference internal" href="../_modules/smb/smb_structs.html#UnsupportedFeature"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.UnsupportedFeature" title="Permalink to this definition">Ā¶</a></dt>
130115 <a href="../genindex.html" title="General Index"
131116 >index</a></li>
132117 <li class="right" >
133 <a href="../extending.html" title="Extending pysmb For Other Frameworks"
118 <a href="../py-modindex.html" title="Python Module Index"
119 >modules</a> |</li>
120 <li class="right" >
121 <a href="smb_security_descriptors.html" title="Security Descriptors"
134122 >next</a> |</li>
135123 <li class="right" >
136124 <a href="smb_SharedFile.html" title="SharedFile Class"
137125 >previous</a> |</li>
138 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
126 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
139127 </ul>
140128 </div>
141129 <div class="footer" role="contentinfo">
142 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
130 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
143131 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
144132 </div>
145133 </body>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>Security Descriptors &mdash; pysmb 1.1.25 documentation</title>
9
10 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '../',
16 VERSION: '1.1.25',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="../_static/jquery.js"></script>
23 <script type="text/javascript" src="../_static/underscore.js"></script>
24 <script type="text/javascript" src="../_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
26 <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
27 <link rel="prev" title="SMB Exceptions" href="smb_exceptions.html" />
28 </head>
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
31 <h3>Navigation</h3>
32 <ul>
33 <li class="right" style="margin-right: 10px">
34 <a href="../genindex.html" title="General Index"
35 accesskey="I">index</a></li>
36 <li class="right" >
37 <a href="../py-modindex.html" title="Python Module Index"
38 >modules</a> |</li>
39 <li class="right" >
40 <a href="../extending.html" title="Extending pysmb For Other Frameworks"
41 accesskey="N">next</a> |</li>
42 <li class="right" >
43 <a href="smb_exceptions.html" title="SMB Exceptions"
44 accesskey="P">previous</a> |</li>
45 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
46 </ul>
47 </div>
48 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
49 <div class="sphinxsidebarwrapper">
50 <h4>Previous topic</h4>
51 <p class="topless"><a href="smb_exceptions.html"
52 title="previous chapter">SMB Exceptions</a></p>
53 <h4>Next topic</h4>
54 <p class="topless"><a href="../extending.html"
55 title="next chapter">Extending pysmb For Other Frameworks</a></p>
56 <div role="note" aria-label="source link">
57 <h3>This Page</h3>
58 <ul class="this-page-menu">
59 <li><a href="../_sources/api/smb_security_descriptors.txt"
60 rel="nofollow">Show Source</a></li>
61 </ul>
62 </div>
63 <div id="searchbox" style="display: none" role="search">
64 <h3>Quick search</h3>
65 <form class="search" action="../search.html" method="get">
66 <input type="text" name="q" />
67 <input type="submit" value="Go" />
68 <input type="hidden" name="check_keywords" value="yes" />
69 <input type="hidden" name="area" value="default" />
70 </form>
71 <p class="searchtip" style="font-size: 90%">
72 Enter search terms or a module, class or function name.
73 </p>
74 </div>
75 <script type="text/javascript">$('#searchbox').show(0);</script>
76 </div>
77 </div>
78
79 <div class="document">
80 <div class="documentwrapper">
81 <div class="bodywrapper">
82 <div class="body" role="main">
83
84 <div class="section" id="module-smb.security_descriptors">
85 <span id="security-descriptors"></span><h1>Security Descriptors<a class="headerlink" href="#module-smb.security_descriptors" title="Permalink to this headline">Ā¶</a></h1>
86 <p>This module implements security descriptors, and associated data
87 structures, as specified in <a class="reference external" href="https://msdn.microsoft.com/en-us/library/cc230273.aspx">[MS-DTYP]</a>.</p>
88 <dl class="class">
89 <dt id="smb.security_descriptors.SID">
90 <em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">SID</code><span class="sig-paren">(</span><em>revision</em>, <em>identifier_authority</em>, <em>subauthorities</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#SID"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.SID" title="Permalink to this definition">Ā¶</a></dt>
91 <dd><p>A Windows security identifier. Represents a single principal, such a
92 user or a group, as a sequence of numbers consisting of the revision,
93 identifier authority, and a variable-length list of subauthorities.</p>
94 <p>See [MS-DTYP]: 2.4.2</p>
95 <dl class="attribute">
96 <dt id="smb.security_descriptors.SID.identifier_authority">
97 <code class="descname">identifier_authority</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.identifier_authority" title="Permalink to this definition">Ā¶</a></dt>
98 <dd><p>An integer representing the identifier authority.</p>
99 </dd></dl>
100
101 <dl class="attribute">
102 <dt id="smb.security_descriptors.SID.revision">
103 <code class="descname">revision</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.revision" title="Permalink to this definition">Ā¶</a></dt>
104 <dd><p>Revision, should always be 1.</p>
105 </dd></dl>
106
107 <dl class="attribute">
108 <dt id="smb.security_descriptors.SID.subauthorities">
109 <code class="descname">subauthorities</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.subauthorities" title="Permalink to this definition">Ā¶</a></dt>
110 <dd><p>A list of integers representing all subauthorities.</p>
111 </dd></dl>
112
113 </dd></dl>
114
115 <dl class="class">
116 <dt id="smb.security_descriptors.ACE">
117 <em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">ACE</code><span class="sig-paren">(</span><em>type_</em>, <em>flags</em>, <em>mask</em>, <em>sid</em>, <em>additional_data</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#ACE"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.ACE" title="Permalink to this definition">Ā¶</a></dt>
118 <dd><p>Represents a single access control entry.</p>
119 <p>See [MS-DTYP]: 2.4.4</p>
120 <dl class="attribute">
121 <dt id="smb.security_descriptors.ACE.additional_data">
122 <code class="descname">additional_data</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.additional_data" title="Permalink to this definition">Ā¶</a></dt>
123 <dd><p>A dictionary of additional fields present in the ACE, depending
124 on the type. The following fields can be present:</p>
125 <ul class="simple">
126 <li><code class="docutils literal"><span class="pre">flags</span></code></li>
127 <li><code class="docutils literal"><span class="pre">object_type</span></code></li>
128 <li><code class="docutils literal"><span class="pre">inherited_object_type</span></code></li>
129 <li><code class="docutils literal"><span class="pre">application_data</span></code></li>
130 <li><code class="docutils literal"><span class="pre">attribute_data</span></code></li>
131 </ul>
132 </dd></dl>
133
134 <dl class="attribute">
135 <dt id="smb.security_descriptors.ACE.flags">
136 <code class="descname">flags</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.flags" title="Permalink to this definition">Ā¶</a></dt>
137 <dd><p>An integer bitmask with ACE flags, corresponds to the
138 <code class="docutils literal"><span class="pre">AceFlags</span></code> field.</p>
139 </dd></dl>
140
141 <dl class="attribute">
142 <dt id="smb.security_descriptors.ACE.isInheritOnly">
143 <code class="descname">isInheritOnly</code><a class="headerlink" href="#smb.security_descriptors.ACE.isInheritOnly" title="Permalink to this definition">Ā¶</a></dt>
144 <dd><p>Convenience property which indicates if this ACE is inherit
145 only, meaning that it doesn&#8217;t apply to the object itself.</p>
146 </dd></dl>
147
148 <dl class="attribute">
149 <dt id="smb.security_descriptors.ACE.mask">
150 <code class="descname">mask</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.mask" title="Permalink to this definition">Ā¶</a></dt>
151 <dd><p>An integer representing the <code class="docutils literal"><span class="pre">ACCESS_MASK</span></code> as specified in
152 [MS-DTYP] 2.4.3.</p>
153 </dd></dl>
154
155 <dl class="attribute">
156 <dt id="smb.security_descriptors.ACE.sid">
157 <code class="descname">sid</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.sid" title="Permalink to this definition">Ā¶</a></dt>
158 <dd><p>The <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> of a trustee.</p>
159 </dd></dl>
160
161 <dl class="attribute">
162 <dt id="smb.security_descriptors.ACE.type">
163 <code class="descname">type</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.type" title="Permalink to this definition">Ā¶</a></dt>
164 <dd><p>An integer representing the type of the ACE. One of the
165 <code class="docutils literal"><span class="pre">ACE_TYPE_*</span></code> constants. Corresponds to the <code class="docutils literal"><span class="pre">AceType</span></code> field
166 from [MS-DTYP] 2.4.4.1.</p>
167 </dd></dl>
168
169 </dd></dl>
170
171 <dl class="class">
172 <dt id="smb.security_descriptors.ACL">
173 <em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">ACL</code><span class="sig-paren">(</span><em>revision</em>, <em>aces</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#ACL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.ACL" title="Permalink to this definition">Ā¶</a></dt>
174 <dd><p>Access control list, encapsulating a sequence of access control
175 entries.</p>
176 <p>See [MS-DTYP]: 2.4.5</p>
177 <dl class="attribute">
178 <dt id="smb.security_descriptors.ACL.aces">
179 <code class="descname">aces</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACL.aces" title="Permalink to this definition">Ā¶</a></dt>
180 <dd><p>List of <a class="reference internal" href="#smb.security_descriptors.ACE" title="smb.security_descriptors.ACE"><code class="xref py py-class docutils literal"><span class="pre">ACE</span></code></a> instances.</p>
181 </dd></dl>
182
183 <dl class="attribute">
184 <dt id="smb.security_descriptors.ACL.revision">
185 <code class="descname">revision</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACL.revision" title="Permalink to this definition">Ā¶</a></dt>
186 <dd><p>Integer value of the revision.</p>
187 </dd></dl>
188
189 </dd></dl>
190
191 <dl class="class">
192 <dt id="smb.security_descriptors.SecurityDescriptor">
193 <em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">SecurityDescriptor</code><span class="sig-paren">(</span><em>flags</em>, <em>owner</em>, <em>group</em>, <em>dacl</em>, <em>sacl</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#SecurityDescriptor"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor" title="Permalink to this definition">Ā¶</a></dt>
194 <dd><p>Represents a security descriptor.</p>
195 <p>See [MS-DTYP]: 2.4.6</p>
196 <dl class="attribute">
197 <dt id="smb.security_descriptors.SecurityDescriptor.dacl">
198 <code class="descname">dacl</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.dacl" title="Permalink to this definition">Ā¶</a></dt>
199 <dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.ACL" title="smb.security_descriptors.ACL"><code class="xref py py-class docutils literal"><span class="pre">ACL</span></code></a> representing the discretionary access
200 control list, which specifies access restrictions of an object.</p>
201 </dd></dl>
202
203 <dl class="attribute">
204 <dt id="smb.security_descriptors.SecurityDescriptor.flags">
205 <code class="descname">flags</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.flags" title="Permalink to this definition">Ā¶</a></dt>
206 <dd><p>Integer bitmask of control flags. Corresponds to the
207 <code class="docutils literal"><span class="pre">Control</span></code> field in [MS-DTYP] 2.4.6.</p>
208 </dd></dl>
209
210 <dl class="attribute">
211 <dt id="smb.security_descriptors.SecurityDescriptor.group">
212 <code class="descname">group</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.group" title="Permalink to this definition">Ā¶</a></dt>
213 <dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> representing the owner group.</p>
214 </dd></dl>
215
216 <dl class="attribute">
217 <dt id="smb.security_descriptors.SecurityDescriptor.owner">
218 <code class="descname">owner</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.owner" title="Permalink to this definition">Ā¶</a></dt>
219 <dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> representing the owner user.</p>
220 </dd></dl>
221
222 <dl class="attribute">
223 <dt id="smb.security_descriptors.SecurityDescriptor.sacl">
224 <code class="descname">sacl</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.sacl" title="Permalink to this definition">Ā¶</a></dt>
225 <dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.ACL" title="smb.security_descriptors.ACL"><code class="xref py py-class docutils literal"><span class="pre">ACL</span></code></a> representing the system access control
226 list, which specifies audit logging of an object.</p>
227 </dd></dl>
228
229 </dd></dl>
230
231 </div>
232
233
234 </div>
235 </div>
236 </div>
237 <div class="clearer"></div>
238 </div>
239 <div class="related" role="navigation" aria-label="related navigation">
240 <h3>Navigation</h3>
241 <ul>
242 <li class="right" style="margin-right: 10px">
243 <a href="../genindex.html" title="General Index"
244 >index</a></li>
245 <li class="right" >
246 <a href="../py-modindex.html" title="Python Module Index"
247 >modules</a> |</li>
248 <li class="right" >
249 <a href="../extending.html" title="Extending pysmb For Other Frameworks"
250 >next</a> |</li>
251 <li class="right" >
252 <a href="smb_exceptions.html" title="SMB Exceptions"
253 >previous</a> |</li>
254 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
255 </ul>
256 </div>
257 <div class="footer" role="contentinfo">
258 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
259 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
260 </div>
261 </body>
262 </html>āŽ
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.18 documentation</title>
8 <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: './',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="_static/jquery.js"></script>
2323 <script type="text/javascript" src="_static/underscore.js"></script>
2424 <script type="text/javascript" src="_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
26 <link rel="prev" title="SMB Exceptions" href="api/smb_exceptions.html" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
26 <link rel="prev" title="Security Descriptors" href="api/smb_security_descriptors.html" />
2727 </head>
2828 <body role="document">
2929 <div class="related" role="navigation" aria-label="related navigation">
3333 <a href="genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
3535 <li class="right" >
36 <a href="api/smb_exceptions.html" title="SMB Exceptions"
36 <a href="py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="right" >
39 <a href="api/smb_security_descriptors.html" title="Security Descriptors"
3740 accesskey="P">previous</a> |</li>
38 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
41 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3942 </ul>
4043 </div>
4144 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4245 <div class="sphinxsidebarwrapper">
4346 <h4>Previous topic</h4>
44 <p class="topless"><a href="api/smb_exceptions.html"
45 title="previous chapter">SMB Exceptions</a></p>
47 <p class="topless"><a href="api/smb_security_descriptors.html"
48 title="previous chapter">Security Descriptors</a></p>
4649 <div role="note" aria-label="source link">
4750 <h3>This Page</h3>
4851 <ul class="this-page-menu">
110113 <a href="genindex.html" title="General Index"
111114 >index</a></li>
112115 <li class="right" >
113 <a href="api/smb_exceptions.html" title="SMB Exceptions"
116 <a href="py-modindex.html" title="Python Module Index"
117 >modules</a> |</li>
118 <li class="right" >
119 <a href="api/smb_security_descriptors.html" title="Security Descriptors"
114120 >previous</a> |</li>
115 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
121 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
116122 </ul>
117123 </div>
118124 <div class="footer" role="contentinfo">
119 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
125 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
120126 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
121127 </div>
122128 </body>
66 <head>
77 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
88
9 <title>Index &mdash; pysmb 1.1.18 documentation</title>
9 <title>Index &mdash; pysmb 1.1.25 documentation</title>
1010
1111 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1212 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1414 <script type="text/javascript">
1515 var DOCUMENTATION_OPTIONS = {
1616 URL_ROOT: './',
17 VERSION: '1.1.18',
17 VERSION: '1.1.25',
1818 COLLAPSE_INDEX: false,
1919 FILE_SUFFIX: '.html',
2020 HAS_SOURCE: true
2323 <script type="text/javascript" src="_static/jquery.js"></script>
2424 <script type="text/javascript" src="_static/underscore.js"></script>
2525 <script type="text/javascript" src="_static/doctools.js"></script>
26 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
2727 </head>
2828 <body role="document">
2929 <div class="related" role="navigation" aria-label="related navigation">
3232 <li class="right" style="margin-right: 10px">
3333 <a href="#" title="General Index"
3434 accesskey="I">index</a></li>
35 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
35 <li class="right" >
36 <a href="py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
3639 </ul>
3740 </div>
3841 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
6972 | <a href="#A"><strong>A</strong></a>
7073 | <a href="#C"><strong>C</strong></a>
7174 | <a href="#D"><strong>D</strong></a>
72 | <a href="#E"><strong>E</strong></a>
7375 | <a href="#F"><strong>F</strong></a>
7476 | <a href="#G"><strong>G</strong></a>
7577 | <a href="#I"><strong>I</strong></a>
76 | <a href="#L"><strong>L</strong></a>
78 | <a href="#M"><strong>M</strong></a>
7779 | <a href="#N"><strong>N</strong></a>
7880 | <a href="#O"><strong>O</strong></a>
7981 | <a href="#P"><strong>P</strong></a>
9698 <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.__init__">(nmb.NetBIOSProtocol.NBNSProtocol method)</a>
9799 </dt>
98100
99
100 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.__init__">(smb.SMBConnection.SMBConnection method)</a>
101 </dt>
102
103
104 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.__init__">(smb.SMBProtocol.SMBProtocolFactory method)</a>
105 </dt>
106
107101 </dl></dd>
108102 </dl></td>
109103 </tr></table>
112106 <table style="width: 100%" class="indextable genindextable"><tr>
113107 <td style="width: 33%" valign="top"><dl>
114108
115 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.alloc_size">alloc_size (smb.base.SharedFile attribute)</a>
109 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE">ACE (class in smb.security_descriptors)</a>
110 </dt>
111
112
113 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL.aces">aces (smb.security_descriptors.ACL attribute)</a>
114 </dt>
115
116 </dl></td>
117 <td style="width: 33%" valign="top"><dl>
118
119 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL">ACL (class in smb.security_descriptors)</a>
120 </dt>
121
122
123 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.additional_data">additional_data (smb.security_descriptors.ACE attribute)</a>
116124 </dt>
117125
118126 </dl></td>
125133 <dt><a href="api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.close">close() (nmb.NetBIOS.NetBIOS method)</a>
126134 </dt>
127135
128 <dd><dl>
129
130 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.close">(smb.SMBConnection.SMBConnection method)</a>
131 </dt>
132
133 </dl></dd>
134
135 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.closeConnection">closeConnection() (smb.SMBProtocol.SMBProtocolFactory method)</a>
136 </dt>
137
138
139 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.comments">comments (smb.base.SharedDevice attribute)</a>
140 </dt>
141
142 </dl></td>
143 <td style="width: 33%" valign="top"><dl>
144
145 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.connect">connect() (smb.SMBConnection.SMBConnection method)</a>
146 </dt>
147
148
149 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.create_time">create_time (smb.base.SharedFile attribute)</a>
150 </dt>
151
152
153 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.createDirectory">createDirectory() (smb.SMBConnection.SMBConnection method)</a>
154 </dt>
155
156 <dd><dl>
157
158 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.createDirectory">(smb.SMBProtocol.SMBProtocolFactory method)</a>
159 </dt>
160
161 </dl></dd>
162136 </dl></td>
163137 </tr></table>
164138
166140 <table style="width: 100%" class="indextable genindextable"><tr>
167141 <td style="width: 33%" valign="top"><dl>
168142
169 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteDirectory">deleteDirectory() (smb.SMBConnection.SMBConnection method)</a>
170 </dt>
171
172 <dd><dl>
173
174 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">(smb.SMBProtocol.SMBProtocolFactory method)</a>
175 </dt>
176
177 </dl></dd>
178 </dl></td>
179 <td style="width: 33%" valign="top"><dl>
180
181 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteFiles">deleteFiles() (smb.SMBConnection.SMBConnection method)</a>
182 </dt>
183
184 <dd><dl>
185
186 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteFiles">(smb.SMBProtocol.SMBProtocolFactory method)</a>
187 </dt>
188
189 </dl></dd>
190 </dl></td>
191 </tr></table>
192
193 <h2 id="E">E</h2>
194 <table style="width: 100%" class="indextable genindextable"><tr>
195 <td style="width: 33%" valign="top"><dl>
196
197 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.echo">echo() (smb.SMBConnection.SMBConnection method)</a>
198 </dt>
199
200 <dd><dl>
201
202 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.echo">(smb.SMBProtocol.SMBProtocolFactory method)</a>
203 </dt>
204
205 </dl></dd>
143 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.dacl">dacl (smb.security_descriptors.SecurityDescriptor attribute)</a>
144 </dt>
145
206146 </dl></td>
207147 </tr></table>
208148
210150 <table style="width: 100%" class="indextable genindextable"><tr>
211151 <td style="width: 33%" valign="top"><dl>
212152
213 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.file_attributes">file_attributes (smb.base.SharedFile attribute)</a>
214 </dt>
215
216
217 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.file_size">file_size (smb.base.SharedFile attribute)</a>
218 </dt>
219
220 </dl></td>
221 <td style="width: 33%" valign="top"><dl>
222
223 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.filename">filename (smb.base.SharedFile attribute)</a>
224 </dt>
225
153 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.flags">flags (smb.security_descriptors.ACE attribute)</a>
154 </dt>
155
156 <dd><dl>
157
158 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.flags">(smb.security_descriptors.SecurityDescriptor attribute)</a>
159 </dt>
160
161 </dl></dd>
226162 </dl></td>
227163 </tr></table>
228164
230166 <table style="width: 100%" class="indextable genindextable"><tr>
231167 <td style="width: 33%" valign="top"><dl>
232168
233 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.getAttributes">getAttributes() (smb.SMBConnection.SMBConnection method)</a>
234 </dt>
235
236 <dd><dl>
237
238 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">(smb.SMBProtocol.SMBProtocolFactory method)</a>
239 </dt>
240
241 </dl></dd>
169 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.group">group (smb.security_descriptors.SecurityDescriptor attribute)</a>
170 </dt>
171
242172 </dl></td>
243173 </tr></table>
244174
246176 <table style="width: 100%" class="indextable genindextable"><tr>
247177 <td style="width: 33%" valign="top"><dl>
248178
249 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.instance">instance (smb.SMBProtocol.SMBProtocolFactory attribute)</a>
250 </dt>
251
252
253 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isDirectory">isDirectory (smb.base.SharedFile attribute)</a>
254 </dt>
255
256
257 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isReadOnly">isReadOnly (smb.base.SharedFile attribute)</a>
258 </dt>
259
260
261 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isReady">isReady (smb.SMBProtocol.SMBProtocolFactory attribute)</a>
262 </dt>
263
264 </dl></td>
265 <td style="width: 33%" valign="top"><dl>
266
267 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.isSpecial">isSpecial (smb.base.SharedDevice attribute)</a>
268 </dt>
269
270
271 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.isTemporary">isTemporary (smb.base.SharedDevice attribute)</a>
272 </dt>
273
274
275 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.isUsingSMB2">isUsingSMB2 (smb.SMBConnection.SMBConnection attribute)</a>
276 </dt>
277
278 <dd><dl>
279
280 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
281 </dt>
282
283 </dl></dd>
284 </dl></td>
285 </tr></table>
286
287 <h2 id="L">L</h2>
288 <table style="width: 100%" class="indextable genindextable"><tr>
289 <td style="width: 33%" valign="top"><dl>
290
291 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_access_time">last_access_time (smb.base.SharedFile attribute)</a>
292 </dt>
293
294
295 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_attr_change_time">last_attr_change_time (smb.base.SharedFile attribute)</a>
296 </dt>
297
298
299 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_write_time">last_write_time (smb.base.SharedFile attribute)</a>
300 </dt>
301
302 </dl></td>
303 <td style="width: 33%" valign="top"><dl>
304
305 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath">listPath() (smb.SMBConnection.SMBConnection method)</a>
306 </dt>
307
308 <dd><dl>
309
310 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listPath">(smb.SMBProtocol.SMBProtocolFactory method)</a>
311 </dt>
312
313 </dl></dd>
314
315 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listShares">listShares() (smb.SMBConnection.SMBConnection method)</a>
316 </dt>
317
318 <dd><dl>
319
320 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listShares">(smb.SMBProtocol.SMBProtocolFactory method)</a>
321 </dt>
322
323 </dl></dd>
324
325 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listSnapshots">listSnapshots() (smb.SMBConnection.SMBConnection method)</a>
326 </dt>
327
328 <dd><dl>
329
330 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listSnapshots">(smb.SMBProtocol.SMBProtocolFactory method)</a>
331 </dt>
332
333 </dl></dd>
179 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.identifier_authority">identifier_authority (smb.security_descriptors.SID attribute)</a>
180 </dt>
181
182 </dl></td>
183 <td style="width: 33%" valign="top"><dl>
184
185 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.isInheritOnly">isInheritOnly (smb.security_descriptors.ACE attribute)</a>
186 </dt>
187
188 </dl></td>
189 </tr></table>
190
191 <h2 id="M">M</h2>
192 <table style="width: 100%" class="indextable genindextable"><tr>
193 <td style="width: 33%" valign="top"><dl>
194
195 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.mask">mask (smb.security_descriptors.ACE attribute)</a>
196 </dt>
197
334198 </dl></td>
335199 </tr></table>
336200
338202 <table style="width: 100%" class="indextable genindextable"><tr>
339203 <td style="width: 33%" valign="top"><dl>
340204
341 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.name">name (smb.base.SharedDevice attribute)</a>
342 </dt>
343
344
345205 <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol">NBNSProtocol (class in nmb.NetBIOSProtocol)</a>
346206 </dt>
347207
355215 <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NetBIOSTimeout">NetBIOSTimeout (class in nmb.NetBIOSProtocol)</a>
356216 </dt>
357217
358
359 <dt><a href="api/smb_exceptions.html#smb.base.NotConnectedError">NotConnectedError (class in smb.base)</a>
360 </dt>
361
362
363 <dt><a href="api/smb_exceptions.html#smb.base.NotReadyError">NotReadyError (class in smb.base)</a>
364 </dt>
365
366218 </dl></td>
367219 </tr></table>
368220
370222 <table style="width: 100%" class="indextable genindextable"><tr>
371223 <td style="width: 33%" valign="top"><dl>
372224
373 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">onAuthFailed() (smb.SMBProtocol.SMBProtocolFactory method)</a>
374 </dt>
375
376
377 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthOK">onAuthOK() (smb.SMBProtocol.SMBProtocolFactory method)</a>
378 </dt>
379
380 </dl></td>
381 <td style="width: 33%" valign="top"><dl>
382
383225 <dt><a href="api/smb_exceptions.html#smb.smb_structs.OperationFailure">OperationFailure (class in smb.smb_structs)</a>
384226 </dt>
385227
386228 </dl></td>
229 <td style="width: 33%" valign="top"><dl>
230
231 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.owner">owner (smb.security_descriptors.SecurityDescriptor attribute)</a>
232 </dt>
233
234 </dl></td>
387235 </tr></table>
388236
389237 <h2 id="P">P</h2>
428276 <table style="width: 100%" class="indextable genindextable"><tr>
429277 <td style="width: 33%" valign="top"><dl>
430278
431 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.rename">rename() (smb.SMBConnection.SMBConnection method)</a>
432 </dt>
433
434 <dd><dl>
435
436 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.rename">(smb.SMBProtocol.SMBProtocolFactory method)</a>
437 </dt>
438
439 </dl></dd>
440
441 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.resetFileAttributes">resetFileAttributes() (smb.SMBConnection.SMBConnection method)</a>
442 </dt>
443
444 </dl></td>
445 <td style="width: 33%" valign="top"><dl>
446
447 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFile">retrieveFile() (smb.SMBConnection.SMBConnection method)</a>
448 </dt>
449
450 <dd><dl>
451
452 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFile">(smb.SMBProtocol.SMBProtocolFactory method)</a>
453 </dt>
454
455 </dl></dd>
456
457 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFileFromOffset">retrieveFileFromOffset() (smb.SMBConnection.SMBConnection method)</a>
458 </dt>
459
460 <dd><dl>
461
462 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">(smb.SMBProtocol.SMBProtocolFactory method)</a>
279 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL.revision">revision (smb.security_descriptors.ACL attribute)</a>
280 </dt>
281
282 <dd><dl>
283
284 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.revision">(smb.security_descriptors.SID attribute)</a>
463285 </dt>
464286
465287 </dl></dd>
470292 <table style="width: 100%" class="indextable genindextable"><tr>
471293 <td style="width: 33%" valign="top"><dl>
472294
473 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice">SharedDevice (class in smb.base)</a>
474 </dt>
475
476
477 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile">SharedFile (class in smb.base)</a>
478 </dt>
479
480
481 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.short_name">short_name (smb.base.SharedFile attribute)</a>
482 </dt>
483
484
485 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_NEVER">SIGN_NEVER (smb.SMBConnection.SMBConnection attribute)</a>
486 </dt>
487
488 <dd><dl>
489
490 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
491 </dt>
492
493 </dl></dd>
494
495 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED">SIGN_WHEN_REQUIRED (smb.SMBConnection.SMBConnection attribute)</a>
496 </dt>
497
498 <dd><dl>
499
500 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
501 </dt>
502
503 </dl></dd>
504
505 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED">SIGN_WHEN_SUPPORTED (smb.SMBConnection.SMBConnection attribute)</a>
506 </dt>
507
508 <dd><dl>
509
510 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
511 </dt>
512
513 </dl></dd>
514 </dl></td>
515 <td style="width: 33%" valign="top"><dl>
516
517 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">SMBConnection (class in smb.SMBConnection)</a>
518 </dt>
519
520
521 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory">SMBProtocolFactory (class in smb.SMBProtocol)</a>
522 </dt>
523
524
525 <dt><a href="api/smb_exceptions.html#smb.base.SMBTimeout">SMBTimeout (class in smb.base)</a>
526 </dt>
527
528
529 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFile">storeFile() (smb.SMBConnection.SMBConnection method)</a>
530 </dt>
531
532 <dd><dl>
533
534 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.storeFile">(smb.SMBProtocol.SMBProtocolFactory method)</a>
535 </dt>
536
537 </dl></dd>
538
539 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFileFromOffset">storeFileFromOffset() (smb.SMBConnection.SMBConnection method)</a>
295 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.sacl">sacl (smb.security_descriptors.SecurityDescriptor attribute)</a>
296 </dt>
297
298
299 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor">SecurityDescriptor (class in smb.security_descriptors)</a>
300 </dt>
301
302
303 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID">SID (class in smb.security_descriptors)</a>
304 </dt>
305
306 </dl></td>
307 <td style="width: 33%" valign="top"><dl>
308
309 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.sid">sid (smb.security_descriptors.ACE attribute)</a>
310 </dt>
311
312
313 <dt><a href="api/smb_security_descriptors.html#module-smb.security_descriptors">smb.security_descriptors (module)</a>
314 </dt>
315
316
317 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.subauthorities">subauthorities (smb.security_descriptors.SID attribute)</a>
540318 </dt>
541319
542320 </dl></td>
546324 <table style="width: 100%" class="indextable genindextable"><tr>
547325 <td style="width: 33%" valign="top"><dl>
548326
549 <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.type">type (smb.base.SharedDevice attribute)</a>
327 <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.type">type (smb.security_descriptors.ACE attribute)</a>
550328 </dt>
551329
552330 </dl></td>
575353 <li class="right" style="margin-right: 10px">
576354 <a href="#" title="General Index"
577355 >index</a></li>
578 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
356 <li class="right" >
357 <a href="py-modindex.html" title="Python Module Index"
358 >modules</a> |</li>
359 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
579360 </ul>
580361 </div>
581362 <div class="footer" role="contentinfo">
582 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
363 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
583364 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
584365 </div>
585366 </body>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>Welcome to pysmbā€™s documentation! &mdash; pysmb 1.1.18 documentation</title>
8 <title>Welcome to pysmbā€™s documentation! &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: './',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2222 <script type="text/javascript" src="_static/jquery.js"></script>
2323 <script type="text/javascript" src="_static/underscore.js"></script>
2424 <script type="text/javascript" src="_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.18 documentation" href="#" />
25 <link rel="top" title="pysmb 1.1.25 documentation" href="#" />
2626 <link rel="next" title="NBNSProtocol Class" href="api/nmb_NBNSProtocol.html" />
2727 </head>
2828 <body role="document">
3333 <a href="genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
3535 <li class="right" >
36 <a href="py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="right" >
3639 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
3740 accesskey="N">next</a> |</li>
38 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li>
41 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.25 documentation</a> &raquo;</li>
3942 </ul>
4043 </div>
4144 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
186189 <li class="toctree-l1"><a class="reference internal" href="api/smb_SharedDevice.html">SharedDevice Class</a></li>
187190 <li class="toctree-l1"><a class="reference internal" href="api/smb_SharedFile.html">SharedFile Class</a></li>
188191 <li class="toctree-l1"><a class="reference internal" href="api/smb_exceptions.html">SMB Exceptions</a></li>
192 <li class="toctree-l1"><a class="reference internal" href="api/smb_security_descriptors.html">Security Descriptors</a></li>
189193 <li class="toctree-l1"><a class="reference internal" href="extending.html">Extending pysmb For Other Frameworks</a></li>
190194 </ul>
191195 </div>
208212 <a href="genindex.html" title="General Index"
209213 >index</a></li>
210214 <li class="right" >
215 <a href="py-modindex.html" title="Python Module Index"
216 >modules</a> |</li>
217 <li class="right" >
211218 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
212219 >next</a> |</li>
213 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li>
220 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.25 documentation</a> &raquo;</li>
214221 </ul>
215222 </div>
216223 <div class="footer" role="contentinfo">
217 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
224 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
218225 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
219226 </div>
220227 </body>
Binary diff not shown
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head>
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
8 <title>Python Module Index &mdash; pysmb 1.1.25 documentation</title>
9
10 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
11 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
12
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: './',
16 VERSION: '1.1.25',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="_static/jquery.js"></script>
23 <script type="text/javascript" src="_static/underscore.js"></script>
24 <script type="text/javascript" src="_static/doctools.js"></script>
25 <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
26
27
28
29 </head>
30 <body role="document">
31 <div class="related" role="navigation" aria-label="related navigation">
32 <h3>Navigation</h3>
33 <ul>
34 <li class="right" style="margin-right: 10px">
35 <a href="genindex.html" title="General Index"
36 accesskey="I">index</a></li>
37 <li class="right" >
38 <a href="#" title="Python Module Index"
39 >modules</a> |</li>
40 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
41 </ul>
42 </div>
43 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
44 <div class="sphinxsidebarwrapper">
45 <div id="searchbox" style="display: none" role="search">
46 <h3>Quick search</h3>
47 <form class="search" action="search.html" method="get">
48 <input type="text" name="q" />
49 <input type="submit" value="Go" />
50 <input type="hidden" name="check_keywords" value="yes" />
51 <input type="hidden" name="area" value="default" />
52 </form>
53 <p class="searchtip" style="font-size: 90%">
54 Enter search terms or a module, class or function name.
55 </p>
56 </div>
57 <script type="text/javascript">$('#searchbox').show(0);</script>
58 </div>
59 </div>
60
61 <div class="document">
62 <div class="documentwrapper">
63 <div class="bodywrapper">
64 <div class="body" role="main">
65
66
67 <h1>Python Module Index</h1>
68
69 <div class="modindex-jumpbox">
70 <a href="#cap-s"><strong>s</strong></a>
71 </div>
72
73 <table class="indextable modindextable" cellspacing="0" cellpadding="2">
74 <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
75 <tr class="cap" id="cap-s"><td></td><td>
76 <strong>s</strong></td><td></td></tr>
77 <tr>
78 <td><img src="_static/minus.png" class="toggler"
79 id="toggle-1" style="display: none" alt="-" /></td>
80 <td>
81 <code class="xref">smb</code></td><td>
82 <em></em></td></tr>
83 <tr class="cg-1">
84 <td></td>
85 <td>&nbsp;&nbsp;&nbsp;
86 <a href="api/smb_security_descriptors.html#module-smb.security_descriptors"><code class="xref">smb.security_descriptors</code></a></td><td>
87 <em>Data structures used in Windows security descriptors.</em></td></tr>
88 </table>
89
90
91 </div>
92 </div>
93 </div>
94 <div class="clearer"></div>
95 </div>
96 <div class="related" role="navigation" aria-label="related navigation">
97 <h3>Navigation</h3>
98 <ul>
99 <li class="right" style="margin-right: 10px">
100 <a href="genindex.html" title="General Index"
101 >index</a></li>
102 <li class="right" >
103 <a href="#" title="Python Module Index"
104 >modules</a> |</li>
105 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
106 </ul>
107 </div>
108 <div class="footer" role="contentinfo">
109 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
110 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
111 </div>
112 </body>
113 </html>āŽ
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>Search &mdash; pysmb 1.1.18 documentation</title>
8 <title>Search &mdash; pysmb 1.1.25 documentation</title>
99
1010 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1111 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1313 <script type="text/javascript">
1414 var DOCUMENTATION_OPTIONS = {
1515 URL_ROOT: './',
16 VERSION: '1.1.18',
16 VERSION: '1.1.25',
1717 COLLAPSE_INDEX: false,
1818 FILE_SUFFIX: '.html',
1919 HAS_SOURCE: true
2323 <script type="text/javascript" src="_static/underscore.js"></script>
2424 <script type="text/javascript" src="_static/doctools.js"></script>
2525 <script type="text/javascript" src="_static/searchtools.js"></script>
26 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
2727 <script type="text/javascript">
2828 jQuery(function() { Search.loadIndex("searchindex.js"); });
2929 </script>
3939 <li class="right" style="margin-right: 10px">
4040 <a href="genindex.html" title="General Index"
4141 accesskey="I">index</a></li>
42 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
42 <li class="right" >
43 <a href="py-modindex.html" title="Python Module Index"
44 >modules</a> |</li>
45 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
4346 </ul>
4447 </div>
4548 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
8790 <li class="right" style="margin-right: 10px">
8891 <a href="genindex.html" title="General Index"
8992 >index</a></li>
90 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
93 <li class="right" >
94 <a href="py-modindex.html" title="Python Module Index"
95 >modules</a> |</li>
96 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
9197 </ul>
9298 </div>
9399 <div class="footer" role="contentinfo">
94 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
100 &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
95101 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
96102 </div>
97103 </body>
0 Search.setIndex({envversion:46,filenames:["api/nmb_NBNSProtocol","api/nmb_NetBIOS","api/smb_SMBConnection","api/smb_SMBHandler","api/smb_SMBProtocolFactory","api/smb_SharedDevice","api/smb_SharedFile","api/smb_exceptions","extending","index"],objects:{"nmb.NetBIOS":{NetBIOS:[1,0,1,""]},"nmb.NetBIOS.NetBIOS":{"__init__":[1,1,1,""],close:[1,1,1,""],queryIPForName:[1,1,1,""],queryName:[1,1,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[0,0,1,""],NetBIOSTimeout:[0,0,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{"__init__":[0,1,1,""],queryIPForName:[0,1,1,""],queryName:[0,1,1,""]},"smb.SMBConnection":{SMBConnection:[2,0,1,""]},"smb.SMBConnection.SMBConnection":{"__init__":[2,1,1,""],SIGN_NEVER:[2,2,1,""],SIGN_WHEN_REQUIRED:[2,2,1,""],SIGN_WHEN_SUPPORTED:[2,2,1,""],close:[2,1,1,""],connect:[2,1,1,""],createDirectory:[2,1,1,""],deleteDirectory:[2,1,1,""],deleteFiles:[2,1,1,""],echo:[2,1,1,""],getAttributes:[2,1,1,""],isUsingSMB2:[2,2,1,""],listPath:[2,1,1,""],listShares:[2,1,1,""],listSnapshots:[2,1,1,""],rename:[2,1,1,""],resetFileAttributes:[2,1,1,""],retrieveFile:[2,1,1,""],retrieveFileFromOffset:[2,1,1,""],storeFile:[2,1,1,""],storeFileFromOffset:[2,1,1,""]},"smb.SMBProtocol":{SMBProtocolFactory:[4,0,1,""]},"smb.SMBProtocol.SMBProtocolFactory":{"__init__":[4,1,1,""],SIGN_NEVER:[4,2,1,""],SIGN_WHEN_REQUIRED:[4,2,1,""],SIGN_WHEN_SUPPORTED:[4,2,1,""],closeConnection:[4,1,1,""],createDirectory:[4,1,1,""],deleteDirectory:[4,1,1,""],deleteFiles:[4,1,1,""],echo:[4,1,1,""],getAttributes:[4,1,1,""],instance:[4,2,1,""],isReady:[4,2,1,""],isUsingSMB2:[4,2,1,""],listPath:[4,1,1,""],listShares:[4,1,1,""],listSnapshots:[4,1,1,""],onAuthFailed:[4,1,1,""],onAuthOK:[4,1,1,""],rename:[4,1,1,""],retrieveFile:[4,1,1,""],retrieveFileFromOffset:[4,1,1,""],storeFile:[4,1,1,""]},"smb.base":{NotConnectedError:[7,0,1,""],NotReadyError:[7,0,1,""],SMBTimeout:[7,0,1,""],SharedDevice:[5,0,1,""],SharedFile:[6,0,1,""]},"smb.base.SharedDevice":{comments:[5,2,1,""],isSpecial:[5,2,1,""],isTemporary:[5,2,1,""],name:[5,2,1,""],type:[5,2,1,""]},"smb.base.SharedFile":{alloc_size:[6,2,1,""],create_time:[6,2,1,""],file_attributes:[6,2,1,""],file_size:[6,2,1,""],filename:[6,2,1,""],isDirectory:[6,2,1,""],isReadOnly:[6,2,1,""],last_access_time:[6,2,1,""],last_attr_change_time:[6,2,1,""],last_write_time:[6,2,1,""],short_name:[6,2,1,""]},"smb.smb_structs":{OperationFailure:[7,0,1,""],ProtocolError:[7,0,1,""],UnsupportedFeature:[7,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"3rd":9,"60kbyte":4,"\u5783\u573e\u6587\u4ef6":3,"\u6d4b\u8bd5\u6587\u4ef6\u5939":3,"__init__":[0,1,2,4,8],"abstract":9,"boolean":[0,1,2,4],"byte":[2,4,6],"case":4,"default":[2,4],"float":[0,1,4,6],"function":[0,1,2,4,9],"import":[2,3,4,9],"int":[2,4],"long":[2,4,6],"new":[1,2,4,8],"public":4,"return":[0,1,2,3,4,5,6,9],"short":6,"true":[0,1,2,4,5,6],"try":[2,4,8],"while":7,aaa:[0,1],about:[2,4,5,6],abov:8,accept:[4,8],access:[2,4,6],accur:4,acknowledg:4,across:[2,4],actual:2,add:[0,4],addcallback:[0,4],adderrback:4,address:[0,1,3,8,9],admin:5,administr:5,after:[0,1,2,4,9],again:0,against:9,algorithm:[2,4,8,9],all:[2,4,9],alloc:6,alloc_s:6,allow:[0,2,4],alon:9,alphanumer:[2,4],alreadi:2,also:[2,4,5],alwai:9,anderson:[0,1],ani:[1,2,4,6,9],appli:[2,4],applic:[0,1,4,6,9],appropri:[0,1],arbitari:[2,4],archiv:[2,4],arg:4,around:0,ascii:[2,4],asn:9,aspx:2,assert:2,asynchron:[0,2,8],attempt:2,attribut:[2,4,6],atttempt:2,auth:4,authent:[2,4,7,8,9],authenthent:4,auto:[2,4],automat:[0,1,2,4],avail:[2,4,9],avoid:4,back:[0,1,2,4],base:[2,4,5,6,7,8,9],batch:4,bbb:[0,1],been:[2,4,7,8,9],befor:[2,4],begin:[2,4],between:9,bind:[0,1],bit:[2,4,9],bitwis:[2,4],blob:9,block:[0,1,2,9],both:[2,4],briefli:8,broadcast:[0,1],buffer:8,build_open:3,busi:[2,4],call:[0,1,2,4,6,8],callback:[0,4,8],can:[0,1,2,3,4,5,8,9],cannot:[2,3,4],captur:[2,4],care:8,cc232110:2,ccc:[0,1],chang:6,charact:[2,3,4,6],choic:[2,4],choos:[2,4],cif:[1,2,4,6,7,8,9],clear:2,click:[2,4],client:[2,4,9],client_machine_nam:[2,4],close:[1,2,3,4],closeconnect:4,code:3,com:2,come:9,comm_devic:5,command:[2,4],comment:5,commerci:9,commun:[2,4,5,9],compat:[2,4],complet:[2,4,7,9],compon:[2,3,4],comput:[2,4],concurr:[2,4],configur:[2,4],conflict:9,conn:2,connect:[2,4,7,8],connecttcp:4,constant:[5,9],constructor:8,contain:[1,2,4,5,6,9],content:[2,4],continu:[2,4],contribut:[0,1],control:[2,4],conveni:[2,4,6],copi:[2,4,9],correspond:6,could:[6,9],cover:9,creat:[0,1,2,3,4,8],create_tim:6,createdirectori:[2,4],creation:[5,6],credenti:[2,4],credienti:4,current:[2,7],dat:3,data:[2,3,4,8,9],data_buf:7,datetim:[2,4],ddd:[0,1],decod:9,def:4,defer:[0,4],defin:[0,1],delet:[2,3,4],deletedirectori:[2,4],deletefil:[2,4],depend:9,describ:[2,8],descript:5,detail:[6,8,9],detect:[2,4],determin:[0,1,2,4,9],develop:[2,6,9],devic:[5,6],dialect:9,differ:[2,4,8,9],digest:9,direct:[2,4],directli:[4,6],director:3,directori:[2,3,4,6],disabl:[2,4],disconnect:[2,4,7],discret:9,disk_tre:5,dixon:9,dmitri:9,doe:[2,4,6,9],domain:[2,4,9],done:[0,1],dot:[0,1],download:[4,9],due:8,each:[1,2,4,5,6],earliest:4,echo:[2,4],edit:[2,4],either:[2,4],element:[2,4],els:[2,4],empti:[0,1,2,3,4,6],enabl:[2,4],encod:9,encount:[2,6],encrypt:9,end:[2,4],english:[2,4],enterpris:[2,4],entir:4,entri:6,eof:[2,4],errback:[0,4],error:[2,4,8],establish:[2,4],etc:4,excee:4,except:[0,4],exercis:9,exist:[2,3,4],expos:4,facilit:9,factori:4,fail:[2,4,7,8],failur:0,fallback:[2,4],fals:[0,1,2,4],familiar:9,featur:[2,4,7],feeddata:8,fh2:3,file:[2,3,4,5,6,8,9],file_attribut:[2,4,6],file_attribute_norm:2,file_fh:3,file_obj:[2,4],file_s:[4,6],filenam:[2,4,6],fileretriev:4,files:2,filter:[2,4],find:[2,4,8],first:[2,3,4],flag:[0,1,2,4],folder:[2,3,4,6,9],follow:[2,3,4,5,9],forth:5,framework:[0,4],free:[0,1,9],freeli:[2,4],from:[0,1,2,3,4,8,9],functionl:4,further:2,gener:8,getattribut:[2,4],gmt:[2,4],googl:9,guess:[2,4],handl:[4,8],hash:9,have:[0,2,8,9],held:2,help:2,henc:[2,4,9],hidden:[2,4],hope:[0,1],host:[2,3,4],hostnam:3,http:2,iana:[0,1],identifi:[2,4],idl:2,illustr:[2,3,4],immedi:[2,4],implement:[0,1,2,4,8,9],impos:[2,4],includ:[8,9],incom:0,incomplet:8,index:9,indic:[0,1,2,4],individu:4,inform:[2,4,5,6],initi:[5,8],insid:[2,4],instal:[2,4,9],instanc:[0,1,2,4,6],instanti:[0,1,4,6],instiant:[0,1],integ:[0,1,2,4,6,9],integr:[5,9],interest:[2,4],intern:[4,8,9],internet:[0,4],interprocess:5,interv:4,invok:[2,4],involv:8,ipc:5,ipv4:1,is_direct_tcp:[2,4],isdirectori:6,isreadi:4,isreadonli:6,isspeci:5,istemporari:5,isusingsmb2:[2,4],itself:[4,9],jason:[0,1],just:[0,4],keep:2,keepal:2,know:[0,1,4],known:[2,4],kwarg:4,last:6,last_access_tim:6,last_attr_change_tim:6,last_write_tim:6,latest:9,learn:[2,4],least:2,leav:[0,1,2,4],length:6,lgpl:9,librari:[2,9],like:[2,3,4],limit:[2,4,6],linux:9,list:[0,1,2,4,9],listen:[0,1],listen_port:[0,1],listenudp:0,listpath:[2,4,6],listshar:[2,4],listsnapshot:[2,4],local:[2,4],local_fil:3,look:9,loop:8,loseconnect:4,machin:[0,1,2,3,4,9],made:[2,4,9],mai:[2,4],main:9,match:[0,1,2,4],max_length:[2,4],maximum:[2,4],md4:9,mean:4,meant:2,mechan:[2,4],messag:[2,4,7,9],method:[0,1,2,3,4,6,8],microsoft:[2,9],might:[2,4],miketeo:9,mit:9,mode:[0,1],modif:6,modifi:9,modul:[2,4,9],more:[2,4,6,8,9],most:[2,4,8,9],msdn:2,multipl:[2,4],must:[0,2,4],my_nam:[2,4],mypassword:3,myuserid:3,name:[0,1,2,3,4,5,6,9],namedtemporaryfil:[2,4],nbn:[1,9],need:[2,3,4,6,8,9],neg:[2,4],net:9,netbio:0,netbiosprotocol:[0,9],netbiossess:9,netbiostimeout:0,network:[0,1,2,4,9],never:[2,4],new_path:[2,4],newer:[2,4],next:2,nmb:[0,1,9],non:[2,4],none:[0,1,2,4,5,6,7],notat:[0,1,6],notconnectederror:[4,7],note:2,notreadyerror:[4,7],now:8,ntlm:[4,8,9],ntlmssp:9,ntlmv1:[2,4,9],ntlmv2:[2,4,9],number:[0,1,2,4,6],obj:[2,4],object:[2,3,4],occur:[2,4,7],offset:[2,4],often:8,old:[2,4],old_path:[2,4],onauthfail:[4,8],onauthok:[4,8],onc:[4,8],onli:[2,3,4,6,9],onnmbsessionfail:8,open:[2,3,4,9],opensourc:9,oper:[1,2,4,7,8,9],operationfailur:[2,4,7],opportun:4,organ:9,origin:[2,4,6],other:[2,4],otherwis:[2,4],out:[2,4],over:[2,4,9],overrid:[4,8],overwritten:[2,4],own:[4,8,9],packag:3,packet:[0,1,4,8],page:[8,9],paramet:[0,1,2,3,4,8,9],parent:3,pars:9,part:8,parti:9,pass:[2,3,4],password:[2,4],path:[2,3,4],path_file_pattern:[2,4],pathnam:[2,4],pattern:[2,4],perform:[0,1,2,4,8],period:4,persist:5,place:9,pleas:9,point:3,port:[0,1,2,4],posit:[2,4],possibl:9,post:[4,8],precis:4,present:7,print:[4,9],print_queu:5,proce:4,proceed:[2,4],process:[3,8],prohibit:6,project:[0,4,9],promis:9,properti:[2,4,6],protocol:[2,4,7,9],protocolerror:7,provid:[0,1,2,3,4,8,9],pure:9,purpos:9,pyasn1:9,pyde:9,pymsb:4,pysmb:[0,2,4,7],python:[2,3,4,9],queri:[0,1,2,4,9],queryipfornam:[0,1],querynam:[0,1],queue:4,rais:[0,2,3,4,7],reactor:[0,4],read:[2,3,4,6,8,9],readi:[4,7],receiv:[0,1,2,4],refer:[2,4,5,9],referenc:9,regardless:[2,4],regular:[2,4],reject:[2,4],rel:[2,4],relat:9,releas:[1,2],remot:[1,2,4,5,6,8],remote_nam:[2,4,8],remov:0,renam:[2,4],repli:[0,1,2,4],report:8,request:[2,4],requir:[2,4,7],reserv:5,reset:2,resetfileattribut:2,resourc:[1,2,4,6],respond:2,respons:7,result:[0,2,4],retri:4,retriev:[2,3,4],retrievefil:[2,4],retrievefilefactori:4,retrievefilefromoffset:[2,4],reus:4,rfc1001:[2,3,4],right:[2,4],routin:9,rozmanov:9,safe:[2,4],samba:9,sambda:[2,4],same:[2,4],search:[2,4,9],sec:4,second:[0,1,4,6],section:9,secur:9,securityblob:9,see:[2,4,6],seek:[2,4],select:[0,1,2,4],self:[4,8],send:[0,1,2,4],separ:9,sequenti:2,seri:4,server:[2,4,5,6,8,9],server_ip:[2,4],server_nam:[2,4],servic:[1,2,4,8,9],service_nam:[2,4],session:[8,9],set:[2,4],setup:[0,1,4,8],sha256:9,sha:9,shadow:[2,4],share:[2,3,4,5,6,9],shareddevic:[2,4],sharedfil:[2,4],sharedfold:3,short_nam:6,should:[0,1,2,4,6],side:9,sign:[2,4],sign_nev:[2,4],sign_opt:[2,4],sign_when_requir:[2,4],sign_when_support:[2,4],simpl:[2,4],simpli:3,sinc:6,singl:[2,4,5],site:9,size:[4,6],smb1:[2,4,9],smb2_constant:9,smb2_struct:9,smb:[1,2,3,4,5,6],smb_constant:[2,4,9],smb_ext_file_attr:6,smb_file_attribute_xxx:[2,4],smb_messag:7,smb_struct:[2,4,7,9],smbprotocol:[4,6,9],smbtest:[2,4],smbtimeout:[4,7],snapshot:[2,4],snippet:3,sock_famili:2,socket:[1,2,8],softwar:9,some:[2,4,9],sort:2,sourc:[0,1,2,4,5,6,7,9],sp3:9,space:[2,4],special:5,specif:9,specifi:[0,1,2,4],standard:[0,1,9],start:[0,2,4],step:8,stoplisten:0,store:[2,4,6],storefil:[2,4],storefilefromoffset:2,string:[0,1,2,3,4,5,6],style:9,sub:[2,4],subclass:[4,8],subsequ:3,success:[2,8],successfulli:[2,4],suitabl:[2,9],support_smb2:[2,4],synchron:[8,9],system:[2,4],take:[8,9],target:[0,1],tcp:[2,4,8],technic:[2,8],tempfil:[2,4],temporari:5,term:9,termin:[2,4],test:9,than:[2,4],thei:9,therefor:2,thi:[0,1,2,4,5,6,8,9],thoma:9,those:4,thousand:4,through:4,time:[2,4,5,6,9],timeout:[0,1,2,4,7],todd:9,togeth:9,too:2,total:6,touch:[0,1,4],transfer:[4,9],translat:9,transmit:4,transport:[0,4,9],truncat:2,tupl:[2,4],twist:[0,4,9],txt:[2,3,4],type:5,u32:9,udp:[0,1],ultim:[2,4],under:9,underli:[1,2,4,7,9],unicod:[2,3,4,5,6],unless:[0,1],unlock:2,unsign:9,unsupportedfeatur:7,until:[1,2,4],upload:[2,3,4],upload_fil:3,url:[3,9],urlerror:3,urllib2:[3,9],use_ntlm_v2:[2,4,8],user:[2,4,5],userid:[2,4],usernam:[2,4],usual:[2,4,6,8,9],utc:[2,4],utf:3,util:[2,4],valid:3,valu:[2,4,6],variou:9,veri:2,version:9,via:[0,4,6,9],vista:[2,4,9],wait:[0,1,4,7],want:[4,9],web:9,well:9,what:[0,1,2,4,8],when:[0,1,2,4,7,8,9],where:[2,4,6,9],whether:[2,4],which:[0,1,2,4,6,8,9],whiteman:9,who:[2,4,9],whose:9,wider:[2,4],wildcard:[2,4],window:[2,3,4,6,9],wish:[1,2],within:[2,4,9],without:[0,9],workgroup:[2,4],wrap:0,write:[2,4,8],write_result:4,written:[2,4],wrong:8,yet:7,you:[0,1,2,3,4,6,8,9],your:[0,1,2,4,6,8,9],yourself:9,zero:[0,1,2,4],zone:[2,4]},titles:["NBNSProtocol Class","NetBIOS class","SMBConnection Class","SMbHandler Class","SMBProtocolFactory Class","SharedDevice Class","SharedFile Class","SMB Exceptions","Extending pysmb For Other Frameworks","Welcome to pysmb&#8217;s documentation!"],titleterms:{"class":[0,1,2,3,4,5,6],caveat:[2,4],content:9,credit:9,descript:9,document:9,exampl:[2,3,4],except:7,extend:8,framework:8,indic:9,licens:9,nbnsprotocol:0,netbio:1,note:3,other:8,packag:9,pysmb:[8,9],shareddevic:5,sharedfil:6,smb2:[2,4],smb:7,smbconnect:2,smbhandler:3,smbprotocolfactori:4,support:[2,4],tabl:9,welcom:9}})āŽ
0 Search.setIndex({envversion:46,filenames:["api/nmb_NBNSProtocol","api/nmb_NetBIOS","api/smb_SMBConnection","api/smb_SMBHandler","api/smb_SMBProtocolFactory","api/smb_SharedDevice","api/smb_SharedFile","api/smb_exceptions","api/smb_security_descriptors","extending","index"],objects:{"nmb.NetBIOS":{NetBIOS:[1,0,1,""]},"nmb.NetBIOS.NetBIOS":{"__init__":[1,1,1,""],close:[1,1,1,""],queryIPForName:[1,1,1,""],queryName:[1,1,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[0,0,1,""],NetBIOSTimeout:[0,0,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{"__init__":[0,1,1,""],queryIPForName:[0,1,1,""],queryName:[0,1,1,""]},"smb.security_descriptors":{ACE:[8,0,1,""],ACL:[8,0,1,""],SID:[8,0,1,""],SecurityDescriptor:[8,0,1,""]},"smb.security_descriptors.ACE":{additional_data:[8,3,1,""],flags:[8,3,1,""],isInheritOnly:[8,3,1,""],mask:[8,3,1,""],sid:[8,3,1,""],type:[8,3,1,""]},"smb.security_descriptors.ACL":{aces:[8,3,1,""],revision:[8,3,1,""]},"smb.security_descriptors.SID":{identifier_authority:[8,3,1,""],revision:[8,3,1,""],subauthorities:[8,3,1,""]},"smb.security_descriptors.SecurityDescriptor":{dacl:[8,3,1,""],flags:[8,3,1,""],group:[8,3,1,""],owner:[8,3,1,""],sacl:[8,3,1,""]},"smb.smb_structs":{OperationFailure:[7,0,1,""],ProtocolError:[7,0,1,""],UnsupportedFeature:[7,0,1,""]},smb:{security_descriptors:[8,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute"},terms:{"3rd":10,"\u5783\u573e\u6587\u4ef6":3,"\u6d4b\u8bd5\u6587\u4ef6\u5939":3,"__init__":[0,1,4,9],"abstract":10,"boolean":[0,1],"case":4,"float":[0,1],"function":[0,1,4,10],"import":[2,3,4,10],"long":2,"new":[1,4,9],"public":4,"return":[0,1,2,3,4,10],"true":[0,1,2,4],"try":9,aaa:[0,1],abov:9,accept:[4,9],access:8,access_mask:8,accur:4,ace_type_:8,aceflag:8,acetyp:8,acl:8,add:[0,4],addcallback:[0,4],adderrback:4,addit:8,additional_data:8,address:[0,1,3,9,10],after:[0,1,2,4,10],again:0,against:10,algorithm:[9,10],all:[4,8,10],allow:0,alon:10,alwai:[8,10],anderson:[0,1],ani:[1,10],appli:8,applic:[0,1,4,10],application_data:8,appropri:[0,1],arbitari:[2,4],arg:4,around:0,ascii:[2,4],asn:10,assert:2,associ:8,asynchron:[0,2,9],attribute_data:8,audit:8,auth:4,authent:[4,9,10],authenthent:4,author:8,automat:[0,1,2,4],avail:10,avoid:4,back:[0,1,2,4],base:[9,10],batch:4,bbb:[0,1],been:[4,9,10],befor:[2,4],begin:[2,4],between:10,bind:[0,1],bit:10,bitmask:8,blob:10,block:[0,1,2,10],briefli:9,broadcast:[0,1],buffer:9,build_open:3,call:[0,1,4,9],callback:[0,9],can:[0,1,2,3,4,8,9,10],cannot:3,captur:[2,4],care:9,ccc:[0,1],charact:3,cif:[1,2,4,9,10],client:[2,4,10],client_machine_nam:[2,4],close:[1,2,3,4],closeconnect:4,code:3,come:10,commerci:10,commun:[2,4,10],complet:[2,4,10],compon:3,concurr:[2,4],conflict:10,conn:2,connect:[2,4,9],connecttcp:4,consist:8,constant:[8,10],constructor:9,contain:[1,10],content:[2,4],contribut:[0,1],control:8,conveni:8,copi:10,correspond:8,could:10,cover:10,creat:[0,1,2,3,4,9],current:7,dacl:8,dat:3,data:[3,8,9,10],data_buf:7,ddd:[0,1],decod:10,def:4,defer:[0,4],defin:[0,1],delet:3,depend:[8,10],describ:9,detail:[9,10],determin:[0,1,10],develop:[2,10],dialect:10,dictionari:8,differ:[9,10],digest:10,directli:4,director:3,directori:3,disabl:[2,4],disconnect:[2,4],discret:10,discretionari:8,dixon:10,dmitri:10,doe:10,doesn:8,domain:10,done:[0,1],dot:[0,1],download:10,dtyp:8,due:9,each:[1,2,4],els:[2,4],empti:[0,1,3],encapsul:8,encod:10,encount:2,encrypt:10,end:[2,4],entir:4,entri:8,errback:[0,4],error:[2,9],etc:4,except:[0,4],exercis:10,exist:3,expos:4,facilit:10,factori:4,fail:[2,4,9],failur:0,fallback:[2,4],fals:[0,1,2,4],familiar:10,featur:7,feeddata:9,fh2:3,field:8,file:[2,3,4,9,10],file_attribut:[2,4],file_fh:3,file_obj:[2,4],file_s:4,fileretriev:4,files:2,find:9,first:3,flag:[0,1,2,4,8],folder:[3,10],follow:[2,3,4,8,10],framework:[0,4],free:[0,1,10],from:[0,1,2,3,4,8,9,10],functionl:4,gener:9,googl:10,group:8,handl:[4,9],hash:10,have:[0,2,9,10],henc:10,hope:[0,1],host:3,hostnam:3,iana:[0,1],identifi:8,identifier_author:8,idl:2,illustr:[2,3,4],implement:[0,1,2,4,8,9,10],impos:[2,4],includ:[9,10],incom:0,incomplet:9,index:10,indic:[0,1,8],inherit:8,inherited_object_typ:8,initi:9,insid:[2,4],instal:10,instanc:[0,1,2,4,8],instanti:[0,1],instiant:[0,1],integ:[0,1,8,10],integr:10,interest:4,intern:[4,9,10],internet:[0,4],interv:4,invok:2,involv:9,ipv4:1,isinheritonli:8,itself:[8,10],jason:[0,1],just:[0,4],keep:2,keepal:2,know:[0,1,4],kwarg:4,latest:10,learn:4,leav:[0,1],length:8,lgpl:10,librari:10,like:3,limit:[2,4],linux:10,list:[0,1,8,10],listen:[0,1],listen_port:[0,1],listenudp:0,local_fil:3,log:8,look:10,loop:9,loseconnect:4,machin:[0,1,2,3,4,10],made:10,mai:[2,4],main:10,mask:8,match:[0,1,2,4],md4:10,mean:8,meant:2,mechan:[2,4],messag:[7,10],method:[0,1,2,3,4,9],microsoft:10,might:[2,4],miketeo:10,mit:10,mode:[0,1],modifi:10,modul:[2,4,8,10],more:[2,4,9,10],most:[2,4,9,10],must:[0,4],mypassword:3,myuserid:3,name:[0,1,2,3,4,10],namedtemporaryfil:[2,4],nbn:[1,10],need:[2,3,4,9,10],net:10,netbio:0,netbiosprotocol:[0,10],netbiossess:10,netbiostimeout:0,network:[0,1,10],nmb:[0,1,10],none:[0,1,7,8],notat:[0,1],notconnectederror:4,note:2,notreadyerror:4,now:9,ntlm:[9,10],ntlmssp:10,ntlmv1:10,ntlmv2:10,number:[0,1,4,8],obj:[2,4],object:[3,8],object_typ:8,often:9,onauthfail:[4,9],onauthok:[4,9],onc:[4,9],onli:[3,8,10],onnmbsessionfail:9,open:[3,10],opensourc:10,oper:[1,2,4,9,10],operationfailur:[4,7],organ:10,otherwis:[2,4],over:10,overrid:[4,9],own:[4,9,10],owner:8,packag:3,packet:[0,1,9],page:[9,10],paramet:[0,1,3,4,9,10],parent:3,pars:10,part:9,parti:10,pass:3,password:[2,4],path:[3,4],perform:[0,1,2,4,9],period:4,place:10,pleas:10,point:3,port:[0,1],posit:[2,4],possibl:10,post:[4,9],precis:4,present:[7,8],princip:8,print:[4,10],process:[3,9],project:[0,4,10],promis:10,properti:8,protocol:[2,4,7,10],protocolerror:7,provid:[0,1,3,4,9,10],pure:10,purpos:10,pyasn1:10,pyde:10,pymsb:4,pysmb:[0,2,4,7],python:[3,10],queri:[0,1,10],queryipfornam:[0,1],querynam:[0,1],queue:4,rais:[0,3,4,7],reactor:[0,4],read:[2,3,4,9,10],readi:4,receiv:[0,1],refer:10,referenc:10,reject:[2,4],relat:10,releas:1,remot:[1,2,4,9],remote_nam:9,remov:0,repli:[0,1],report:9,repres:8,requir:7,resourc:1,respond:2,restrict:8,result:[0,4],retriev:[2,3,4],retrievefil:[2,4],retrievefilefactori:4,reus:4,revis:8,rfc1001:[2,3,4],routin:10,rozmanov:10,sacl:8,samba:10,same:[2,4],search:10,sec:4,second:[0,1,4],section:10,security_descriptor:8,securityblob:10,securitydescriptor:8,see:8,seek:[2,4],select:[0,1],self:[4,9],send:[0,1],separ:10,sequenc:8,sequenti:2,server:[2,4,9,10],server_ip:[2,4],server_nam:[2,4],servic:[1,2,4,9,10],session:[9,10],set:[2,4],setup:[0,1,4,9],sha256:10,sha:10,share:[3,10],sharedfold:3,should:[0,1,2,4,8],sid:8,side:10,simpl:[2,4],simpli:3,singl:[2,8],site:10,smb1:[2,4,10],smb2_constant:10,smb2_struct:10,smb:[1,2,3,4],smb_constant:10,smb_messag:7,smb_struct:[2,4,7,10],smbprotocol:[4,10],smbtest:[2,4],smbtimeout:4,snippet:3,socket:[1,9],softwar:10,some:[2,4,10],sort:2,sourc:[0,1,7,8,10],sp3:10,specif:10,specifi:[0,1,4,8],standard:[0,1,10],start:[0,2,4],step:9,stoplisten:0,storefil:4,string:[0,1,2,3,4],structur:8,style:10,subauthor:8,subclass:[4,9],subsequ:3,success:9,suitabl:[2,10],support_smb2:[2,4],synchron:[9,10],system:8,take:[9,10],target:[0,1],tcp:9,technic:9,tempfil:[2,4],term:10,termin:4,test:10,than:[2,4],thei:10,thi:[0,1,4,8,9,10],thoma:10,those:4,thousand:4,through:4,time:[2,4,10],timeout:[0,1,2,4],todd:10,togeth:10,too:2,touch:[0,1,4],transfer:[4,10],translat:10,transport:[0,4,10],truste:8,twist:[0,4,10],txt:[2,3,4],type:8,type_:8,u32:10,udp:[0,1],under:10,underli:[1,4,10],unicod:3,unless:[0,1],unsign:10,unsupportedfeatur:7,until:1,upload:3,upload_fil:3,url:[3,10],urlerror:3,urllib2:[3,10],use_ntlm_v2:[2,4,9],user:8,userid:[2,4],usual:[4,9,10],utf:3,util:[2,4],valid:3,valu:8,variabl:8,variou:10,version:10,via:[0,4,10],vista:10,wait:[0,1,4],want:[4,10],web:10,well:10,what:[0,1,2,4,9],when:[0,1,2,4,7,9,10],where:[4,10],which:[0,1,8,9,10],whiteman:10,who:[2,4,10],whose:10,window:[3,8,10],wish:[1,2],within:[2,4,10],without:[0,10],wrap:0,write:9,write_result:4,wrong:9,you:[0,1,2,3,4,9,10],your:[0,1,4,9,10],yourself:10,zero:[0,1]},titles:["NBNSProtocol Class","NetBIOS class","SMBConnection Class","SMbHandler Class","SMBProtocolFactory Class","SharedDevice Class","SharedFile Class","SMB Exceptions","Security Descriptors","Extending pysmb For Other Frameworks","Welcome to pysmb&#8217;s documentation!"],titleterms:{"class":[0,1,2,3,4,5,6],caveat:[2,4],content:10,credit:10,descript:10,descriptor:8,document:10,exampl:[2,3,4],except:7,extend:9,framework:9,indic:10,licens:10,nbnsprotocol:0,netbio:1,note:3,other:9,packag:10,pysmb:[9,10],secur:8,shareddevic:5,sharedfil:6,smb2:[2,4],smb:7,smbconnect:2,smbhandler:3,smbprotocolfactori:4,support:[2,4],tabl:10,welcom:10}})āŽ
7676 self.onNMBSessionOK()
7777 elif packet.type == NEGATIVE_SESSION_RESPONSE:
7878 self.onNMBSessionFailed()
79 elif packet.type == SESSION_KEEPALIVE:
80 # Discard keepalive packets - [RFC1002]: 5.2.2.1
81 pass
7982 else:
8083 self.log.warning('Unrecognized NMB session type: 0x%02x', packet.type)
8184
0 Metadata-Version: 1.1
1 Name: pysmb
2 Version: 1.1.26
3 Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
4 Home-page: https://miketeo.net/projects/pysmb
5 Author: Michael Teo
6 Author-email: [email protected]
7 License: zlib/libpng
8 Description: pysmb is an experimental SMB/CIFS library written in Python. It implements the client-side SMB/CIFS protocol which allows your Python application to access and transfer files to/from SMB/CIFS shared folders like your Windows file sharing and Samba folders.
9 Keywords: windows samba cifs sharing ftp smb linux
10 Platform: UNKNOWN
11 Classifier: Development Status :: 5 - Production/Stable
12 Classifier: Environment :: Win32 (MS Windows)
13 Classifier: Environment :: Console
14 Classifier: License :: OSI Approved :: zlib/libpng License
15 Classifier: Operating System :: Microsoft :: Windows
16 Classifier: Operating System :: POSIX
17 Classifier: Programming Language :: Python
18 Classifier: Programming Language :: Python :: 2.7
19 Classifier: Programming Language :: Python :: 3
20 Classifier: Topic :: Communications :: File Sharing
21 Classifier: Topic :: Software Development :: Libraries :: Python Modules
22 Classifier: Topic :: System :: Networking
0 CHANGELOG
1 LICENSE
2 MANIFEST.in
3 README.txt
4 setup.py
5 docs/doctrees/environment.pickle
6 docs/doctrees/extending.doctree
7 docs/doctrees/index.doctree
8 docs/doctrees/api/nmb_NBNSProtocol.doctree
9 docs/doctrees/api/nmb_NetBIOS.doctree
10 docs/doctrees/api/smb_SMBConnection.doctree
11 docs/doctrees/api/smb_SMBHandler.doctree
12 docs/doctrees/api/smb_SMBProtocolFactory.doctree
13 docs/doctrees/api/smb_SharedDevice.doctree
14 docs/doctrees/api/smb_SharedFile.doctree
15 docs/doctrees/api/smb_exceptions.doctree
16 docs/doctrees/api/smb_security_descriptors.doctree
17 docs/html/.buildinfo
18 docs/html/extending.html
19 docs/html/genindex.html
20 docs/html/index.html
21 docs/html/objects.inv
22 docs/html/py-modindex.html
23 docs/html/search.html
24 docs/html/searchindex.js
25 docs/html/_modules/index.html
26 docs/html/_modules/nmb/NetBIOS.html
27 docs/html/_modules/nmb/NetBIOSProtocol.html
28 docs/html/_modules/smb/security_descriptors.html
29 docs/html/_modules/smb/smb_structs.html
30 docs/html/_sources/extending.txt
31 docs/html/_sources/index.txt
32 docs/html/_sources/api/nmb_NBNSProtocol.txt
33 docs/html/_sources/api/nmb_NetBIOS.txt
34 docs/html/_sources/api/smb_SMBConnection.txt
35 docs/html/_sources/api/smb_SMBHandler.txt
36 docs/html/_sources/api/smb_SMBProtocolFactory.txt
37 docs/html/_sources/api/smb_SharedDevice.txt
38 docs/html/_sources/api/smb_SharedFile.txt
39 docs/html/_sources/api/smb_exceptions.txt
40 docs/html/_sources/api/smb_security_descriptors.txt
41 docs/html/_static/ajax-loader.gif
42 docs/html/_static/basic.css
43 docs/html/_static/comment-bright.png
44 docs/html/_static/comment-close.png
45 docs/html/_static/comment.png
46 docs/html/_static/contents.png
47 docs/html/_static/doctools.js
48 docs/html/_static/down-pressed.png
49 docs/html/_static/down.png
50 docs/html/_static/file.png
51 docs/html/_static/jquery.js
52 docs/html/_static/minus.png
53 docs/html/_static/navigation.png
54 docs/html/_static/plus.png
55 docs/html/_static/pygments.css
56 docs/html/_static/searchtools.js
57 docs/html/_static/sphinxdoc.css
58 docs/html/_static/underscore.js
59 docs/html/_static/up-pressed.png
60 docs/html/_static/up.png
61 docs/html/_static/websupport.js
62 docs/html/api/nmb_NBNSProtocol.html
63 docs/html/api/nmb_NetBIOS.html
64 docs/html/api/smb_SMBConnection.html
65 docs/html/api/smb_SMBHandler.html
66 docs/html/api/smb_SMBProtocolFactory.html
67 docs/html/api/smb_SharedDevice.html
68 docs/html/api/smb_SharedFile.html
69 docs/html/api/smb_exceptions.html
70 docs/html/api/smb_security_descriptors.html
71 python2/nmb/NetBIOS.py
72 python2/nmb/NetBIOSProtocol.py
73 python2/nmb/__init__.py
74 python2/nmb/base.py
75 python2/nmb/nmb_constants.py
76 python2/nmb/nmb_structs.py
77 python2/nmb/utils.py
78 python2/pysmb.egg-info/PKG-INFO
79 python2/pysmb.egg-info/SOURCES.txt
80 python2/pysmb.egg-info/dependency_links.txt
81 python2/pysmb.egg-info/requires.txt
82 python2/pysmb.egg-info/top_level.txt
83 python2/smb/SMBConnection.py
84 python2/smb/SMBHandler.py
85 python2/smb/SMBProtocol.py
86 python2/smb/__init__.py
87 python2/smb/base.py
88 python2/smb/ntlm.py
89 python2/smb/security_descriptors.py
90 python2/smb/securityblob.py
91 python2/smb/smb2_constants.py
92 python2/smb/smb2_structs.py
93 python2/smb/smb_constants.py
94 python2/smb/smb_structs.py
95 python2/smb/utils/README.txt
96 python2/smb/utils/U32.py
97 python2/smb/utils/__init__.py
98 python2/smb/utils/md4.py
99 python2/smb/utils/pyDes.py
100 python2/smb/utils/sha256.py
101 python2/tests/README_1st.txt
102 python2/tests/__init__.py
103 python2/tests/connection.ini
104 python2/tests/test_ntlm.py
105 python2/tests/test_security_descriptors.py
106 python2/tests/test_securityblob.py
107 python2/tests/DirectSMBConnectionTests/__init__.py
108 python2/tests/DirectSMBConnectionTests/test_SMBHandler.py
109 python2/tests/DirectSMBConnectionTests/test_auth.py
110 python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
111 python2/tests/DirectSMBConnectionTests/test_echo.py
112 python2/tests/DirectSMBConnectionTests/test_listpath.py
113 python2/tests/DirectSMBConnectionTests/test_listshares.py
114 python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
115 python2/tests/DirectSMBConnectionTests/test_rename.py
116 python2/tests/DirectSMBConnectionTests/test_retrievefile.py
117 python2/tests/DirectSMBConnectionTests/test_storefile.py
118 python2/tests/DirectSMBConnectionTests/util.py
119 python2/tests/DirectSMBTwistedTests/test_auth.py
120 python2/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
121 python2/tests/DirectSMBTwistedTests/test_echo.py
122 python2/tests/DirectSMBTwistedTests/test_listpath.py
123 python2/tests/DirectSMBTwistedTests/test_listshares.py
124 python2/tests/DirectSMBTwistedTests/test_listsnapshots.py
125 python2/tests/DirectSMBTwistedTests/test_rename.py
126 python2/tests/DirectSMBTwistedTests/test_retrievefile.py
127 python2/tests/DirectSMBTwistedTests/test_storefile.py
128 python2/tests/DirectSMBTwistedTests/util.py
129 python2/tests/NetBIOSTests/__init__.py
130 python2/tests/NetBIOSTests/test_queryname.py
131 python2/tests/NetBIOSTwistedTests/__init__.py
132 python2/tests/NetBIOSTwistedTests/test_queryname.py
133 python2/tests/SMBConnectionTests/__init__.py
134 python2/tests/SMBConnectionTests/test_SMBHandler.py
135 python2/tests/SMBConnectionTests/test_auth.py
136 python2/tests/SMBConnectionTests/test_createdeletedirectory.py
137 python2/tests/SMBConnectionTests/test_deletepattern.py
138 python2/tests/SMBConnectionTests/test_echo.py
139 python2/tests/SMBConnectionTests/test_getattributes.py
140 python2/tests/SMBConnectionTests/test_listpath.py
141 python2/tests/SMBConnectionTests/test_listshares.py
142 python2/tests/SMBConnectionTests/test_listsnapshots.py
143 python2/tests/SMBConnectionTests/test_rename.py
144 python2/tests/SMBConnectionTests/test_retrievefile.py
145 python2/tests/SMBConnectionTests/test_security.py
146 python2/tests/SMBConnectionTests/test_storefile.py
147 python2/tests/SMBConnectionTests/test_with_context.py
148 python2/tests/SMBConnectionTests/util.py
149 python2/tests/SMBTwistedTests/__init__.py
150 python2/tests/SMBTwistedTests/test_auth.py
151 python2/tests/SMBTwistedTests/test_createdeletedirectory.py
152 python2/tests/SMBTwistedTests/test_echo.py
153 python2/tests/SMBTwistedTests/test_getattributes.py
154 python2/tests/SMBTwistedTests/test_listpath.py
155 python2/tests/SMBTwistedTests/test_listshares.py
156 python2/tests/SMBTwistedTests/test_listsnapshots.py
157 python2/tests/SMBTwistedTests/test_rename.py
158 python2/tests/SMBTwistedTests/test_retrievefile.py
159 python2/tests/SMBTwistedTests/test_storefile.py
160 python2/tests/SMBTwistedTests/util.py
161 python2/tests/SupportFiles/binary.dat
162 python3/nmb/NetBIOS.py
163 python3/nmb/NetBIOSProtocol.py
164 python3/nmb/__init__.py
165 python3/nmb/base.py
166 python3/nmb/nmb_constants.py
167 python3/nmb/nmb_structs.py
168 python3/nmb/utils.py
169 python3/pysmb.egg-info/PKG-INFO
170 python3/pysmb.egg-info/SOURCES.txt
171 python3/pysmb.egg-info/dependency_links.txt
172 python3/pysmb.egg-info/requires.txt
173 python3/pysmb.egg-info/top_level.txt
174 python3/smb/SMBConnection.py
175 python3/smb/SMBHandler.py
176 python3/smb/SMBProtocol.py
177 python3/smb/__init__.py
178 python3/smb/base.py
179 python3/smb/ntlm.py
180 python3/smb/security_descriptors.py
181 python3/smb/securityblob.py
182 python3/smb/smb2_constants.py
183 python3/smb/smb2_structs.py
184 python3/smb/smb_constants.py
185 python3/smb/smb_structs.py
186 python3/smb/utils/U32.py
187 python3/smb/utils/__init__.py
188 python3/smb/utils/md4.py
189 python3/smb/utils/pyDes.py
190 python3/smb/utils/sha256.py
191 python3/tests/README_1st.txt
192 python3/tests/__init__.py
193 python3/tests/connection.ini
194 python3/tests/test_ntlm.py
195 python3/tests/test_security_descriptors.py
196 python3/tests/test_securityblob.py
197 python3/tests/DirectSMBConnectionTests/__init__.py
198 python3/tests/DirectSMBConnectionTests/test_auth.py
199 python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
200 python3/tests/DirectSMBConnectionTests/test_echo.py
201 python3/tests/DirectSMBConnectionTests/test_listpath.py
202 python3/tests/DirectSMBConnectionTests/test_listshares.py
203 python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
204 python3/tests/DirectSMBConnectionTests/test_rename.py
205 python3/tests/DirectSMBConnectionTests/test_retrievefile.py
206 python3/tests/DirectSMBConnectionTests/test_storefile.py
207 python3/tests/DirectSMBConnectionTests/util.py
208 python3/tests/NetBIOSTests/__init__.py
209 python3/tests/NetBIOSTests/test_queryname.py
210 python3/tests/SMBConnectionTests/__init__.py
211 python3/tests/SMBConnectionTests/test_SMBHandler.py
212 python3/tests/SMBConnectionTests/test_auth.py
213 python3/tests/SMBConnectionTests/test_createdeletedirectory.py
214 python3/tests/SMBConnectionTests/test_deletepattern.py
215 python3/tests/SMBConnectionTests/test_echo.py
216 python3/tests/SMBConnectionTests/test_getattributes.py
217 python3/tests/SMBConnectionTests/test_listpath.py
218 python3/tests/SMBConnectionTests/test_listshares.py
219 python3/tests/SMBConnectionTests/test_listsnapshots.py
220 python3/tests/SMBConnectionTests/test_rename.py
221 python3/tests/SMBConnectionTests/test_retrievefile.py
222 python3/tests/SMBConnectionTests/test_security.py
223 python3/tests/SMBConnectionTests/test_storefile.py
224 python3/tests/SMBConnectionTests/test_with_context.py
225 python3/tests/SMBConnectionTests/util.py
226 python3/tests/SupportFiles/binary.dat
227 sphinx/Makefile
228 sphinx/make.bat
229 sphinx/requirements.txt
230 sphinx/source/conf.py
231 sphinx/source/extending.rst
232 sphinx/source/index.rst
233 sphinx/source/api/nmb_NBNSProtocol.rst
234 sphinx/source/api/nmb_NetBIOS.rst
235 sphinx/source/api/smb_SMBConnection.rst
236 sphinx/source/api/smb_SMBHandler.rst
237 sphinx/source/api/smb_SMBProtocolFactory.rst
238 sphinx/source/api/smb_SharedDevice.rst
239 sphinx/source/api/smb_SharedFile.rst
240 sphinx/source/api/smb_exceptions.rst
241 sphinx/source/api/smb_security_descriptors.rstāŽ
7171 total_sent = total_sent + sent
7272
7373 #
74 # Support for "with" context
75 #
76 def __enter__(self):
77 return self
78
79 def __exit__(self, *args):
80 self.close()
81
82 #
7483 # Misc Properties
7584 #
7685
152161 return results
153162
154163 def listPath(self, service_name, path,
155 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
164 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
156165 pattern = '*', timeout = 30):
157166 """
158167 Retrieve a directory listing of files/folders at *path*
168
169 For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
170 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
171
172 Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
173 system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
174 and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
175 If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
176 SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
159177
160178 :param string/unicode service_name: the name of the shared folder for the *path*
161179 :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
162180 :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
163 The default *search* value will query for all read-only, hidden, system, archive files and directories.
164181 :param string/unicode pattern: the filter to apply to the results before returning to the client.
165182 :return: A list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
166183 """
244261 self.is_busy = True
245262 try:
246263 self._getAttributes(service_name, path, cb, eb, timeout)
264 while self.is_busy:
265 self._pollForNetBIOSPacket(timeout)
266 finally:
267 self.is_busy = False
268
269 return results[0]
270
271 def getSecurity(self, service_name, path, timeout = 30):
272 """
273 Retrieve the security descriptor of the file at *path* on the *service_name*.
274
275 :param string/unicode service_name: the name of the shared folder for the *path*
276 :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure<smb_exceptions>` will be raised.
277 :return: A :class:`smb.security_descriptors.SecurityDescriptor` instance containing the security information of the file.
278 """
279 if not self.sock:
280 raise NotConnectedError('Not connected to server')
281
282 results = [ ]
283
284 def cb(info):
285 self.is_busy = False
286 results.append(info)
287
288 def eb(failure):
289 self.is_busy = False
290 raise failure
291
292 self.is_busy = True
293 try:
294 self._getSecurity(service_name, path, cb, eb, timeout)
247295 while self.is_busy:
248296 self._pollForNetBIOSPacket(timeout)
249297 finally:
383431 It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
384432 This function is very helpful when deleting files/folders that are read-only.
385433 Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)
386
434
387435 :param string/unicode service_name: Contains the name of the shared folder.
388436 :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
389437 Wildcards may be used in the filename component of the path.
494542 """
495543 Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
496544
497 :param string data: Data to send to the remote server.
545 :param bytes data: Data to send to the remote server. Must be a bytes object.
498546 :return: The *data* parameter
499547 """
500548 if not self.sock:
552600 raise ex
553601
554602 type_, flags, length = struct.unpack('>BBH', data)
555 if flags & 0x01:
556 length = length | 0x10000
603 if type_ == 0x0:
604 # This is a Direct TCP packet
605 # The length is specified in the header from byte 8. (0-indexed)
606 # we read a structure assuming NBT, so to get the real length
607 # combine the length and flag fields together
608 length = length + (flags << 16)
609 else:
610 # This is a NetBIOS over TCP (NBT) packet
611 # The length is specified in the header from byte 16. (0-indexed)
612 if flags & 0x01:
613 length = length | 0x10000
557614
558615 read_len = length
559616 while read_len > 0:
176176 return d
177177
178178 def listPath(self, service_name, path,
179 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
179 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
180180 pattern = '*', timeout = 30):
181181 """
182182 Retrieve a directory listing of files/folders at *path*
183
184 For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
185 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
186
187 Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
188 system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
189 and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
190 If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
191 SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
183192
184193 :param string/unicode service_name: the name of the shared folder for the *path*
185194 :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
186195 :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
187 The default *search* value will query for all read-only, hidden, system, archive files and directories.
188196 :param string/unicode pattern: the filter to apply to the results before returning to the client.
189197 :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
190198 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
367375 """
368376 Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
369377
370 :param string data: Data to send to the remote server.
378 :param bytes data: Data to send to the remote server. Must be a bytes object.
371379 :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
372380 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.
373381 """
44 from smb2_constants import *
55 from smb_structs import *
66 from smb2_structs import *
7 from .security_descriptors import SecurityDescriptor
78 from nmb.base import NMBSession
89 from utils import convertFILETIMEtoEpoch
910 import ntlm, securityblob
6364 self.sign_options = sign_options
6465 self.is_direct_tcp = is_direct_tcp
6566 self.use_ntlm_v2 = use_ntlm_v2 #: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1
66 self.smb_message = SMBMessage()
67 self.smb_message = SMBMessage(self)
6768 self.is_using_smb2 = False #: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True
69 self.async_requests = { } #: AsyncID mapped to _PendingRequest instance
6870 self.pending_requests = { } #: MID mapped to _PendingRequest instance
6971 self.connected_trees = { } #: Share name mapped to TID
7072 self.next_rpc_call_id = 1 #: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages
9597 self.max_write_size = 0 #: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4
9698 self.max_transact_size = 0 #: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4
9799 self.session_id = 0 #: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method
100 self.smb2_dialect = 0
101
102
103 # SMB 2.1 attributes
104 self.cap_leasing = False
105 self.cap_multi_credit = False
106 self.credits = 0 # how many credits we're allowed to spend per request
98107
99108 self._setupSMB1Methods()
100109
109118 #
110119
111120 def onNMBSessionOK(self):
112 self._sendSMBMessage(SMBMessage(ComNegotiateRequest()))
121 self._sendSMBMessage(SMBMessage(self, ComNegotiateRequest()))
113122
114123 def onNMBSessionFailed(self):
115124 pass
123132 self.is_using_smb2 = True
124133 self.mid = 0 # Must reset messageID counter, or else remote SMB2 server will disconnect
125134 self._setupSMB2Methods()
126 self.smb_message = self._klassSMBMessage()
135 self.smb_message = self._klassSMBMessage(self)
127136 i = self.smb_message.decode(data)
137 self.log.info('SMB2 dialect is 0x%04x', self.smb2_dialect)
128138
129139 next_message_offset = 0
130140 if self.is_using_smb2:
131141 next_message_offset = self.smb_message.next_command_offset
142
143 # update how many credits we're allowed to spend on requests
144 self.credits = self.smb_message.credit_response
145
146 # SMB2 CANCEL commands do not consume message IDs
147 if self.smb_message.command != SMB2_COM_CANCEL:
148 self.log.debug('Received SMB2 packet from server - "%s" (command:0x%02X). Credit charge recv: %s',
149 SMB_COMMAND_NAMES.get(self.smb_message.command, '<unknown>'), self.smb_message.command, self.smb_message.credit_charge)
150 if self.smb_message.credit_charge > 0:
151 # Let's update the sequenceWindow based on the CreditsCharged
152 # In the SMB 2.0.2 dialect, this field MUST NOT be used and MUST be reserved.
153 # The sender MUST set this to 0, and the receiver MUST ignore it.
154 # In all other dialects, this field indicates the number of credits that this request consumes.
155 self.log.debug("Updating MID to add credit charge from server...")
156 self.log.debug("*** Before: " + str(self.mid))
157 self.mid = self.mid + (self.smb_message.credit_charge - 1)
158 self.log.debug("*** After: " + str(self.mid))
132159
133160 if i > 0:
134161 if not self.is_using_smb2:
141168 self.smb_message.command, self.smb_message.flags)
142169 if self._updateState(self.smb_message):
143170 # We need to create a new instance instead of calling reset() because the instance could be captured in the message history.
144 self.smb_message = self._klassSMBMessage()
171 self.smb_message = self._klassSMBMessage(self)
145172
146173 if next_message_offset > 0:
147174 data = data[next_message_offset:]
172199 self._listShares = self._listShares_SMB1
173200 self._listPath = self._listPath_SMB1
174201 self._listSnapshots = self._listSnapshots_SMB1
202 self._getSecurity = self._getSecurity_SMB1
175203 self._getAttributes = self._getAttributes_SMB1
176204 self._retrieveFile = self._retrieveFile_SMB1
177205 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
195223 self._listPath = self._listPath_SMB2
196224 self._listSnapshots = self._listSnapshots_SMB2
197225 self._getAttributes = self._getAttributes_SMB2
226 self._getSecurity = self._getSecurity_SMB2
198227 self._retrieveFile = self._retrieveFile_SMB2
199228 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
200229 self._storeFile = self._storeFile_SMB2
218247 if smb_message.mid == 0:
219248 smb_message.mid = self._getNextMID_SMB2()
220249
221 if smb_message.command != SMB2_COM_NEGOTIATE and smb_message.command != SMB2_COM_ECHO:
250 if smb_message.command != SMB2_COM_NEGOTIATE:
222251 smb_message.session_id = self.session_id
223252
224253 if self.is_signing_active:
240269 if message.isReply:
241270 if message.command == SMB2_COM_NEGOTIATE:
242271 if message.status == 0:
243 self.has_negotiated = True
244 self.log.info('SMB2 dialect negotiation successful')
245 self._updateServerInfo(message.payload)
246 self._handleNegotiateResponse(message)
272
273 if self.smb_message.payload.dialect_revision == SMB2_DIALECT_2ALL:
274 # Dialects from SMB 2.1 must be negotiated in a second negotiate phase
275 # We send a SMB2 Negotiate Request to accomplish this
276 self._sendSMBMessage(SMB2Message(self, SMB2NegotiateRequest()))
277 else:
278 if self.smb_message.payload.dialect_revision == SMB2_DIALECT_21:
279 # We negotiated SMB 2.1.
280 # we must now send credit requests (MUST!)
281 #self.send_credits_request = True
282 pass
283
284 self.has_negotiated = True
285 self.log.info('SMB2 dialect negotiation successful')
286 self.dialect = self.smb_message.payload.dialect_revision
287 self._updateServerInfo(message.payload)
288 self._handleNegotiateResponse(message)
247289 else:
248290 raise ProtocolError('Unknown status value (0x%08X) in SMB2_COM_NEGOTIATE' % message.status,
249291 message.raw_data, message)
255297 if result == securityblob.RESULT_ACCEPT_COMPLETED:
256298 self.has_authenticated = True
257299 self.log.info('Authentication (on SMB2) successful!')
300
301 # [MS-SMB2]: 3.2.5.3.1
302 # If the security subsystem indicates that the session was established by an anonymous user,
303 # Session.SigningRequired MUST be set to FALSE.
304 # If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags field of the
305 # SMB2 SESSION_SETUP Response and if Session.SigningRequired is TRUE, this indicates a SESSION_SETUP
306 # failure and the connection MUST be terminated. If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags
307 # field of the SMB2 SESSION_SETUP Response and if RequireMessageSigning is FALSE, Session.SigningRequired
308 # MUST be set to FALSE.
309 if message.payload.isGuestSession or message.payload.isAnonymousSession:
310 self.is_signing_active = False
311 self.log.info('Signing disabled because session is guest/anonymous')
312
258313 self.onAuthOK()
259314 else:
260315 raise ProtocolError('SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is %d' % result, message.raw_data, message)
268323 self._handleSessionChallenge(message, ntlm_token)
269324 except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ), ex:
270325 raise ProtocolError(str(ex), message.raw_data, message)
271 elif message.status == 0xc000006d: # STATUS_LOGON_FAILURE
326 elif (message.status == 0xc000006d # STATUS_LOGON_FAILURE
327 or message.status == 0xc0000064 # STATUS_NO_SUCH_USER
328 or message.status == 0xc000006a):# STATUS_WRONG_PASSWORD
272329 self.has_authenticated = False
273330 self.log.info('Authentication (on SMB2) failed. Please check username and password.')
274331 self.onAuthFailed()
332 elif (message.status == 0xc0000193 # STATUS_ACCOUNT_EXPIRED
333 or message.status == 0xC0000071): # STATUS_PASSWORD_EXPIRED
334 self.has_authenticated = False
335 self.log.info('Authentication (on SMB2) failed. Account or password has expired.')
336 self.onAuthFailed()
337 elif message.status == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
338 self.has_authenticated = False
339 self.log.info('Authentication (on SMB2) failed. Account has been locked due to too many invalid logon attempts.')
340 self.onAuthFailed()
341 elif message.status == 0xc0000072: # STATUS_ACCOUNT_DISABLED
342 self.has_authenticated = False
343 self.log.info('Authentication (on SMB2) failed. Account has been disabled.')
344 self.onAuthFailed()
345 elif (message.status == 0xc000006f # STATUS_INVALID_LOGON_HOURS
346 or message.status == 0xc000015b # STATUS_LOGON_TYPE_NOT_GRANTED
347 or message.status == 0xc0000070): # STATUS_INVALID_WORKSTATION
348 self.has_authenticated = False
349 self.log.info('Authentication (on SMB2) failed. Not allowed.')
350 self.onAuthFailed()
351 elif message.status == 0xc000018c: # STATUS_TRUSTED_DOMAIN_FAILURE
352 self.has_authenticated = False
353 self.log.info('Authentication (on SMB2) failed. Domain not trusted.')
354 self.onAuthFailed()
355 elif message.status == 0xc000018d: # STATUS_TRUSTED_RELATIONSHIP_FAILURE
356 self.has_authenticated = False
357 self.log.info('Authentication (on SMB2) failed. Workstation not trusted.')
358 self.onAuthFailed()
275359 else:
276360 raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status,
277361 message.raw_data, message)
278362
279 req = self.pending_requests.pop(message.mid, None)
280 if req:
281 req.callback(message, **req.kwargs)
282 return True
363 if message.isAsync:
364 if message.status == 0x00000103: # STATUS_PENDING
365 req = self.pending_requests.pop(message.mid, None)
366 if req:
367 self.async_requests[message.async_id] = req
368 else: # All other status including SUCCESS
369 req = self.async_requests.pop(message.async_id, None)
370 if req:
371 req.callback(message, **req.kwargs)
372 return True
373 else:
374 req = self.pending_requests.pop(message.mid, None)
375 if req:
376 req.callback(message, **req.kwargs)
377 return True
283378
284379
285380 def _updateServerInfo_SMB2(self, payload):
290385 self.max_write_size = payload.max_write_size
291386 self.use_plaintext_authentication = False # SMB2 never allows plaintext authentication
292387
388 if (self.capabilities & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
389 self.cap_leasing = True
390
391 if (self.capabilities & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
392 self.cap_multi_credit = True
393
293394
294395 def _handleNegotiateResponse_SMB2(self, message):
295396 ntlm_data = ntlm.generateNegotiateMessage()
296397 blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
297 self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
398 self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
298399
299400
300401 def _handleSessionChallenge_SMB2(self, message, ntlm_token):
319420 lm_challenge_response,
320421 session_key,
321422 self.username,
322 self.domain)
423 self.domain,
424 self.my_name)
323425
324426 if self.log.isEnabledFor(logging.DEBUG):
325427 self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
326428 self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
327429
328430 blob = securityblob.generateAuthSecurityBlob(ntlm_data)
329 self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
431 self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
330432
331433 if self.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED:
332434 self.log.info('Server requires all SMB messages to be signed')
357459 messages_history = [ ]
358460
359461 def connectSrvSvc(tid):
360 m = SMB2Message(SMB2CreateRequest('srvsvc',
462 m = SMB2Message(self, SMB2CreateRequest('srvsvc',
361463 file_attributes = 0,
362464 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
363465 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
368470
369471 m.tid = tid
370472 self._sendSMBMessage(m)
371 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback)
473 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback, tid = tid)
372474 messages_history.append(m)
373475
374476 def connectSrvSvcCB(create_message, **kwargs):
389491 2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00
390492 01 00 00 00
391493 """.replace(' ', '').replace('\n', ''))
392 m = SMB2Message(SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
393 m.tid = create_message.tid
494 m = SMB2Message(self, SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
495 m.tid = kwargs['tid']
394496 self._sendSMBMessage(m)
395 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, fid = create_message.payload.fid)
497 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
396498 messages_history.append(m)
397499 else:
398500 errback(OperationFailure('Failed to list shares: Unable to locate Server Service RPC endpoint', messages_history))
400502 def rpcBindCB(trans_message, **kwargs):
401503 messages_history.append(trans_message)
402504 if trans_message.status == 0:
403 m = SMB2Message(SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
404 m.tid = trans_message.tid
505 m = SMB2Message(self, SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
506 m.tid = kwargs['tid']
405507 self._sendSMBMessage(m)
406 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, fid = kwargs['fid'])
508 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
407509 messages_history.append(m)
408510 else:
409 closeFid(trans_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
511 closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
410512
411513 def rpcReadCB(read_message, **kwargs):
412514 messages_history.append(read_message)
433535 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
434536 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
435537 """.replace(' ', '').replace('\n', ''))
436 m = SMB2Message(SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
437 m.tid = read_message.tid
538 m = SMB2Message(self, SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
539 m.tid = kwargs['tid']
438540 self._sendSMBMessage(m)
439 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
541 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
440542 messages_history.append(m)
441543 else:
442 closeFid(read_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
544 closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
443545
444546 def listShareResultsCB(result_message, **kwargs):
445547 messages_history.append(result_message)
448550 data_bytes = result_message.payload.out_data
449551
450552 if ord(data_bytes[3]) & 0x02 == 0:
451 sendReadRequest(result_message.tid, kwargs['fid'], data_bytes)
452 else:
453 decodeResults(result_message.tid, kwargs['fid'], data_bytes)
454 elif result_message.status == 0x0103: # STATUS_PENDING
455 self.pending_requests[result_message.mid] = _PendingRequest(result_message.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
456 else:
457 closeFid(result_message.tid, kwargs['fid'])
553 sendReadRequest(kwargs['tid'], kwargs['fid'], data_bytes)
554 else:
555 decodeResults(kwargs['tid'], kwargs['fid'], data_bytes)
556 else:
557 closeFid(kwargs['tid'], kwargs['fid'])
458558 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
459559
460560 def decodeResults(tid, fid, data_bytes):
489589
490590 def sendReadRequest(tid, fid, data_bytes):
491591 read_count = min(4280, self.max_read_size)
492 m = SMB2Message(SMB2ReadRequest(fid, 0, read_count))
592 m = SMB2Message(self, SMB2ReadRequest(fid, 0, read_count))
493593 m.tid = tid
494594 self._sendSMBMessage(m)
495595 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
496 fid = fid, data_bytes = data_bytes)
596 tid = tid, fid = fid, data_bytes = data_bytes)
497597
498598 def readCB(read_message, **kwargs):
499599 messages_history.append(read_message)
500600 if read_message.status == 0:
501 data_len = read_message.payload.data_length
502601 data_bytes = read_message.payload.data
503602
504603 if ord(data_bytes[3]) & 0x02 == 0:
505 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
506 else:
507 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
508 else:
509 closeFid(read_message.tid, kwargs['fid'])
604 sendReadRequest(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
605 else:
606 decodeResults(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
607 else:
608 closeFid(kwargs['tid'], kwargs['fid'])
510609 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
511610
512611 def closeFid(tid, fid, results = None, error = None):
513 m = SMB2Message(SMB2CloseRequest(fid))
612 m = SMB2Message(self, SMB2CloseRequest(fid))
514613 m.tid = tid
515614 self._sendSMBMessage(m)
516615 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
531630 else:
532631 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
533632
534 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
633 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
535634 self._sendSMBMessage(m)
536635 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
537636 messages_history.append(m)
560659 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
561660 51 46 69 64 00 00 00 00
562661 """.replace(' ', '').replace('\n', ''))
563 m = SMB2Message(SMB2CreateRequest(path,
662 m = SMB2Message(self, SMB2CreateRequest(path,
564663 file_attributes = 0,
565664 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
566665 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
571670 create_context_data = create_context_data))
572671 m.tid = tid
573672 self._sendSMBMessage(m)
574 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
673 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
575674 messages_history.append(m)
576675
577676 def createCB(create_message, **kwargs):
578677 messages_history.append(create_message)
579678 if create_message.status == 0:
580 sendQuery(create_message.tid, create_message.payload.fid, '')
679 sendQuery(kwargs['tid'], create_message.payload.fid, '')
581680 else:
582681 errback(OperationFailure('Failed to list %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
583682
584683 def sendQuery(tid, fid, data_buf):
585 m = SMB2Message(SMB2QueryDirectoryRequest(fid, pattern,
586 info_class = 0x03, # FileBothDirectoryInformation
684 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
685 output_buf_len = 64 * 1024 * (self.credits - 1)
686 else:
687 output_buf_len = self.max_transact_size
688
689 m = SMB2Message(self, SMB2QueryDirectoryRequest(fid, pattern,
690 info_class = 0x25, # FileIdBothDirectoryInformation
587691 flags = 0,
588 output_buf_len = self.max_transact_size))
589 m.tid = tid
590 self._sendSMBMessage(m)
591 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, fid = fid, data_buf = data_buf)
692 output_buf_len = output_buf_len))
693 m.tid = tid
694 self._sendSMBMessage(m)
695 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = tid, fid = fid, data_buf = data_buf)
592696 messages_history.append(m)
593697
594698 def queryCB(query_message, **kwargs):
595699 messages_history.append(query_message)
596700 if query_message.status == 0:
597701 data_buf = decodeQueryStruct(kwargs['data_buf'] + query_message.payload.data)
598 sendQuery(query_message.tid, kwargs['fid'], data_buf)
702 sendQuery(kwargs['tid'], kwargs['fid'], data_buf)
599703 elif query_message.status == 0x80000006L: # STATUS_NO_MORE_FILES
600 closeFid(query_message.tid, kwargs['fid'], results = results)
601 else:
602 closeFid(query_message.tid, kwargs['fid'], error = query_message.status)
704 closeFid(kwargs['tid'], kwargs['fid'], results = results)
705 else:
706 closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
603707
604708 def decodeQueryStruct(data_bytes):
605 # SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1
606 info_format = '<IIQQQQQQIIIBB24s'
709 # FileIdBothDirectoryInformation structure. See [MS-SMB]: 2.2.8.1.3 and [MS-FSCC]: 2.4.17
710 info_format = '<IIQQQQQQIIIBB24sHQ'
607711 info_size = struct.calcsize(info_format)
608712
609713 data_length = len(data_bytes)
615719 next_offset, _, \
616720 create_time, last_access_time, last_write_time, last_attr_change_time, \
617721 file_size, alloc_size, file_attributes, filename_length, ea_size, \
618 short_name_length, _, short_name = struct.unpack(info_format, data_bytes[offset:offset+info_size])
722 short_name_length, _, short_name, _, file_id = struct.unpack(info_format, data_bytes[offset:offset+info_size])
619723
620724 offset2 = offset + info_size
621725 if offset2 + filename_length > data_length:
622726 return data_bytes[offset:]
623727
624728 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
625 short_name = short_name.decode('UTF-16LE')
626 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
627 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
628 file_size, alloc_size, file_attributes, short_name, filename))
729 short_name = short_name[:short_name_length].decode('UTF-16LE')
730
731 accept_result = False
732 if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
733 accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
734 else:
735 accept_result = (file_attributes & search) > 0
736 if accept_result:
737 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
738 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
739 file_size, alloc_size, file_attributes, short_name, filename, file_id))
629740
630741 if next_offset:
631742 offset += next_offset
634745 return ''
635746
636747 def closeFid(tid, fid, results = None, error = None):
637 m = SMB2Message(SMB2CloseRequest(fid))
748 m = SMB2Message(self, SMB2CloseRequest(fid))
638749 m.tid = tid
639750 self._sendSMBMessage(m)
640751 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
644755 if kwargs['results'] is not None:
645756 callback(kwargs['results'])
646757 elif kwargs['error'] is not None:
647 errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
758 if kwargs['error'] == 0xC000000F: # [MS-ERREF]: STATUS_NO_SUCH_FILE
759 # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
760 callback([ ])
761 else:
762 errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
648763
649764 if not self.connected_trees.has_key(service_name):
650765 def connectCB(connect_message, **kwargs):
655770 else:
656771 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
657772
658 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
773 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
659774 self._sendSMBMessage(m)
660775 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
661776 messages_history.append(m)
683798 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
684799 51 46 69 64 00 00 00 00
685800 """.replace(' ', '').replace('\n', ''))
686 m = SMB2Message(SMB2CreateRequest(path,
801 m = SMB2Message(self, SMB2CreateRequest(path,
687802 file_attributes = 0,
688803 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
689804 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
694809 create_context_data = create_context_data))
695810 m.tid = tid
696811 self._sendSMBMessage(m)
697 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
812 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
698813 messages_history.append(m)
699814
700815 def createCB(create_message, **kwargs):
701816 messages_history.append(create_message)
702817 if create_message.status == 0:
703818 p = create_message.payload
819 filename = self._extractLastPathComponent(unicode(path))
704820 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
705821 p.file_size, p.allocation_size, p.file_attributes,
706 unicode(path), unicode(path))
707 closeFid(create_message.tid, p.fid, info = info)
822 filename, filename)
823 closeFid(kwargs['tid'], p.fid, info = info)
708824 else:
709825 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
710826
711827 def closeFid(tid, fid, info = None, error = None):
712 m = SMB2Message(SMB2CloseRequest(fid))
828 m = SMB2Message(self, SMB2CloseRequest(fid))
713829 m.tid = tid
714830 self._sendSMBMessage(m)
715831 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
730846 else:
731847 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
732848
733 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
849 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
850 self._sendSMBMessage(m)
851 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
852 messages_history.append(m)
853 else:
854 sendCreate(self.connected_trees[service_name])
855
856 def _getSecurity_SMB2(self, service_name, path, callback, errback, timeout = 30):
857 if not self.has_authenticated:
858 raise NotReadyError('SMB connection not authenticated')
859
860 expiry_time = time.time() + timeout
861 path = path.replace('/', '\\')
862 if path.startswith('\\'):
863 path = path[1:]
864 if path.endswith('\\'):
865 path = path[:-1]
866 messages_history = [ ]
867 results = [ ]
868
869 def sendCreate(tid):
870 m = SMB2Message(self, SMB2CreateRequest(path,
871 file_attributes = 0,
872 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
873 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
874 oplock = SMB2_OPLOCK_LEVEL_NONE,
875 impersonation = SEC_IMPERSONATE,
876 create_options = 0,
877 create_disp = FILE_OPEN))
878 m.tid = tid
879 self._sendSMBMessage(m)
880 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
881 messages_history.append(m)
882
883 def createCB(create_message, **kwargs):
884 messages_history.append(create_message)
885 if create_message.status == 0:
886 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
887 output_buf_len = 64 * 1024 * (self.credits - 1)
888 else:
889 output_buf_len = self.max_transact_size
890
891 m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
892 flags = 0,
893 additional_info = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
894 info_type = SMB2_INFO_SECURITY,
895 file_info_class = 0, # [MS-SMB2] 2.2.37, 3.2.4.12
896 input_buf = '',
897 output_buf_len = output_buf_len))
898 m.tid = kwargs['tid']
899 self._sendSMBMessage(m)
900 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
901 messages_history.append(m)
902 else:
903 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to open file or directory' % ( path, service_name ), messages_history))
904
905 def queryCB(query_message, **kwargs):
906 messages_history.append(query_message)
907 if query_message.status == 0:
908 security = SecurityDescriptor.from_bytes(query_message.payload.data)
909 closeFid(kwargs['tid'], kwargs['fid'], result = security)
910 else:
911 closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
912
913 def closeFid(tid, fid, result = None, error = None):
914 m = SMB2Message(self, SMB2CloseRequest(fid))
915 m.tid = tid
916 self._sendSMBMessage(m)
917 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, result = result, error = error)
918 messages_history.append(m)
919
920 def closeCB(close_message, **kwargs):
921 if kwargs['result'] is not None:
922 callback(kwargs['result'])
923 elif kwargs['error'] is not None:
924 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
925
926 if not self.connected_trees.has_key(service_name):
927 def connectCB(connect_message, **kwargs):
928 messages_history.append(connect_message)
929 if connect_message.status == 0:
930 self.connected_trees[service_name] = connect_message.tid
931 sendCreate(connect_message.tid)
932 else:
933 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
934
935 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
734936 self._sendSMBMessage(m)
735937 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
736938 messages_history.append(m)
762964 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
763965 51 46 69 64 00 00 00 00
764966 """.replace(' ', '').replace('\n', ''))
765 m = SMB2Message(SMB2CreateRequest(path,
967 m = SMB2Message(self, SMB2CreateRequest(path,
766968 file_attributes = 0,
767969 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
768 share_access = FILE_SHARE_READ,
970 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
769971 oplock = SMB2_OPLOCK_LEVEL_NONE,
770972 impersonation = SEC_IMPERSONATE,
771973 create_options = FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE,
779981 def createCB(create_message, **kwargs):
780982 messages_history.append(create_message)
781983 if create_message.status == 0:
782 m = SMB2Message(SMB2QueryInfoRequest(create_message.payload.fid,
984 m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
783985 flags = 0,
784986 additional_info = 0,
785987 info_type = SMB2_INFO_FILE,
786988 file_info_class = 0x16, # FileStreamInformation [MS-FSCC] 2.4
787989 input_buf = '',
788990 output_buf_len = 4096))
789 m.tid = create_message.tid
991 m.tid = kwargs['tid']
790992 self._sendSMBMessage(m)
791993 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, infoCB, errback,
792 fid = create_message.payload.fid, file_attributes = create_message.payload.file_attributes)
994 tid = kwargs['tid'],
995 fid = create_message.payload.fid,
996 file_attributes = create_message.payload.file_attributes)
793997 messages_history.append(m)
794998 else:
795 errback(OperationFailure('Failed to list %s on %s: Unable to open file' % ( path, service_name ), messages_history))
999 errback(OperationFailure('Failed to retrieve %s on %s: Unable to open file' % ( path, service_name ), messages_history))
7961000
7971001 def infoCB(info_message, **kwargs):
7981002 messages_history.append(info_message)
8071011 remaining_len = file_len
8081012 if starting_offset + remaining_len > file_len:
8091013 remaining_len = file_len - starting_offset
810 sendRead(info_message.tid, kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
811 else:
812 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
1014 sendRead(kwargs['tid'], kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
1015 else:
1016 errback(OperationFailure('Failed to retrieve %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
8131017
8141018 def sendRead(tid, fid, offset, remaining_len, read_len, file_attributes):
8151019 read_count = min(self.max_read_size, remaining_len)
816 m = SMB2Message(SMB2ReadRequest(fid, offset, read_count))
1020
1021 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
1022 max_read_count = 64 * 1024 * (self.credits -1)
1023 read_count = min(read_count, max_read_count)
1024
1025 m = SMB2Message(self, SMB2ReadRequest(fid, offset, read_count))
8171026 m.tid = tid
8181027 self._sendSMBMessage(m)
8191028 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
820 fid = fid, offset = offset,
1029 tid = tid, fid = fid, offset = offset,
8211030 remaining_len = remaining_len,
8221031 read_len = read_len,
8231032 file_attributes = file_attributes)
8311040 remaining_len = kwargs['remaining_len'] - data_len
8321041
8331042 if remaining_len > 0:
834 sendRead(read_message.tid, kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
835 else:
836 closeFid(read_message.tid, kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
1043 sendRead(kwargs['tid'], kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
1044 else:
1045 closeFid(kwargs['tid'], kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
8371046 else:
8381047 messages_history.append(read_message)
839 closeFid(read_message.tid, kwargs['fid'], error = read_message.status)
1048 closeFid(kwargs['tid'], kwargs['fid'], error = read_message.status)
8401049
8411050 def closeFid(tid, fid, ret = None, error = None):
842 m = SMB2Message(SMB2CloseRequest(fid))
1051 m = SMB2Message(self, SMB2CloseRequest(fid))
8431052 m.tid = tid
8441053 self._sendSMBMessage(m)
8451054 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, ret = ret, error = error)
8601069 else:
8611070 errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
8621071
863 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1072 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
8641073 self._sendSMBMessage(m)
8651074 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
8661075 messages_history.append(m)
8931102 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
8941103 51 46 69 64 00 00 00 00
8951104 """.replace(' ', '').replace('\n', ''))
896 m = SMB2Message(SMB2CreateRequest(path,
1105 m = SMB2Message(self, SMB2CreateRequest(path,
8971106 file_attributes = ATTR_ARCHIVE,
8981107 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | SYNCHRONIZE,
8991108 share_access = 0,
9121121 messages_history.append(create_message)
9131122 if create_message.status == 0:
9141123 sendWrite(create_message.tid, create_message.payload.fid, starting_offset)
915 elif create_message.status == 0x0103: # STATUS_PENDING
916 self.pending_requests[create_message.mid] = _PendingRequest(create_message.mid, expiry_time,
917 createCB, errback,
918 tid=kwargs['tid'])
9191124 else:
9201125 errback(OperationFailure('Failed to store %s on %s: Unable to open file' % ( path, service_name ), messages_history))
9211126
9221127 def sendWrite(tid, fid, offset):
923 write_count = self.max_write_size
1128 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
1129 write_count = 64 * 1024 * (self.credits -1)
1130 else:
1131 write_count = self.max_write_size
9241132 data = file_obj.read(write_count)
9251133 data_len = len(data)
9261134 if data_len > 0:
927 m = SMB2Message(SMB2WriteRequest(fid, data, offset))
1135 m = SMB2Message(self, SMB2WriteRequest(fid, data, offset))
9281136 m.tid = tid
9291137 self._sendSMBMessage(m)
930 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
1138 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, tid = tid, fid = fid, offset = offset+data_len)
9311139 else:
9321140 closeFid(tid, fid, offset = offset)
9331141
9341142 def writeCB(write_message, **kwargs):
9351143 # To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.
9361144 if write_message.status == 0:
937 sendWrite(write_message.tid, kwargs['fid'], kwargs['offset'])
1145 sendWrite(kwargs['tid'], kwargs['fid'], kwargs['offset'])
9381146 else:
9391147 messages_history.append(write_message)
940 closeFid(write_message.tid, kwargs['fid'])
1148 closeFid(kwargs['tid'], kwargs['fid'])
9411149 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
9421150
9431151 def closeFid(tid, fid, error = None, offset = None):
944 m = SMB2Message(SMB2CloseRequest(fid))
1152 m = SMB2Message(self, SMB2CloseRequest(fid))
9451153 m.tid = tid
9461154 self._sendSMBMessage(m)
9471155 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, fid = fid, offset = offset, error = error)
9621170 else:
9631171 errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
9641172
965 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1173 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
9661174 self._sendSMBMessage(m)
9671175 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
9681176 messages_history.append(m)
9911199 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
9921200 51 46 69 64 00 00 00 00
9931201 """.replace(' ', '').replace('\n', ''))
994 m = SMB2Message(SMB2CreateRequest(path,
1202 m = SMB2Message(self, SMB2CreateRequest(path,
9951203 file_attributes = 0,
9961204 access_mask = DELETE | FILE_READ_ATTRIBUTES,
9971205 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
10101218 messages_history.append(open_message)
10111219 if open_message.status == 0:
10121220 sendDelete(open_message.tid, open_message.payload.fid)
1013 elif open_message.status == 0x0103: # STATUS_PENDING
1014 self.pending_requests[open_message.mid] = _PendingRequest(open_message.mid, expiry_time,
1015 createCB, errback,
1016 tid=kwargs['tid'])
10171221 else:
10181222 errback(OperationFailure('Failed to delete %s on %s: Unable to open file' % ( path, service_name ), messages_history))
10191223
10201224 def sendDelete(tid, fid):
1021 m = SMB2Message(SMB2SetInfoRequest(fid,
1225 m = SMB2Message(self, SMB2SetInfoRequest(fid,
10221226 additional_info = 0,
10231227 info_type = SMB2_INFO_FILE,
10241228 file_info_class = 0x0d, # SMB2_FILE_DISPOSITION_INFO
10251229 data = '\x01'))
1026 '''
1027 Resources:
1028 https://msdn.microsoft.com/en-us/library/cc246560.aspx
1029 https://msdn.microsoft.com/en-us/library/cc232098.aspx
1030 '''
1031 m.tid = tid
1032 self._sendSMBMessage(m)
1033 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
1230 # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4.11
1231 m.tid = tid
1232 self._sendSMBMessage(m)
1233 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
10341234 messages_history.append(m)
10351235
10361236 def deleteCB(delete_message, **kwargs):
10371237 messages_history.append(delete_message)
10381238 if delete_message.status == 0:
1039 closeFid(delete_message.tid, kwargs['fid'], status = 0)
1040 else:
1041 closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
1239 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1240 else:
1241 closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
10421242
10431243 def closeFid(tid, fid, status = None):
1044 m = SMB2Message(SMB2CloseRequest(fid))
1244 m = SMB2Message(self, SMB2CloseRequest(fid))
10451245 m.tid = tid
10461246 self._sendSMBMessage(m)
10471247 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
10621262 else:
10631263 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
10641264
1065 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1265 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
10661266 self._sendSMBMessage(m)
10671267 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
10681268 messages_history.append(m)
10911291 51 46 69 64 00 00 00 00
10921292 """.replace(' ', '').replace('\n', ''))
10931293
1094 m = SMB2Message(SMB2CreateRequest(path,
1294 m = SMB2Message(self, SMB2CreateRequest(path,
10951295 file_attributes = 0,
10961296 access_mask = FILE_WRITE_ATTRIBUTES,
10971297 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
11081308 def createCB(open_message, **kwargs):
11091309 messages_history.append(open_message)
11101310 if open_message.status == 0:
1111 sendReset(open_message.tid, open_message.payload.fid)
1311 sendReset(kwargs['tid'], open_message.payload.fid)
11121312 else:
11131313 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to open file' % ( path, service_name ), messages_history))
11141314
11151315 def sendReset(tid, fid):
1116 m = SMB2Message(SMB2SetInfoRequest(fid,
1316 m = SMB2Message(self, SMB2SetInfoRequest(fid,
11171317 additional_info = 0,
11181318 info_type = SMB2_INFO_FILE,
11191319 file_info_class = 4, # FileBasicInformation
11201320 data = struct.pack('qqqqii',0,0,0,0,0x80,0))) # FILE_ATTRIBUTE_NORMAL
1121 '''
1122 Resources:
1123 https://msdn.microsoft.com/en-us/library/cc246560.aspx
1124 https://msdn.microsoft.com/en-us/library/cc232064.aspx
1125 https://msdn.microsoft.com/en-us/library/cc232094.aspx
1126 https://msdn.microsoft.com/en-us/library/cc232110.aspx
1127 '''
1128 m.tid = tid
1129 self._sendSMBMessage(m)
1130 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, fid = fid)
1321 # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4, [MS-FSCC]: 2.4.7, [MS-FSCC]: 2.6
1322 m.tid = tid
1323 self._sendSMBMessage(m)
1324 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, tid = tid, fid = fid)
11311325 messages_history.append(m)
11321326
11331327 def resetCB(reset_message, **kwargs):
11341328 messages_history.append(reset_message)
11351329 if reset_message.status == 0:
1136 closeFid(reset_message.tid, kwargs['fid'], status = 0)
1137 else:
1138 closeFid(reset_message.tid, kwargs['fid'], status = reset_message.status)
1330 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1331 else:
1332 closeFid(kwargs['tid'], kwargs['fid'], status = reset_message.status)
11391333
11401334 def closeFid(tid, fid, status = None):
1141 m = SMB2Message(SMB2CloseRequest(fid))
1335 m = SMB2Message(self, SMB2CloseRequest(fid))
11421336 m.tid = tid
11431337 self._sendSMBMessage(m)
11441338 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
11591353 else:
11601354 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
11611355
1162 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1356 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
11631357 self._sendSMBMessage(m)
11641358 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
11651359 messages_history.append(m)
11871381 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
11881382 51 46 69 64 00 00 00 00
11891383 """.replace(' ', '').replace('\n', ''))
1190 m = SMB2Message(SMB2CreateRequest(path,
1384 m = SMB2Message(self, SMB2CreateRequest(path,
11911385 file_attributes = 0,
11921386 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_READ_EA | FILE_WRITE_EA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | READ_CONTROL | DELETE | SYNCHRONIZE,
11931387 share_access = 0,
11981392 create_context_data = create_context_data))
11991393 m.tid = tid
12001394 self._sendSMBMessage(m)
1201 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
1395 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback, tid = tid)
12021396 messages_history.append(m)
12031397
12041398 def createCB(create_message, **kwargs):
12051399 messages_history.append(create_message)
12061400 if create_message.status == 0:
1207 closeFid(create_message.tid, create_message.payload.fid)
1401 closeFid(kwargs['tid'], create_message.payload.fid)
12081402 else:
12091403 errback(OperationFailure('Failed to create directory %s on %s: Create failed' % ( path, service_name ), messages_history))
12101404
12111405 def closeFid(tid, fid):
1212 m = SMB2Message(SMB2CloseRequest(fid))
1406 m = SMB2Message(self, SMB2CloseRequest(fid))
12131407 m.tid = tid
12141408 self._sendSMBMessage(m)
12151409 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback)
12271421 else:
12281422 errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
12291423
1230 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1424 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
12311425 self._sendSMBMessage(m)
12321426 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
12331427 messages_history.append(m)
12551449 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
12561450 51 46 69 64 00 00 00 00
12571451 """.replace(' ', '').replace('\n', ''))
1258 m = SMB2Message(SMB2CreateRequest(path,
1452 m = SMB2Message(self, SMB2CreateRequest(path,
12591453 file_attributes = 0,
12601454 access_mask = DELETE | FILE_READ_ATTRIBUTES,
12611455 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
12721466 def createCB(open_message, **kwargs):
12731467 messages_history.append(open_message)
12741468 if open_message.status == 0:
1275 sendDelete(open_message.tid, open_message.payload.fid)
1469 sendDelete(kwargs['tid'], open_message.payload.fid)
12761470 else:
12771471 errback(OperationFailure('Failed to delete %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
12781472
12791473 def sendDelete(tid, fid):
1280 m = SMB2Message(SMB2SetInfoRequest(fid,
1474 m = SMB2Message(self, SMB2SetInfoRequest(fid,
12811475 additional_info = 0,
12821476 info_type = SMB2_INFO_FILE,
12831477 file_info_class = 0x0d, # SMB2_FILE_DISPOSITION_INFO
12841478 data = '\x01'))
12851479 m.tid = tid
12861480 self._sendSMBMessage(m)
1287 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
1481 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
12881482 messages_history.append(m)
12891483
12901484 def deleteCB(delete_message, **kwargs):
12911485 messages_history.append(delete_message)
12921486 if delete_message.status == 0:
1293 closeFid(delete_message.tid, kwargs['fid'], status = 0)
1294 else:
1295 closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
1487 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1488 else:
1489 closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
12961490
12971491 def closeFid(tid, fid, status = None):
1298 m = SMB2Message(SMB2CloseRequest(fid))
1492 m = SMB2Message(self, SMB2CloseRequest(fid))
12991493 m.tid = tid
13001494 self._sendSMBMessage(m)
13011495 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
13161510 else:
13171511 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
13181512
1319 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1513 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
13201514 self._sendSMBMessage(m)
13211515 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
13221516 messages_history.append(m)
13511545 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
13521546 51 46 69 64 00 00 00 00
13531547 """.replace(' ', '').replace('\n', ''))
1354 m = SMB2Message(SMB2CreateRequest(old_path,
1548 m = SMB2Message(self, SMB2CreateRequest(old_path,
13551549 file_attributes = 0,
13561550 access_mask = DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
13571551 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
13681562 def createCB(create_message, **kwargs):
13691563 messages_history.append(create_message)
13701564 if create_message.status == 0:
1371 sendRename(create_message.tid, create_message.payload.fid)
1565 sendRename(kwargs['tid'], create_message.payload.fid)
13721566 else:
13731567 errback(OperationFailure('Failed to rename %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
13741568
13751569 def sendRename(tid, fid):
13761570 data = '\x00'*16 + struct.pack('<I', len(new_path)*2) + new_path.encode('UTF-16LE')
1377 m = SMB2Message(SMB2SetInfoRequest(fid,
1571 m = SMB2Message(self, SMB2SetInfoRequest(fid,
13781572 additional_info = 0,
13791573 info_type = SMB2_INFO_FILE,
13801574 file_info_class = 0x0a, # SMB2_FILE_RENAME_INFO
13811575 data = data))
13821576 m.tid = tid
13831577 self._sendSMBMessage(m)
1384 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, fid = fid)
1578 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, tid = tid, fid = fid)
13851579 messages_history.append(m)
13861580
13871581 def renameCB(rename_message, **kwargs):
13881582 messages_history.append(rename_message)
13891583 if rename_message.status == 0:
1390 closeFid(rename_message.tid, kwargs['fid'], status = 0)
1391 else:
1392 closeFid(rename_message.tid, kwargs['fid'], status = rename_message.status)
1584 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1585 else:
1586 closeFid(kwargs['tid'], kwargs['fid'], status = rename_message.status)
13931587
13941588 def closeFid(tid, fid, status = None):
1395 m = SMB2Message(SMB2CloseRequest(fid))
1589 m = SMB2Message(self, SMB2CloseRequest(fid))
13961590 m.tid = tid
13971591 self._sendSMBMessage(m)
13981592 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
14131607 else:
14141608 errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
14151609
1416 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1610 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
14171611 self._sendSMBMessage(m)
14181612 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
14191613 messages_history.append(m)
14391633 00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00
14401634 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
14411635 """.replace(' ', '').replace('\n', ''))
1442 m = SMB2Message(SMB2CreateRequest(path,
1636 m = SMB2Message(self, SMB2CreateRequest(path,
14431637 file_attributes = 0,
14441638 access_mask = FILE_READ_DATA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
14451639 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
14561650 def createCB(create_message, **kwargs):
14571651 messages_history.append(create_message)
14581652 if create_message.status == 0:
1459 sendEnumSnapshots(create_message.tid, create_message.payload.fid)
1653 sendEnumSnapshots(kwargs['tid'], create_message.payload.fid)
14601654 else:
14611655 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
14621656
14631657 def sendEnumSnapshots(tid, fid):
1464 m = SMB2Message(SMB2IoctlRequest(fid,
1658 m = SMB2Message(self, SMB2IoctlRequest(fid,
14651659 ctlcode = 0x00144064, # FSCTL_SRV_ENUMERATE_SNAPSHOTS
14661660 flags = 0x0001,
14671661 in_data = ''))
14831677 closeFid(kwargs['tid'], kwargs['fid'], status = enum_message.status)
14841678
14851679 def closeFid(tid, fid, status = None, results = None):
1486 m = SMB2Message(SMB2CloseRequest(fid))
1680 m = SMB2Message(self, SMB2CloseRequest(fid))
14871681 m.tid = tid
14881682 self._sendSMBMessage(m)
14891683 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status, results = results)
15041698 else:
15051699 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
15061700
1507 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1701 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
15081702 self._sendSMBMessage(m)
15091703 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
15101704 messages_history.append(m)
15211715 else:
15221716 errback(OperationFailure('Echo failed', messages_history))
15231717
1524 m = SMB2Message(SMB2EchoRequest())
1718 m = SMB2Message(self, SMB2EchoRequest())
15251719 self._sendSMBMessage(m)
15261720 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
15271721 messages_history.append(m)
15971791 self._handleSessionChallenge(message, ntlm_token)
15981792 except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ), ex:
15991793 raise ProtocolError(str(ex), message.raw_data, message)
1600 elif message.status.internal_value == 0xc000006d: # STATUS_LOGON_FAILURE
1794 elif (message.status.internal_value == 0xc000006d # STATUS_LOGON_FAILURE
1795 or message.status.internal_value == 0xc0000064 # STATUS_NO_SUCH_USER
1796 or message.status.internal_value == 0xc000006a): # STATUS_WRONG_PASSWORD
16011797 self.has_authenticated = False
1602 self.log.info('Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.')
1798 self.log.info('Authentication (with extended security) failed. Please check username and password.')
1799 self.onAuthFailed()
1800 elif (message.status.internal_value == 0xc0000193 # STATUS_ACCOUNT_EXPIRED
1801 or message.status.internal_value == 0xC0000071): # STATUS_PASSWORD_EXPIRED
1802 self.has_authenticated = False
1803 self.log.info('Authentication (with extended security) failed. Account or password has expired.')
1804 self.onAuthFailed()
1805 elif message.status.internal_value == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
1806 self.has_authenticated = False
1807 self.log.info('Authentication (with extended security) failed. Account has been locked due to too many invalid logon attempts.')
1808 self.onAuthFailed()
1809 elif message.status.internal_value == 0xc0000072: # STATUS_ACCOUNT_DISABLED
1810 self.has_authenticated = False
1811 self.log.info('Authentication (with extended security) failed. Account has been disabled.')
1812 self.onAuthFailed()
1813 elif (message.status.internal_value == 0xc000006f # STATUS_INVALID_LOGON_HOURS
1814 or message.status.internal_value == 0xc000015b # STATUS_LOGON_TYPE_NOT_GRANTED
1815 or message.status.internal_value == 0xc0000070): # STATUS_INVALID_WORKSTATION
1816 self.has_authenticated = False
1817 self.log.info('Authentication (with extended security) failed. Not allowed.')
1818 self.onAuthFailed()
1819 elif message.status.internal_value == 0xc000018c: # STATUS_TRUSTED_DOMAIN_FAILURE
1820 self.has_authenticated = False
1821 self.log.info('Authentication (with extended security) failed. Domain not trusted.')
1822 self.onAuthFailed()
1823 elif message.status.internal_value == 0xc000018d: # STATUS_TRUSTED_RELATIONSHIP_FAILURE
1824 self.has_authenticated = False
1825 self.log.info('Authentication (with extended security) failed. Workstation not trusted.')
16031826 self.onAuthFailed()
16041827 else:
16051828 raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status.internal_value,
16661889 lm_challenge_response,
16671890 session_key,
16681891 self.username,
1669 self.domain)
1892 self.domain,
1893 self.my_name)
16701894
16711895 if self.log.isEnabledFor(logging.DEBUG):
16721896 self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
16731897 self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
16741898
16751899 blob = securityblob.generateAuthSecurityBlob(ntlm_data)
1676 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
1900 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
16771901
16781902 if self.security_mode & NEGOTIATE_SECURITY_SIGNATURES_REQUIRE:
16791903 self.log.info('Server requires all SMB messages to be signed')
17021926 if message.hasExtendedSecurity or message.payload.supportsExtendedSecurity:
17031927 ntlm_data = ntlm.generateNegotiateMessage()
17041928 blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
1705 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
1929 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
17061930 else:
17071931 nt_password, _, _ = ntlm.generateChallengeResponseV1(self.password, message.payload.challenge, False)
17081932 self.log.info('Performing NTLMv1 authentication (without extended security) with challenge "%s" and hashed password of "%s"',
17091933 binascii.hexlify(message.payload.challenge),
17101934 binascii.hexlify(nt_password))
1711 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
1935 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
17121936 self.username,
17131937 nt_password,
17141938 True,
17231947 messages_history = [ ]
17241948
17251949 def connectSrvSvc(tid):
1726 m = SMBMessage(ComNTCreateAndxRequest('\\srvsvc',
1950 m = SMBMessage(self, ComNTCreateAndxRequest('\\srvsvc',
17271951 flags = NT_CREATE_REQUEST_EXTENDED_RESPONSE,
17281952 access_mask = READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | FILE_WRITE_EA | FILE_READ_EA | FILE_APPEND_DATA | FILE_WRITE_DATA | FILE_READ_DATA,
17291953 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
17521976 c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
17531977 03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
17541978 2b 10 48 60 02 00 00 00""".replace(' ', '').replace('\n', ''))
1755 m = SMBMessage(ComTransactionRequest(max_params_count = 0,
1979 m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
17561980 max_data_count = 4280,
17571981 max_setup_count = 0,
17581982 data_bytes = data_bytes,
17902014 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
17912015 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
17922016 """.replace(' ', '').replace('\n', ''))
1793 m = SMBMessage(ComTransactionRequest(max_params_count = 0,
2017 m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
17942018 max_data_count = 4280,
17952019 max_setup_count = 0,
17962020 data_bytes = data_bytes,
18492073
18502074 def sendReadRequest(tid, fid, data_bytes):
18512075 read_count = min(4280, self.max_raw_size - 2)
1852 m = SMBMessage(ComReadAndxRequest(fid = fid,
2076 m = SMBMessage(self, ComReadAndxRequest(fid = fid,
18532077 offset = 0,
18542078 max_return_bytes_count = read_count,
18552079 min_return_bytes_count = read_count))
18602084 def readCB(read_message, **kwargs):
18612085 messages_history.append(read_message)
18622086 if not read_message.status.hasError:
1863 data_len = read_message.payload.data_length
18642087 data_bytes = read_message.payload.data
18652088
18662089 if ord(data_bytes[3]) & 0x02 == 0:
1867 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
1868 else:
1869 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
2090 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
2091 else:
2092 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
18702093 else:
18712094 closeFid(read_message.tid, kwargs['fid'])
18722095 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
18732096
18742097 def closeFid(tid, fid):
1875 m = SMBMessage(ComCloseRequest(fid))
2098 m = SMBMessage(self, ComCloseRequest(fid))
18762099 m.tid = tid
18772100 self._sendSMBMessage(m)
18782101 messages_history.append(m)
18852108 else:
18862109 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
18872110
1888 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
2111 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
18892112 self._sendSMBMessage(m)
18902113 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
18912114 messages_history.append(m)
19052128 setup_bytes = struct.pack('<H', 0x0001) # TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1
19062129 params_bytes = \
19072130 struct.pack('<HHHHI',
1908 search, # SearchAttributes
2131 search & 0xFFFF, # SearchAttributes (need to restrict the values due to introduction of SMB_FILE_ATTRIBUTE_INCL_NORMAL)
19092132 100, # SearchCount
19102133 0x0006, # Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
19112134 0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
1912 0x0000) # SearchStorageType
2135 0x0000) # SearchStorageType (seems to be ignored by Windows)
19132136 if support_dfs:
19142137 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
19152138 else:
1916 params_bytes += (path + pattern).encode('UTF-16LE')
1917
1918 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2139 params_bytes += (path + pattern + '\0').encode('UTF-16LE')
2140
2141 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
19192142 max_data_count = 16644,
19202143 max_setup_count = 0,
19212144 params_bytes = params_bytes,
19492172
19502173 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
19512174 short_name = short_name.decode('UTF-16LE')
1952 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
1953 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
1954 file_size, alloc_size, file_attributes, short_name, filename))
2175
2176 accept_result = False
2177 if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
2178 accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
2179 else:
2180 accept_result = (file_attributes & search) > 0
2181 if accept_result:
2182 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
2183 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
2184 file_size, alloc_size, file_attributes, short_name, filename))
19552185
19562186 if next_offset:
19572187 offset += next_offset
19912221 elif end_of_search:
19922222 callback(results)
19932223 else:
1994 sendFindNext(find_message.tid, sid, last_name_offset, kwargs.get('support_dfs', False))
1995 else:
1996 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
1997
1998 def sendFindNext(tid, sid, resume_key, support_dfs=False):
2224 sendFindNext(find_message.tid, sid, 0, results[-1].filename, kwargs.get('support_dfs', False))
2225 else:
2226 if find_message.status.internal_value == 0xC000000F: # [MS-ERREF]: STATUS_NO_SUCH_FILE
2227 # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
2228 callback([ ])
2229 else:
2230 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
2231
2232 def sendFindNext(tid, sid, resume_key, resume_file, support_dfs=False):
19992233 setup_bytes = struct.pack('<H', 0x0002) # TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1
20002234 params_bytes = \
20012235 struct.pack('<HHHIH',
20032237 100, # SearchCount
20042238 0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
20052239 resume_key, # ResumeKey
2006 0x000a) # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
2007 if support_dfs:
2008 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
2009 else:
2010 params_bytes += (path + pattern).encode('UTF-16LE')
2011
2012 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2240 0x0006) # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
2241 params_bytes += (resume_file+'\0').encode('UTF-16LE')
2242
2243 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
20132244 max_data_count = 16644,
20142245 max_setup_count = 0,
20152246 params_bytes = params_bytes,
20532284 elif end_of_search:
20542285 callback(results)
20552286 else:
2056 sendFindNext(find_message.tid, kwargs['sid'], last_name_offset, kwargs.get('support_dfs', False))
2287 sendFindNext(find_message.tid, kwargs['sid'], 0, results[-1].filename, kwargs.get('support_dfs', False))
20572288 else:
20582289 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
20592290
20622293 params_bytes = struct.pack('<H', 3) # Max referral level 3
20632294 params_bytes += ("\\" + self.remote_name + "\\" + service_name).encode('UTF-16LE')
20642295
2065 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2296 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
20662297 max_data_count = 16644,
20672298 max_setup_count = 0,
20682299 params_bytes = params_bytes,
20872318 else:
20882319 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
20892320
2090 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2321 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
20912322 self._sendSMBMessage(m)
20922323 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
20932324 messages_history.append(m)
21142345 0x0000) # Reserved
21152346 params_bytes += (path + '\0').encode('UTF-16LE')
21162347
2117 m = SMBMessage(ComTransaction2Request(max_params_count = 2,
2348 m = SMBMessage(self, ComTransaction2Request(max_params_count = 2,
21182349 max_data_count = 65535,
21192350 max_setup_count = 0,
21202351 params_bytes = params_bytes,
21312362 info_size = struct.calcsize(info_format)
21322363 create_time, last_access_time, last_write_time, last_attr_change_time, \
21332364 file_attributes, _, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
2134
2135 info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
2136 file_size, alloc_size, file_attributes, unicode(path), unicode(path))
2365 filename = self._extractLastPathComponent(unicode(path))
2366
2367 info = SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time), convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
2368 file_size, alloc_size, file_attributes, filename, filename)
21372369 callback(info)
21382370 else:
21392371 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
21472379 else:
21482380 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
21492381
2150 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2382 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
21512383 self._sendSMBMessage(m)
21522384 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
21532385 messages_history.append(m)
21542386 else:
21552387 sendQuery(self.connected_trees[service_name])
2388
2389 def _getSecurity_SMB1(self, service_name, path_file_pattern, callback, errback, timeout = 30):
2390 raise NotReadyError('getSecurity is not yet implemented for SMB1')
21562391
21572392 def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
21582393 return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0L, -1L, timeout)
21652400 messages_history = [ ]
21662401
21672402 def sendOpen(tid):
2168 m = SMBMessage(ComOpenAndxRequest(filename = path,
2403 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
21692404 access_mode = 0x0040, # Sharing mode: Deny nothing to others
21702405 open_mode = 0x0001, # Failed if file does not exist
21712406 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
21882423
21892424 def sendRead(tid, fid, offset, file_attributes, read_len, remaining_len):
21902425 read_count = self.max_raw_size - 2
2191 m = SMBMessage(ComReadAndxRequest(fid = fid,
2426 m = SMBMessage(self, ComReadAndxRequest(fid = fid,
21922427 offset = offset,
21932428 max_return_bytes_count = read_count,
21942429 min_return_bytes_count = min(0xFFFF, read_count)))
22272462 errback(OperationFailure('Failed to retrieve %s on %s: Read failed' % ( path, service_name ), messages_history))
22282463
22292464 def closeFid(tid, fid):
2230 m = SMBMessage(ComCloseRequest(fid))
2465 m = SMBMessage(self, ComCloseRequest(fid))
22312466 m.tid = tid
22322467 self._sendSMBMessage(m)
22332468 messages_history.append(m)
22412476 else:
22422477 errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
22432478
2244 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2479 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
22452480 self._sendSMBMessage(m)
22462481 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
22472482 messages_history.append(m)
22592494 messages_history = [ ]
22602495
22612496 def sendOpen(tid):
2262 m = SMBMessage(ComOpenAndxRequest(filename = path,
2497 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
22632498 access_mode = 0x0041, # Sharing mode: Deny nothing to others + Open for writing
22642499 open_mode = 0x0012 if truncate else 0x0011, # Create file if file does not exist. Overwrite or append depending on truncate parameter.
22652500 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
22822517 data_bytes = file_obj.read(write_count)
22832518 data_len = len(data_bytes)
22842519 if data_len > 0:
2285 m = SMBMessage(ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
2520 m = SMBMessage(self, ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
22862521 m.tid = tid
22872522 self._sendSMBMessage(m)
22882523 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
23002535 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
23012536
23022537 def closeFid(tid, fid):
2303 m = SMBMessage(ComCloseRequest(fid))
2538 m = SMBMessage(self, ComCloseRequest(fid))
23042539 m.tid = tid
23052540 self._sendSMBMessage(m)
23062541 messages_history.append(m)
23142549 else:
23152550 errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23162551
2317 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2552 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23182553 self._sendSMBMessage(m)
23192554 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23202555 messages_history.append(m)
23292564 messages_history = [ ]
23302565
23312566 def sendDelete(tid):
2332 m = SMBMessage(ComDeleteRequest(filename_pattern = path,
2567 m = SMBMessage(self, ComDeleteRequest(filename_pattern = path,
23332568 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
23342569 m.tid = tid
23352570 self._sendSMBMessage(m)
23522587 else:
23532588 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23542589
2355 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2590 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23562591 self._sendSMBMessage(m)
23572592 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23582593 messages_history.append(m)
23702605 messages_history = [ ]
23712606
23722607 def sendCreate(tid):
2373 m = SMBMessage(ComCreateDirectoryRequest(path))
2608 m = SMBMessage(self, ComCreateDirectoryRequest(path))
23742609 m.tid = tid
23752610 self._sendSMBMessage(m)
23762611 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
23922627 else:
23932628 errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23942629
2395 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2630 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23962631 self._sendSMBMessage(m)
23972632 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23982633 messages_history.append(m)
24072642 messages_history = [ ]
24082643
24092644 def sendDelete(tid):
2410 m = SMBMessage(ComDeleteDirectoryRequest(path))
2645 m = SMBMessage(self, ComDeleteDirectoryRequest(path))
24112646 m.tid = tid
24122647 self._sendSMBMessage(m)
24132648 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback)
24292664 else:
24302665 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
24312666
2432 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2667 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
24332668 self._sendSMBMessage(m)
24342669 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
24352670 messages_history.append(m)
24452680 messages_history = [ ]
24462681
24472682 def sendRename(tid):
2448 m = SMBMessage(ComRenameRequest(old_path = old_path,
2683 m = SMBMessage(self, ComRenameRequest(old_path = old_path,
24492684 new_path = new_path,
24502685 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
24512686 m.tid = tid
24692704 else:
24702705 errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
24712706
2472 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2707 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
24732708 self._sendSMBMessage(m)
24742709 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
24752710 messages_history.append(m)
24882723 results = [ ]
24892724
24902725 def sendOpen(tid):
2491 m = SMBMessage(ComOpenAndxRequest(filename = path,
2726 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
24922727 access_mode = 0x0040, # Sharing mode: Deny nothing to others
24932728 open_mode = 0x0001, # Failed if file does not exist
24942729 search_attributes = 0,
25132748 fid, # FID
25142749 0x01, # IsFctl
25152750 0) # IsFlags
2516 m = SMBMessage(ComNTTransactRequest(function = 0x0002, # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
2751 m = SMBMessage(self, ComNTTransactRequest(function = 0x0002, # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
25172752 max_params_count = 0,
25182753 max_data_count = 0xFFFF,
25192754 max_setup_count = 0,
25382773 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to list snapshots on path' % ( path, service_name ), messages_history))
25392774
25402775 def closeFid(tid, fid):
2541 m = SMBMessage(ComCloseRequest(fid))
2776 m = SMBMessage(self, ComCloseRequest(fid))
25422777 m.tid = tid
25432778 self._sendSMBMessage(m)
25442779 messages_history.append(m)
25522787 else:
25532788 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
25542789
2555 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2790 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
25562791 self._sendSMBMessage(m)
25572792 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
25582793 messages_history.append(m)
25612796
25622797 def _echo_SMB1(self, data, callback, errback, timeout = 30):
25632798 messages_history = [ ]
2799
2800 if not isinstance(data, type(b'')):
2801 raise TypeError('Echo data must be %s not %s' % (type(b'').__name__, type(data).__name__))
25642802
25652803 def echoCB(echo_message, **kwargs):
25662804 messages_history.append(echo_message)
25692807 else:
25702808 errback(OperationFailure('Echo failed', messages_history))
25712809
2572 m = SMBMessage(ComEchoRequest(echo_data = data))
2810 m = SMBMessage(self, ComEchoRequest(echo_data = data))
25732811 self._sendSMBMessage(m)
25742812 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
25752813 messages_history.append(m)
25762814
2815 def _extractLastPathComponent(self, path):
2816 return path.replace('\\', '/').split('/')[-1]
2817
25772818
25782819 class SharedDevice:
25792820 """
25802821 Contains information about a single shared device on the remote server.
2822
2823 The following attributes are available:
2824
2825 * name : An unicode string containing the name of the shared device
2826 * comments : An unicode string containing the user description of the shared device
25812827 """
25822828
25832829 # The following constants are taken from [MS-SRVS]: 2.2.2.4
26332879 If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
26342880 to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
26352881 one of these prohibited characters: "\/[]:+|<>=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).
2882
2883 The following attributes are available:
2884
2885 * create_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
2886 * last_access_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
2887 * last_write_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
2888 * last_attr_change_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
2889 * file_size : File size in number of bytes
2890 * alloc_size : Total number of bytes allocated to store this file
2891 * file_attributes : A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
2892 * short_name : Unicode string containing the short name of this file (usually in 8.3 notation)
2893 * filename : Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
2894 * file_id : Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
26362895 """
26372896
2638 def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename):
2897 def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename, file_id=None):
26392898 self.create_time = create_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
26402899 self.last_access_time = last_access_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
26412900 self.last_write_time = last_write_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
26422901 self.last_attr_change_time = last_attr_change_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
26432902 self.file_size = file_size #: File size in number of bytes
26442903 self.alloc_size = alloc_size #: Total number of bytes allocated to store this file
2645 self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3
2904 self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
26462905 self.short_name = short_name #: Unicode string containing the short name of this file (usually in 8.3 notation)
26472906 self.filename = filename #: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
2907 self.file_id = file_id #: Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
26482908
26492909 @property
26502910 def isDirectory(self):
26552915 def isReadOnly(self):
26562916 """A convenient property to return True if this file resource is read-only on the remote server"""
26572917 return bool(self.file_attributes & ATTR_READONLY)
2918
2919 @property
2920 def isNormal(self):
2921 """
2922 A convenient property to return True if this is a normal file.
2923
2924 Note that pysmb defines a normal file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
2925 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
2926 """
2927 return (self.file_attributes==ATTR_NORMAL) or ((self.file_attributes & 0xff)==0)
26582928
26592929 def __unicode__(self):
26602930 return u'Shared file: %s (FileSize:%d bytes, isDirectory:%s)' % ( self.filename, self.file_size, self.isDirectory )
0 """
1 This module implements security descriptors, and the partial structures
2 used in them, as specified in [MS-DTYP].
3 """
4
5 import struct
6
7
8 # Security descriptor control flags
9 # [MS-DTYP]: 2.4.6
10 SECURITY_DESCRIPTOR_OWNER_DEFAULTED = 0x0001
11 SECURITY_DESCRIPTOR_GROUP_DEFAULTED = 0x0002
12 SECURITY_DESCRIPTOR_DACL_PRESENT = 0x0004
13 SECURITY_DESCRIPTOR_DACL_DEFAULTED = 0x0008
14 SECURITY_DESCRIPTOR_SACL_PRESENT = 0x0010
15 SECURITY_DESCRIPTOR_SACL_DEFAULTED = 0x0020
16 SECURITY_DESCRIPTOR_SERVER_SECURITY = 0x0040
17 SECURITY_DESCRIPTOR_DACL_TRUSTED = 0x0080
18 SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED = 0x0100
19 SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED = 0x0200
20 SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED = 0x0400
21 SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED = 0x0800
22 SECURITY_DESCRIPTOR_DACL_PROTECTED = 0x1000
23 SECURITY_DESCRIPTOR_SACL_PROTECTED = 0x2000
24 SECURITY_DESCRIPTOR_RM_CONTROL_VALID = 0x4000
25 SECURITY_DESCRIPTOR_SELF_RELATIVE = 0x8000
26
27 # ACE types
28 # [MS-DTYP]: 2.4.4.1
29 ACE_TYPE_ACCESS_ALLOWED = 0x00
30 ACE_TYPE_ACCESS_DENIED = 0x01
31 ACE_TYPE_SYSTEM_AUDIT = 0x02
32 ACE_TYPE_SYSTEM_ALARM = 0x03
33 ACE_TYPE_ACCESS_ALLOWED_COMPOUND = 0x04
34 ACE_TYPE_ACCESS_ALLOWED_OBJECT = 0x05
35 ACE_TYPE_ACCESS_DENIED_OBJECT = 0x06
36 ACE_TYPE_SYSTEM_AUDIT_OBJECT = 0x07
37 ACE_TYPE_SYSTEM_ALARM_OBJECT = 0x08
38 ACE_TYPE_ACCESS_ALLOWED_CALLBACK = 0x09
39 ACE_TYPE_ACCESS_DENIED_CALLBACK = 0x0A
40 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0x0B
41 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0x0C
42 ACE_TYPE_SYSTEM_AUDIT_CALLBACK = 0x0D
43 ACE_TYPE_SYSTEM_ALARM_CALLBACK = 0x0E
44 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0x0F
45 ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10
46 ACE_TYPE_SYSTEM_MANDATORY_LABEL = 0x11
47 ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE = 0x12
48 ACE_TYPE_SYSTEM_SCOPED_POLICY_ID = 0x13
49
50 # ACE flags
51 # [MS-DTYP]: 2.4.4.1
52 ACE_FLAG_OBJECT_INHERIT = 0x01
53 ACE_FLAG_CONTAINER_INHERIT = 0x02
54 ACE_FLAG_NO_PROPAGATE_INHERIT = 0x04
55 ACE_FLAG_INHERIT_ONLY = 0x08
56 ACE_FLAG_INHERITED = 0x10
57 ACE_FLAG_SUCCESSFUL_ACCESS = 0x40
58 ACE_FLAG_FAILED_ACCESS = 0x80
59
60 # Pre-defined well-known SIDs
61 # [MS-DTYP]: 2.4.2.4
62 SID_NULL = "S-1-0-0"
63 SID_EVERYONE = "S-1-1-0"
64 SID_LOCAL = "S-1-2-0"
65 SID_CONSOLE_LOGON = "S-1-2-1"
66 SID_CREATOR_OWNER = "S-1-3-0"
67 SID_CREATOR_GROUP = "S-1-3-1"
68 SID_OWNER_SERVER = "S-1-3-2"
69 SID_GROUP_SERVER = "S-1-3-3"
70 SID_OWNER_RIGHTS = "S-1-3-4"
71 SID_NT_AUTHORITY = "S-1-5"
72 SID_DIALUP = "S-1-5-1"
73 SID_NETWORK = "S-1-5-2"
74 SID_BATCH = "S-1-5-3"
75 SID_INTERACTIVE = "S-1-5-4"
76 SID_SERVICE = "S-1-5-6"
77 SID_ANONYMOUS = "S-1-5-7"
78 SID_PROXY = "S-1-5-8"
79 SID_ENTERPRISE_DOMAIN_CONTROLLERS = "S-1-5-9"
80 SID_PRINCIPAL_SELF = "S-1-5-10"
81 SID_AUTHENTICATED_USERS = "S-1-5-11"
82 SID_RESTRICTED_CODE = "S-1-5-12"
83 SID_TERMINAL_SERVER_USER = "S-1-5-13"
84 SID_REMOTE_INTERACTIVE_LOGON = "S-1-5-14"
85 SID_THIS_ORGANIZATION = "S-1-5-15"
86 SID_IUSR = "S-1-5-17"
87 SID_LOCAL_SYSTEM = "S-1-5-18"
88 SID_LOCAL_SERVICE = "S-1-5-19"
89 SID_NETWORK_SERVICE = "S-1-5-20"
90 SID_COMPOUNDED_AUTHENTICATION = "S-1-5-21-0-0-0-496"
91 SID_CLAIMS_VALID = "S-1-5-21-0-0-0-497"
92 SID_BUILTIN_ADMINISTRATORS = "S-1-5-32-544"
93 SID_BUILTIN_USERS = "S-1-5-32-545"
94 SID_BUILTIN_GUESTS = "S-1-5-32-546"
95 SID_POWER_USERS = "S-1-5-32-547"
96 SID_ACCOUNT_OPERATORS = "S-1-5-32-548"
97 SID_SERVER_OPERATORS = "S-1-5-32-549"
98 SID_PRINTER_OPERATORS = "S-1-5-32-550"
99 SID_BACKUP_OPERATORS = "S-1-5-32-551"
100 SID_REPLICATOR = "S-1-5-32-552"
101 SID_ALIAS_PREW2KCOMPACC = "S-1-5-32-554"
102 SID_REMOTE_DESKTOP = "S-1-5-32-555"
103 SID_NETWORK_CONFIGURATION_OPS = "S-1-5-32-556"
104 SID_INCOMING_FOREST_TRUST_BUILDERS = "S-1-5-32-557"
105 SID_PERFMON_USERS = "S-1-5-32-558"
106 SID_PERFLOG_USERS = "S-1-5-32-559"
107 SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP = "S-1-5-32-560"
108 SID_TERMINAL_SERVER_LICENSE_SERVERS = "S-1-5-32-561"
109 SID_DISTRIBUTED_COM_USERS = "S-1-5-32-562"
110 SID_IIS_IUSRS = "S-1-5-32-568"
111 SID_CRYPTOGRAPHIC_OPERATORS = "S-1-5-32-569"
112 SID_EVENT_LOG_READERS = "S-1-5-32-573"
113 SID_CERTIFICATE_SERVICE_DCOM_ACCESS = "S-1-5-32-574"
114 SID_RDS_REMOTE_ACCESS_SERVERS = "S-1-5-32-575"
115 SID_RDS_ENDPOINT_SERVERS = "S-1-5-32-576"
116 SID_RDS_MANAGEMENT_SERVERS = "S-1-5-32-577"
117 SID_HYPER_V_ADMINS = "S-1-5-32-578"
118 SID_ACCESS_CONTROL_ASSISTANCE_OPS = "S-1-5-32-579"
119 SID_REMOTE_MANAGEMENT_USERS = "S-1-5-32-580"
120 SID_WRITE_RESTRICTED_CODE = "S-1-5-33"
121 SID_NTLM_AUTHENTICATION = "S-1-5-64-10"
122 SID_SCHANNEL_AUTHENTICATION = "S-1-5-64-14"
123 SID_DIGEST_AUTHENTICATION = "S-1-5-64-21"
124 SID_THIS_ORGANIZATION_CERTIFICATE = "S-1-5-65-1"
125 SID_NT_SERVICE = "S-1-5-80"
126 SID_USER_MODE_DRIVERS = "S-1-5-84-0-0-0-0-0"
127 SID_LOCAL_ACCOUNT = "S-1-5-113"
128 SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP = "S-1-5-114"
129 SID_OTHER_ORGANIZATION = "S-1-5-1000"
130 SID_ALL_APP_PACKAGES = "S-1-15-2-1"
131 SID_ML_UNTRUSTED = "S-1-16-0"
132 SID_ML_LOW = "S-1-16-4096"
133 SID_ML_MEDIUM = "S-1-16-8192"
134 SID_ML_MEDIUM_PLUS = "S-1-16-8448"
135 SID_ML_HIGH = "S-1-16-12288"
136 SID_ML_SYSTEM = "S-1-16-16384"
137 SID_ML_PROTECTED_PROCESS = "S-1-16-20480"
138 SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY = "S-1-18-1"
139 SID_SERVICE_ASSERTED_IDENTITY = "S-1-18-2"
140 SID_FRESH_PUBLIC_KEY_IDENTITY = "S-1-18-3"
141 SID_KEY_TRUST_IDENTITY = "S-1-18-4"
142 SID_KEY_PROPERTY_MFA = "S-1-18-5"
143 SID_KEY_PROPERTY_ATTESTATION = "S-1-18-6"
144
145
146 class SID(object):
147 """
148 A Windows security identifier. Represents a single principal, such a
149 user or a group, as a sequence of numbers consisting of the revision,
150 identifier authority, and a variable-length list of subauthorities.
151
152 See [MS-DTYP]: 2.4.2
153 """
154 def __init__(self, revision, identifier_authority, subauthorities):
155 #: Revision, should always be 1.
156 self.revision = revision
157 #: An integer representing the identifier authority.
158 self.identifier_authority = identifier_authority
159 #: A list of integers representing all subauthorities.
160 self.subauthorities = subauthorities
161
162 def __str__(self):
163 """
164 String representation, as specified in [MS-DTYP]: 2.4.2.1
165 """
166 if self.identifier_authority >= 2**32:
167 id_auth = '%#x' % (self.identifier_authority,)
168 else:
169 id_auth = self.identifier_authority
170 auths = [self.revision, id_auth] + self.subauthorities
171 return 'S-' + '-'.join(str(subauth) for subauth in auths)
172
173 def __repr__(self):
174 return 'SID(%r)' % (str(self),)
175
176 @classmethod
177 def from_bytes(cls, data, return_tail=False):
178 revision, subauth_count = struct.unpack('<BB', data[:2])
179 identifier_authority = struct.unpack('>Q', '\x00\x00' + data[2:8])[0]
180 subauth_data = data[8:]
181 subauthorities = [struct.unpack('<L', subauth_data[4 * i : 4 * (i+1)])[0]
182 for i in range(subauth_count)]
183 sid = cls(revision, identifier_authority, subauthorities)
184 if return_tail:
185 return sid, subauth_data[4 * subauth_count :]
186 return sid
187
188
189 class ACE(object):
190 """
191 Represents a single access control entry.
192
193 See [MS-DTYP]: 2.4.4
194 """
195 HEADER_FORMAT = '<BBH'
196
197 def __init__(self, type_, flags, mask, sid, additional_data):
198 #: An integer representing the type of the ACE. One of the
199 #: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field
200 #: from [MS-DTYP] 2.4.4.1.
201 self.type = type_
202 #: An integer bitmask with ACE flags, corresponds to the
203 #: ``AceFlags`` field.
204 self.flags = flags
205 #: An integer representing the ``ACCESS_MASK`` as specified in
206 #: [MS-DTYP] 2.4.3.
207 self.mask = mask
208 #: The :class:`SID` of a trustee.
209 self.sid = sid
210 #: A dictionary of additional fields present in the ACE, depending
211 #: on the type. The following fields can be present:
212 #:
213 #: * ``flags``
214 #: * ``object_type``
215 #: * ``inherited_object_type``
216 #: * ``application_data``
217 #: * ``attribute_data``
218 self.additional_data = additional_data
219
220 def __repr__(self):
221 return "ACE(type=%#04x, flags=%#04x, mask=%#010x, sid=%s)" % (
222 self.type, self.flags, self.mask, self.sid,
223 )
224
225 @property
226 def isInheritOnly(self):
227 """Convenience property which indicates if this ACE is inherit
228 only, meaning that it doesn't apply to the object itself."""
229 return bool(self.flags & ACE_FLAG_INHERIT_ONLY)
230
231 @classmethod
232 def from_bytes(cls, data):
233 header_size = struct.calcsize(cls.HEADER_FORMAT)
234 header = data[:header_size]
235 type_, flags, size = struct.unpack(cls.HEADER_FORMAT, header)
236
237 assert len(data) >= size
238
239 body = data[header_size:size]
240 additional_data = {}
241
242 # In all ACE types, the mask immediately follows the header.
243 mask = struct.unpack('<I', body[:4])[0]
244 body = body[4:]
245
246 # All OBJECT-type ACEs contain additional flags, and two GUIDs as
247 # the following fields.
248 if type_ in (ACE_TYPE_ACCESS_ALLOWED_OBJECT,
249 ACE_TYPE_ACCESS_DENIED_OBJECT,
250 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
251 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
252 ACE_TYPE_SYSTEM_AUDIT_OBJECT,
253 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
254 additional_data['flags'] = struct.unpack('<I', body[:4])[0]
255 additional_data['object_type'] = body[4:20]
256 additional_data['inherited_object_type'] = body[20:36]
257 body = body[36:]
258
259 # Then the SID in all types.
260 sid, body = SID.from_bytes(body, return_tail=True)
261
262 # CALLBACK-type ACEs (and for some obscure reason,
263 # SYSTEM_AUDIT_OBJECT) have a final tail of application data.
264 if type_ in (ACE_TYPE_ACCESS_ALLOWED_CALLBACK,
265 ACE_TYPE_ACCESS_DENIED_CALLBACK,
266 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
267 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
268 ACE_TYPE_SYSTEM_AUDIT_OBJECT,
269 ACE_TYPE_SYSTEM_AUDIT_CALLBACK,
270 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
271 additional_data['application_data'] = body
272
273 # SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.
274 if type_ == ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE:
275 additional_data['attribute_data'] = body
276
277 return cls(type_, flags, mask, sid, additional_data)
278
279
280 class ACL(object):
281 """
282 Access control list, encapsulating a sequence of access control
283 entries.
284
285 See [MS-DTYP]: 2.4.5
286 """
287 HEADER_FORMAT = '<BBHHH'
288
289 def __init__(self, revision, aces):
290 #: Integer value of the revision.
291 self.revision = revision
292 #: List of :class:`ACE` instances.
293 self.aces = aces
294
295 def __repr__(self):
296 return "ACL(%r)" % (self.aces,)
297
298 @classmethod
299 def from_bytes(cls, data):
300 revision = None
301 aces = []
302
303 header_size = struct.calcsize(cls.HEADER_FORMAT)
304 header, remaining = data[:header_size], data[header_size:]
305 revision, sbz1, size, count, sbz2 = struct.unpack(cls.HEADER_FORMAT, header)
306
307 assert len(data) >= size
308
309 for i in range(count):
310 ace_size = struct.unpack('<H', remaining[2:4])[0]
311 ace_data, remaining = remaining[:ace_size], remaining[ace_size:]
312 aces.append(ACE.from_bytes(ace_data))
313
314 return cls(revision, aces)
315
316
317 class SecurityDescriptor(object):
318 """
319 Represents a security descriptor.
320
321 See [MS-DTYP]: 2.4.6
322 """
323
324 HEADER_FORMAT = '<BBHIIII'
325
326 def __init__(self, flags, owner, group, dacl, sacl):
327 #: Integer bitmask of control flags. Corresponds to the
328 #: ``Control`` field in [MS-DTYP] 2.4.6.
329 self.flags = flags
330 #: Instance of :class:`SID` representing the owner user.
331 self.owner = owner
332 #: Instance of :class:`SID` representing the owner group.
333 self.group = group
334 #: Instance of :class:`ACL` representing the discretionary access
335 #: control list, which specifies access restrictions of an object.
336 self.dacl = dacl
337 #: Instance of :class:`ACL` representing the system access control
338 #: list, which specifies audit logging of an object.
339 self.sacl = sacl
340
341 @classmethod
342 def from_bytes(cls, data):
343 owner = None
344 group = None
345 dacl = None
346 sacl = None
347
348 header = data[:struct.calcsize(cls.HEADER_FORMAT)]
349 (revision, sbz1, flags, owner_offset, group_offset, sacl_offset,
350 dacl_offset) = struct.unpack(cls.HEADER_FORMAT, header)
351
352 assert revision == 1
353 assert flags & SECURITY_DESCRIPTOR_SELF_RELATIVE
354 for offset in (owner_offset, group_offset, sacl_offset, dacl_offset):
355 assert 0 <= offset < len(data)
356
357 if owner_offset:
358 owner = SID.from_bytes(data[owner_offset:])
359 if group_offset:
360 group = SID.from_bytes(data[group_offset:])
361 if dacl_offset:
362 dacl = ACL.from_bytes(data[dacl_offset:])
363 if sacl_offset:
364 sacl = ACL.from_bytes(data[sacl_offset:])
365
366 return cls(flags, owner, group, dacl, sacl)
4949 }
5050
5151 # Values for dialect_revision field in SMB2NegotiateResponse class
52 SMB2_DIALECT_2 = 0x0202
53 SMB2_DIALECT_21 = 0x0210
54 SMB2_DIALECT_2ALL = 0x02FF
52 SMB2_DIALECT_2 = 0x0202 # 2.0.2 - First SMB2 version
53 SMB2_DIALECT_21 = 0x0210 # 2.1 - Windows 7
54 SMB2_DIALET_30 = 0x0300 # 3.0 - Windows 8
55 SMB2_DIALECT_302 = 0x0302 # 3.0.2 - Windows 8.1
56 SMB2_DIALECT_311 = 0x0311 # 3.1.1 - Windows 10
57 SMB2_DIALECT_2ALL = 0x02FF # Wildcard (for negotiation only)
5558
5659 # Bit mask for SecurityMode field in SMB2NegotiateResponse class
5760 SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001
6467
6568 # Bitmask for Capabilities in SMB2TreeConnectResponse class
6669 SMB2_SHARE_CAP_DFS = 0x0008
70
71
72 # SMB 2.1 / 3 Capabilities flags
73 SMB2_GLOBAL_CAP_DFS = 0x01
74 SMB2_GLOBAL_CAP_LEASING = 0x02
75 SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
76 SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
77 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
78 SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
79 SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
80
6781
6882 # Values for OpLockLevel field in SMB2CreateRequest class
6983 SMB2_OPLOCK_LEVEL_NONE = 0x00
00
1 import os, sys, struct, types, logging, binascii, time
1 import os, sys, struct, types, logging, binascii, time, uuid
22 from StringIO import StringIO
33 from smb_structs import ProtocolError
44 from smb_constants import *
2222 log = logging.getLogger('SMB.SMB2Message')
2323 protocol = 2
2424
25 def __init__(self, payload = None):
25
26 def __init__(self, conn = None, payload = None):
27 """
28 Initialise a new SMB2 Message.
29 conn - reference to the connection, the SMB class
30 payload - the message payload, if any
31 """
2632 self.reset()
33 self.conn = conn
2734 if payload:
2835 self.payload = payload
2936 self.payload.initMessage(self)
5966 self.pid = 0
6067 self.tid = 0
6168
69 # credit related
70 self.credit_charge = 0
71 self.credit_request = 1
72
6273 # Not used in this class. Maintained for compatibility with SMBMessage class
6374 self.flags2 = 0
6475 self.uid = 0
6879 def encode(self):
6980 """
7081 Encode this SMB2 message into a series of bytes suitable to be embedded with a NetBIOS session message.
82 AssertionError will be raised if this SMB message has not been initialized with an SMB instance
7183 AssertionError will be raised if this SMB message has not been initialized with a Payload instance
84
85 The header format is:
86 - Protocol ID
87 - Structure Size
88 - Credit Charge
89 - Status / Channel Sequence
90 - Command
91 - Credit Request / Credit Response
92 - Flags
93 - Next Compound
94 - MessageId
95 - Reserved
96 - TreeId
97 - Session ID
98 - Signature
7299
73100 @return: a string containing the encoded SMB2 message
74101 """
75102 assert self.payload
103 assert self.conn
76104
77105 self.pid = os.getpid()
78106 self.payload.prepare(self)
79107
108 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
109 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
110 # This only applies to SMB2ReadRequest, SMB2WriteRequest, SMB2IoctlRequest and SMB2QueryDirectory
111 # See: MS-SMB2 3.2.4.1.5: For all other requests, the client MUST set CreditCharge to 1, even if the
112 # payload size of a request or the anticipated response is greater than 65536.
113 if self.conn.smb2_dialect != SMB2_DIALECT_2:
114 if self.conn.cap_multi_credit:
115 # self.credit_charge will be set by some commands if necessary (Read/Write/Ioctl/QueryDirectory)
116 # If not set, but dialect is SMB 2.1 or above, we must set it to 1
117 if self.credit_charge is 0:
118 self.credit_charge = 1
119 else:
120 # If >= SMB 2.1, but server does not support multi credit operations we must set to 1
121 self.credit_charge = 1
122
123 if self.mid > 3:
124 self.credit_request = 127
125
80126 headers_data = struct.pack(self.HEADER_STRUCT_FORMAT,
81 '\xFESMB', self.HEADER_SIZE, 0, self.status, self.command, 0, self.flags) + \
82 struct.pack(self.SYNC_HEADER_STRUCT_FORMAT, self.next_command_offset, self.mid, self.pid, self.tid, self.session_id, self.signature)
127 '\xFESMB', # Protocol ID
128 self.HEADER_SIZE, # Structure Size
129 self.credit_charge, # Credit Charge
130 self.status, # Status / Channel Sequence
131 self.command, # Command
132 self.credit_request, # Credit Request / Credit Response
133 self.flags, # Flags
134 ) + \
135 struct.pack(self.SYNC_HEADER_STRUCT_FORMAT,
136 self.next_command_offset, # Next Compound
137 self.mid, # Message ID
138 self.pid, # Process ID
139 self.tid, # Tree ID
140 self.session_id, # Session ID
141 self.signature) # Signature
83142 return headers_data + self.data
84143
85144 def decode(self, buf):
105164 self.reset()
106165
107166 protocol, struct_size, self.credit_charge, self.status, \
108 self.command, self.credit_re, self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
167 self.command, self.credit_response, \
168 self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
109169
110170 if protocol != '\xFESMB':
111171 raise ProtocolError('Invalid 4-byte SMB2 protocol field', buf)
188248 raise NotImplementedError
189249
190250
251 class SMB2NegotiateRequest(Structure):
252 """
253 2.2.3 SMB2 NEGOTIATE Request
254 The SMB2 NEGOTIATE Request packet is used by the client to notify the server what dialects of the SMB 2 Protocol
255 the client understands. This request is composed of an SMB2 header, as specified in section 2.2.1,
256 followed by this request structure:
257
258 SMB2 Negotiate Request Packet structure:
259 StructureSize (2 bytes)
260 DialectCount (2 bytes)
261 SecurityMode (2 bytes)
262 Reserved (2 bytes)
263 Capabilities (4 bytes)
264 ClientGuid (16 bytes)
265 ClientStartTime (8 bytes):
266 ClientStartTime (8 bytes):
267 Dialects (variable): An array of one or more 16-bit integers
268
269 References:
270 ===========
271 - [MS-SMB2]: 2.2.3
272
273 """
274
275
276 STRUCTURE_FORMAT = "<HHHHI16sQHH"
277 STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
278
279 def initMessage(self, message):
280 Structure.initMessage(self, message)
281 message.command = SMB2_COM_NEGOTIATE
282
283 def prepare(self, message):
284 # TODO! Do we need to save the GUID and present it later in other requests?
285 # The SMB docs don't exactly explain what the guid is for
286 message.data = struct.pack(self.STRUCTURE_FORMAT,
287 36, # Structure size. Must be 36 as mandated by [MS-SMB2] 2.2.3
288 2, # DialectCount
289 0x01, # Security mode
290 0, # Reserved
291 0x00, # Capabilities
292 uuid.uuid4().bytes, # Client GUID
293 0, # Client start time
294 SMB2_DIALECT_2,
295 SMB2_DIALECT_21)
296
297
191298 class SMB2NegotiateResponse(Structure):
192299 """
193300 Contains information on the SMB2_NEGOTIATE response from server
222329 self.server_start_time = convertFILETIMEtoEpoch(self.server_start_time)
223330 self.system_time = convertFILETIMEtoEpoch(self.system_time)
224331 self.security_blob = message.raw_data[security_buf_offset:security_buf_offset+security_buf_len]
332 message.conn.smb2_dialect = self.dialect_revision
225333
226334
227335 class SMB2SessionSetupRequest(Structure):
268376
269377 STRUCTURE_FORMAT = "<HHHH"
270378 STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
379
380 @property
381 def isGuestSession(self):
382 return (self.session_flags & 0x0001) > 0 # SMB2_SESSION_FLAG_IS_GUEST
383
384 @property
385 def isAnonymousSession(self):
386 return (self.session_flags & 0x0002) > 0 # SMB2_SESSION_FLAG_IS_NULL
271387
272388 def decode(self, message):
273389 assert message.command == SMB2_COM_SESSION_SETUP
464580 0, # WriteChannelInfoLength
465581 self.flags) + self.data
466582
583 # MS-SMB2 3.2.4.7
584 # If a client requests writing to a file, Connection.Dialect is not "2.0.2", and if
585 # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
586 # to ( 1 + (Length - 1) / 65536 )
587 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
588 message.credit_charge = int(1 + (len(self.data) -1) / 65536)
589
467590
468591 class SMB2WriteResponse(Structure):
469592 """
521644 0, # ReadChannelInfoOffset
522645 0 # ReadChannelInfoLength
523646 ) + '\0'
647
648 # MS-SMB2 3.2.4.6
649 # If a client requests reading from a file, Connection.Dialect is not "2.0.2", and if
650 # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
651 # to ( 1 + (Length - 1) / 65536 )
652 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
653 message.credit_charge = int(1 + (self.read_len -1) / 65536)
524654
525655
526656 class SMB2ReadResponse(Structure):
578708 0 # Reserved
579709 ) + self.in_data
580710
711 # If Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header
712 # SHOULD be set to (max(InputCount, MaxOutputResponse) - 1) / 65536 + 1
713 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
714 message.credit_charge = int((max(len(self.in_data), self.max_out_size) - 1) / 65536 + 1)
715
581716
582717 class SMB2IoctlResponse(Structure):
583718 """
685820 SMB2Message.HEADER_SIZE + self.STRUCTURE_SIZE, # FileNameOffset
686821 len(self.filename)*2,
687822 self.output_buf_len) + self.filename.encode('UTF-16LE')
823
824 # MS-SMB2 3.2.4.17
825 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
826 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
827 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
828 message.credit_charge = int(1 + (self.output_buf_len -1) / 65536)
688829
689830
690831 class SMB2QueryDirectoryResponse(Structure):
748889 self.fid # FileId
749890 ) + self.input_buf
750891
892 # MS-SMB2 3.2.4.17
893 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
894 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
895 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
896 message.credit_charge = int(1 + ((self.output_buf_len + len(self.input_buf)) -1) / 65536)
897
751898
752899 class SMB2QueryInfoResponse(Structure):
753900 """
806953 self.fid # FileId
807954 ) + self.data
808955
956 # MS-SMB2 3.2.4.17
957 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
958 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
959 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
960 message.credit_charge = int(1 + (len(self.data) -1) / 65536)
961
809962 class SMB2SetInfoResponse(Structure):
810963 """
811964 References:
114114 FILE_READ_EA = 0x08
115115 FILE_WRITE_EA = 0x10
116116 FILE_EXECUTE = 0x20
117 FILE_DELETE_CHILD = 0x40
117118 FILE_READ_ATTRIBUTES = 0x80
118119 FILE_WRITE_ATTRIBUTES = 0x0100
119120 DELETE = 0x010000
224225 SMB_FILE_ATTRIBUTE_READONLY = 0x01
225226 SMB_FILE_ATTRIBUTE_HIDDEN = 0x02
226227 SMB_FILE_ATTRIBUTE_SYSTEM = 0x04
227 SMB_FILE_ATTRIBUTE_VOLUME = 0x08
228 SMB_FILE_ATTRIBUTE_VOLUME = 0x08 # Unsupported for listPath() operations
228229 SMB_FILE_ATTRIBUTE_DIRECTORY = 0x10
229230 SMB_FILE_ATTRIBUTE_ARCHIVE = 0x20
231 # SMB_FILE_ATTRIBUTE_INCL_NORMAL is a special placeholder to include normal files for
232 # with other search attributes for listPath() operations. It is not defined in the MS-CIFS specs.
233 SMB_FILE_ATTRIBUTE_INCL_NORMAL = 0x10000
234 # Do not use the following values for listPath() operations as they are not supported for SMB2
230235 SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
231236 SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
232237 SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
236241 # Bitmask for OptionalSupport field in SMB_COM_TREE_CONNECT_ANDX response
237242 SMB_TREE_CONNECTX_SUPPORT_SEARCH = 0x0001
238243 SMB_TREE_CONNECTX_SUPPORT_DFS = 0x0002
244
245 # Bitmask for security information fields, specified as
246 # AdditionalInformation in SMB2
247 # [MS-SMB]: 2.2.7.4
248 # [MS-SMB2]: 2.2.37
249 OWNER_SECURITY_INFORMATION = 0x00000001
250 GROUP_SECURITY_INFORMATION = 0x00000002
251 DACL_SECURITY_INFORMATION = 0x00000004
252 SACL_SECURITY_INFORMATION = 0x00000008
253 LABEL_SECURITY_INFORMATION = 0x00000010
254 ATTRIBUTE_SECURITY_INFORMATION = 0x00000020
255 SCOPE_SECURITY_INFORMATION = 0x00000040
256 BACKUP_SECURITY_INFORMATION = 0x00010000
99 # Set to True if you want to enable SMB2 protocol.
1010 SUPPORT_SMB2 = True
1111
12 # Set to True if you want to enable SMB2.1 and above protocol.
13 SUPPORT_SMB2x = True
14
1215 # Supported dialects
13 DIALECTS = [ ]
14 for i, ( name, dialect ) in enumerate([ ( 'NT_LAN_MANAGER_DIALECT', 'NT LM 0.12' ), ]):
15 DIALECTS.append(dialect)
16 globals()[name] = i
17
18 DIALECTS2 = [ ]
19 for i, ( name, dialect ) in enumerate([ ( 'SMB2_DIALECT', 'SMB 2.002' ) ]):
20 DIALECTS2.append(dialect)
21 globals()[name] = i + len(DIALECTS)
22
16 NT_LAN_MANAGER_DIALECT = 0 # 'NT LM 0.12' is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)
17
18 # Return the list of support SMB dialects based on the SUPPORT_x constants
19 def init_dialects_list():
20 dialects = [ 'NT LM 0.12' ]
21 if SUPPORT_SMB2:
22 dialects.append('SMB 2.002')
23 if SUPPORT_SMB2x:
24 dialects.append('SMB 2.???')
25 return dialects
2326
2427 class UnsupportedFeature(Exception):
2528 """
107110 log = logging.getLogger('SMB.SMBMessage')
108111 protocol = 1
109112
110 def __init__(self, payload = None):
113 def __init__(self, conn, payload = None):
111114 self.reset()
115 self.conn = conn
112116 if payload:
113117 self.payload = payload
114118 self.payload.initMessage(self)
289293 def prepare(self, message):
290294 assert message.payload == self
291295 message.parameters_data = ''
292 if SUPPORT_SMB2:
293 message.data = ''.join(map(lambda s: '\x02'+s+'\x00', DIALECTS + DIALECTS2))
294 else:
295 message.data = ''.join(map(lambda s: '\x02'+s+'\x00', DIALECTS))
296 message.data = ''.join(map(lambda s: '\x02'+s+'\x00', init_dialects_list()))
296297
297298
298299 class ComNegotiateResponse(Payload):
12791280 - [MS-CIFS]: 2.2.4.39.1
12801281 """
12811282
1282 def __init__(self, echo_data = '', echo_count = 1):
1283 def __init__(self, echo_data = b'', echo_count = 1):
12831284 self.echo_count = echo_count
12841285 self.echo_data = echo_data
12851286
33 from nose.tools import with_setup
44 from smb import smb_structs
55
6 conn = None
6 conn, conn2, conn3 = None, None, None
77
88 def teardown_func():
9 global conn
10 conn.close()
9 global conn, conn2, conn3
10 if conn:
11 conn.close()
12 if conn2:
13 conn2.close()
14 if conn3:
15 conn3.close();
1116
1217 @with_setup(teardown = teardown_func)
1318 def test_NTLMv1_auth_SMB1():
1419 global conn
15 smb_structs.SUPPORT_SMB2 = False
20 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1621 info = getConnectionInfo()
17 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False, is_direct_tcp = True)
1823 assert conn.connect(info['server_ip'], info['server_port'])
24
25 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
26 assert not conn2.connect(info['server_ip'], info['server_port'])
27
28 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
29 assert not conn3.connect(info['server_ip'], info['server_port'])
1930
2031 @with_setup(teardown = teardown_func)
2132 def test_NTLMv2_auth_SMB1():
2233 global conn
23 smb_structs.SUPPORT_SMB2 = False
34 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2435 info = getConnectionInfo()
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
36 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
2637 assert conn.connect(info['server_ip'], info['server_port'])
38
39 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 assert not conn2.connect(info['server_ip'], info['server_port'])
41
42 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert not conn3.connect(info['server_ip'], info['server_port'])
2744
2845 @with_setup(teardown = teardown_func)
2946 def test_NTLMv1_auth_SMB2():
3047 global conn
31 smb_structs.SUPPORT_SMB2 = True
48 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
3249 info = getConnectionInfo()
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
50 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
3451 assert conn.connect(info['server_ip'], info['server_port'])
52
53 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
54 assert not conn2.connect(info['server_ip'], info['server_port'])
55
56 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
57 assert not conn3.connect(info['server_ip'], info['server_port'])
3558
3659 @with_setup(teardown = teardown_func)
3760 def test_NTLMv2_auth_SMB2():
3861 global conn
39 smb_structs.SUPPORT_SMB2 = True
62 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
4063 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
64 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
4265 assert conn.connect(info['server_ip'], info['server_port'])
66
67 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
68 assert not conn2.connect(info['server_ip'], info['server_port'])
69
70 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
71 assert not conn3.connect(info['server_ip'], info['server_port'])
11
22 import os, time, random
33 from smb.SMBConnection import SMBConnection
4 from smb.smb2_constants import SMB2_DIALECT_2
45 from util import getConnectionInfo
56 from nose.tools import with_setup
67 from smb import smb_structs
910
1011 def setup_func_SMB1():
1112 global conn
12 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1314
1415 info = getConnectionInfo()
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
16 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1718
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123
2224 info = getConnectionInfo()
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
26 assert conn.connect(info['server_ip'], info['server_port'])
27
28 def setup_func_SMB2x():
29 global conn
30 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
31
32 info = getConnectionInfo()
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2434 assert conn.connect(info['server_ip'], info['server_port'])
2535
2636 def teardown_func():
4757 @with_setup(setup_func_SMB2, teardown_func)
4858 def test_english_directory_SMB2():
4959 global conn
60 assert conn.smb2_dialect == SMB2_DIALECT_2
61
62 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
63 conn.createDirectory('smbtest', path)
64
65 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
66 names = map(lambda e: e.filename, entries)
67 assert os.path.basename(path.replace('/', os.sep)) in names
68
69 conn.deleteDirectory('smbtest', path)
70
71 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
72 names = map(lambda e: e.filename, entries)
73 assert os.path.basename(path.replace('/', os.sep)) not in names
74
75 @with_setup(setup_func_SMB2x, teardown_func)
76 def test_english_directory_SMB2x():
77 global conn
78 assert conn.smb2_dialect != SMB2_DIALECT_2
5079
5180 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
5281 conn.createDirectory('smbtest', path)
81110 @with_setup(setup_func_SMB2, teardown_func)
82111 def test_unicode_directory_SMB2():
83112 global conn
113 assert conn.smb2_dialect == SMB2_DIALECT_2
84114
85115 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86116 conn.createDirectory('smbtest', path)
94124 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
95125 names = map(lambda e: e.filename, entries)
96126 assert os.path.basename(path.replace('/', os.sep)) not in names
127
128 @with_setup(setup_func_SMB2x, teardown_func)
129 def test_unicode_directory_SMB2x():
130 global conn
131 assert conn.smb2_dialect != SMB2_DIALECT_2
132
133 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
134 conn.createDirectory('smbtest', path)
135
136 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
137 names = map(lambda e: e.filename, entries)
138 assert os.path.basename(path.replace('/', os.sep)) in names
139
140 conn.deleteDirectory('smbtest', path)
141
142 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
143 names = map(lambda e: e.filename, entries)
144 assert os.path.basename(path.replace('/', os.sep)) not in names
88 def setup_func():
99 global conn
1010 info = getConnectionInfo()
11 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
11 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1212 assert conn.connect(info['server_ip'], info['server_port'])
1313
1414 def teardown_func():
2121
2222 data = '%d' % random.randint(1000, 9999)
2323 assert conn.echo(data) == data
24
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb_constants import *
4 from smb.smb2_constants import SMB2_DIALECT_2
35 from util import getConnectionInfo
46 from nose.tools import with_setup
57 from smb import smb_structs
810
911 def setup_func_SMB1():
1012 global conn
11 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1214 info = getConnectionInfo()
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1517
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
1922 info = getConnectionInfo()
20 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29 info = getConnectionInfo()
30 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2131 assert conn.connect(info['server_ip'], info['server_port'])
2232
2333 def teardown_func():
4454 assert ( u'Test Folder', True ) in filenames
4555 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
4656
57 @with_setup(setup_func_SMB1, teardown_func)
58 def test_listPathWithManyFiles_SMB1():
59 global conn
60 results = conn.listPath('smbtest', '/RFC Archive/')
61 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
62 assert len(filenames)==999
63
4764 @with_setup(setup_func_SMB2, teardown_func)
4865 def test_listPath_SMB2():
4966 global conn
67 assert conn.smb2_dialect == SMB2_DIALECT_2
68 results = conn.listPath('smbtest', '/')
69 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
70 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
71 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
72 assert ( u'TestDir1', True ) in filenames # Test short English folder names
73 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
74 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
75
76 @with_setup(setup_func_SMB2x, teardown_func)
77 def test_listPath_SMB2x():
78 global conn
79 assert conn.smb2_dialect != SMB2_DIALECT_2
5080 results = conn.listPath('smbtest', '/')
5181 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
5282 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
5888 @with_setup(setup_func_SMB2, teardown_func)
5989 def test_listSubPath_SMB2():
6090 global conn
91 assert conn.smb2_dialect == SMB2_DIALECT_2
6192 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
6293 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
6394 assert ( u'Test File.txt', False ) in filenames
6495 assert ( u'Test Folder', True ) in filenames
6596 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
97
98 @with_setup(setup_func_SMB2x, teardown_func)
99 def test_listSubPath_SMB2x():
100 global conn
101 assert conn.smb2_dialect != SMB2_DIALECT_2
102 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
103 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
104 assert ( u'Test File.txt', False ) in filenames
105 assert ( u'Test Folder', True ) in filenames
106 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
107
108 @with_setup(setup_func_SMB2, teardown_func)
109 def test_listPathWithManyFiles_SMB2():
110 global conn
111 results = conn.listPath('smbtest', '/RFC Archive/')
112 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
113 assert len(filenames)==999
114
115 @with_setup(setup_func_SMB1, teardown_func)
116 def test_listPathFilterForDirectory_SMB1():
117 global conn
118 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
119 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
120 assert len(filenames) > 0
121 for f, isDirectory in filenames:
122 assert isDirectory
123
124 @with_setup(setup_func_SMB2, teardown_func)
125 def test_listPathFilterForDirectory_SMB2():
126 global conn
127 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
128 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
129 assert len(filenames) > 0
130 for f, isDirectory in filenames:
131 assert isDirectory
132
133 @with_setup(setup_func_SMB1, teardown_func)
134 def test_listPathFilterForFiles_SMB1():
135 global conn
136 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
137 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
138 assert len(filenames) > 0
139 for f, isDirectory in filenames:
140 assert not isDirectory
141
142 @with_setup(setup_func_SMB2, teardown_func)
143 def test_listPathFilterForFiles_SMB2():
144 global conn
145 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
146 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
147 assert len(filenames) > 0
148 for f, isDirectory in filenames:
149 assert not isDirectory
150
151 @with_setup(setup_func_SMB1, teardown_func)
152 def test_listPathFilterPattern_SMB1():
153 global conn
154 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
155 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
156 assert len(filenames) == 2
157 assert ( u'Test File.txt', False ) in filenames
158 assert ( u'Test Folder', True ) in filenames
159 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
160
161 @with_setup(setup_func_SMB2, teardown_func)
162 def test_listPathFilterPattern_SMB2():
163 global conn
164 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
165 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
166 assert len(filenames) == 2
167 assert ( u'Test File.txt', False ) in filenames
168 assert ( u'Test Folder', True ) in filenames
169 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
170
171 @with_setup(setup_func_SMB1, teardown_func)
172 def test_listPathFilterUnicodePattern_SMB1():
173 global conn
174 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
175 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
176 assert len(filenames) == 1
177 assert ( u'Test File.txt', False ) not in filenames
178 assert ( u'Test Folder', True ) not in filenames
179 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
180
181 @with_setup(setup_func_SMB2, teardown_func)
182 def test_listPathFilterUnicodePattern_SMB2():
183 global conn
184 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
185 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
186 assert len(filenames) == 1
187 assert ( u'Test File.txt', False ) not in filenames
188 assert ( u'Test Folder', True ) not in filenames
189 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1112 info = getConnectionInfo()
12 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1314 assert conn.connect(info['server_ip'], info['server_port'])
1415
1516 def setup_func_SMB2():
1617 global conn
1718 smb_structs.SUPPORT_SMB2 = True
19 smb_structs.SUPPORT_SMB2x = False
1820 info = getConnectionInfo()
19 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
21 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
22 assert conn.connect(info['server_ip'], info['server_port'])
23
24 def setup_func_SMB2x():
25 global conn
26 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
27 info = getConnectionInfo()
28 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2029 assert conn.connect(info['server_ip'], info['server_port'])
2130
2231 def teardown_func():
3241 @with_setup(setup_func_SMB2, teardown_func)
3342 def test_listshares_SMB2():
3443 global conn
44 assert conn.smb2_dialect == SMB2_DIALECT_2
3545 results = conn.listShares()
3646 assert 'smbtest' in map(lambda r: r.name.lower(), results)
47
48 @with_setup(setup_func_SMB2x, teardown_func)
49 def test_listshares_SMB2x():
50 global conn
51 assert conn.smb2_dialect != SMB2_DIALECT_2
52 results = conn.listShares()
53 assert 'smbtest' in map(lambda r: r.name.lower(), results)
99 global conn
1010 smb_structs.SUPPORT_SMB2 = False
1111 info = getConnectionInfo()
12 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
12 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1313 assert conn.connect(info['server_ip'], info['server_port'])
1414
1515 def setup_func_SMB2():
1616 global conn
1717 smb_structs.SUPPORT_SMB2 = True
1818 info = getConnectionInfo()
19 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
19 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2020 assert conn.connect(info['server_ip'], info['server_port'])
2121
2222 def teardown_func():
22 import os, time, random
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415 info = getConnectionInfo()
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
16 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1718
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123 info = getConnectionInfo()
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
25 assert conn.connect(info['server_ip'], info['server_port'])
26
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30 info = getConnectionInfo()
31 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2332 assert conn.connect(info['server_ip'], info['server_port'])
2433
2534 def teardown_func():
5261 @with_setup(setup_func_SMB2, teardown_func)
5362 def test_rename_english_file_SMB2():
5463 global conn
64 assert conn.smb2_dialect == SMB2_DIALECT_2
65
66 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
67 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
68
69 conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
70
71 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
72 filenames = map(lambda e: e.filename, entries)
73 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
74 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
75
76 conn.rename('smbtest', old_path, new_path)
77
78 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
79 filenames = map(lambda e: e.filename, entries)
80 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
81 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
82
83 conn.deleteFiles('smbtest', new_path)
84
85 @with_setup(setup_func_SMB2x, teardown_func)
86 def test_rename_english_file_SMB2x():
87 global conn
88 assert conn.smb2_dialect != SMB2_DIALECT_2
5589
5690 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
5791 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
98132 @with_setup(setup_func_SMB2, teardown_func)
99133 def test_rename_unicode_file_SMB2():
100134 global conn
135 assert conn.smb2_dialect == SMB2_DIALECT_2
101136
102137 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
103138 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
118153
119154 conn.deleteFiles('smbtest', new_path)
120155
156 @with_setup(setup_func_SMB2x, teardown_func)
157 def test_rename_unicode_file_SMB2x():
158 global conn
159 assert conn.smb2_dialect != SMB2_DIALECT_2
160
161 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
162 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
163
164 conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
165
166 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
167 filenames = map(lambda e: e.filename, entries)
168 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
169 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
170
171 conn.rename('smbtest', old_path, new_path)
172
173 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
174 filenames = map(lambda e: e.filename, entries)
175 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
176 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
177
178 conn.deleteFiles('smbtest', new_path)
179
121180 @with_setup(setup_func_SMB1, teardown_func)
122181 def test_rename_english_directory_SMB1():
123182 global conn
144203 @with_setup(setup_func_SMB2, teardown_func)
145204 def test_rename_english_directory_SMB2():
146205 global conn
206 assert conn.smb2_dialect == SMB2_DIALECT_2
207
208 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
209 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
210
211 conn.createDirectory('smbtest', old_path)
212
213 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
214 filenames = map(lambda e: e.filename, entries)
215 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
216 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
217
218 conn.rename('smbtest', old_path, new_path)
219
220 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
221 filenames = map(lambda e: e.filename, entries)
222 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
223 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
224
225 conn.deleteDirectory('smbtest', new_path)
226
227 @with_setup(setup_func_SMB2x, teardown_func)
228 def test_rename_english_directory_SMB2x():
229 global conn
230 assert conn.smb2_dialect != SMB2_DIALECT_2
147231
148232 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
149233 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
190274 @with_setup(setup_func_SMB2, teardown_func)
191275 def test_rename_unicode_directory_SMB2():
192276 global conn
277 assert conn.smb2_dialect == SMB2_DIALECT_2
193278
194279 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
195280 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
209294 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
210295
211296 conn.deleteDirectory('smbtest', new_path)
297
298 @with_setup(setup_func_SMB2x, teardown_func)
299 def test_rename_unicode_directory_SMB2x():
300 global conn
301 assert conn.smb2_dialect != SMB2_DIALECT_2
302
303 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
304 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
305
306 conn.createDirectory('smbtest', old_path)
307
308 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
309 filenames = map(lambda e: e.filename, entries)
310 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
311 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
312
313 conn.rename('smbtest', old_path, new_path)
314
315 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
316 filenames = map(lambda e: e.filename, entries)
317 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
318 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
319
320 conn.deleteDirectory('smbtest', new_path)
22 import os, tempfile
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1718
1819 def setup_func_SMB1():
1920 global conn
20 smb_structs.SUPPORT_SMB2 = False
21 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
22
2123 info = getConnectionInfo()
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2426
2527 def setup_func_SMB2():
2628 global conn
2729 smb_structs.SUPPORT_SMB2 = True
30 smb_structs.SUPPORT_SMB2x = False
31
2832 info = getConnectionInfo()
29 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
34 assert conn.connect(info['server_ip'], info['server_port'])
35
36 def setup_func_SMB2x():
37 global conn
38 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
39
40 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
3042 assert conn.connect(info['server_ip'], info['server_port'])
3143
3244 def teardown_func():
5163 def test_retr_multiplereads_SMB2():
5264 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
5365 global conn
66 assert conn.smb2_dialect == SMB2_DIALECT_2
67
5468 temp_fh = StringIO()
5569 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
5670
6175
6276 temp_fh.close()
6377
78 @with_setup(setup_func_SMB2x, teardown_func)
79 def test_retr_multiplereads_SMB2x():
80 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
81 global conn
82 assert conn.smb2_dialect != SMB2_DIALECT_2
83
84 temp_fh = StringIO()
85 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
86
87 md = MD5()
88 md.update(temp_fh.getvalue())
89 assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
90 assert filesize == 158437
91
92 temp_fh.close()
93
6494 @with_setup(setup_func_SMB1, teardown_func)
6595 def test_retr_longfilename_SMB1():
6696 # Test file retrieval that has a long English filename
79109 def test_retr_longfilename_SMB2():
80110 # Test file retrieval that has a long English filename
81111 global conn
112 assert conn.smb2_dialect == SMB2_DIALECT_2
113
82114 temp_fh = StringIO()
83115 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
84116
89121
90122 temp_fh.close()
91123
124 @with_setup(setup_func_SMB2x, teardown_func)
125 def test_retr_longfilename_SMB2x():
126 # Test file retrieval that has a long English filename
127 global conn
128 assert conn.smb2_dialect != SMB2_DIALECT_2
129
130 temp_fh = StringIO()
131 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
132
133 md = MD5()
134 md.update(temp_fh.getvalue())
135 assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
136 assert filesize == 421269
137
138 temp_fh.close()
139
92140 @with_setup(setup_func_SMB1, teardown_func)
93141 def test_retr_unicodefilename_SMB1():
94142 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
107155 def test_retr_unicodefilename_SMB2():
108156 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
109157 global conn
158 assert conn.smb2_dialect == SMB2_DIALECT_2
159
110160 temp_fh = StringIO()
111161 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
112162
117167
118168 temp_fh.close()
119169
170 @with_setup(setup_func_SMB2x, teardown_func)
171 def test_retr_unicodefilename_SMB2x():
172 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
173 global conn
174 assert conn.smb2_dialect != SMB2_DIALECT_2
175
176 temp_fh = StringIO()
177 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
178
179 md = MD5()
180 md.update(temp_fh.getvalue())
181 assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
182 assert filesize == 256000
183
184 temp_fh.close()
185
120186 @with_setup(setup_func_SMB1, teardown_func)
121187 def test_retr_offset_SMB1():
122188 # Test file retrieval from offset to EOF
135201 def test_retr_offset_SMB2():
136202 # Test file retrieval from offset to EOF
137203 global conn
204 assert conn.smb2_dialect == SMB2_DIALECT_2
205
138206 temp_fh = StringIO()
139207 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
140208
145213
146214 temp_fh.close()
147215
216 @with_setup(setup_func_SMB2x, teardown_func)
217 def test_retr_offset_SMB2x():
218 # Test file retrieval from offset to EOF
219 global conn
220 assert conn.smb2_dialect != SMB2_DIALECT_2
221
222 temp_fh = StringIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
224
225 md = MD5()
226 md.update(temp_fh.getvalue())
227 assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
228 assert filesize == 156000
229
230 temp_fh.close()
231
148232 @with_setup(setup_func_SMB1, teardown_func)
149233 def test_retr_offset_and_biglimit_SMB1():
150234 # Test file retrieval from offset with a big max_length
163247 def test_retr_offset_and_biglimit_SMB2():
164248 # Test file retrieval from offset with a big max_length
165249 global conn
250 assert conn.smb2_dialect == SMB2_DIALECT_2
251
166252 temp_fh = StringIO()
167253 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
168254
173259
174260 temp_fh.close()
175261
262 @with_setup(setup_func_SMB2x, teardown_func)
263 def test_retr_offset_and_biglimit_SMB2x():
264 # Test file retrieval from offset with a big max_length
265 global conn
266 assert conn.smb2_dialect != SMB2_DIALECT_2
267
268 temp_fh = StringIO()
269 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
270
271 md = MD5()
272 md.update(temp_fh.getvalue())
273 assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
274 assert filesize == 100000
275
276 temp_fh.close()
277
176278 @with_setup(setup_func_SMB1, teardown_func)
177279 def test_retr_offset_and_smalllimit_SMB1():
178280 # Test file retrieval from offset with a small max_length
191293 def test_retr_offset_and_smalllimit_SMB2():
192294 # Test file retrieval from offset with a small max_length
193295 global conn
296 assert conn.smb2_dialect == SMB2_DIALECT_2
297
194298 temp_fh = StringIO()
195299 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
196300
201305
202306 temp_fh.close()
203307
308 @with_setup(setup_func_SMB2x, teardown_func)
309 def test_retr_offset_and_smalllimit_SMB2x():
310 # Test file retrieval from offset with a small max_length
311 global conn
312 assert conn.smb2_dialect != SMB2_DIALECT_2
313
314 temp_fh = StringIO()
315 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
316
317 md = MD5()
318 md.update(temp_fh.getvalue())
319 assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
320 assert filesize == 10
321
322 temp_fh.close()
323
204324 @with_setup(setup_func_SMB1, teardown_func)
205325 def test_retr_offset_and_zerolimit_SMB1():
206326 # Test file retrieval from offset to EOF with max_length=0
219339 def test_retr_offset_and_zerolimit_SMB2():
220340 # Test file retrieval from offset to EOF with max_length=0
221341 global conn
342 assert conn.smb2_dialect == SMB2_DIALECT_2
343
222344 temp_fh = StringIO()
223345 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
224346
228350 assert filesize == 0
229351
230352 temp_fh.close()
353
354 @with_setup(setup_func_SMB2x, teardown_func)
355 def test_retr_offset_and_zerolimit_SMB2x():
356 # Test file retrieval from offset to EOF with max_length=0
357 global conn
358 assert conn.smb2_dialect != SMB2_DIALECT_2
359
360 temp_fh = StringIO()
361 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
362
363 md = MD5()
364 md.update(temp_fh.getvalue())
365 assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
366 assert filesize == 0
367
368 temp_fh.close()
22 import os, tempfile, random, time
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
2122
2223 def setup_func_SMB1():
2324 global conn
24 smb_structs.SUPPORT_SMB2 = False
25
25 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2626 info = getConnectionInfo()
27 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
27 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2828 assert conn.connect(info['server_ip'], info['server_port'])
2929
3030 def setup_func_SMB2():
3131 global conn
3232 smb_structs.SUPPORT_SMB2 = True
33
33 smb_structs.SUPPORT_SMB2x = False
3434 info = getConnectionInfo()
35 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
35 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
36 assert conn.connect(info['server_ip'], info['server_port'])
37
38 def setup_func_SMB2x():
39 global conn
40 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
41 info = getConnectionInfo()
42 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
3643 assert conn.connect(info['server_ip'], info['server_port'])
3744
3845 def teardown_func():
4249
4350 @with_setup(setup_func_SMB1, teardown_func)
4451 def test_store_long_filename_SMB1():
45 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
46
47 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
48 assert filesize == TEST_FILESIZE
49
50 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
51 filenames = map(lambda e: e.filename, entries)
52 assert os.path.basename(filename.replace('/', os.sep)) in filenames
53
54 buf = StringIO()
55 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
56 assert file_size == TEST_FILESIZE
57
58 md = MD5()
59 md.update(buf.getvalue())
60 assert md.hexdigest() == TEST_DIGEST
61 buf.close()
62
63 conn.deleteFiles('smbtest', filename)
64
52 global conn
53 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
54
55 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
56 assert filesize == TEST_FILESIZE
57
58 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
59 filenames = map(lambda e: e.filename, entries)
60 assert os.path.basename(filename.replace('/', os.sep)) in filenames
61
62 buf = StringIO()
63 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
64 assert file_size == TEST_FILESIZE
65
66 md = MD5()
67 md.update(buf.getvalue())
68 assert md.hexdigest() == TEST_DIGEST
69 buf.close()
70
71 conn.deleteFiles('smbtest', filename)
72
73 @with_setup(setup_func_SMB1, teardown_func)
74 def test_store_from_offset_SMB1():
75 global conn
76 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
77
78 buf = StringIO('0123456789')
79 filesize = conn.storeFile('smbtest', filename, buf)
80 assert filesize == 10
81
82 buf = StringIO('aa')
83 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
84 assert pos == 7
85
86 buf = StringIO()
87 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
88 assert file_size == 10
89 assert buf.getvalue() == '01234aa789'
90 buf.close()
91
92 conn.deleteFiles('smbtest', filename)
6593
6694 @with_setup(setup_func_SMB2, teardown_func)
6795 def test_store_long_filename_SMB2():
96 global conn
97 assert conn.smb2_dialect == SMB2_DIALECT_2
98
99 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
100
101 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
102 assert filesize == TEST_FILESIZE
103
104 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
105 filenames = map(lambda e: e.filename, entries)
106 assert os.path.basename(filename.replace('/', os.sep)) in filenames
107
108 buf = StringIO()
109 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
110 assert file_size == TEST_FILESIZE
111
112 md = MD5()
113 md.update(buf.getvalue())
114 assert md.hexdigest() == TEST_DIGEST
115 buf.close()
116
117 conn.deleteFiles('smbtest', filename)
118
119
120 @with_setup(setup_func_SMB2x, teardown_func)
121 def test_store_long_filename_SMB2x():
122 global conn
123 assert conn.smb2_dialect != SMB2_DIALECT_2
124
68125 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
69126
70127 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
88145
89146 @with_setup(setup_func_SMB1, teardown_func)
90147 def test_store_unicode_filename_SMB1():
148 global conn
91149 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
92150
93151 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
111169
112170 @with_setup(setup_func_SMB2, teardown_func)
113171 def test_store_unicode_filename_SMB2():
172 global conn
173 assert conn.smb2_dialect == SMB2_DIALECT_2
174
114175 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
115176
116177 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
130191 buf.close()
131192
132193 conn.deleteFiles('smbtest', filename)
194
195
196 @with_setup(setup_func_SMB2x, teardown_func)
197 def test_store_unicode_filename_SMB2x():
198 global conn
199 assert conn.smb2_dialect != SMB2_DIALECT_2
200
201 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
202
203 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
204 assert filesize == TEST_FILESIZE
205
206 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
207 filenames = map(lambda e: e.filename, entries)
208 assert os.path.basename(filename.replace('/', os.sep)) in filenames
209
210 buf = StringIO()
211 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
212 assert file_size == TEST_FILESIZE
213
214 md = MD5()
215 md.update(buf.getvalue())
216 assert md.hexdigest() == TEST_DIGEST
217 buf.close()
218
219 conn.deleteFiles('smbtest', filename)
220
221
222 @with_setup(setup_func_SMB2, teardown_func)
223 def test_store_from_offset_SMB2():
224 global conn
225 assert conn.smb2_dialect == SMB2_DIALECT_2
226
227 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
228
229 buf = StringIO('0123456789')
230 filesize = conn.storeFile('smbtest', filename, buf)
231 assert filesize == 10
232
233 buf = StringIO('aa')
234 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
235 assert pos == 7
236
237 buf = StringIO()
238 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
239 assert file_size == 10
240 assert buf.getvalue() == '01234aa789'
241 buf.close()
242
243 conn.deleteFiles('smbtest', filename)
244
245
246 @with_setup(setup_func_SMB2x, teardown_func)
247 def test_store_from_offset_SMB2x():
248 global conn
249 assert conn.smb2_dialect != SMB2_DIALECT_2
250
251 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
252
253 buf = StringIO('0123456789')
254 filesize = conn.storeFile('smbtest', filename, buf)
255 assert filesize == 10
256
257 buf = StringIO('aa')
258 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
259 print(pos)
260 assert pos == 7
261
262 buf = StringIO()
263 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
264 assert file_size == 10
265 assert buf.getvalue() == '01234aa789'
266 buf.close()
267
268 conn.deleteFiles('smbtest', filename)
99 info = {
1010 'server_name': cp.get('server', 'name'),
1111 'server_ip': cp.get('server', 'ip'),
12 'server_port': cp.getint('server', 'port'),
12 'server_port': cp.getint('server', 'direct_port'),
1313 'client_name': cp.get('client', 'name'),
1414 'user': cp.get('user', 'name'),
1515 'password': cp.get('user', 'password'),
1818 pysmb has been tested against Samba 3.x, Windows XP SP3 and Windows Vista.
1919 The shared folder must be named "smbtest".
2020
21 3. Unzip smbtest.zip in the Shared Folder
22 In the same folder where you are viewing this readme file, there should be a zip file
23 called "smbtest.zip". Unzip the contents of this zip file in the shared folder.
21 3. Download smbtest.zip from https://miketeo.net/files/Projects/pysmb/smbtest.zip
22 Unzip the contents of this zip file in the shared folder.
2423
2524 4. Update Connection Details in connection.ini
2625 In the same folder where you are viewing this readme file, there should be an ini file
2726 called "connection.ini". Edit this file's connection details to match the shared folder's
2827 access information.
2928
30 5. Run the Unit Tests
31 Just run: nosetests
29 5. Run the Unit Tests in the python2 folder
30 Just run: nosetests -v tests
31 or selectively: nosetests -v tests/SMBConnectionTests
33 from nose.tools import with_setup
44 from smb import smb_structs
55
6 conn = None
6 conn, conn2, conn3 = None, None, None
77
88 def teardown_func():
9 global conn
10 conn.close()
9 global conn, conn2, conn3
10 if conn:
11 conn.close()
12 if conn2:
13 conn2.close()
14 if conn3:
15 conn3.close();
1116
1217 @with_setup(teardown = teardown_func)
1318 def test_NTLMv1_auth_SMB1():
1419 global conn
15 smb_structs.SUPPORT_SMB2 = False
20 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1621 info = getConnectionInfo()
1722 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
1823 assert conn.connect(info['server_ip'], info['server_port'])
1924
25 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
26 assert not conn2.connect(info['server_ip'], info['server_port'])
27
28 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
29 assert not conn3.connect(info['server_ip'], info['server_port'])
30
2031 @with_setup(teardown = teardown_func)
2132 def test_NTLMv2_auth_SMB1():
2233 global conn
23 smb_structs.SUPPORT_SMB2 = False
34 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2435 info = getConnectionInfo()
2536 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
2637 assert conn.connect(info['server_ip'], info['server_port'])
2738
39 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 assert not conn2.connect(info['server_ip'], info['server_port'])
41
42 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert not conn3.connect(info['server_ip'], info['server_port'])
44
2845 @with_setup(teardown = teardown_func)
2946 def test_NTLMv1_auth_SMB2():
3047 global conn
31 smb_structs.SUPPORT_SMB2 = True
48 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
3249 info = getConnectionInfo()
3350 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
3451 assert conn.connect(info['server_ip'], info['server_port'])
3552
53 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
54 assert not conn2.connect(info['server_ip'], info['server_port'])
55
56 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
57 assert not conn3.connect(info['server_ip'], info['server_port'])
58
3659 @with_setup(teardown = teardown_func)
3760 def test_NTLMv2_auth_SMB2():
3861 global conn
39 smb_structs.SUPPORT_SMB2 = True
62 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
4063 info = getConnectionInfo()
4164 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
4265 assert conn.connect(info['server_ip'], info['server_port'])
66
67 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
68 assert not conn2.connect(info['server_ip'], info['server_port'])
69
70 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
71 assert not conn3.connect(info['server_ip'], info['server_port'])
11
22 import os, time, random
33 from smb.SMBConnection import SMBConnection
4 from smb.smb2_constants import SMB2_DIALECT_2
45 from util import getConnectionInfo
56 from nose.tools import with_setup
67 from smb import smb_structs
910
1011 def setup_func_SMB1():
1112 global conn
12 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1314
1415 info = getConnectionInfo()
1516 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
23
24 info = getConnectionInfo()
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
26 assert conn.connect(info['server_ip'], info['server_port'])
27
28 def setup_func_SMB2x():
29 global conn
30 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
2131
2232 info = getConnectionInfo()
2333 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
4757 @with_setup(setup_func_SMB2, teardown_func)
4858 def test_english_directory_SMB2():
4959 global conn
60 assert conn.smb2_dialect == SMB2_DIALECT_2
61
62 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
63 conn.createDirectory('smbtest', path)
64
65 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
66 names = map(lambda e: e.filename, entries)
67 assert os.path.basename(path.replace('/', os.sep)) in names
68
69 conn.deleteDirectory('smbtest', path)
70
71 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
72 names = map(lambda e: e.filename, entries)
73 assert os.path.basename(path.replace('/', os.sep)) not in names
74
75 @with_setup(setup_func_SMB2x, teardown_func)
76 def test_english_directory_SMB2x():
77 global conn
78 assert conn.smb2_dialect != SMB2_DIALECT_2
5079
5180 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
5281 conn.createDirectory('smbtest', path)
81110 @with_setup(setup_func_SMB2, teardown_func)
82111 def test_unicode_directory_SMB2():
83112 global conn
113 assert conn.smb2_dialect == SMB2_DIALECT_2
84114
85115 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86116 conn.createDirectory('smbtest', path)
94124 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
95125 names = map(lambda e: e.filename, entries)
96126 assert os.path.basename(path.replace('/', os.sep)) not in names
127
128 @with_setup(setup_func_SMB2x, teardown_func)
129 def test_unicode_directory_SMB2x():
130 global conn
131 assert conn.smb2_dialect != SMB2_DIALECT_2
132
133 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
134 conn.createDirectory('smbtest', path)
135
136 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
137 names = map(lambda e: e.filename, entries)
138 assert os.path.basename(path.replace('/', os.sep)) in names
139
140 conn.deleteDirectory('smbtest', path)
141
142 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
143 names = map(lambda e: e.filename, entries)
144 assert os.path.basename(path.replace('/', os.sep)) not in names
22 import os, time, random
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415
1516 info = getConnectionInfo()
1617 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1920 def setup_func_SMB2():
2021 global conn
2122 smb_structs.SUPPORT_SMB2 = True
23 smb_structs.SUPPORT_SMB2x = False
24
25 info = getConnectionInfo()
26 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
27 assert conn.connect(info['server_ip'], info['server_port'])
28
29 def setup_func_SMB2x():
30 global conn
31 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
2232
2333 info = getConnectionInfo()
2434 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
7080 @with_setup(setup_func_SMB2, teardown_func)
7181 def test_delete_SMB2():
7282 global conn
83 assert conn.smb2_dialect == SMB2_DIALECT_2
7384
7485 path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
7586 conn.createDirectory('smbtest', path)
102113 assert 'aaTest.bin' not in filenames
103114 assert 'aaBest.bin' in filenames
104115 assert 'random.txt' in filenames
116
117 @with_setup(setup_func_SMB2x, teardown_func)
118 def test_delete_SMB2x():
119 global conn
120 assert conn.smb2_dialect != SMB2_DIALECT_2
121
122 path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
123 conn.createDirectory('smbtest', path)
124
125 for filename in [ 'aaTest.txt', 'aaBest.txt', 'aaTest.bin', 'aaBest.bin', 'random.txt' ]:
126 conn.storeFile('smbtest', path+"/"+filename, StringIO("0123456789"))
127
128 results = conn.listPath('smbtest', path)
129 filenames = map(lambda r: r.filename, results)
130 assert 'aaTest.txt' in filenames
131 assert 'aaBest.txt' in filenames
132 assert 'aaTest.bin' in filenames
133 assert 'aaBest.bin' in filenames
134 assert 'random.txt' in filenames
135
136 conn.deleteFiles('smbtest', path+'/aa*.txt')
137
138 results = conn.listPath('smbtest', path)
139 filenames = map(lambda r: r.filename, results)
140 assert 'aaTest.txt' not in filenames
141 assert 'aaBest.txt' not in filenames
142 assert 'aaTest.bin' in filenames
143 assert 'aaBest.bin' in filenames
144 assert 'random.txt' in filenames
145
146 conn.deleteFiles('smbtest', path+'/aaTest.*')
147
148 results = conn.listPath('smbtest', path)
149 filenames = map(lambda r: r.filename, results)
150 assert 'aaTest.bin' not in filenames
151 assert 'aaBest.bin' in filenames
152 assert 'random.txt' in filenames
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb2_constants import SMB2_DIALECT_2
34 from util import getConnectionInfo
45 from nose.tools import with_setup
56 from smb import smb_structs
89
910 def setup_func_SMB1():
1011 global conn
11 smb_structs.SUPPORT_SMB2 = False
12 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
13
1214 info = getConnectionInfo()
1315 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
22
23 info = getConnectionInfo()
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
25 assert conn.connect(info['server_ip'], info['server_port'])
26
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30
1931 info = getConnectionInfo()
2032 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2133 assert conn.connect(info['server_ip'], info['server_port'])
2335 def teardown_func():
2436 global conn
2537 conn.close()
26
38
2739 @with_setup(setup_func_SMB2, teardown_func)
2840 def test_getAttributes_SMB2():
2941 global conn
42 assert conn.smb2_dialect == SMB2_DIALECT_2
43
3044 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
3145 assert info.isDirectory
32
46
3347 info = conn.getAttributes('smbtest', '/rfc1001.txt')
3448 assert not info.isDirectory
3549 assert info.file_size == 158437
3650 assert info.alloc_size == 159744
37
51
3852 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
3953 assert info.isDirectory
40
54
55 @with_setup(setup_func_SMB2x, teardown_func)
56 def test_getAttributes_SMB2x():
57 global conn
58 assert conn.smb2_dialect != SMB2_DIALECT_2
59
60 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
61 assert info.isDirectory
62
63 info = conn.getAttributes('smbtest', '/rfc1001.txt')
64 assert not info.isDirectory
65 assert info.file_size == 158437
66 assert info.alloc_size == 159744
67
68 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
69 assert info.isDirectory
70
4171 @with_setup(setup_func_SMB1, teardown_func)
4272 def test_getAttributes_SMB1():
4373 global conn
4474 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
4575 assert info.isDirectory
46
76
4777 info = conn.getAttributes('smbtest', '/rfc1001.txt')
4878 assert not info.isDirectory
4979 assert info.file_size == 158437
5080 assert info.alloc_size == 159744
51
81
5282 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
5383 assert info.isDirectory
54
55 āŽ
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb_constants import *
4 from smb.smb2_constants import SMB2_DIALECT_2
35 from util import getConnectionInfo
46 from nose.tools import with_setup
57 from smb import smb_structs
810
911 def setup_func_SMB1():
1012 global conn
11 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1214 info = getConnectionInfo()
1315 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
22 info = getConnectionInfo()
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
1929 info = getConnectionInfo()
2030 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2131 assert conn.connect(info['server_ip'], info['server_port'])
4454 assert ( u'Test Folder', True ) in filenames
4555 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
4656
57 @with_setup(setup_func_SMB1, teardown_func)
58 def test_listPathWithManyFiles_SMB1():
59 global conn
60 results = conn.listPath('smbtest', '/RFC Archive/')
61 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
62 assert len(filenames)==999
63
4764 @with_setup(setup_func_SMB2, teardown_func)
4865 def test_listPath_SMB2():
4966 global conn
67 assert conn.smb2_dialect == SMB2_DIALECT_2
5068 results = conn.listPath('smbtest', '/')
5169 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
5270 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
5573 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
5674 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
5775
76 @with_setup(setup_func_SMB2x, teardown_func)
77 def test_listPath_SMB2x():
78 global conn
79 assert conn.smb2_dialect != SMB2_DIALECT_2
80 results = conn.listPath('smbtest', '/')
81 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
82 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
83 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
84 assert ( u'TestDir1', True ) in filenames # Test short English folder names
85 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
86 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
87
5888 @with_setup(setup_func_SMB2, teardown_func)
5989 def test_listSubPath_SMB2():
6090 global conn
91 assert conn.smb2_dialect == SMB2_DIALECT_2
6192 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
6293 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
6394 assert ( u'Test File.txt', False ) in filenames
6495 assert ( u'Test Folder', True ) in filenames
6596 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
97
98 @with_setup(setup_func_SMB2x, teardown_func)
99 def test_listSubPath_SMB2x():
100 global conn
101 assert conn.smb2_dialect != SMB2_DIALECT_2
102 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
103 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
104 assert ( u'Test File.txt', False ) in filenames
105 assert ( u'Test Folder', True ) in filenames
106 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
107
108 @with_setup(setup_func_SMB2, teardown_func)
109 def test_listPathWithManyFiles_SMB2():
110 global conn
111 results = conn.listPath('smbtest', '/RFC Archive/')
112 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
113 assert len(filenames)==999
114
115 @with_setup(setup_func_SMB1, teardown_func)
116 def test_listPathFilterForDirectory_SMB1():
117 global conn
118 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
119 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
120 assert len(filenames) > 0
121 for f, isDirectory in filenames:
122 assert isDirectory
123
124 @with_setup(setup_func_SMB2, teardown_func)
125 def test_listPathFilterForDirectory_SMB2():
126 global conn
127 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
128 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
129 assert len(filenames) > 0
130 for f, isDirectory in filenames:
131 assert isDirectory
132
133 @with_setup(setup_func_SMB1, teardown_func)
134 def test_listPathFilterForFiles_SMB1():
135 global conn
136 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
137 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
138 assert len(filenames) > 0
139 for f, isDirectory in filenames:
140 assert not isDirectory
141
142 @with_setup(setup_func_SMB2, teardown_func)
143 def test_listPathFilterForFiles_SMB2():
144 global conn
145 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
146 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
147 assert len(filenames) > 0
148 for f, isDirectory in filenames:
149 assert not isDirectory
150
151 @with_setup(setup_func_SMB1, teardown_func)
152 def test_listPathFilterPattern_SMB1():
153 global conn
154 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
155 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
156 assert len(filenames) == 2
157 assert ( u'Test File.txt', False ) in filenames
158 assert ( u'Test Folder', True ) in filenames
159 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
160
161 @with_setup(setup_func_SMB2, teardown_func)
162 def test_listPathFilterPattern_SMB2():
163 global conn
164 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
165 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
166 assert len(filenames) == 2
167 assert ( u'Test File.txt', False ) in filenames
168 assert ( u'Test Folder', True ) in filenames
169 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
170
171 @with_setup(setup_func_SMB1, teardown_func)
172 def test_listPathFilterUnicodePattern_SMB1():
173 global conn
174 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
175 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
176 assert len(filenames) == 1
177 assert ( u'Test File.txt', False ) not in filenames
178 assert ( u'Test Folder', True ) not in filenames
179 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
180
181 @with_setup(setup_func_SMB2, teardown_func)
182 def test_listPathFilterUnicodePattern_SMB2():
183 global conn
184 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
185 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
186 assert len(filenames) == 1
187 assert ( u'Test File.txt', False ) not in filenames
188 assert ( u'Test Folder', True ) not in filenames
189 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
190
191 @with_setup(setup_func_SMB1, teardown_func)
192 def test_listPathFilterEmptyList_SMB1():
193 global conn
194 results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
195 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
196
197 @with_setup(setup_func_SMB2, teardown_func)
198 def test_listPathFilterEmptyList_SMB2():
199 global conn
200 results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
201 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1112 info = getConnectionInfo()
1213 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1314 assert conn.connect(info['server_ip'], info['server_port'])
1516 def setup_func_SMB2():
1617 global conn
1718 smb_structs.SUPPORT_SMB2 = True
19 smb_structs.SUPPORT_SMB2x = False
20 info = getConnectionInfo()
21 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
22 assert conn.connect(info['server_ip'], info['server_port'])
23
24 def setup_func_SMB2x():
25 global conn
26 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
1827 info = getConnectionInfo()
1928 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2029 assert conn.connect(info['server_ip'], info['server_port'])
3241 @with_setup(setup_func_SMB2, teardown_func)
3342 def test_listshares_SMB2():
3443 global conn
44 assert conn.smb2_dialect == SMB2_DIALECT_2
3545 results = conn.listShares()
3646 assert 'smbtest' in map(lambda r: r.name.lower(), results)
47
48 @with_setup(setup_func_SMB2x, teardown_func)
49 def test_listshares_SMB2x():
50 global conn
51 assert conn.smb2_dialect != SMB2_DIALECT_2
52 results = conn.listShares()
53 assert 'smbtest' in map(lambda r: r.name.lower(), results)
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
12
1113 info = getConnectionInfo()
1214 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1315 assert conn.connect(info['server_ip'], info['server_port'])
1517 def setup_func_SMB2():
1618 global conn
1719 smb_structs.SUPPORT_SMB2 = True
20 smb_structs.SUPPORT_SMB2x = False
21
22 info = getConnectionInfo()
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29
1830 info = getConnectionInfo()
1931 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2032 assert conn.connect(info['server_ip'], info['server_port'])
3244 @with_setup(setup_func_SMB2, teardown_func)
3345 def test_listsnapshots_SMB2():
3446 global conn
47 assert conn.smb2_dialect == SMB2_DIALECT_2
3548 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
3649 assert len(results) > 0
50
51 @with_setup(setup_func_SMB2x, teardown_func)
52 def test_listsnapshots_SMB2x():
53 global conn
54 assert conn.smb2_dialect != SMB2_DIALECT_2
55 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
56 assert len(results) > 0
22 import os, time, random
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415 info = getConnectionInfo()
1516 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123 info = getConnectionInfo()
2224 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2426
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30 info = getConnectionInfo()
31 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
32 assert conn.connect(info['server_ip'], info['server_port'])
33
2534 def teardown_func():
2635 global conn
2736 conn.close()
5261 @with_setup(setup_func_SMB2, teardown_func)
5362 def test_rename_english_file_SMB2():
5463 global conn
64 assert conn.smb2_dialect == SMB2_DIALECT_2
65
66 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
67 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
68
69 conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
70
71 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
72 filenames = map(lambda e: e.filename, entries)
73 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
74 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
75
76 conn.rename('smbtest', old_path, new_path)
77
78 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
79 filenames = map(lambda e: e.filename, entries)
80 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
81 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
82
83 conn.deleteFiles('smbtest', new_path)
84
85 @with_setup(setup_func_SMB2x, teardown_func)
86 def test_rename_english_file_SMB2x():
87 global conn
88 assert conn.smb2_dialect != SMB2_DIALECT_2
5589
5690 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
5791 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
98132 @with_setup(setup_func_SMB2, teardown_func)
99133 def test_rename_unicode_file_SMB2():
100134 global conn
135 assert conn.smb2_dialect == SMB2_DIALECT_2
101136
102137 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
103138 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
118153
119154 conn.deleteFiles('smbtest', new_path)
120155
156 @with_setup(setup_func_SMB2x, teardown_func)
157 def test_rename_unicode_file_SMB2x():
158 global conn
159 assert conn.smb2_dialect != SMB2_DIALECT_2
160
161 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
162 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
163
164 conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
165
166 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
167 filenames = map(lambda e: e.filename, entries)
168 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
169 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
170
171 conn.rename('smbtest', old_path, new_path)
172
173 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
174 filenames = map(lambda e: e.filename, entries)
175 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
176 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
177
178 conn.deleteFiles('smbtest', new_path)
179
121180 @with_setup(setup_func_SMB1, teardown_func)
122181 def test_rename_english_directory_SMB1():
123182 global conn
144203 @with_setup(setup_func_SMB2, teardown_func)
145204 def test_rename_english_directory_SMB2():
146205 global conn
206 assert conn.smb2_dialect == SMB2_DIALECT_2
207
208 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
209 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
210
211 conn.createDirectory('smbtest', old_path)
212
213 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
214 filenames = map(lambda e: e.filename, entries)
215 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
216 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
217
218 conn.rename('smbtest', old_path, new_path)
219
220 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
221 filenames = map(lambda e: e.filename, entries)
222 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
223 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
224
225 conn.deleteDirectory('smbtest', new_path)
226
227 @with_setup(setup_func_SMB2x, teardown_func)
228 def test_rename_english_directory_SMB2x():
229 global conn
230 assert conn.smb2_dialect != SMB2_DIALECT_2
147231
148232 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
149233 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
190274 @with_setup(setup_func_SMB2, teardown_func)
191275 def test_rename_unicode_directory_SMB2():
192276 global conn
277 assert conn.smb2_dialect == SMB2_DIALECT_2
193278
194279 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
195280 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
209294 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
210295
211296 conn.deleteDirectory('smbtest', new_path)
297
298 @with_setup(setup_func_SMB2x, teardown_func)
299 def test_rename_unicode_directory_SMB2x():
300 global conn
301 assert conn.smb2_dialect != SMB2_DIALECT_2
302
303 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
304 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
305
306 conn.createDirectory('smbtest', old_path)
307
308 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
309 filenames = map(lambda e: e.filename, entries)
310 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
311 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
312
313 conn.rename('smbtest', old_path, new_path)
314
315 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
316 filenames = map(lambda e: e.filename, entries)
317 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
318 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
319
320 conn.deleteDirectory('smbtest', new_path)
22 import os, tempfile
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1718
1819 def setup_func_SMB1():
1920 global conn
20 smb_structs.SUPPORT_SMB2 = False
21 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
22
2123 info = getConnectionInfo()
2224 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2527 def setup_func_SMB2():
2628 global conn
2729 smb_structs.SUPPORT_SMB2 = True
30 smb_structs.SUPPORT_SMB2x = False
31
2832 info = getConnectionInfo()
2933 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
3034 assert conn.connect(info['server_ip'], info['server_port'])
3135
36 def setup_func_SMB2x():
37 global conn
38 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
39
40 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
42 assert conn.connect(info['server_ip'], info['server_port'])
43
3244 def teardown_func():
3345 global conn
3446 conn.close()
5163 def test_retr_multiplereads_SMB2():
5264 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
5365 global conn
66 assert conn.smb2_dialect == SMB2_DIALECT_2
67
5468 temp_fh = StringIO()
5569 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
5670
6175
6276 temp_fh.close()
6377
78 @with_setup(setup_func_SMB2x, teardown_func)
79 def test_retr_multiplereads_SMB2x():
80 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
81 global conn
82 assert conn.smb2_dialect != SMB2_DIALECT_2
83
84 temp_fh = StringIO()
85 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
86
87 md = MD5()
88 md.update(temp_fh.getvalue())
89 assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
90 assert filesize == 158437
91
92 temp_fh.close()
93
6494 @with_setup(setup_func_SMB1, teardown_func)
6595 def test_retr_longfilename_SMB1():
6696 # Test file retrieval that has a long English filename
79109 def test_retr_longfilename_SMB2():
80110 # Test file retrieval that has a long English filename
81111 global conn
112 assert conn.smb2_dialect == SMB2_DIALECT_2
113
82114 temp_fh = StringIO()
83115 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
84116
89121
90122 temp_fh.close()
91123
124 @with_setup(setup_func_SMB2x, teardown_func)
125 def test_retr_longfilename_SMB2x():
126 # Test file retrieval that has a long English filename
127 global conn
128 assert conn.smb2_dialect != SMB2_DIALECT_2
129
130 temp_fh = StringIO()
131 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
132
133 md = MD5()
134 md.update(temp_fh.getvalue())
135 assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
136 assert filesize == 421269
137
138 temp_fh.close()
139
92140 @with_setup(setup_func_SMB1, teardown_func)
93141 def test_retr_unicodefilename_SMB1():
94142 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
107155 def test_retr_unicodefilename_SMB2():
108156 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
109157 global conn
158 assert conn.smb2_dialect == SMB2_DIALECT_2
159
110160 temp_fh = StringIO()
111161 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
112162
117167
118168 temp_fh.close()
119169
170 @with_setup(setup_func_SMB2x, teardown_func)
171 def test_retr_unicodefilename_SMB2x():
172 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
173 global conn
174 assert conn.smb2_dialect != SMB2_DIALECT_2
175
176 temp_fh = StringIO()
177 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
178
179 md = MD5()
180 md.update(temp_fh.getvalue())
181 assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
182 assert filesize == 256000
183
184 temp_fh.close()
185
120186 @with_setup(setup_func_SMB1, teardown_func)
121187 def test_retr_offset_SMB1():
122188 # Test file retrieval from offset to EOF
135201 def test_retr_offset_SMB2():
136202 # Test file retrieval from offset to EOF
137203 global conn
204 assert conn.smb2_dialect == SMB2_DIALECT_2
205
138206 temp_fh = StringIO()
139207 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
140208
145213
146214 temp_fh.close()
147215
216 @with_setup(setup_func_SMB2x, teardown_func)
217 def test_retr_offset_SMB2x():
218 # Test file retrieval from offset to EOF
219 global conn
220 assert conn.smb2_dialect != SMB2_DIALECT_2
221
222 temp_fh = StringIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
224
225 md = MD5()
226 md.update(temp_fh.getvalue())
227 assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
228 assert filesize == 156000
229
230 temp_fh.close()
231
148232 @with_setup(setup_func_SMB1, teardown_func)
149233 def test_retr_offset_and_biglimit_SMB1():
150234 # Test file retrieval from offset with a big max_length
163247 def test_retr_offset_and_biglimit_SMB2():
164248 # Test file retrieval from offset with a big max_length
165249 global conn
250 assert conn.smb2_dialect == SMB2_DIALECT_2
251
166252 temp_fh = StringIO()
167253 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
168254
173259
174260 temp_fh.close()
175261
262 @with_setup(setup_func_SMB2x, teardown_func)
263 def test_retr_offset_and_biglimit_SMB2x():
264 # Test file retrieval from offset with a big max_length
265 global conn
266 assert conn.smb2_dialect != SMB2_DIALECT_2
267
268 temp_fh = StringIO()
269 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
270
271 md = MD5()
272 md.update(temp_fh.getvalue())
273 assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
274 assert filesize == 100000
275
276 temp_fh.close()
277
176278 @with_setup(setup_func_SMB1, teardown_func)
177279 def test_retr_offset_and_smalllimit_SMB1():
178280 # Test file retrieval from offset with a small max_length
191293 def test_retr_offset_and_smalllimit_SMB2():
192294 # Test file retrieval from offset with a small max_length
193295 global conn
296 assert conn.smb2_dialect == SMB2_DIALECT_2
297
194298 temp_fh = StringIO()
195299 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
196300
201305
202306 temp_fh.close()
203307
308 @with_setup(setup_func_SMB2x, teardown_func)
309 def test_retr_offset_and_smalllimit_SMB2x():
310 # Test file retrieval from offset with a small max_length
311 global conn
312 assert conn.smb2_dialect != SMB2_DIALECT_2
313
314 temp_fh = StringIO()
315 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
316
317 md = MD5()
318 md.update(temp_fh.getvalue())
319 assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
320 assert filesize == 10
321
322 temp_fh.close()
323
204324 @with_setup(setup_func_SMB1, teardown_func)
205325 def test_retr_offset_and_zerolimit_SMB1():
206326 # Test file retrieval from offset to EOF with max_length=0
219339 def test_retr_offset_and_zerolimit_SMB2():
220340 # Test file retrieval from offset to EOF with max_length=0
221341 global conn
342 assert conn.smb2_dialect == SMB2_DIALECT_2
343
222344 temp_fh = StringIO()
223345 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
224346
228350 assert filesize == 0
229351
230352 temp_fh.close()
353
354 @with_setup(setup_func_SMB2x, teardown_func)
355 def test_retr_offset_and_zerolimit_SMB2x():
356 # Test file retrieval from offset to EOF with max_length=0
357 global conn
358 assert conn.smb2_dialect != SMB2_DIALECT_2
359
360 temp_fh = StringIO()
361 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
362
363 md = MD5()
364 md.update(temp_fh.getvalue())
365 assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
366 assert filesize == 0
367
368 temp_fh.close()
0 # -*- coding: utf-8 -*-
1
2 import os, tempfile
3 from StringIO import StringIO
4 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
6 from util import getConnectionInfo
7 from nose.tools import with_setup
8 from smb import smb_structs
9
10 try:
11 import hashlib
12 def MD5(): return hashlib.md5()
13 except ImportError:
14 import md5
15 def MD5(): return md5.new()
16
17 conn = None
18
19 def setup_func_SMB2():
20 global conn
21 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
23
24 info = getConnectionInfo()
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
26 assert conn.connect(info['server_ip'], info['server_port'])
27
28 def setup_func_SMB2x():
29 global conn
30 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
31
32 info = getConnectionInfo()
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
34 assert conn.connect(info['server_ip'], info['server_port'])
35
36 def teardown_func():
37 global conn
38 conn.close()
39
40 @with_setup(setup_func_SMB2, teardown_func)
41 def test_security_SMB2():
42 global conn
43 assert conn.smb2_dialect == SMB2_DIALECT_2
44 # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
45 attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
46
47 @with_setup(setup_func_SMB2x, teardown_func)
48 def test_security_SMB2x():
49 global conn
50 assert conn.smb2_dialect != SMB2_DIALECT_2
51 # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
52 attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
22 import os, tempfile, random, time
33 from StringIO import StringIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
2122
2223 def setup_func_SMB1():
2324 global conn
24 smb_structs.SUPPORT_SMB2 = False
25
25 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2626 info = getConnectionInfo()
2727 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2828 assert conn.connect(info['server_ip'], info['server_port'])
3030 def setup_func_SMB2():
3131 global conn
3232 smb_structs.SUPPORT_SMB2 = True
33
33 smb_structs.SUPPORT_SMB2x = False
3434 info = getConnectionInfo()
3535 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
3636 assert conn.connect(info['server_ip'], info['server_port'])
3737
38 def setup_func_SMB2x():
39 global conn
40 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
41 info = getConnectionInfo()
42 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert conn.connect(info['server_ip'], info['server_port'])
44
3845 def teardown_func():
3946 global conn
4047 conn.close()
4249
4350 @with_setup(setup_func_SMB1, teardown_func)
4451 def test_store_long_filename_SMB1():
52 global conn
4553 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
4654
4755 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
6472
6573 @with_setup(setup_func_SMB1, teardown_func)
6674 def test_store_from_offset_SMB1():
75 global conn
6776 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
6877
6978 buf = StringIO('0123456789')
8493
8594 @with_setup(setup_func_SMB2, teardown_func)
8695 def test_store_long_filename_SMB2():
96 global conn
97 assert conn.smb2_dialect == SMB2_DIALECT_2
98
99 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
100
101 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
102 assert filesize == TEST_FILESIZE
103
104 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
105 filenames = map(lambda e: e.filename, entries)
106 assert os.path.basename(filename.replace('/', os.sep)) in filenames
107
108 buf = StringIO()
109 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
110 assert file_size == TEST_FILESIZE
111
112 md = MD5()
113 md.update(buf.getvalue())
114 assert md.hexdigest() == TEST_DIGEST
115 buf.close()
116
117 conn.deleteFiles('smbtest', filename)
118
119
120 @with_setup(setup_func_SMB2x, teardown_func)
121 def test_store_long_filename_SMB2x():
122 global conn
123 assert conn.smb2_dialect != SMB2_DIALECT_2
124
87125 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
88126
89127 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
107145
108146 @with_setup(setup_func_SMB1, teardown_func)
109147 def test_store_unicode_filename_SMB1():
148 global conn
110149 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
111150
112151 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
130169
131170 @with_setup(setup_func_SMB2, teardown_func)
132171 def test_store_unicode_filename_SMB2():
172 global conn
173 assert conn.smb2_dialect == SMB2_DIALECT_2
174
133175 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
134176
135177 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
149191 buf.close()
150192
151193 conn.deleteFiles('smbtest', filename)
194
195
196 @with_setup(setup_func_SMB2x, teardown_func)
197 def test_store_unicode_filename_SMB2x():
198 global conn
199 assert conn.smb2_dialect != SMB2_DIALECT_2
200
201 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
202
203 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
204 assert filesize == TEST_FILESIZE
205
206 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
207 filenames = map(lambda e: e.filename, entries)
208 assert os.path.basename(filename.replace('/', os.sep)) in filenames
209
210 buf = StringIO()
211 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
212 assert file_size == TEST_FILESIZE
213
214 md = MD5()
215 md.update(buf.getvalue())
216 assert md.hexdigest() == TEST_DIGEST
217 buf.close()
218
219 conn.deleteFiles('smbtest', filename)
220
152221
153222 @with_setup(setup_func_SMB2, teardown_func)
154223 def test_store_from_offset_SMB2():
224 global conn
225 assert conn.smb2_dialect == SMB2_DIALECT_2
226
155227 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
156228
157229 buf = StringIO('0123456789')
169241 buf.close()
170242
171243 conn.deleteFiles('smbtest', filename)
172 āŽ
244
245
246 @with_setup(setup_func_SMB2x, teardown_func)
247 def test_store_from_offset_SMB2x():
248 global conn
249 assert conn.smb2_dialect != SMB2_DIALECT_2
250
251 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
252
253 buf = StringIO('0123456789')
254 filesize = conn.storeFile('smbtest', filename, buf)
255 assert filesize == 10
256
257 buf = StringIO('aa')
258 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
259 assert pos == 7
260
261 buf = StringIO()
262 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
263 assert file_size == 10
264 assert buf.getvalue() == '01234aa789'
265 buf.close()
266
267 conn.deleteFiles('smbtest', filename)
0 # -*- coding: utf-8 -*-
1
2 from smb.SMBConnection import SMBConnection
3 from .util import getConnectionInfo
4
5 def test_context():
6 info = getConnectionInfo()
7 with SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True) as conn:
8 assert conn.connect(info['server_ip'], info['server_port'])
9
10 assert conn.sock is None
22 name = SERVER
33 ip = 192.168.1.1
44 port = 139
5 direct_port = 445
56
67 [client]
78 name = TESTCLIENT
python2/tests/smbtest.7z less more
Binary diff not shown
0 import binascii
1
2 from smb import security_descriptors as sd
3 from smb import smb_constants as sc
4
5
6 def test_sid_string_representation():
7 sid = sd.SID(1, 5, [2, 3, 4])
8 assert str(sid) == "S-1-5-2-3-4"
9 sid = sd.SID(1, 2**32 + 3, [])
10 assert str(sid) == "S-1-0x100000003"
11 sid = sd.SID(1, 2**32, [3, 2, 1])
12 assert str(sid) == "S-1-0x100000000-3-2-1"
13
14
15 def test_sid_binary_parsing():
16 raw_sid = binascii.unhexlify("""
17 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
18 2a 4f da ca c1 79 a6 32 b1 04 00 00
19 """.translate(None, ' \n'))
20 assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
21 raw_sid += "garbage"
22 assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
23 sid, tail = sd.SID.from_bytes(raw_sid, return_tail=True)
24 assert str(sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
25 assert tail == "garbage"
26
27
28 def test_ace_binary_parsing():
29 raw_ace = binascii.unhexlify("""
30 00 10 24 00 ff 01 1f 00 01 05 00 00 00 00 00 05
31 15 00 00 00 de 53 c1 2a 2a 4f da ca c1 79 a6 32
32 6e 04 00 00
33 """.translate(None, ' \n'))
34 ace = sd.ACE.from_bytes(raw_ace)
35 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1134"
36 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
37 assert ace.flags == sd.ACE_FLAG_INHERITED
38 assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
39 | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
40 | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
41 | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
42 | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
43 | sc.FILE_WRITE_ATTRIBUTES)
44 assert not ace.additional_data
45
46 raw_ace = binascii.unhexlify("""
47 00 13 18 00 a9 00 12 00 01 02 00 00 00 00 00 05
48 20 00 00 00 21 02 00 00
49 """.translate(None, ' \n'))
50 ace = sd.ACE.from_bytes(raw_ace)
51 assert str(ace.sid) == "S-1-5-32-545"
52 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
53 assert ace.flags == (sd.ACE_FLAG_INHERITED | sd.ACE_FLAG_CONTAINER_INHERIT
54 | sd.ACE_FLAG_OBJECT_INHERIT)
55 assert ace.mask == (sc.SYNCHRONIZE | sc.READ_CONTROL | sc.FILE_READ_DATA
56 | sc.FILE_READ_EA | sc.FILE_EXECUTE
57 | sc.FILE_READ_ATTRIBUTES)
58 assert not ace.additional_data
59
60 raw_ace = binascii.unhexlify("""
61 01 03 24 00 a9 00 02 00 01 05 00 00 00 00 00 05
62 15 00 00 00 de 53 c1 2a 2a 4f da ca c1 79 a6 32
63 6c 04 00 00
64 """.translate(None, ' \n'))
65 ace = sd.ACE.from_bytes(raw_ace)
66 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1132"
67 assert ace.type == sd.ACE_TYPE_ACCESS_DENIED
68 assert ace.flags == (sd.ACE_FLAG_CONTAINER_INHERIT
69 | sd.ACE_FLAG_OBJECT_INHERIT)
70 assert ace.mask == (sc.READ_CONTROL | sc.FILE_READ_DATA | sc.FILE_READ_EA
71 | sc.FILE_EXECUTE | sc.FILE_READ_ATTRIBUTES)
72 assert not ace.additional_data
73
74
75 def test_acl_binary_parsing():
76 raw_acl = binascii.unhexlify("""
77 02 00 70 00 04 00 00 00 00 10 18 00 89 00 10 00
78 01 02 00 00 00 00 00 05 20 00 00 00 21 02 00 00
79 00 10 14 00 ff 01 1f 00 01 01 00 00 00 00 00 05
80 12 00 00 00 00 10 18 00 ff 01 1f 00 01 02 00 00
81 00 00 00 05 20 00 00 00 20 02 00 00 00 10 24 00
82 ff 01 1f 00 01 05 00 00 00 00 00 05 15 00 00 00
83 de 53 c1 2a 2a 4f da ca c1 79 a6 32 b1 04 00 00
84 """.translate(None, ' \n'))
85 acl = sd.ACL.from_bytes(raw_acl)
86 assert acl.revision == 2
87 assert len(acl.aces) == 4
88
89 ace = acl.aces[0]
90 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
91 assert str(ace.sid) == "S-1-5-32-545"
92 assert ace.flags == sd.ACE_FLAG_INHERITED
93 assert ace.mask == (sc.SYNCHRONIZE | sc.FILE_READ_DATA | sc.FILE_READ_EA
94 | sc.FILE_READ_ATTRIBUTES)
95
96 ace = acl.aces[3]
97 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
98 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
99 assert ace.flags == sd.ACE_FLAG_INHERITED
100 assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
101 | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
102 | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
103 | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
104 | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
105 | sc.FILE_WRITE_ATTRIBUTES)
106
107
108 def test_descriptor_binary_parsing():
109 raw_descriptor = binascii.unhexlify("""
110 01 00 04 84 14 00 00 00 30 00 00 00 00 00 00 00
111 4c 00 00 00 01 05 00 00 00 00 00 05 15 00 00 00
112 de 53 c1 2a 2a 4f da ca c1 79 a6 32 b1 04 00 00
113 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
114 2a 4f da ca c1 79 a6 32 01 02 00 00 02 00 70 00
115 04 00 00 00 00 10 18 00 89 00 10 00 01 02 00 00
116 00 00 00 05 20 00 00 00 21 02 00 00 00 10 14 00
117 ff 01 1f 00 01 01 00 00 00 00 00 05 12 00 00 00
118 00 10 18 00 ff 01 1f 00 01 02 00 00 00 00 00 05
119 20 00 00 00 20 02 00 00 00 10 24 00 ff 01 1f 00
120 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
121 2a 4f da ca c1 79 a6 32 b1 04 00 00
122 """.translate(None, ' \n'))
123 descriptor = sd.SecurityDescriptor.from_bytes(raw_descriptor)
124 assert descriptor.flags == (sd.SECURITY_DESCRIPTOR_SELF_RELATIVE
125 | sd.SECURITY_DESCRIPTOR_DACL_PRESENT
126 | sd.SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED)
127 assert descriptor.dacl is not None
128 assert descriptor.sacl is None
129 assert str(descriptor.owner) == "S-1-5-21-717312990-3403304746-849770945-1201"
130 assert str(descriptor.group) == "S-1-5-21-717312990-3403304746-849770945-513"
131
132 acl = descriptor.dacl
133 assert acl.revision == 2
134 assert len(acl.aces) == 4
135 assert str(acl.aces[0].sid) == sd.SID_BUILTIN_USERS
136 assert str(acl.aces[1].sid) == sd.SID_LOCAL_SYSTEM
137 assert str(acl.aces[2].sid) == sd.SID_BUILTIN_ADMINISTRATORS
138 assert str(acl.aces[3].sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
7676 self.onNMBSessionOK()
7777 elif packet.type == NEGATIVE_SESSION_RESPONSE:
7878 self.onNMBSessionFailed()
79 elif packet.type == SESSION_KEEPALIVE:
80 # Discard keepalive packets - [RFC1002]: 5.2.2.1
81 pass
7982 else:
8083 self.log.warning('Unrecognized NMB session type: 0x%02x', packet.type)
8184
0 Metadata-Version: 1.1
1 Name: pysmb
2 Version: 1.1.20
3 Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
4 Home-page: https://miketeo.net/projects/pysmb
5 Author: Michael Teo
6 Author-email: [email protected]
7 License: zlib/libpng
8 Description: pysmb is an experimental SMB/CIFS library written in Python. It implements the client-side SMB/CIFS protocol which allows your Python application to access and transfer files to/from SMB/CIFS shared folders like your Windows file sharing and Samba folders.
9 Keywords: windows samba cifs sharing ftp smb linux
10 Platform: UNKNOWN
11 Classifier: Development Status :: 5 - Production/Stable
12 Classifier: Environment :: Win32 (MS Windows)
13 Classifier: Environment :: Console
14 Classifier: License :: OSI Approved :: zlib/libpng License
15 Classifier: Operating System :: Microsoft :: Windows
16 Classifier: Operating System :: POSIX
17 Classifier: Programming Language :: Python
18 Classifier: Programming Language :: Python :: 2.4
19 Classifier: Programming Language :: Python :: 2.5
20 Classifier: Programming Language :: Python :: 2.6
21 Classifier: Programming Language :: Python :: 2.7
22 Classifier: Programming Language :: Python :: 3
23 Classifier: Topic :: Communications :: File Sharing
24 Classifier: Topic :: Software Development :: Libraries :: Python Modules
25 Classifier: Topic :: System :: Networking
0 CHANGELOG
1 LICENSE
2 MANIFEST.in
3 README.txt
4 setup.py
5 docs/doctrees/environment.pickle
6 docs/doctrees/extending.doctree
7 docs/doctrees/index.doctree
8 docs/doctrees/api/nmb_NBNSProtocol.doctree
9 docs/doctrees/api/nmb_NetBIOS.doctree
10 docs/doctrees/api/smb_SMBConnection.doctree
11 docs/doctrees/api/smb_SMBHandler.doctree
12 docs/doctrees/api/smb_SMBProtocolFactory.doctree
13 docs/doctrees/api/smb_SharedDevice.doctree
14 docs/doctrees/api/smb_SharedFile.doctree
15 docs/doctrees/api/smb_exceptions.doctree
16 docs/html/.buildinfo
17 docs/html/extending.html
18 docs/html/genindex.html
19 docs/html/index.html
20 docs/html/objects.inv
21 docs/html/search.html
22 docs/html/searchindex.js
23 docs/html/_modules/index.html
24 docs/html/_modules/nmb/NetBIOS.html
25 docs/html/_modules/nmb/NetBIOSProtocol.html
26 docs/html/_modules/smb/SMBConnection.html
27 docs/html/_modules/smb/SMBProtocol.html
28 docs/html/_modules/smb/base.html
29 docs/html/_modules/smb/smb_structs.html
30 docs/html/_sources/extending.txt
31 docs/html/_sources/index.txt
32 docs/html/_sources/api/nmb_NBNSProtocol.txt
33 docs/html/_sources/api/nmb_NetBIOS.txt
34 docs/html/_sources/api/smb_SMBConnection.txt
35 docs/html/_sources/api/smb_SMBHandler.txt
36 docs/html/_sources/api/smb_SMBProtocolFactory.txt
37 docs/html/_sources/api/smb_SharedDevice.txt
38 docs/html/_sources/api/smb_SharedFile.txt
39 docs/html/_sources/api/smb_exceptions.txt
40 docs/html/_static/ajax-loader.gif
41 docs/html/_static/basic.css
42 docs/html/_static/comment-bright.png
43 docs/html/_static/comment-close.png
44 docs/html/_static/comment.png
45 docs/html/_static/contents.png
46 docs/html/_static/doctools.js
47 docs/html/_static/down-pressed.png
48 docs/html/_static/down.png
49 docs/html/_static/file.png
50 docs/html/_static/jquery.js
51 docs/html/_static/minus.png
52 docs/html/_static/navigation.png
53 docs/html/_static/plus.png
54 docs/html/_static/pygments.css
55 docs/html/_static/searchtools.js
56 docs/html/_static/sphinxdoc.css
57 docs/html/_static/underscore.js
58 docs/html/_static/up-pressed.png
59 docs/html/_static/up.png
60 docs/html/_static/websupport.js
61 docs/html/api/nmb_NBNSProtocol.html
62 docs/html/api/nmb_NetBIOS.html
63 docs/html/api/smb_SMBConnection.html
64 docs/html/api/smb_SMBHandler.html
65 docs/html/api/smb_SMBProtocolFactory.html
66 docs/html/api/smb_SharedDevice.html
67 docs/html/api/smb_SharedFile.html
68 docs/html/api/smb_exceptions.html
69 python2/nmb/NetBIOS.py
70 python2/nmb/NetBIOSProtocol.py
71 python2/nmb/__init__.py
72 python2/nmb/base.py
73 python2/nmb/nmb_constants.py
74 python2/nmb/nmb_structs.py
75 python2/nmb/utils.py
76 python2/smb/SMBConnection.py
77 python2/smb/SMBHandler.py
78 python2/smb/SMBProtocol.py
79 python2/smb/__init__.py
80 python2/smb/base.py
81 python2/smb/ntlm.py
82 python2/smb/security_descriptors.py
83 python2/smb/securityblob.py
84 python2/smb/smb2_constants.py
85 python2/smb/smb2_structs.py
86 python2/smb/smb_constants.py
87 python2/smb/smb_structs.py
88 python2/smb/utils/README.txt
89 python2/smb/utils/U32.py
90 python2/smb/utils/__init__.py
91 python2/smb/utils/md4.py
92 python2/smb/utils/pyDes.py
93 python2/smb/utils/sha256.py
94 python2/tests/README_1st.txt
95 python2/tests/__init__.py
96 python2/tests/connection.ini
97 python2/tests/smbtest.7z
98 python2/tests/test_ntlm.py
99 python2/tests/test_security_descriptors.py
100 python2/tests/test_securityblob.py
101 python2/tests/DirectSMBConnectionTests/__init__.py
102 python2/tests/DirectSMBConnectionTests/test_SMBHandler.py
103 python2/tests/DirectSMBConnectionTests/test_auth.py
104 python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
105 python2/tests/DirectSMBConnectionTests/test_echo.py
106 python2/tests/DirectSMBConnectionTests/test_listpath.py
107 python2/tests/DirectSMBConnectionTests/test_listshares.py
108 python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
109 python2/tests/DirectSMBConnectionTests/test_rename.py
110 python2/tests/DirectSMBConnectionTests/test_retrievefile.py
111 python2/tests/DirectSMBConnectionTests/test_storefile.py
112 python2/tests/DirectSMBConnectionTests/util.py
113 python2/tests/DirectSMBTwistedTests/test_auth.py
114 python2/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
115 python2/tests/DirectSMBTwistedTests/test_echo.py
116 python2/tests/DirectSMBTwistedTests/test_listpath.py
117 python2/tests/DirectSMBTwistedTests/test_listshares.py
118 python2/tests/DirectSMBTwistedTests/test_listsnapshots.py
119 python2/tests/DirectSMBTwistedTests/test_rename.py
120 python2/tests/DirectSMBTwistedTests/test_retrievefile.py
121 python2/tests/DirectSMBTwistedTests/test_storefile.py
122 python2/tests/DirectSMBTwistedTests/util.py
123 python2/tests/NetBIOSTests/__init__.py
124 python2/tests/NetBIOSTests/test_queryname.py
125 python2/tests/NetBIOSTwistedTests/__init__.py
126 python2/tests/NetBIOSTwistedTests/test_queryname.py
127 python2/tests/SMBConnectionTests/__init__.py
128 python2/tests/SMBConnectionTests/test_SMBHandler.py
129 python2/tests/SMBConnectionTests/test_auth.py
130 python2/tests/SMBConnectionTests/test_createdeletedirectory.py
131 python2/tests/SMBConnectionTests/test_deletepattern.py
132 python2/tests/SMBConnectionTests/test_echo.py
133 python2/tests/SMBConnectionTests/test_getattributes.py
134 python2/tests/SMBConnectionTests/test_listpath.py
135 python2/tests/SMBConnectionTests/test_listshares.py
136 python2/tests/SMBConnectionTests/test_listsnapshots.py
137 python2/tests/SMBConnectionTests/test_rename.py
138 python2/tests/SMBConnectionTests/test_retrievefile.py
139 python2/tests/SMBConnectionTests/test_security.py
140 python2/tests/SMBConnectionTests/test_storefile.py
141 python2/tests/SMBConnectionTests/util.py
142 python2/tests/SMBTwistedTests/__init__.py
143 python2/tests/SMBTwistedTests/test_auth.py
144 python2/tests/SMBTwistedTests/test_createdeletedirectory.py
145 python2/tests/SMBTwistedTests/test_echo.py
146 python2/tests/SMBTwistedTests/test_getattributes.py
147 python2/tests/SMBTwistedTests/test_listpath.py
148 python2/tests/SMBTwistedTests/test_listshares.py
149 python2/tests/SMBTwistedTests/test_listsnapshots.py
150 python2/tests/SMBTwistedTests/test_rename.py
151 python2/tests/SMBTwistedTests/test_retrievefile.py
152 python2/tests/SMBTwistedTests/test_storefile.py
153 python2/tests/SMBTwistedTests/util.py
154 python2/tests/SupportFiles/binary.dat
155 python3/nmb/NetBIOS.py
156 python3/nmb/NetBIOSProtocol.py
157 python3/nmb/__init__.py
158 python3/nmb/base.py
159 python3/nmb/nmb_constants.py
160 python3/nmb/nmb_structs.py
161 python3/nmb/utils.py
162 python3/pysmb.egg-info/PKG-INFO
163 python3/pysmb.egg-info/SOURCES.txt
164 python3/pysmb.egg-info/dependency_links.txt
165 python3/pysmb.egg-info/requires.txt
166 python3/pysmb.egg-info/top_level.txt
167 python3/smb/SMBConnection.py
168 python3/smb/SMBHandler.py
169 python3/smb/SMBProtocol.py
170 python3/smb/__init__.py
171 python3/smb/base.py
172 python3/smb/ntlm.py
173 python3/smb/security_descriptors.py
174 python3/smb/securityblob.py
175 python3/smb/smb2_constants.py
176 python3/smb/smb2_structs.py
177 python3/smb/smb_constants.py
178 python3/smb/smb_structs.py
179 python3/smb/utils/U32.py
180 python3/smb/utils/__init__.py
181 python3/smb/utils/md4.py
182 python3/smb/utils/pyDes.py
183 python3/smb/utils/sha256.py
184 python3/tests/__init__.py
185 python3/tests/connection.ini
186 python3/tests/smbtest.7z
187 python3/tests/test_ntlm.py
188 python3/tests/test_security_descriptors.py
189 python3/tests/test_securityblob.py
190 python3/tests/DirectSMBConnectionTests/__init__.py
191 python3/tests/DirectSMBConnectionTests/test_auth.py
192 python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
193 python3/tests/DirectSMBConnectionTests/test_echo.py
194 python3/tests/DirectSMBConnectionTests/test_listpath.py
195 python3/tests/DirectSMBConnectionTests/test_listshares.py
196 python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
197 python3/tests/DirectSMBConnectionTests/test_rename.py
198 python3/tests/DirectSMBConnectionTests/test_retrievefile.py
199 python3/tests/DirectSMBConnectionTests/test_storefile.py
200 python3/tests/DirectSMBConnectionTests/util.py
201 python3/tests/DirectSMBTwistedTests/test_auth.py
202 python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
203 python3/tests/DirectSMBTwistedTests/test_echo.py
204 python3/tests/DirectSMBTwistedTests/test_listpath.py
205 python3/tests/DirectSMBTwistedTests/test_listshares.py
206 python3/tests/DirectSMBTwistedTests/test_listsnapshots.py
207 python3/tests/DirectSMBTwistedTests/test_rename.py
208 python3/tests/DirectSMBTwistedTests/test_retrievefile.py
209 python3/tests/DirectSMBTwistedTests/test_storefile.py
210 python3/tests/DirectSMBTwistedTests/util.py
211 python3/tests/NetBIOSTests/__init__.py
212 python3/tests/NetBIOSTests/test_queryname.py
213 python3/tests/NetBIOSTwistedTests/__init__.py
214 python3/tests/NetBIOSTwistedTests/test_queryname.py
215 python3/tests/SMBConnectionTests/__init__.py
216 python3/tests/SMBConnectionTests/test_SMBHandler.py
217 python3/tests/SMBConnectionTests/test_auth.py
218 python3/tests/SMBConnectionTests/test_createdeletedirectory.py
219 python3/tests/SMBConnectionTests/test_deletepattern.py
220 python3/tests/SMBConnectionTests/test_echo.py
221 python3/tests/SMBConnectionTests/test_getattributes.py
222 python3/tests/SMBConnectionTests/test_listpath.py
223 python3/tests/SMBConnectionTests/test_listshares.py
224 python3/tests/SMBConnectionTests/test_listsnapshots.py
225 python3/tests/SMBConnectionTests/test_rename.py
226 python3/tests/SMBConnectionTests/test_retrievefile.py
227 python3/tests/SMBConnectionTests/test_storefile.py
228 python3/tests/SMBConnectionTests/util.py
229 python3/tests/SMBTwistedTests/__init__.py
230 python3/tests/SMBTwistedTests/test_auth.py
231 python3/tests/SMBTwistedTests/test_createdeletedirectory.py
232 python3/tests/SMBTwistedTests/test_echo.py
233 python3/tests/SMBTwistedTests/test_getattributes.py
234 python3/tests/SMBTwistedTests/test_listpath.py
235 python3/tests/SMBTwistedTests/test_listshares.py
236 python3/tests/SMBTwistedTests/test_listsnapshots.py
237 python3/tests/SMBTwistedTests/test_rename.py
238 python3/tests/SMBTwistedTests/test_retrievefile.py
239 python3/tests/SMBTwistedTests/test_storefile.py
240 python3/tests/SMBTwistedTests/util.py
241 python3/tests/SupportFiles/binary.dat
242 sphinx/Makefile
243 sphinx/make.bat
244 sphinx/source/conf.py
245 sphinx/source/extending.rst
246 sphinx/source/index.rst
247 sphinx/source/api/nmb_NBNSProtocol.rst
248 sphinx/source/api/nmb_NetBIOS.rst
249 sphinx/source/api/smb_SMBConnection.rst
250 sphinx/source/api/smb_SMBHandler.rst
251 sphinx/source/api/smb_SMBProtocolFactory.rst
252 sphinx/source/api/smb_SharedDevice.rst
253 sphinx/source/api/smb_SharedFile.rst
254 sphinx/source/api/smb_exceptions.rst
255 sphinx/source/api/smb_security_descriptors.rstāŽ
7171 total_sent = total_sent + sent
7272
7373 #
74 # Support for "with" context
75 #
76 def __enter__(self):
77 return self
78
79 def __exit__(self, *args):
80 self.close()
81
82 #
7483 # Misc Properties
7584 #
7685
152161 return results
153162
154163 def listPath(self, service_name, path,
155 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
164 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
156165 pattern = '*', timeout = 30):
157166 """
158167 Retrieve a directory listing of files/folders at *path*
168
169 For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
170 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
171
172 Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
173 system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
174 and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
175 If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
176 SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
159177
160178 :param string/unicode service_name: the name of the shared folder for the *path*
161179 :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
162180 :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
163 The default *search* value will query for all read-only, hidden, system, archive files and directories.
164181 :param string/unicode pattern: the filter to apply to the results before returning to the client.
165182 :return: A list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
166183 """
244261 self.is_busy = True
245262 try:
246263 self._getAttributes(service_name, path, cb, eb, timeout)
264 while self.is_busy:
265 self._pollForNetBIOSPacket(timeout)
266 finally:
267 self.is_busy = False
268
269 return results[0]
270
271 def getSecurity(self, service_name, path, timeout = 30):
272 """
273 Retrieve the security descriptor of the file at *path* on the *service_name*.
274
275 :param string/unicode service_name: the name of the shared folder for the *path*
276 :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure<smb_exceptions>` will be raised.
277 :return: A :class:`smb.security_descriptors.SecurityDescriptor` instance containing the security information of the file.
278 """
279 if not self.sock:
280 raise NotConnectedError('Not connected to server')
281
282 results = [ ]
283
284 def cb(info):
285 self.is_busy = False
286 results.append(info)
287
288 def eb(failure):
289 self.is_busy = False
290 raise failure
291
292 self.is_busy = True
293 try:
294 self._getSecurity(service_name, path, cb, eb, timeout)
247295 while self.is_busy:
248296 self._pollForNetBIOSPacket(timeout)
249297 finally:
383431 It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
384432 This function is very helpful when deleting files/folders that are read-only.
385433 Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)
386
434
387435 :param string/unicode service_name: Contains the name of the shared folder.
388436 :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
389437 Wildcards may be used in the filename component of the path.
495543 """
496544 Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
497545
498 :param string data: Data to send to the remote server.
546 :param bytes data: Data to send to the remote server. Must be a bytes object.
499547 :return: The *data* parameter
500548 """
501549 if not self.sock:
552600 else:
553601 raise ex
554602
555 type, flags, length = struct.unpack('>BBH', data)
556 if flags & 0x01:
557 length = length | 0x10000
603 type_, flags, length = struct.unpack('>BBH', data)
604 if type_ == 0x0:
605 # This is a Direct TCP packet
606 # The length is specified in the header from byte 8. (0-indexed)
607 # we read a structure assuming NBT, so to get the real length
608 # combine the length and flag fields together
609 length = length + (flags << 16)
610 else:
611 # This is a NetBIOS over TCP (NBT) packet
612 # The length is specified in the header from byte 16. (0-indexed)
613 if flags & 0x01:
614 length = length | 0x10000
558615
559616 read_len = length
560617 while read_len > 0:
177177 return d
178178
179179 def listPath(self, service_name, path,
180 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
180 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
181181 pattern = '*', timeout = 30):
182182 """
183183 Retrieve a directory listing of files/folders at *path*
184
185 For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
186 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
187
188 Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
189 system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
190 and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
191 If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
192 SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
184193
185194 :param string/unicode service_name: the name of the shared folder for the *path*
186195 :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
187196 :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
188 The default *search* value will query for all read-only, hidden, system, archive files and directories.
189197 :param string/unicode pattern: the filter to apply to the results before returning to the client.
190198 :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
191199 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
368376 """
369377 Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
370378
371 :param string data: Data to send to the remote server.
379 :param bytes data: Data to send to the remote server. Must be a bytes object.
372380 :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
373381 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.
374382 """
44 from .smb2_constants import *
55 from .smb_structs import *
66 from .smb2_structs import *
7 from .security_descriptors import SecurityDescriptor
78 from nmb.base import NMBSession
89 from .utils import convertFILETIMEtoEpoch
910 from . import ntlm, securityblob
5758 self.sign_options = sign_options
5859 self.is_direct_tcp = is_direct_tcp
5960 self.use_ntlm_v2 = use_ntlm_v2 #: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1
60 self.smb_message = SMBMessage()
61 self.smb_message = SMBMessage(self)
6162 self.is_using_smb2 = False #: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True
63 self.async_requests = { } #: AsyncID mapped to _PendingRequest instance
6264 self.pending_requests = { } #: MID mapped to _PendingRequest instance
6365 self.connected_trees = { } #: Share name mapped to TID
6466 self.next_rpc_call_id = 1 #: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages
8991 self.max_write_size = 0 #: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4
9092 self.max_transact_size = 0 #: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4
9193 self.session_id = 0 #: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method
94 self.smb2_dialect = 0
95
96
97 # SMB 2.1 attributes
98 self.cap_leasing = False
99 self.cap_multi_credit = False
100 self.credits = 0 # how many credits we're allowed to spend per request
92101
93102 self._setupSMB1Methods()
94103
103112 #
104113
105114 def onNMBSessionOK(self):
106 self._sendSMBMessage(SMBMessage(ComNegotiateRequest()))
115 self._sendSMBMessage(SMBMessage(self, ComNegotiateRequest()))
107116
108117 def onNMBSessionFailed(self):
109118 pass
117126 self.is_using_smb2 = True
118127 self.mid = 0 # Must reset messageID counter, or else remote SMB2 server will disconnect
119128 self._setupSMB2Methods()
120 self.smb_message = self._klassSMBMessage()
129 self.smb_message = self._klassSMBMessage(self)
121130 i = self.smb_message.decode(data)
131 self.log.info('SMB2 dialect is 0x%04x', self.smb2_dialect)
122132
123133 next_message_offset = 0
124134 if self.is_using_smb2:
125135 next_message_offset = self.smb_message.next_command_offset
136
137 # update how many credits we're allowed to spend on requests
138 self.credits = self.smb_message.credit_response
139
140 # SMB2 CANCEL commands do not consume message IDs
141 if self.smb_message.command != SMB2_COM_CANCEL:
142 self.log.debug('Received SMB2 packet from server - "%s" (command:0x%02X). Credit charge recv: %s',
143 SMB_COMMAND_NAMES.get(self.smb_message.command, '<unknown>'), self.smb_message.command, self.smb_message.credit_charge)
144 if self.smb_message.credit_charge > 0:
145 # Let's update the sequenceWindow based on the CreditsCharged
146 # In the SMB 2.0.2 dialect, this field MUST NOT be used and MUST be reserved.
147 # The sender MUST set this to 0, and the receiver MUST ignore it.
148 # In all other dialects, this field indicates the number of credits that this request consumes.
149 self.log.debug("Updating MID to add credit charge from server...")
150 self.log.debug("*** Before: " + str(self.mid))
151 self.mid = self.mid + (self.smb_message.credit_charge - 1)
152 self.log.debug("*** After: " + str(self.mid))
126153
127154 if i > 0:
128155 if not self.is_using_smb2:
135162 self.smb_message.command, self.smb_message.flags)
136163 if self._updateState(self.smb_message):
137164 # We need to create a new instance instead of calling reset() because the instance could be captured in the message history.
138 self.smb_message = self._klassSMBMessage()
165 self.smb_message = self._klassSMBMessage(self)
139166
140167 if next_message_offset > 0:
141168 data = data[next_message_offset:]
166193 self._listShares = self._listShares_SMB1
167194 self._listPath = self._listPath_SMB1
168195 self._listSnapshots = self._listSnapshots_SMB1
196 self._getSecurity = self._getSecurity_SMB1
169197 self._getAttributes = self._getAttributes_SMB1
170198 self._retrieveFile = self._retrieveFile_SMB1
171199 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
188216 self._listShares = self._listShares_SMB2
189217 self._listPath = self._listPath_SMB2
190218 self._listSnapshots = self._listSnapshots_SMB2
219 self._getSecurity = self._getSecurity_SMB2
191220 self._getAttributes = self._getAttributes_SMB2
192221 self._retrieveFile = self._retrieveFile_SMB2
193222 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
212241 if smb_message.mid == 0:
213242 smb_message.mid = self._getNextMID_SMB2()
214243
215 if smb_message.command != SMB2_COM_NEGOTIATE and smb_message.command != SMB2_COM_ECHO:
244 if smb_message.command != SMB2_COM_NEGOTIATE:
216245 smb_message.session_id = self.session_id
217246
218247 if self.is_signing_active:
234263 if message.isReply:
235264 if message.command == SMB2_COM_NEGOTIATE:
236265 if message.status == 0:
237 self.has_negotiated = True
238 self.log.info('SMB2 dialect negotiation successful')
239 self._updateServerInfo(message.payload)
240 self._handleNegotiateResponse(message)
266 if self.smb_message.payload.dialect_revision == SMB2_DIALECT_2ALL:
267 # Dialects from SMB 2.1 must be negotiated in a second negotiate phase
268 # We send a SMB2 Negotiate Request to accomplish this
269 self._sendSMBMessage(SMB2Message(self, SMB2NegotiateRequest()))
270 else:
271 if self.smb_message.payload.dialect_revision == SMB2_DIALECT_21:
272 # We negotiated SMB 2.1.
273 # we must now send credit requests (MUST!)
274 #self.send_credits_request = True
275 pass
276
277 self.has_negotiated = True
278 self.log.info('SMB2 dialect negotiation successful')
279 self.dialect = self.smb_message.payload.dialect_revision
280 self._updateServerInfo(message.payload)
281 self._handleNegotiateResponse(message)
241282 else:
242283 raise ProtocolError('Unknown status value (0x%08X) in SMB2_COM_NEGOTIATE' % message.status,
243284 message.raw_data, message)
249290 if result == securityblob.RESULT_ACCEPT_COMPLETED:
250291 self.has_authenticated = True
251292 self.log.info('Authentication (on SMB2) successful!')
293
294 # [MS-SMB2]: 3.2.5.3.1
295 # If the security subsystem indicates that the session was established by an anonymous user,
296 # Session.SigningRequired MUST be set to FALSE.
297 # If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags field of the
298 # SMB2 SESSION_SETUP Response and if Session.SigningRequired is TRUE, this indicates a SESSION_SETUP
299 # failure and the connection MUST be terminated. If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags
300 # field of the SMB2 SESSION_SETUP Response and if RequireMessageSigning is FALSE, Session.SigningRequired
301 # MUST be set to FALSE.
302 if message.payload.isGuestSession or message.payload.isAnonymousSession:
303 self.is_signing_active = False
304 self.log.info('Signing disabled because session is guest/anonymous')
305
252306 self.onAuthOK()
253307 else:
254308 raise ProtocolError('SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is %d' % result, message.raw_data, message)
262316 self._handleSessionChallenge(message, ntlm_token)
263317 except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ) as ex:
264318 raise ProtocolError(str(ex), message.raw_data, message)
265 elif message.status == 0xc000006d: # STATUS_LOGON_FAILURE
319 elif (message.status == 0xc000006d # STATUS_LOGON_FAILURE
320 or message.status == 0xc0000064 # STATUS_NO_SUCH_USER
321 or message.status == 0xc000006a):# STATUS_WRONG_PASSWORD
266322 self.has_authenticated = False
267323 self.log.info('Authentication (on SMB2) failed. Please check username and password.')
268324 self.onAuthFailed()
325 elif (message.status == 0xc0000193 # STATUS_ACCOUNT_EXPIRED
326 or message.status == 0xC0000071): # STATUS_PASSWORD_EXPIRED
327 self.has_authenticated = False
328 self.log.info('Authentication (on SMB2) failed. Account or password has expired.')
329 self.onAuthFailed()
330 elif message.status == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
331 self.has_authenticated = False
332 self.log.info('Authentication (on SMB2) failed. Account has been locked due to too many invalid logon attempts.')
333 self.onAuthFailed()
334 elif message.status == 0xc0000072: # STATUS_ACCOUNT_DISABLED
335 self.has_authenticated = False
336 self.log.info('Authentication (on SMB2) failed. Account has been disabled.')
337 self.onAuthFailed()
338 elif (message.status == 0xc000006f # STATUS_INVALID_LOGON_HOURS
339 or message.status == 0xc000015b # STATUS_LOGON_TYPE_NOT_GRANTED
340 or message.status == 0xc0000070): # STATUS_INVALID_WORKSTATION
341 self.has_authenticated = False
342 self.log.info('Authentication (on SMB2) failed. Not allowed.')
343 self.onAuthFailed()
344 elif message.status == 0xc000018c: # STATUS_TRUSTED_DOMAIN_FAILURE
345 self.has_authenticated = False
346 self.log.info('Authentication (on SMB2) failed. Domain not trusted.')
347 self.onAuthFailed()
348 elif message.status == 0xc000018d: # STATUS_TRUSTED_RELATIONSHIP_FAILURE
349 self.has_authenticated = False
350 self.log.info('Authentication (on SMB2) failed. Workstation not trusted.')
351 self.onAuthFailed()
269352 else:
270353 raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status,
271354 message.raw_data, message)
272355
273 req = self.pending_requests.pop(message.mid, None)
274 if req:
275 req.callback(message, **req.kwargs)
276 return True
356 if message.isAsync:
357 if message.status == 0x00000103: # STATUS_PENDING
358 req = self.pending_requests.pop(message.mid, None)
359 if req:
360 self.async_requests[message.async_id] = req
361 else: # All other status including SUCCESS
362 req = self.async_requests.pop(message.async_id, None)
363 if req:
364 req.callback(message, **req.kwargs)
365 return True
366 else:
367 req = self.pending_requests.pop(message.mid, None)
368 if req:
369 req.callback(message, **req.kwargs)
370 return True
277371
278372
279373 def _updateServerInfo_SMB2(self, payload):
284378 self.max_write_size = payload.max_write_size
285379 self.use_plaintext_authentication = False # SMB2 never allows plaintext authentication
286380
381 if (self.capabilities & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
382 self.cap_leasing = True
383
384 if (self.capabilities & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
385 self.cap_multi_credit = True
386
287387
288388 def _handleNegotiateResponse_SMB2(self, message):
289389 ntlm_data = ntlm.generateNegotiateMessage()
290390 blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
291 self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
391 self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
292392
293393
294394 def _handleSessionChallenge_SMB2(self, message, ntlm_token):
313413 lm_challenge_response,
314414 session_key,
315415 self.username,
316 self.domain)
416 self.domain,
417 self.my_name)
317418
318419 if self.log.isEnabledFor(logging.DEBUG):
319420 self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
320421 self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
321422
322423 blob = securityblob.generateAuthSecurityBlob(ntlm_data)
323 self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
424 self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
324425
325426 if self.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED:
326427 self.log.info('Server requires all SMB messages to be signed')
351452 messages_history = [ ]
352453
353454 def connectSrvSvc(tid):
354 m = SMB2Message(SMB2CreateRequest('srvsvc',
455 m = SMB2Message(self, SMB2CreateRequest('srvsvc',
355456 file_attributes = 0,
356457 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
357458 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
362463
363464 m.tid = tid
364465 self._sendSMBMessage(m)
365 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback)
466 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback, tid = tid)
366467 messages_history.append(m)
367468
368469 def connectSrvSvcCB(create_message, **kwargs):
383484 2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00
384485 01 00 00 00
385486 """.replace(b' ', b'').replace(b'\n', b''))
386 m = SMB2Message(SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
387 m.tid = create_message.tid
487 m = SMB2Message(self, SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
488 m.tid = kwargs['tid']
388489 self._sendSMBMessage(m)
389 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, fid = create_message.payload.fid)
490 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
390491 messages_history.append(m)
391492 else:
392493 errback(OperationFailure('Failed to list shares: Unable to locate Server Service RPC endpoint', messages_history))
394495 def rpcBindCB(trans_message, **kwargs):
395496 messages_history.append(trans_message)
396497 if trans_message.status == 0:
397 m = SMB2Message(SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
398 m.tid = trans_message.tid
498 m = SMB2Message(self, SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
499 m.tid = kwargs['tid']
399500 self._sendSMBMessage(m)
400 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, fid = kwargs['fid'])
501 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
401502 messages_history.append(m)
402503 else:
403 closeFid(trans_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
504 closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
404505
405506 def rpcReadCB(read_message, **kwargs):
406507 messages_history.append(read_message)
427528 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
428529 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
429530 """.replace(b' ', b'').replace(b'\n', b''))
430 m = SMB2Message(SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
431 m.tid = read_message.tid
531 m = SMB2Message(self, SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
532 m.tid = kwargs['tid']
432533 self._sendSMBMessage(m)
433 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
534 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
434535 messages_history.append(m)
435536 else:
436 closeFid(read_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
537 closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
437538
438539 def listShareResultsCB(result_message, **kwargs):
439540 messages_history.append(result_message)
442543 data_bytes = result_message.payload.out_data
443544
444545 if data_bytes[3] & 0x02 == 0:
445 sendReadRequest(result_message.tid, kwargs['fid'], data_bytes)
446 else:
447 decodeResults(result_message.tid, kwargs['fid'], data_bytes)
448 elif result_message.status == 0x0103: # STATUS_PENDING
449 self.pending_requests[result_message.mid] = _PendingRequest(result_message.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
450 else:
451 closeFid(result_message.tid, kwargs['fid'])
546 sendReadRequest(kwargs['tid'], kwargs['fid'], data_bytes)
547 else:
548 decodeResults(kwargs['tid'], kwargs['fid'], data_bytes)
549 else:
550 closeFid(kwargs['tid'], kwargs['fid'])
452551 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
453552
454553 def decodeResults(tid, fid, data_bytes):
483582
484583 def sendReadRequest(tid, fid, data_bytes):
485584 read_count = min(4280, self.max_read_size)
486 m = SMB2Message(SMB2ReadRequest(fid, 0, read_count))
585 m = SMB2Message(self, SMB2ReadRequest(fid, 0, read_count))
487586 m.tid = tid
488587 self._sendSMBMessage(m)
489588 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
490 fid = fid, data_bytes = data_bytes)
589 tid = tid, fid = fid, data_bytes = data_bytes)
491590
492591 def readCB(read_message, **kwargs):
493592 messages_history.append(read_message)
494593 if read_message.status == 0:
495 data_len = read_message.payload.data_length
496594 data_bytes = read_message.payload.data
497595
498596 if data_bytes[3] & 0x02 == 0:
499 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
500 else:
501 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
502 else:
503 closeFid(read_message.tid, kwargs['fid'])
597 sendReadRequest(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
598 else:
599 decodeResults(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
600 else:
601 closeFid(kwargs['tid'], kwargs['fid'])
504602 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
505603
506604 def closeFid(tid, fid, results = None, error = None):
507 m = SMB2Message(SMB2CloseRequest(fid))
605 m = SMB2Message(self, SMB2CloseRequest(fid))
508606 m.tid = tid
509607 self._sendSMBMessage(m)
510608 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
525623 else:
526624 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
527625
528 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
626 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
529627 self._sendSMBMessage(m)
530628 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
531629 messages_history.append(m)
554652 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
555653 51 46 69 64 00 00 00 00
556654 """.replace(b' ', b'').replace(b'\n', b''))
557 m = SMB2Message(SMB2CreateRequest(path,
655 m = SMB2Message(self, SMB2CreateRequest(path,
558656 file_attributes = 0,
559657 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
560658 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
565663 create_context_data = create_context_data))
566664 m.tid = tid
567665 self._sendSMBMessage(m)
568 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
666 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
569667 messages_history.append(m)
570668
571669 def createCB(create_message, **kwargs):
572670 messages_history.append(create_message)
573671 if create_message.status == 0:
574 sendQuery(create_message.tid, create_message.payload.fid, b'')
672 sendQuery(kwargs['tid'], create_message.payload.fid, b'')
575673 else:
576674 errback(OperationFailure('Failed to list %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
577675
578676 def sendQuery(tid, fid, data_buf):
579 m = SMB2Message(SMB2QueryDirectoryRequest(fid, pattern,
580 info_class = 0x03, # FileBothDirectoryInformation
677 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
678 output_buf_len = 64 * 1024 * (self.credits - 1)
679 else:
680 output_buf_len = self.max_transact_size
681
682 m = SMB2Message(self, SMB2QueryDirectoryRequest(fid, pattern,
683 info_class = 0x25, # FileIdBothDirectoryInformation
581684 flags = 0,
582 output_buf_len = self.max_transact_size))
583 m.tid = tid
584 self._sendSMBMessage(m)
585 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, fid = fid, data_buf = data_buf)
685 output_buf_len = output_buf_len))
686 m.tid = tid
687 self._sendSMBMessage(m)
688 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = tid, fid = fid, data_buf = data_buf)
586689 messages_history.append(m)
587690
588691 def queryCB(query_message, **kwargs):
589692 messages_history.append(query_message)
590693 if query_message.status == 0:
591694 data_buf = decodeQueryStruct(kwargs['data_buf'] + query_message.payload.data)
592 sendQuery(query_message.tid, kwargs['fid'], data_buf)
695 sendQuery(kwargs['tid'], kwargs['fid'], data_buf)
593696 elif query_message.status == 0x80000006: # STATUS_NO_MORE_FILES
594 closeFid(query_message.tid, kwargs['fid'], results = results)
595 else:
596 closeFid(query_message.tid, kwargs['fid'], error = query_message.status)
697 closeFid(kwargs['tid'], kwargs['fid'], results = results)
698 else:
699 closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
597700
598701 def decodeQueryStruct(data_bytes):
599 # SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1
600 info_format = '<IIQQQQQQIIIBB24s'
702 # FileIdBothDirectoryInformation structure. See [MS-SMB]: 2.2.8.1.3 and [MS-FSCC]: 2.4.17
703 info_format = '<IIQQQQQQIIIBB24sHQ'
601704 info_size = struct.calcsize(info_format)
602705
603706 data_length = len(data_bytes)
609712 next_offset, _, \
610713 create_time, last_access_time, last_write_time, last_attr_change_time, \
611714 file_size, alloc_size, file_attributes, filename_length, ea_size, \
612 short_name_length, _, short_name = struct.unpack(info_format, data_bytes[offset:offset+info_size])
715 short_name_length, _, short_name, _, file_id = struct.unpack(info_format, data_bytes[offset:offset+info_size])
613716
614717 offset2 = offset + info_size
615718 if offset2 + filename_length > data_length:
616719 return data_bytes[offset:]
617720
618721 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
619 short_name = short_name.decode('UTF-16LE')
620 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
621 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
622 file_size, alloc_size, file_attributes, short_name, filename))
722 short_name = short_name[:short_name_length].decode('UTF-16LE')
723
724 accept_result = False
725 if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
726 accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
727 else:
728 accept_result = (file_attributes & search) > 0
729 if accept_result:
730 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
731 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
732 file_size, alloc_size, file_attributes, short_name, filename, file_id))
623733
624734 if next_offset:
625735 offset += next_offset
628738 return b''
629739
630740 def closeFid(tid, fid, results = None, error = None):
631 m = SMB2Message(SMB2CloseRequest(fid))
741 m = SMB2Message(self, SMB2CloseRequest(fid))
632742 m.tid = tid
633743 self._sendSMBMessage(m)
634744 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
638748 if kwargs['results'] is not None:
639749 callback(kwargs['results'])
640750 elif kwargs['error'] is not None:
641 errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
751 if kwargs['error'] == 0xC000000F: # [MS-ERREF]: STATUS_NO_SUCH_FILE
752 # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
753 callback([ ])
754 else:
755 errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
642756
643757 if service_name not in self.connected_trees:
644758 def connectCB(connect_message, **kwargs):
649763 else:
650764 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
651765
652 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
766 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
653767 self._sendSMBMessage(m)
654768 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
655769 messages_history.append(m)
677791 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
678792 51 46 69 64 00 00 00 00
679793 """.replace(' ', '').replace('\n', ''))
680 m = SMB2Message(SMB2CreateRequest(path,
794 m = SMB2Message(self, SMB2CreateRequest(path,
681795 file_attributes = 0,
682796 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
683797 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
688802 create_context_data = create_context_data))
689803 m.tid = tid
690804 self._sendSMBMessage(m)
691 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
805 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
692806 messages_history.append(m)
693807
694808 def createCB(create_message, **kwargs):
695809 messages_history.append(create_message)
696810 if create_message.status == 0:
697811 p = create_message.payload
812 filename = self._extractLastPathComponent(path)
698813 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
699814 p.file_size, p.allocation_size, p.file_attributes,
700 path, path)
701 closeFid(create_message.tid, p.fid, info = info)
815 filename, filename)
816 closeFid(kwargs['tid'], p.fid, info = info)
702817 else:
703818 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
704819
705820 def closeFid(tid, fid, info = None, error = None):
706 m = SMB2Message(SMB2CloseRequest(fid))
821 m = SMB2Message(self, SMB2CloseRequest(fid))
707822 m.tid = tid
708823 self._sendSMBMessage(m)
709824 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
724839 else:
725840 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
726841
727 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
842 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
843 self._sendSMBMessage(m)
844 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
845 messages_history.append(m)
846 else:
847 sendCreate(self.connected_trees[service_name])
848
849 def _getSecurity_SMB2(self, service_name, path, callback, errback, timeout = 30):
850 if not self.has_authenticated:
851 raise NotReadyError('SMB connection not authenticated')
852
853 expiry_time = time.time() + timeout
854 path = path.replace('/', '\\')
855 if path.startswith('\\'):
856 path = path[1:]
857 if path.endswith('\\'):
858 path = path[:-1]
859 messages_history = [ ]
860 results = [ ]
861
862 def sendCreate(tid):
863 m = SMB2Message(self, SMB2CreateRequest(path,
864 file_attributes = 0,
865 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
866 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
867 oplock = SMB2_OPLOCK_LEVEL_NONE,
868 impersonation = SEC_IMPERSONATE,
869 create_options = 0,
870 create_disp = FILE_OPEN))
871 m.tid = tid
872 self._sendSMBMessage(m)
873 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
874 messages_history.append(m)
875
876 def createCB(create_message, **kwargs):
877 messages_history.append(create_message)
878 if create_message.status == 0:
879 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
880 output_buf_len = 64 * 1024 * (self.credits - 1)
881 else:
882 output_buf_len = self.max_transact_size
883
884 m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
885 flags = 0,
886 additional_info = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
887 info_type = SMB2_INFO_SECURITY,
888 file_info_class = 0, # [MS-SMB2] 2.2.37, 3.2.4.12
889 input_buf = '',
890 output_buf_len = output_buf_len))
891 m.tid = kwargs['tid']
892 self._sendSMBMessage(m)
893 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
894 messages_history.append(m)
895 else:
896 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to open file or directory' % ( path, service_name ), messages_history))
897
898 def queryCB(query_message, **kwargs):
899 messages_history.append(query_message)
900 if query_message.status == 0:
901 security = SecurityDescriptor.from_bytes(query_message.payload.data)
902 closeFid(kwargs['tid'], kwargs['fid'], result = security)
903 else:
904 closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
905
906 def closeFid(tid, fid, result = None, error = None):
907 m = SMB2Message(self, SMB2CloseRequest(fid))
908 m.tid = tid
909 self._sendSMBMessage(m)
910 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, result = result, error = error)
911 messages_history.append(m)
912
913 def closeCB(close_message, **kwargs):
914 if kwargs['result'] is not None:
915 callback(kwargs['result'])
916 elif kwargs['error'] is not None:
917 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
918
919 if service_name not in self.connected_trees:
920 def connectCB(connect_message, **kwargs):
921 messages_history.append(connect_message)
922 if connect_message.status == 0:
923 self.connected_trees[service_name] = connect_message.tid
924 sendCreate(connect_message.tid)
925 else:
926 errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
927
928 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
728929 self._sendSMBMessage(m)
729930 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
730931 messages_history.append(m)
756957 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
757958 51 46 69 64 00 00 00 00
758959 """.replace(b' ', b'').replace(b'\n', b''))
759 m = SMB2Message(SMB2CreateRequest(path,
960 m = SMB2Message(self, SMB2CreateRequest(path,
760961 file_attributes = 0,
761962 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
762 share_access = FILE_SHARE_READ,
963 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
763964 oplock = SMB2_OPLOCK_LEVEL_NONE,
764965 impersonation = SEC_IMPERSONATE,
765966 create_options = FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE,
773974 def createCB(create_message, **kwargs):
774975 messages_history.append(create_message)
775976 if create_message.status == 0:
776 m = SMB2Message(SMB2QueryInfoRequest(create_message.payload.fid,
977 m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
777978 flags = 0,
778979 additional_info = 0,
779980 info_type = SMB2_INFO_FILE,
780981 file_info_class = 0x16, # FileStreamInformation [MS-FSCC] 2.4
781982 input_buf = b'',
782983 output_buf_len = 4096))
783 m.tid = create_message.tid
984 m.tid = kwargs['tid']
784985 self._sendSMBMessage(m)
785986 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, infoCB, errback,
786 fid = create_message.payload.fid, file_attributes = create_message.payload.file_attributes)
987 tid = kwargs['tid'],
988 fid = create_message.payload.fid,
989 file_attributes = create_message.payload.file_attributes)
787990 messages_history.append(m)
788991 else:
789 errback(OperationFailure('Failed to list %s on %s: Unable to open file' % ( path, service_name ), messages_history))
992 errback(OperationFailure('Failed to retrieve %s on %s: Unable to open file' % ( path, service_name ), messages_history))
790993
791994 def infoCB(info_message, **kwargs):
792995 messages_history.append(info_message)
8011004 remaining_len = file_len
8021005 if starting_offset + remaining_len > file_len:
8031006 remaining_len = file_len - starting_offset
804 sendRead(info_message.tid, kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
805 else:
806 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
1007 sendRead(kwargs['tid'], kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
1008 else:
1009 errback(OperationFailure('Failed to retrieve %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
8071010
8081011 def sendRead(tid, fid, offset, remaining_len, read_len, file_attributes):
8091012 read_count = min(self.max_read_size, remaining_len)
810 m = SMB2Message(SMB2ReadRequest(fid, offset, read_count))
1013
1014 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
1015 max_read_count = 64 * 1024 * (self.credits -1)
1016 read_count = min(read_count, max_read_count)
1017
1018 m = SMB2Message(self, SMB2ReadRequest(fid, offset, read_count))
8111019 m.tid = tid
8121020 self._sendSMBMessage(m)
8131021 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
814 fid = fid, offset = offset,
1022 tid = tid, fid = fid, offset = offset,
8151023 remaining_len = remaining_len,
8161024 read_len = read_len,
8171025 file_attributes = file_attributes)
8251033 remaining_len = kwargs['remaining_len'] - data_len
8261034
8271035 if remaining_len > 0:
828 sendRead(read_message.tid, kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
829 else:
830 closeFid(read_message.tid, kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
1036 sendRead(kwargs['tid'], kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
1037 else:
1038 closeFid(kwargs['tid'], kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
8311039 else:
8321040 messages_history.append(read_message)
833 closeFid(read_message.tid, kwargs['fid'], error = read_message.status)
1041 closeFid(kwargs['tid'], kwargs['fid'], error = read_message.status)
8341042
8351043 def closeFid(tid, fid, ret = None, error = None):
836 m = SMB2Message(SMB2CloseRequest(fid))
1044 m = SMB2Message(self, SMB2CloseRequest(fid))
8371045 m.tid = tid
8381046 self._sendSMBMessage(m)
8391047 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, ret = ret, error = error)
8541062 else:
8551063 errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
8561064
857 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1065 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
8581066 self._sendSMBMessage(m)
8591067 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
8601068 messages_history.append(m)
8871095 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
8881096 51 46 69 64 00 00 00 00
8891097 """.replace(b' ', b'').replace(b'\n', b''))
890 m = SMB2Message(SMB2CreateRequest(path,
1098 m = SMB2Message(self, SMB2CreateRequest(path,
8911099 file_attributes = ATTR_ARCHIVE,
8921100 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | SYNCHRONIZE,
8931101 share_access = 0,
9061114 messages_history.append(create_message)
9071115 if create_message.status == 0:
9081116 sendWrite(create_message.tid, create_message.payload.fid, starting_offset)
909 elif create_message.status == 0x0103: # STATUS_PENDING
910 self.pending_requests[create_message.mid] = _PendingRequest(create_message.mid, expiry_time,
911 createCB, errback,
912 tid=kwargs['tid'])
9131117 else:
9141118 errback(OperationFailure('Failed to store %s on %s: Unable to open file' % ( path, service_name ), messages_history))
9151119
9161120 def sendWrite(tid, fid, offset):
917 write_count = self.max_write_size
1121 if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
1122 write_count = 64 * 1024 * (self.credits -1)
1123 else:
1124 write_count = self.max_write_size
9181125 data = file_obj.read(write_count)
9191126 data_len = len(data)
9201127 if data_len > 0:
921 m = SMB2Message(SMB2WriteRequest(fid, data, offset))
1128 m = SMB2Message(self, SMB2WriteRequest(fid, data, offset))
9221129 m.tid = tid
9231130 self._sendSMBMessage(m)
924 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
1131 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, tid = tid, fid = fid, offset = offset+data_len)
9251132 else:
9261133 closeFid(tid, fid, offset = offset)
9271134
9281135 def writeCB(write_message, **kwargs):
9291136 # To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.
9301137 if write_message.status == 0:
931 sendWrite(write_message.tid, kwargs['fid'], kwargs['offset'])
1138 sendWrite(kwargs['tid'], kwargs['fid'], kwargs['offset'])
9321139 else:
9331140 messages_history.append(write_message)
934 closeFid(write_message.tid, kwargs['fid'])
1141 closeFid(kwargs['tid'], kwargs['fid'])
9351142 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
9361143
9371144 def closeFid(tid, fid, error = None, offset = None):
938 m = SMB2Message(SMB2CloseRequest(fid))
1145 m = SMB2Message(self, SMB2CloseRequest(fid))
9391146 m.tid = tid
9401147 self._sendSMBMessage(m)
9411148 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, fid = fid, offset = offset, error = error)
9561163 else:
9571164 errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
9581165
959 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1166 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
9601167 self._sendSMBMessage(m)
9611168 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
9621169 messages_history.append(m)
9851192 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
9861193 51 46 69 64 00 00 00 00
9871194 """.replace(b' ', b'').replace(b'\n', b''))
988 m = SMB2Message(SMB2CreateRequest(path,
1195 m = SMB2Message(self, SMB2CreateRequest(path,
9891196 file_attributes = 0,
9901197 access_mask = DELETE | FILE_READ_ATTRIBUTES,
9911198 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
10041211 messages_history.append(open_message)
10051212 if open_message.status == 0:
10061213 sendDelete(open_message.tid, open_message.payload.fid)
1007 elif open_message.status == 0x0103: # STATUS_PENDING
1008 self.pending_requests[open_message.mid] = _PendingRequest(open_message.mid, expiry_time,
1009 createCB, errback,
1010 tid=kwargs['tid'])
10111214 else:
10121215 errback(OperationFailure('Failed to delete %s on %s: Unable to open file' % ( path, service_name ), messages_history))
10131216
10141217 def sendDelete(tid, fid):
1015 m = SMB2Message(SMB2SetInfoRequest(fid,
1218 m = SMB2Message(self, SMB2SetInfoRequest(fid,
10161219 additional_info = 0,
10171220 info_type = SMB2_INFO_FILE,
10181221 file_info_class = 0x0d, # SMB2_FILE_DISPOSITION_INFO
10191222 data = b'\x01'))
1020 '''
1021 Resources:
1022 https://msdn.microsoft.com/en-us/library/cc246560.aspx
1023 https://msdn.microsoft.com/en-us/library/cc232098.aspx
1024 '''
1025 m.tid = tid
1026 self._sendSMBMessage(m)
1027 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
1223 # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4.11
1224 m.tid = tid
1225 self._sendSMBMessage(m)
1226 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
10281227 messages_history.append(m)
10291228
10301229 def deleteCB(delete_message, **kwargs):
10311230 messages_history.append(delete_message)
10321231 if delete_message.status == 0:
1033 closeFid(delete_message.tid, kwargs['fid'], status = 0)
1034 else:
1035 closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
1232 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1233 else:
1234 closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
10361235
10371236 def closeFid(tid, fid, status = None):
1038 m = SMB2Message(SMB2CloseRequest(fid))
1237 m = SMB2Message(self, SMB2CloseRequest(fid))
10391238 m.tid = tid
10401239 self._sendSMBMessage(m)
10411240 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
10561255 else:
10571256 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
10581257
1059 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1258 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
10601259 self._sendSMBMessage(m)
10611260 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
10621261 messages_history.append(m)
10851284 51 46 69 64 00 00 00 00
10861285 """.replace(' ', '').replace('\n', ''))
10871286
1088 m = SMB2Message(SMB2CreateRequest(path,
1287 m = SMB2Message(self, SMB2CreateRequest(path,
10891288 file_attributes = 0,
10901289 access_mask = FILE_WRITE_ATTRIBUTES,
10911290 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
11021301 def createCB(open_message, **kwargs):
11031302 messages_history.append(open_message)
11041303 if open_message.status == 0:
1105 sendReset(open_message.tid, open_message.payload.fid)
1304 sendReset(kwargs['tid'], open_message.payload.fid)
11061305 else:
11071306 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to open file' % ( path, service_name ), messages_history))
11081307
11091308 def sendReset(tid, fid):
1110 m = SMB2Message(SMB2SetInfoRequest(fid,
1309 m = SMB2Message(self, SMB2SetInfoRequest(fid,
11111310 additional_info = 0,
11121311 info_type = SMB2_INFO_FILE,
11131312 file_info_class = 4, # FileBasicInformation
11141313 data = struct.pack('qqqqii',0,0,0,0,0x80,0))) # FILE_ATTRIBUTE_NORMAL
1115 '''
1116 Resources:
1117 https://msdn.microsoft.com/en-us/library/cc246560.aspx
1118 https://msdn.microsoft.com/en-us/library/cc232064.aspx
1119 https://msdn.microsoft.com/en-us/library/cc232094.aspx
1120 https://msdn.microsoft.com/en-us/library/cc232110.aspx
1121 '''
1122 m.tid = tid
1123 self._sendSMBMessage(m)
1124 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, fid = fid)
1314 # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4, [MS-FSCC]: 2.4.7, [MS-FSCC]: 2.6
1315 m.tid = tid
1316 self._sendSMBMessage(m)
1317 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, tid = tid, fid = fid)
11251318 messages_history.append(m)
11261319
11271320 def resetCB(reset_message, **kwargs):
11281321 messages_history.append(reset_message)
11291322 if reset_message.status == 0:
1130 closeFid(reset_message.tid, kwargs['fid'], status = 0)
1131 else:
1132 closeFid(reset_message.tid, kwargs['fid'], status = reset_message.status)
1323 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1324 else:
1325 closeFid(kwargs['tid'], kwargs['fid'], status = reset_message.status)
11331326
11341327 def closeFid(tid, fid, status = None):
1135 m = SMB2Message(SMB2CloseRequest(fid))
1328 m = SMB2Message(self, SMB2CloseRequest(fid))
11361329 m.tid = tid
11371330 self._sendSMBMessage(m)
11381331 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
11531346 else:
11541347 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
11551348
1156 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1349 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
11571350 self._sendSMBMessage(m)
11581351 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
11591352 messages_history.append(m)
11831376 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
11841377 51 46 69 64 00 00 00 00
11851378 """.replace(b' ', b'').replace(b'\n', b''))
1186 m = SMB2Message(SMB2CreateRequest(path,
1379 m = SMB2Message(self, SMB2CreateRequest(path,
11871380 file_attributes = 0,
11881381 access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_READ_EA | FILE_WRITE_EA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | READ_CONTROL | DELETE | SYNCHRONIZE,
11891382 share_access = 0,
11941387 create_context_data = create_context_data))
11951388 m.tid = tid
11961389 self._sendSMBMessage(m)
1197 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
1390 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback, tid = tid)
11981391 messages_history.append(m)
11991392
12001393 def createCB(create_message, **kwargs):
12011394 messages_history.append(create_message)
12021395 if create_message.status == 0:
1203 closeFid(create_message.tid, create_message.payload.fid)
1396 closeFid(kwargs['tid'], create_message.payload.fid)
12041397 else:
12051398 errback(OperationFailure('Failed to create directory %s on %s: Create failed' % ( path, service_name ), messages_history))
12061399
12071400 def closeFid(tid, fid):
1208 m = SMB2Message(SMB2CloseRequest(fid))
1401 m = SMB2Message(self, SMB2CloseRequest(fid))
12091402 m.tid = tid
12101403 self._sendSMBMessage(m)
12111404 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback)
12231416 else:
12241417 errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
12251418
1226 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1419 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
12271420 self._sendSMBMessage(m)
12281421 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
12291422 messages_history.append(m)
12511444 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
12521445 51 46 69 64 00 00 00 00
12531446 """.replace(b' ', b'').replace(b'\n', b''))
1254 m = SMB2Message(SMB2CreateRequest(path,
1447 m = SMB2Message(self, SMB2CreateRequest(path,
12551448 file_attributes = 0,
12561449 access_mask = DELETE | FILE_READ_ATTRIBUTES,
12571450 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
12681461 def createCB(open_message, **kwargs):
12691462 messages_history.append(open_message)
12701463 if open_message.status == 0:
1271 sendDelete(open_message.tid, open_message.payload.fid)
1464 sendDelete(kwargs['tid'], open_message.payload.fid)
12721465 else:
12731466 errback(OperationFailure('Failed to delete %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
12741467
12751468 def sendDelete(tid, fid):
1276 m = SMB2Message(SMB2SetInfoRequest(fid,
1469 m = SMB2Message(self, SMB2SetInfoRequest(fid,
12771470 additional_info = 0,
12781471 info_type = SMB2_INFO_FILE,
12791472 file_info_class = 0x0d, # SMB2_FILE_DISPOSITION_INFO
12801473 data = b'\x01'))
12811474 m.tid = tid
12821475 self._sendSMBMessage(m)
1283 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
1476 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
12841477 messages_history.append(m)
12851478
12861479 def deleteCB(delete_message, **kwargs):
12871480 messages_history.append(delete_message)
12881481 if delete_message.status == 0:
1289 closeFid(delete_message.tid, kwargs['fid'], status = 0)
1290 else:
1291 closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
1482 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1483 else:
1484 closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
12921485
12931486 def closeFid(tid, fid, status = None):
1294 m = SMB2Message(SMB2CloseRequest(fid))
1487 m = SMB2Message(self, SMB2CloseRequest(fid))
12951488 m.tid = tid
12961489 self._sendSMBMessage(m)
12971490 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
13121505 else:
13131506 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
13141507
1315 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1508 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
13161509 self._sendSMBMessage(m)
13171510 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
13181511 messages_history.append(m)
13471540 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
13481541 51 46 69 64 00 00 00 00
13491542 """.replace(b' ', b'').replace(b'\n', b''))
1350 m = SMB2Message(SMB2CreateRequest(old_path,
1543 m = SMB2Message(self, SMB2CreateRequest(old_path,
13511544 file_attributes = 0,
13521545 access_mask = DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
13531546 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
13641557 def createCB(create_message, **kwargs):
13651558 messages_history.append(create_message)
13661559 if create_message.status == 0:
1367 sendRename(create_message.tid, create_message.payload.fid)
1560 sendRename(kwargs['tid'], create_message.payload.fid)
13681561 else:
13691562 errback(OperationFailure('Failed to rename %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
13701563
13711564 def sendRename(tid, fid):
13721565 data = b'\x00'*16 + struct.pack('<I', len(new_path)*2) + new_path.encode('UTF-16LE')
1373 m = SMB2Message(SMB2SetInfoRequest(fid,
1566 m = SMB2Message(self, SMB2SetInfoRequest(fid,
13741567 additional_info = 0,
13751568 info_type = SMB2_INFO_FILE,
13761569 file_info_class = 0x0a, # SMB2_FILE_RENAME_INFO
13771570 data = data))
13781571 m.tid = tid
13791572 self._sendSMBMessage(m)
1380 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, fid = fid)
1573 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, tid = tid, fid = fid)
13811574 messages_history.append(m)
13821575
13831576 def renameCB(rename_message, **kwargs):
13841577 messages_history.append(rename_message)
13851578 if rename_message.status == 0:
1386 closeFid(rename_message.tid, kwargs['fid'], status = 0)
1387 else:
1388 closeFid(rename_message.tid, kwargs['fid'], status = rename_message.status)
1579 closeFid(kwargs['tid'], kwargs['fid'], status = 0)
1580 else:
1581 closeFid(kwargs['tid'], kwargs['fid'], status = rename_message.status)
13891582
13901583 def closeFid(tid, fid, status = None):
1391 m = SMB2Message(SMB2CloseRequest(fid))
1584 m = SMB2Message(self, SMB2CloseRequest(fid))
13921585 m.tid = tid
13931586 self._sendSMBMessage(m)
13941587 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
14091602 else:
14101603 errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
14111604
1412 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1605 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
14131606 self._sendSMBMessage(m)
14141607 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
14151608 messages_history.append(m)
14351628 00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00
14361629 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
14371630 """.replace(b' ', b'').replace(b'\n', b''))
1438 m = SMB2Message(SMB2CreateRequest(path,
1631 m = SMB2Message(self, SMB2CreateRequest(path,
14391632 file_attributes = 0,
14401633 access_mask = FILE_READ_DATA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
14411634 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
14521645 def createCB(create_message, **kwargs):
14531646 messages_history.append(create_message)
14541647 if create_message.status == 0:
1455 sendEnumSnapshots(create_message.tid, create_message.payload.fid)
1648 sendEnumSnapshots(kwargs['tid'], create_message.payload.fid)
14561649 else:
14571650 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
14581651
14591652 def sendEnumSnapshots(tid, fid):
1460 m = SMB2Message(SMB2IoctlRequest(fid,
1653 m = SMB2Message(self, SMB2IoctlRequest(fid,
14611654 ctlcode = 0x00144064, # FSCTL_SRV_ENUMERATE_SNAPSHOTS
14621655 flags = 0x0001,
14631656 in_data = b''))
14791672 closeFid(kwargs['tid'], kwargs['fid'], status = enum_message.status)
14801673
14811674 def closeFid(tid, fid, status = None, results = None):
1482 m = SMB2Message(SMB2CloseRequest(fid))
1675 m = SMB2Message(self, SMB2CloseRequest(fid))
14831676 m.tid = tid
14841677 self._sendSMBMessage(m)
14851678 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status, results = results)
15001693 else:
15011694 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
15021695
1503 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
1696 m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
15041697 self._sendSMBMessage(m)
15051698 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
15061699 messages_history.append(m)
15171710 else:
15181711 errback(OperationFailure('Echo failed', messages_history))
15191712
1520 m = SMB2Message(SMB2EchoRequest())
1713 m = SMB2Message(self, SMB2EchoRequest())
15211714 self._sendSMBMessage(m)
15221715 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
15231716 messages_history.append(m)
15931786 self._handleSessionChallenge(message, ntlm_token)
15941787 except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ) as ex:
15951788 raise ProtocolError(str(ex), message.raw_data, message)
1596 elif message.status.internal_value == 0xc000006d: # STATUS_LOGON_FAILURE
1789 elif (message.status.internal_value == 0xc000006d # STATUS_LOGON_FAILURE
1790 or message.status.internal_value == 0xc0000064 # STATUS_NO_SUCH_USER
1791 or message.status.internal_value == 0xc000006a): # STATUS_WRONG_PASSWORD
15971792 self.has_authenticated = False
1598 self.log.info('Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.')
1793 self.log.info('Authentication (with extended security) failed. Please check username and password.')
1794 self.onAuthFailed()
1795 elif (message.status.internal_value == 0xc0000193 # STATUS_ACCOUNT_EXPIRED
1796 or message.status.internal_value == 0xC0000071): # STATUS_PASSWORD_EXPIRED
1797 self.has_authenticated = False
1798 self.log.info('Authentication (with extended security) failed. Account or password has expired.')
1799 self.onAuthFailed()
1800 elif message.status.internal_value == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
1801 self.has_authenticated = False
1802 self.log.info('Authentication (with extended security) failed. Account has been locked due to too many invalid logon attempts.')
1803 self.onAuthFailed()
1804 elif message.status.internal_value == 0xc0000072: # STATUS_ACCOUNT_DISABLED
1805 self.has_authenticated = False
1806 self.log.info('Authentication (with extended security) failed. Account has been disabled.')
1807 self.onAuthFailed()
1808 elif (message.status.internal_value == 0xc000006f # STATUS_INVALID_LOGON_HOURS
1809 or message.status.internal_value == 0xc000015b # STATUS_LOGON_TYPE_NOT_GRANTED
1810 or message.status.internal_value == 0xc0000070): # STATUS_INVALID_WORKSTATION
1811 self.has_authenticated = False
1812 self.log.info('Authentication (with extended security) failed. Not allowed.')
1813 self.onAuthFailed()
1814 elif message.status.internal_value == 0xc000018c: # STATUS_TRUSTED_DOMAIN_FAILURE
1815 self.has_authenticated = False
1816 self.log.info('Authentication (with extended security) failed. Domain not trusted.')
1817 self.onAuthFailed()
1818 elif message.status.internal_value == 0xc000018d: # STATUS_TRUSTED_RELATIONSHIP_FAILURE
1819 self.has_authenticated = False
1820 self.log.info('Authentication (with extended security) failed. Workstation not trusted.')
15991821 self.onAuthFailed()
16001822 else:
16011823 raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status.internal_value,
16621884 lm_challenge_response,
16631885 session_key,
16641886 self.username,
1665 self.domain)
1887 self.domain,
1888 self.my_name)
16661889
16671890 if self.log.isEnabledFor(logging.DEBUG):
16681891 self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
16691892 self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
16701893
16711894 blob = securityblob.generateAuthSecurityBlob(ntlm_data)
1672 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
1895 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
16731896
16741897 if self.security_mode & NEGOTIATE_SECURITY_SIGNATURES_REQUIRE:
16751898 self.log.info('Server requires all SMB messages to be signed')
16981921 if message.hasExtendedSecurity or message.payload.supportsExtendedSecurity:
16991922 ntlm_data = ntlm.generateNegotiateMessage()
17001923 blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
1701 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
1924 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
17021925 else:
17031926 nt_password, _, _ = ntlm.generateChallengeResponseV1(self.password, message.payload.challenge, False)
17041927 self.log.info('Performing NTLMv1 authentication (without extended security) with challenge "%s" and hashed password of "%s"',
17051928 binascii.hexlify(message.payload.challenge),
17061929 binascii.hexlify(nt_password))
1707 self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
1930 self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
17081931 self.username,
17091932 nt_password,
17101933 True,
17191942 messages_history = [ ]
17201943
17211944 def connectSrvSvc(tid):
1722 m = SMBMessage(ComNTCreateAndxRequest('\\srvsvc',
1945 m = SMBMessage(self, ComNTCreateAndxRequest('\\srvsvc',
17231946 flags = NT_CREATE_REQUEST_EXTENDED_RESPONSE,
17241947 access_mask = READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | FILE_WRITE_EA | FILE_READ_EA | FILE_APPEND_DATA | FILE_WRITE_DATA | FILE_READ_DATA,
17251948 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
17481971 c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
17491972 03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
17501973 2b 10 48 60 02 00 00 00""".replace(b' ', b'').replace(b'\n', b''))
1751 m = SMBMessage(ComTransactionRequest(max_params_count = 0,
1974 m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
17521975 max_data_count = 4280,
17531976 max_setup_count = 0,
17541977 data_bytes = data_bytes,
17862009 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
17872010 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
17882011 """.replace(b' ', b'').replace(b'\n', b''))
1789 m = SMBMessage(ComTransactionRequest(max_params_count = 0,
2012 m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
17902013 max_data_count = 4280,
17912014 max_setup_count = 0,
17922015 data_bytes = data_bytes,
18452068
18462069 def sendReadRequest(tid, fid, data_bytes):
18472070 read_count = min(4280, self.max_raw_size - 2)
1848 m = SMBMessage(ComReadAndxRequest(fid = fid,
2071 m = SMBMessage(self, ComReadAndxRequest(fid = fid,
18492072 offset = 0,
18502073 max_return_bytes_count = read_count,
18512074 min_return_bytes_count = read_count))
18562079 def readCB(read_message, **kwargs):
18572080 messages_history.append(read_message)
18582081 if not read_message.status.hasError:
1859 data_len = read_message.payload.data_length
18602082 data_bytes = read_message.payload.data
18612083
18622084 if data_bytes[3] & 0x02 == 0:
1863 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
1864 else:
1865 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
2085 sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
2086 else:
2087 decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
18662088 else:
18672089 closeFid(read_message.tid, kwargs['fid'])
18682090 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
18692091
18702092 def closeFid(tid, fid):
1871 m = SMBMessage(ComCloseRequest(fid))
2093 m = SMBMessage(self, ComCloseRequest(fid))
18722094 m.tid = tid
18732095 self._sendSMBMessage(m)
18742096 messages_history.append(m)
18812103 else:
18822104 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
18832105
1884 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
2106 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
18852107 self._sendSMBMessage(m)
18862108 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
18872109 messages_history.append(m)
19012123 setup_bytes = struct.pack('<H', 0x0001) # TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1
19022124 params_bytes = \
19032125 struct.pack('<HHHHI',
1904 search, # SearchAttributes
2126 search & 0xFFFF, # SearchAttributes (need to restrict the values due to introduction of SMB_FILE_ATTRIBUTE_INCL_NORMAL)
19052127 100, # SearchCount
19062128 0x0006, # Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
19072129 0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
1908 0x0000) # SearchStorageType
2130 0x0000) # SearchStorageType (seems to be ignored by Windows)
19092131 if support_dfs:
19102132 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
19112133 else:
1912 params_bytes += (path + pattern).encode('UTF-16LE')
1913
1914 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2134 params_bytes += (path + pattern + '\0').encode('UTF-16LE')
2135
2136 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
19152137 max_data_count = 16644,
19162138 max_setup_count = 0,
19172139 params_bytes = params_bytes,
19452167
19462168 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
19472169 short_name = short_name.decode('UTF-16LE')
1948 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
1949 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
1950 file_size, alloc_size, file_attributes, short_name, filename))
2170
2171 accept_result = False
2172 if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
2173 accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
2174 else:
2175 accept_result = (file_attributes & search) > 0
2176 if accept_result:
2177 results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
2178 convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
2179 file_size, alloc_size, file_attributes, short_name, filename))
19512180
19522181 if next_offset:
19532182 offset += next_offset
19872216 elif end_of_search:
19882217 callback(results)
19892218 else:
1990 sendFindNext(find_message.tid, sid, last_name_offset, kwargs.get('support_dfs', False))
1991 else:
1992 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
1993
1994 def sendFindNext(tid, sid, resume_key, support_dfs=False):
2219 sendFindNext(find_message.tid, sid, 0, results[-1].filename, kwargs.get('support_dfs', False))
2220 else:
2221 if find_message.status.internal_value == 0xC000000F: # [MS-ERREF]: STATUS_NO_SUCH_FILE
2222 # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
2223 callback([ ])
2224 else:
2225 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
2226
2227 def sendFindNext(tid, sid, resume_key, resume_file, support_dfs):
19952228 setup_bytes = struct.pack('<H', 0x0002) # TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1
19962229 params_bytes = \
19972230 struct.pack('<HHHIH',
19992232 100, # SearchCount
20002233 0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
20012234 resume_key, # ResumeKey
2002 0x000a) # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
2003 if support_dfs:
2004 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
2005 else:
2006 params_bytes += (path + pattern).encode('UTF-16LE')
2007
2008 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2235 0x0006) # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
2236 params_bytes += (resume_file+'\0').encode('UTF-16LE')
2237
2238 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
20092239 max_data_count = 16644,
20102240 max_setup_count = 0,
20112241 params_bytes = params_bytes,
20492279 elif end_of_search:
20502280 callback(results)
20512281 else:
2052 sendFindNext(find_message.tid, kwargs['sid'], last_name_offset, kwargs.get('support_dfs', False))
2282 sendFindNext(find_message.tid, kwargs['sid'], 0, results[-1].filename, kwargs.get('support_dfs', False))
20532283 else:
20542284 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
20552285
20582288 params_bytes = struct.pack('<H', 3) # Max referral level 3
20592289 params_bytes += ("\\" + self.remote_name + "\\" + service_name).encode('UTF-16LE')
20602290
2061 m = SMBMessage(ComTransaction2Request(max_params_count = 10,
2291 m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
20622292 max_data_count = 16644,
20632293 max_setup_count = 0,
20642294 params_bytes = params_bytes,
20832313 else:
20842314 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
20852315
2086 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2316 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
20872317 self._sendSMBMessage(m)
20882318 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
20892319 messages_history.append(m)
21102340 0x0000) # Reserved
21112341 params_bytes += (path + '\0').encode('UTF-16LE')
21122342
2113 m = SMBMessage(ComTransaction2Request(max_params_count = 2,
2343 m = SMBMessage(self, ComTransaction2Request(max_params_count = 2,
21142344 max_data_count = 65535,
21152345 max_setup_count = 0,
21162346 params_bytes = params_bytes,
21272357 info_size = struct.calcsize(info_format)
21282358 create_time, last_access_time, last_write_time, last_attr_change_time, \
21292359 file_attributes, _, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
2130
2131 info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
2132 file_size, alloc_size, file_attributes, path, path)
2360 filename = self._extractLastPathComponent(path)
2361
2362 info = SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time), convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
2363 file_size, alloc_size, file_attributes, filename, filename)
21332364 callback(info)
21342365 else:
21352366 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
21432374 else:
21442375 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
21452376
2146 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2377 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
21472378 self._sendSMBMessage(m)
21482379 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
21492380 messages_history.append(m)
21502381 else:
21512382 sendQuery(self.connected_trees[service_name])
2383
2384 def _getSecurity_SMB1(self, service_name, path_file_pattern, callback, errback, timeout = 30):
2385 raise NotReadyError('getSecurity is not yet implemented for SMB1')
21522386
21532387 def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
21542388 return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0, -1, timeout)
21612395 messages_history = [ ]
21622396
21632397 def sendOpen(tid):
2164 m = SMBMessage(ComOpenAndxRequest(filename = path,
2398 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
21652399 access_mode = 0x0040, # Sharing mode: Deny nothing to others
21662400 open_mode = 0x0001, # Failed if file does not exist
21672401 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
21842418
21852419 def sendRead(tid, fid, offset, file_attributes, read_len, remaining_len):
21862420 read_count = self.max_raw_size - 2
2187 m = SMBMessage(ComReadAndxRequest(fid = fid,
2421 m = SMBMessage(self, ComReadAndxRequest(fid = fid,
21882422 offset = offset,
21892423 max_return_bytes_count = read_count,
21902424 min_return_bytes_count = min(0xFFFF, read_count)))
22232457 errback(OperationFailure('Failed to retrieve %s on %s: Read failed' % ( path, service_name ), messages_history))
22242458
22252459 def closeFid(tid, fid):
2226 m = SMBMessage(ComCloseRequest(fid))
2460 m = SMBMessage(self, ComCloseRequest(fid))
22272461 m.tid = tid
22282462 self._sendSMBMessage(m)
22292463 messages_history.append(m)
22372471 else:
22382472 errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
22392473
2240 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2474 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
22412475 self._sendSMBMessage(m)
22422476 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
22432477 messages_history.append(m)
22552489 messages_history = [ ]
22562490
22572491 def sendOpen(tid):
2258 m = SMBMessage(ComOpenAndxRequest(filename = path,
2492 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
22592493 access_mode = 0x0041, # Sharing mode: Deny nothing to others + Open for writing
22602494 open_mode = 0x0012 if truncate else 0x0011, # Create file if file does not exist. Overwrite or append depending on truncate parameter.
22612495 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
22782512 data_bytes = file_obj.read(write_count)
22792513 data_len = len(data_bytes)
22802514 if data_len > 0:
2281 m = SMBMessage(ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
2515 m = SMBMessage(self, ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
22822516 m.tid = tid
22832517 self._sendSMBMessage(m)
22842518 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
22962530 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
22972531
22982532 def closeFid(tid, fid):
2299 m = SMBMessage(ComCloseRequest(fid))
2533 m = SMBMessage(self, ComCloseRequest(fid))
23002534 m.tid = tid
23012535 self._sendSMBMessage(m)
23022536 messages_history.append(m)
23102544 else:
23112545 errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23122546
2313 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2547 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23142548 self._sendSMBMessage(m)
23152549 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23162550 messages_history.append(m)
23252559 messages_history = [ ]
23262560
23272561 def sendDelete(tid):
2328 m = SMBMessage(ComDeleteRequest(filename_pattern = path,
2562 m = SMBMessage(self, ComDeleteRequest(filename_pattern = path,
23292563 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
23302564 m.tid = tid
23312565 self._sendSMBMessage(m)
23482582 else:
23492583 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23502584
2351 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2585 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23522586 self._sendSMBMessage(m)
23532587 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23542588 messages_history.append(m)
23662600 messages_history = [ ]
23672601
23682602 def sendCreate(tid):
2369 m = SMBMessage(ComCreateDirectoryRequest(path))
2603 m = SMBMessage(self, ComCreateDirectoryRequest(path))
23702604 m.tid = tid
23712605 self._sendSMBMessage(m)
23722606 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
23882622 else:
23892623 errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
23902624
2391 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2625 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
23922626 self._sendSMBMessage(m)
23932627 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
23942628 messages_history.append(m)
24032637 messages_history = [ ]
24042638
24052639 def sendDelete(tid):
2406 m = SMBMessage(ComDeleteDirectoryRequest(path))
2640 m = SMBMessage(self, ComDeleteDirectoryRequest(path))
24072641 m.tid = tid
24082642 self._sendSMBMessage(m)
24092643 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback)
24252659 else:
24262660 errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
24272661
2428 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2662 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
24292663 self._sendSMBMessage(m)
24302664 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
24312665 messages_history.append(m)
24412675 messages_history = [ ]
24422676
24432677 def sendRename(tid):
2444 m = SMBMessage(ComRenameRequest(old_path = old_path,
2678 m = SMBMessage(self, ComRenameRequest(old_path = old_path,
24452679 new_path = new_path,
24462680 search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
24472681 m.tid = tid
24652699 else:
24662700 errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
24672701
2468 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2702 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
24692703 self._sendSMBMessage(m)
24702704 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
24712705 messages_history.append(m)
24842718 results = [ ]
24852719
24862720 def sendOpen(tid):
2487 m = SMBMessage(ComOpenAndxRequest(filename = path,
2721 m = SMBMessage(self, ComOpenAndxRequest(filename = path,
24882722 access_mode = 0x0040, # Sharing mode: Deny nothing to others
24892723 open_mode = 0x0001, # Failed if file does not exist
24902724 search_attributes = 0,
25092743 fid, # FID
25102744 0x01, # IsFctl
25112745 0) # IsFlags
2512 m = SMBMessage(ComNTTransactRequest(function = 0x0002, # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
2746 m = SMBMessage(self, ComNTTransactRequest(function = 0x0002, # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
25132747 max_params_count = 0,
25142748 max_data_count = 0xFFFF,
25152749 max_setup_count = 0,
25342768 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to list snapshots on path' % ( path, service_name ), messages_history))
25352769
25362770 def closeFid(tid, fid):
2537 m = SMBMessage(ComCloseRequest(fid))
2771 m = SMBMessage(self, ComCloseRequest(fid))
25382772 m.tid = tid
25392773 self._sendSMBMessage(m)
25402774 messages_history.append(m)
25482782 else:
25492783 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
25502784
2551 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
2785 m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
25522786 self._sendSMBMessage(m)
25532787 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
25542788 messages_history.append(m)
25572791
25582792 def _echo_SMB1(self, data, callback, errback, timeout = 30):
25592793 messages_history = [ ]
2794
2795 if not isinstance(data, type(b'')):
2796 raise TypeError('Echo data must be %s not %s' % (type(b'').__name__, type(data).__name__))
25602797
25612798 def echoCB(echo_message, **kwargs):
25622799 messages_history.append(echo_message)
25652802 else:
25662803 errback(OperationFailure('Echo failed', messages_history))
25672804
2568 m = SMBMessage(ComEchoRequest(echo_data = data))
2805 m = SMBMessage(self, ComEchoRequest(echo_data = data))
25692806 self._sendSMBMessage(m)
25702807 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
25712808 messages_history.append(m)
25722809
2810 def _extractLastPathComponent(self, path):
2811 return path.replace('\\', '/').split('/')[-1]
2812
25732813
25742814 class SharedDevice:
25752815 """
25762816 Contains information about a single shared device on the remote server.
2817
2818 The following attributes are available:
2819
2820 * name : An unicode string containing the name of the shared device
2821 * comments : An unicode string containing the user description of the shared device
25772822 """
25782823
25792824 # The following constants are taken from [MS-SRVS]: 2.2.2.4
26292874 If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
26302875 to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
26312876 one of these prohibited characters: "\/[]:+|<>=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).
2877
2878 The following attributes are available:
2879
2880 * create_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
2881 * last_access_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
2882 * last_write_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
2883 * last_attr_change_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
2884 * file_size : File size in number of bytes
2885 * alloc_size : Total number of bytes allocated to store this file
2886 * file_attributes : A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
2887 * short_name : Unicode string containing the short name of this file (usually in 8.3 notation)
2888 * filename : Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
2889 * file_id : Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
26322890 """
26332891
2634 def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename):
2892 def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename, file_id=None):
26352893 self.create_time = create_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
26362894 self.last_access_time = last_access_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
26372895 self.last_write_time = last_write_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
26382896 self.last_attr_change_time = last_attr_change_time #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
26392897 self.file_size = file_size #: File size in number of bytes
26402898 self.alloc_size = alloc_size #: Total number of bytes allocated to store this file
2641 self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3
2899 self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
26422900 self.short_name = short_name #: Unicode string containing the short name of this file (usually in 8.3 notation)
26432901 self.filename = filename #: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
2902 self.file_id = file_id #: Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
26442903
26452904 @property
26462905 def isDirectory(self):
26512910 def isReadOnly(self):
26522911 """A convenient property to return True if this file resource is read-only on the remote server"""
26532912 return bool(self.file_attributes & ATTR_READONLY)
2913
2914 @property
2915 def isNormal(self):
2916 """
2917 A convenient property to return True if this is a normal file.
2918
2919 Note that pysmb defines a normal file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
2920 It ignores other attributes like compression, indexed, sparse, temporary and encryption.
2921 """
2922 return (self.file_attributes==ATTR_NORMAL) or ((self.file_attributes & 0xff)==0)
26542923
26552924 def __unicode__(self):
26562925 return 'Shared file: %s (FileSize:%d bytes, isDirectory:%s)' % ( self.filename, self.file_size, self.isDirectory )
160160 d = MD4()
161161 d.update(password.encode('UTF-16LE'))
162162 ntlm_hash = d.digest() # The NT password hash
163 response_key = hmac.new(ntlm_hash, (user.upper() + domain).encode('UTF-16LE')).digest() # The NTLMv2 password hash. In [MS-NLMP], this is the result of NTOWFv2 and LMOWFv2 functions
163 response_key = hmac.new(ntlm_hash, (user.upper() + domain).encode('UTF-16LE'), 'md5').digest() # The NTLMv2 password hash. In [MS-NLMP], this is the result of NTOWFv2 and LMOWFv2 functions
164164 temp = b'\x01\x01' + b'\0'*6 + client_timestamp + client_challenge + b'\0'*4 + server_info
165 ntproofstr = hmac.new(response_key, server_challenge + temp).digest()
165 ntproofstr = hmac.new(response_key, server_challenge + temp, 'md5').digest()
166166
167167 nt_challenge_response = ntproofstr + temp
168 lm_challenge_response = hmac.new(response_key, server_challenge + client_challenge).digest() + client_challenge
169 session_key = hmac.new(response_key, ntproofstr).digest()
168 lm_challenge_response = hmac.new(response_key, server_challenge + client_challenge, 'md5').digest() + client_challenge
169 session_key = hmac.new(response_key, ntproofstr, 'md5').digest()
170170
171171 return nt_challenge_response, lm_challenge_response, session_key
172172
0 """
1 This module implements security descriptors, and the partial structures
2 used in them, as specified in [MS-DTYP].
3 """
4
5 import struct
6
7
8 # Security descriptor control flags
9 # [MS-DTYP]: 2.4.6
10 SECURITY_DESCRIPTOR_OWNER_DEFAULTED = 0x0001
11 SECURITY_DESCRIPTOR_GROUP_DEFAULTED = 0x0002
12 SECURITY_DESCRIPTOR_DACL_PRESENT = 0x0004
13 SECURITY_DESCRIPTOR_DACL_DEFAULTED = 0x0008
14 SECURITY_DESCRIPTOR_SACL_PRESENT = 0x0010
15 SECURITY_DESCRIPTOR_SACL_DEFAULTED = 0x0020
16 SECURITY_DESCRIPTOR_SERVER_SECURITY = 0x0040
17 SECURITY_DESCRIPTOR_DACL_TRUSTED = 0x0080
18 SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED = 0x0100
19 SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED = 0x0200
20 SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED = 0x0400
21 SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED = 0x0800
22 SECURITY_DESCRIPTOR_DACL_PROTECTED = 0x1000
23 SECURITY_DESCRIPTOR_SACL_PROTECTED = 0x2000
24 SECURITY_DESCRIPTOR_RM_CONTROL_VALID = 0x4000
25 SECURITY_DESCRIPTOR_SELF_RELATIVE = 0x8000
26
27 # ACE types
28 # [MS-DTYP]: 2.4.4.1
29 ACE_TYPE_ACCESS_ALLOWED = 0x00
30 ACE_TYPE_ACCESS_DENIED = 0x01
31 ACE_TYPE_SYSTEM_AUDIT = 0x02
32 ACE_TYPE_SYSTEM_ALARM = 0x03
33 ACE_TYPE_ACCESS_ALLOWED_COMPOUND = 0x04
34 ACE_TYPE_ACCESS_ALLOWED_OBJECT = 0x05
35 ACE_TYPE_ACCESS_DENIED_OBJECT = 0x06
36 ACE_TYPE_SYSTEM_AUDIT_OBJECT = 0x07
37 ACE_TYPE_SYSTEM_ALARM_OBJECT = 0x08
38 ACE_TYPE_ACCESS_ALLOWED_CALLBACK = 0x09
39 ACE_TYPE_ACCESS_DENIED_CALLBACK = 0x0A
40 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0x0B
41 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0x0C
42 ACE_TYPE_SYSTEM_AUDIT_CALLBACK = 0x0D
43 ACE_TYPE_SYSTEM_ALARM_CALLBACK = 0x0E
44 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0x0F
45 ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10
46 ACE_TYPE_SYSTEM_MANDATORY_LABEL = 0x11
47 ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE = 0x12
48 ACE_TYPE_SYSTEM_SCOPED_POLICY_ID = 0x13
49
50 # ACE flags
51 # [MS-DTYP]: 2.4.4.1
52 ACE_FLAG_OBJECT_INHERIT = 0x01
53 ACE_FLAG_CONTAINER_INHERIT = 0x02
54 ACE_FLAG_NO_PROPAGATE_INHERIT = 0x04
55 ACE_FLAG_INHERIT_ONLY = 0x08
56 ACE_FLAG_INHERITED = 0x10
57 ACE_FLAG_SUCCESSFUL_ACCESS = 0x40
58 ACE_FLAG_FAILED_ACCESS = 0x80
59
60 # Pre-defined well-known SIDs
61 # [MS-DTYP]: 2.4.2.4
62 SID_NULL = "S-1-0-0"
63 SID_EVERYONE = "S-1-1-0"
64 SID_LOCAL = "S-1-2-0"
65 SID_CONSOLE_LOGON = "S-1-2-1"
66 SID_CREATOR_OWNER = "S-1-3-0"
67 SID_CREATOR_GROUP = "S-1-3-1"
68 SID_OWNER_SERVER = "S-1-3-2"
69 SID_GROUP_SERVER = "S-1-3-3"
70 SID_OWNER_RIGHTS = "S-1-3-4"
71 SID_NT_AUTHORITY = "S-1-5"
72 SID_DIALUP = "S-1-5-1"
73 SID_NETWORK = "S-1-5-2"
74 SID_BATCH = "S-1-5-3"
75 SID_INTERACTIVE = "S-1-5-4"
76 SID_SERVICE = "S-1-5-6"
77 SID_ANONYMOUS = "S-1-5-7"
78 SID_PROXY = "S-1-5-8"
79 SID_ENTERPRISE_DOMAIN_CONTROLLERS = "S-1-5-9"
80 SID_PRINCIPAL_SELF = "S-1-5-10"
81 SID_AUTHENTICATED_USERS = "S-1-5-11"
82 SID_RESTRICTED_CODE = "S-1-5-12"
83 SID_TERMINAL_SERVER_USER = "S-1-5-13"
84 SID_REMOTE_INTERACTIVE_LOGON = "S-1-5-14"
85 SID_THIS_ORGANIZATION = "S-1-5-15"
86 SID_IUSR = "S-1-5-17"
87 SID_LOCAL_SYSTEM = "S-1-5-18"
88 SID_LOCAL_SERVICE = "S-1-5-19"
89 SID_NETWORK_SERVICE = "S-1-5-20"
90 SID_COMPOUNDED_AUTHENTICATION = "S-1-5-21-0-0-0-496"
91 SID_CLAIMS_VALID = "S-1-5-21-0-0-0-497"
92 SID_BUILTIN_ADMINISTRATORS = "S-1-5-32-544"
93 SID_BUILTIN_USERS = "S-1-5-32-545"
94 SID_BUILTIN_GUESTS = "S-1-5-32-546"
95 SID_POWER_USERS = "S-1-5-32-547"
96 SID_ACCOUNT_OPERATORS = "S-1-5-32-548"
97 SID_SERVER_OPERATORS = "S-1-5-32-549"
98 SID_PRINTER_OPERATORS = "S-1-5-32-550"
99 SID_BACKUP_OPERATORS = "S-1-5-32-551"
100 SID_REPLICATOR = "S-1-5-32-552"
101 SID_ALIAS_PREW2KCOMPACC = "S-1-5-32-554"
102 SID_REMOTE_DESKTOP = "S-1-5-32-555"
103 SID_NETWORK_CONFIGURATION_OPS = "S-1-5-32-556"
104 SID_INCOMING_FOREST_TRUST_BUILDERS = "S-1-5-32-557"
105 SID_PERFMON_USERS = "S-1-5-32-558"
106 SID_PERFLOG_USERS = "S-1-5-32-559"
107 SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP = "S-1-5-32-560"
108 SID_TERMINAL_SERVER_LICENSE_SERVERS = "S-1-5-32-561"
109 SID_DISTRIBUTED_COM_USERS = "S-1-5-32-562"
110 SID_IIS_IUSRS = "S-1-5-32-568"
111 SID_CRYPTOGRAPHIC_OPERATORS = "S-1-5-32-569"
112 SID_EVENT_LOG_READERS = "S-1-5-32-573"
113 SID_CERTIFICATE_SERVICE_DCOM_ACCESS = "S-1-5-32-574"
114 SID_RDS_REMOTE_ACCESS_SERVERS = "S-1-5-32-575"
115 SID_RDS_ENDPOINT_SERVERS = "S-1-5-32-576"
116 SID_RDS_MANAGEMENT_SERVERS = "S-1-5-32-577"
117 SID_HYPER_V_ADMINS = "S-1-5-32-578"
118 SID_ACCESS_CONTROL_ASSISTANCE_OPS = "S-1-5-32-579"
119 SID_REMOTE_MANAGEMENT_USERS = "S-1-5-32-580"
120 SID_WRITE_RESTRICTED_CODE = "S-1-5-33"
121 SID_NTLM_AUTHENTICATION = "S-1-5-64-10"
122 SID_SCHANNEL_AUTHENTICATION = "S-1-5-64-14"
123 SID_DIGEST_AUTHENTICATION = "S-1-5-64-21"
124 SID_THIS_ORGANIZATION_CERTIFICATE = "S-1-5-65-1"
125 SID_NT_SERVICE = "S-1-5-80"
126 SID_USER_MODE_DRIVERS = "S-1-5-84-0-0-0-0-0"
127 SID_LOCAL_ACCOUNT = "S-1-5-113"
128 SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP = "S-1-5-114"
129 SID_OTHER_ORGANIZATION = "S-1-5-1000"
130 SID_ALL_APP_PACKAGES = "S-1-15-2-1"
131 SID_ML_UNTRUSTED = "S-1-16-0"
132 SID_ML_LOW = "S-1-16-4096"
133 SID_ML_MEDIUM = "S-1-16-8192"
134 SID_ML_MEDIUM_PLUS = "S-1-16-8448"
135 SID_ML_HIGH = "S-1-16-12288"
136 SID_ML_SYSTEM = "S-1-16-16384"
137 SID_ML_PROTECTED_PROCESS = "S-1-16-20480"
138 SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY = "S-1-18-1"
139 SID_SERVICE_ASSERTED_IDENTITY = "S-1-18-2"
140 SID_FRESH_PUBLIC_KEY_IDENTITY = "S-1-18-3"
141 SID_KEY_TRUST_IDENTITY = "S-1-18-4"
142 SID_KEY_PROPERTY_MFA = "S-1-18-5"
143 SID_KEY_PROPERTY_ATTESTATION = "S-1-18-6"
144
145
146 class SID(object):
147 """
148 A Windows security identifier. Represents a single principal, such a
149 user or a group, as a sequence of numbers consisting of the revision,
150 identifier authority, and a variable-length list of subauthorities.
151
152 See [MS-DTYP]: 2.4.2
153 """
154 def __init__(self, revision, identifier_authority, subauthorities):
155 #: Revision, should always be 1.
156 self.revision = revision
157 #: An integer representing the identifier authority.
158 self.identifier_authority = identifier_authority
159 #: A list of integers representing all subauthorities.
160 self.subauthorities = subauthorities
161
162 def __str__(self):
163 """
164 String representation, as specified in [MS-DTYP]: 2.4.2.1
165 """
166 if self.identifier_authority >= 2**32:
167 id_auth = '%#x' % (self.identifier_authority,)
168 else:
169 id_auth = self.identifier_authority
170 auths = [self.revision, id_auth] + self.subauthorities
171 return 'S-' + '-'.join(str(subauth) for subauth in auths)
172
173 def __repr__(self):
174 return 'SID(%r)' % (str(self),)
175
176 @classmethod
177 def from_bytes(cls, data, return_tail=False):
178 revision, subauth_count = struct.unpack('<BB', data[:2])
179 identifier_authority = struct.unpack('>Q', b'\x00\x00' + data[2:8])[0]
180 subauth_data = data[8:]
181 subauthorities = [struct.unpack('<L', subauth_data[4 * i : 4 * (i+1)])[0]
182 for i in range(subauth_count)]
183 sid = cls(revision, identifier_authority, subauthorities)
184 if return_tail:
185 return sid, subauth_data[4 * subauth_count :]
186 return sid
187
188
189 class ACE(object):
190 """
191 Represents a single access control entry.
192
193 See [MS-DTYP]: 2.4.4
194 """
195 HEADER_FORMAT = '<BBH'
196
197 def __init__(self, type_, flags, mask, sid, additional_data):
198 #: An integer representing the type of the ACE. One of the
199 #: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field
200 #: from [MS-DTYP] 2.4.4.1.
201 self.type = type_
202 #: An integer bitmask with ACE flags, corresponds to the
203 #: ``AceFlags`` field.
204 self.flags = flags
205 #: An integer representing the ``ACCESS_MASK`` as specified in
206 #: [MS-DTYP] 2.4.3.
207 self.mask = mask
208 #: The :class:`SID` of a trustee.
209 self.sid = sid
210 #: A dictionary of additional fields present in the ACE, depending
211 #: on the type. The following fields can be present:
212 #:
213 #: * ``flags``
214 #: * ``object_type``
215 #: * ``inherited_object_type``
216 #: * ``application_data``
217 #: * ``attribute_data``
218 self.additional_data = additional_data
219
220 def __repr__(self):
221 return "ACE(type=%#04x, flags=%#04x, mask=%#010x, sid=%s)" % (
222 self.type, self.flags, self.mask, self.sid,
223 )
224
225 @property
226 def isInheritOnly(self):
227 """Convenience property which indicates if this ACE is inherit
228 only, meaning that it doesn't apply to the object itself."""
229 return bool(self.flags & ACE_FLAG_INHERIT_ONLY)
230
231 @classmethod
232 def from_bytes(cls, data):
233 header_size = struct.calcsize(cls.HEADER_FORMAT)
234 header = data[:header_size]
235 type_, flags, size = struct.unpack(cls.HEADER_FORMAT, header)
236
237 assert len(data) >= size
238
239 body = data[header_size:size]
240 additional_data = {}
241
242 # In all ACE types, the mask immediately follows the header.
243 mask = struct.unpack('<I', body[:4])[0]
244 body = body[4:]
245
246 # All OBJECT-type ACEs contain additional flags, and two GUIDs as
247 # the following fields.
248 if type_ in (ACE_TYPE_ACCESS_ALLOWED_OBJECT,
249 ACE_TYPE_ACCESS_DENIED_OBJECT,
250 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
251 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
252 ACE_TYPE_SYSTEM_AUDIT_OBJECT,
253 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
254 additional_data['flags'] = struct.unpack('<I', body[:4])[0]
255 additional_data['object_type'] = body[4:20]
256 additional_data['inherited_object_type'] = body[20:36]
257 body = body[36:]
258
259 # Then the SID in all types.
260 sid, body = SID.from_bytes(body, return_tail=True)
261
262 # CALLBACK-type ACEs (and for some obscure reason,
263 # SYSTEM_AUDIT_OBJECT) have a final tail of application data.
264 if type_ in (ACE_TYPE_ACCESS_ALLOWED_CALLBACK,
265 ACE_TYPE_ACCESS_DENIED_CALLBACK,
266 ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
267 ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
268 ACE_TYPE_SYSTEM_AUDIT_OBJECT,
269 ACE_TYPE_SYSTEM_AUDIT_CALLBACK,
270 ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
271 additional_data['application_data'] = body
272
273 # SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.
274 if type_ == ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE:
275 additional_data['attribute_data'] = body
276
277 return cls(type_, flags, mask, sid, additional_data)
278
279
280 class ACL(object):
281 """
282 Access control list, encapsulating a sequence of access control
283 entries.
284
285 See [MS-DTYP]: 2.4.5
286 """
287 HEADER_FORMAT = '<BBHHH'
288
289 def __init__(self, revision, aces):
290 #: Integer value of the revision.
291 self.revision = revision
292 #: List of :class:`ACE` instances.
293 self.aces = aces
294
295 def __repr__(self):
296 return "ACL(%r)" % (self.aces,)
297
298 @classmethod
299 def from_bytes(cls, data):
300 revision = None
301 aces = []
302
303 header_size = struct.calcsize(cls.HEADER_FORMAT)
304 header, remaining = data[:header_size], data[header_size:]
305 revision, sbz1, size, count, sbz2 = struct.unpack(cls.HEADER_FORMAT, header)
306
307 assert len(data) >= size
308
309 for i in range(count):
310 ace_size = struct.unpack('<H', remaining[2:4])[0]
311 ace_data, remaining = remaining[:ace_size], remaining[ace_size:]
312 aces.append(ACE.from_bytes(ace_data))
313
314 return cls(revision, aces)
315
316
317 class SecurityDescriptor(object):
318 """
319 Represents a security descriptor.
320
321 See [MS-DTYP]: 2.4.6
322 """
323
324 HEADER_FORMAT = '<BBHIIII'
325
326 def __init__(self, flags, owner, group, dacl, sacl):
327 #: Integer bitmask of control flags. Corresponds to the
328 #: ``Control`` field in [MS-DTYP] 2.4.6.
329 self.flags = flags
330 #: Instance of :class:`SID` representing the owner user.
331 self.owner = owner
332 #: Instance of :class:`SID` representing the owner group.
333 self.group = group
334 #: Instance of :class:`ACL` representing the discretionary access
335 #: control list, which specifies access restrictions of an object.
336 self.dacl = dacl
337 #: Instance of :class:`ACL` representing the system access control
338 #: list, which specifies audit logging of an object.
339 self.sacl = sacl
340
341 @classmethod
342 def from_bytes(cls, data):
343 owner = None
344 group = None
345 dacl = None
346 sacl = None
347
348 header = data[:struct.calcsize(cls.HEADER_FORMAT)]
349 (revision, sbz1, flags, owner_offset, group_offset, sacl_offset,
350 dacl_offset) = struct.unpack(cls.HEADER_FORMAT, header)
351
352 assert revision == 1
353 assert flags & SECURITY_DESCRIPTOR_SELF_RELATIVE
354 for offset in (owner_offset, group_offset, sacl_offset, dacl_offset):
355 assert 0 <= offset < len(data)
356
357 if owner_offset:
358 owner = SID.from_bytes(data[owner_offset:])
359 if group_offset:
360 group = SID.from_bytes(data[group_offset:])
361 if dacl_offset:
362 dacl = ACL.from_bytes(data[dacl_offset:])
363 if sacl_offset:
364 sacl = ACL.from_bytes(data[sacl_offset:])
365
366 return cls(flags, owner, group, dacl, sacl)
4949 }
5050
5151 # Values for dialect_revision field in SMB2NegotiateResponse class
52 SMB2_DIALECT_2 = 0x0202
53 SMB2_DIALECT_21 = 0x0210
54 SMB2_DIALECT_2ALL = 0x02FF
52 SMB2_DIALECT_2 = 0x0202 # 2.0.2 - First SMB2 version
53 SMB2_DIALECT_21 = 0x0210 # 2.1 - Windows 7
54 SMB2_DIALET_30 = 0x0300 # 3.0 - Windows 8
55 SMB2_DIALECT_302 = 0x0302 # 3.0.2 - Windows 8.1
56 SMB2_DIALECT_311 = 0x0311 # 3.1.1 - Windows 10
57 SMB2_DIALECT_2ALL = 0x02FF # Wildcard (for negotiation only)
5558
5659 # Bit mask for SecurityMode field in SMB2NegotiateResponse class
5760 SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001
6467
6568 # Bitmask for Capabilities in SMB2TreeConnectResponse class
6669 SMB2_SHARE_CAP_DFS = 0x0008
70
71
72 # SMB 2.1 / 3 Capabilities flags
73 SMB2_GLOBAL_CAP_DFS = 0x01
74 SMB2_GLOBAL_CAP_LEASING = 0x02
75 SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
76 SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
77 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
78 SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
79 SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
80
6781
6882 # Values for OpLockLevel field in SMB2CreateRequest class
6983 SMB2_OPLOCK_LEVEL_NONE = 0x00
00
1 import os, sys, struct, types, logging, binascii, time
1 import os, sys, struct, types, logging, binascii, time, uuid
22 from io import StringIO
33 from .smb_structs import ProtocolError
44 from .smb_constants import *
2222 log = logging.getLogger('SMB.SMB2Message')
2323 protocol = 2
2424
25 def __init__(self, payload = None):
25 def __init__(self, conn = None, payload = None):
26 """
27 Initialise a new SMB2 Message.
28 conn - reference to the connection, the SMB class
29 payload - the message payload, if any
30 """
2631 self.reset()
32 self.conn = conn
2733 if payload:
2834 self.payload = payload
2935 self.payload.initMessage(self)
5965 self.pid = 0
6066 self.tid = 0
6167
68 # credit related
69 self.credit_charge = 0
70 self.credit_request = 1
71
6272 # Not used in this class. Maintained for compatibility with SMBMessage class
6373 self.flags2 = 0
6474 self.uid = 0
6878 def encode(self):
6979 """
7080 Encode this SMB2 message into a series of bytes suitable to be embedded with a NetBIOS session message.
81 AssertionError will be raised if this SMB message has not been initialized with an SMB instance
7182 AssertionError will be raised if this SMB message has not been initialized with a Payload instance
83
84 The header format is:
85 - Protocol ID
86 - Structure Size
87 - Credit Charge
88 - Status / Channel Sequence
89 - Command
90 - Credit Request / Credit Response
91 - Flags
92 - Next Compound
93 - MessageId
94 - Reserved
95 - TreeId
96 - Session ID
97 - Signature
7298
7399 @return: a string containing the encoded SMB2 message
74100 """
77103 self.pid = os.getpid()
78104 self.payload.prepare(self)
79105
106 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
107 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
108 # This only applies to SMB2ReadRequest, SMB2WriteRequest, SMB2IoctlRequest and SMB2QueryDirectory
109 # See: MS-SMB2 3.2.4.1.5: For all other requests, the client MUST set CreditCharge to 1, even if the
110 # payload size of a request or the anticipated response is greater than 65536.
111 if self.conn.smb2_dialect != SMB2_DIALECT_2:
112 if self.conn.cap_multi_credit:
113 # self.credit_charge will be set by some commands if necessary (Read/Write/Ioctl/QueryDirectory)
114 # If not set, but dialect is SMB 2.1 or above, we must set it to 1
115 if self.credit_charge is 0:
116 self.credit_charge = 1
117 else:
118 # If >= SMB 2.1, but server does not support multi credit operations we must set to 1
119 self.credit_charge = 1
120
121 if self.mid > 3:
122 self.credit_request = 127
123
80124 headers_data = struct.pack(self.HEADER_STRUCT_FORMAT,
81 b'\xFESMB', self.HEADER_SIZE, 0, self.status, self.command, 0, self.flags) + \
82 struct.pack(self.SYNC_HEADER_STRUCT_FORMAT, self.next_command_offset, self.mid, self.pid, self.tid, self.session_id, self.signature)
125 b'\xFESMB', # Protocol ID
126 self.HEADER_SIZE, # Structure Size
127 self.credit_charge, # Credit Charge
128 self.status, # Status / Channel Sequence
129 self.command, # Command
130 self.credit_request, # Credit Request / Credit Response
131 self.flags, # Flags
132 ) + \
133 struct.pack(self.SYNC_HEADER_STRUCT_FORMAT,
134 self.next_command_offset, # Next Compound
135 self.mid, # Message ID
136 self.pid, # Process ID
137 self.tid, # Tree ID
138 self.session_id, # Session ID
139 self.signature) # Signature
83140 return headers_data + self.data
84141
85142 def decode(self, buf):
104161
105162 self.reset()
106163
164 protocol, struct_size, self.credit_charge, self.status, \
165 self.command, self.credit_response, \
166 self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
107167 protocol, struct_size, self.credit_charge, self.status, \
108168 self.command, self.credit_re, self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
109169
188248 raise NotImplementedError
189249
190250
251 class SMB2NegotiateRequest(Structure):
252 """
253 2.2.3 SMB2 NEGOTIATE Request
254 The SMB2 NEGOTIATE Request packet is used by the client to notify the server what dialects of the SMB 2 Protocol
255 the client understands. This request is composed of an SMB2 header, as specified in section 2.2.1,
256 followed by this request structure:
257
258 SMB2 Negotiate Request Packet structure:
259 StructureSize (2 bytes)
260 DialectCount (2 bytes)
261 SecurityMode (2 bytes)
262 Reserved (2 bytes)
263 Capabilities (4 bytes)
264 ClientGuid (16 bytes)
265 ClientStartTime (8 bytes):
266 ClientStartTime (8 bytes):
267 Dialects (variable): An array of one or more 16-bit integers
268
269 References:
270 ===========
271 - [MS-SMB2]: 2.2.3
272
273 """
274
275
276 STRUCTURE_FORMAT = "<HHHHI16sQHH"
277 STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
278
279 def initMessage(self, message):
280 Structure.initMessage(self, message)
281 message.command = SMB2_COM_NEGOTIATE
282
283 def prepare(self, message):
284 # TODO! Do we need to save the GUID and present it later in other requests?
285 # The SMB docs don't exactly explain what the guid is for
286 message.data = struct.pack(self.STRUCTURE_FORMAT,
287 36, # Structure size. Must be 36 as mandated by [MS-SMB2] 2.2.3
288 2, # DialectCount
289 0x01, # Security mode
290 0, # Reserved
291 0x00, # Capabilities
292 uuid.uuid4().bytes, # Client GUID
293 0, # Client start time
294 SMB2_DIALECT_2,
295 SMB2_DIALECT_21)
296
297
191298 class SMB2NegotiateResponse(Structure):
192299 """
193300 Contains information on the SMB2_NEGOTIATE response from server
222329 self.server_start_time = convertFILETIMEtoEpoch(self.server_start_time)
223330 self.system_time = convertFILETIMEtoEpoch(self.system_time)
224331 self.security_blob = message.raw_data[security_buf_offset:security_buf_offset+security_buf_len]
332 message.conn.smb2_dialect = self.dialect_revision
225333
226334
227335 class SMB2SessionSetupRequest(Structure):
268376
269377 STRUCTURE_FORMAT = "<HHHH"
270378 STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
379
380 @property
381 def isGuestSession(self):
382 return (self.session_flags & 0x0001) > 0 # SMB2_SESSION_FLAG_IS_GUEST
383
384 @property
385 def isAnonymousSession(self):
386 return (self.session_flags & 0x0002) > 0 # SMB2_SESSION_FLAG_IS_NULL
271387
272388 def decode(self, message):
273389 assert message.command == SMB2_COM_SESSION_SETUP
464580 0, # WriteChannelInfoLength
465581 self.flags) + self.data
466582
583 # MS-SMB2 3.2.4.7
584 # If a client requests writing to a file, Connection.Dialect is not "2.0.2", and if
585 # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
586 # to ( 1 + (Length - 1) / 65536 )
587 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
588 message.credit_charge = int(1 + (len(self.data) -1) / 65536)
589
467590
468591 class SMB2WriteResponse(Structure):
469592 """
521644 0, # ReadChannelInfoOffset
522645 0 # ReadChannelInfoLength
523646 ) + b'\0'
647
648 # MS-SMB2 3.2.4.6
649 # If a client requests reading from a file, Connection.Dialect is not "2.0.2", and if
650 # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
651 # to ( 1 + (Length - 1) / 65536 )
652 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
653 message.credit_charge = int(1 + (self.read_len -1) / 65536)
524654
525655
526656 class SMB2ReadResponse(Structure):
578708 0 # Reserved
579709 ) + self.in_data
580710
711 # If Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header
712 # SHOULD be set to (max(InputCount, MaxOutputResponse) - 1) / 65536 + 1
713 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
714 message.credit_charge = int((max(len(self.in_data), self.max_out_size) - 1) / 65536 + 1)
715
581716
582717 class SMB2IoctlResponse(Structure):
583718 """
685820 SMB2Message.HEADER_SIZE + self.STRUCTURE_SIZE, # FileNameOffset
686821 len(self.filename)*2,
687822 self.output_buf_len) + self.filename.encode('UTF-16LE')
823
824 # MS-SMB2 3.2.4.17
825 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
826 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
827 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
828 message.credit_charge = int(1 + (self.output_buf_len -1) / 65536)
688829
689830
690831 class SMB2QueryDirectoryResponse(Structure):
748889 self.fid # FileId
749890 ) + self.input_buf
750891
892 # MS-SMB2 3.2.4.17
893 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
894 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
895 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
896 message.credit_charge = int(1 + ((self.output_buf_len + len(self.input_buf)) -1) / 65536)
897
751898
752899 class SMB2QueryInfoResponse(Structure):
753900 """
806953 self.fid # FileId
807954 ) + self.data
808955
956 # MS-SMB2 3.2.4.17
957 # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
958 # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
959 if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
960 message.credit_charge = int(1 + (len(self.data) -1) / 65536)
961
962
809963 class SMB2SetInfoResponse(Structure):
810964 """
811965 References:
114114 FILE_READ_EA = 0x08
115115 FILE_WRITE_EA = 0x10
116116 FILE_EXECUTE = 0x20
117 FILE_DELETE_CHILD = 0x40
117118 FILE_READ_ATTRIBUTES = 0x80
118119 FILE_WRITE_ATTRIBUTES = 0x0100
119120 DELETE = 0x010000
224225 SMB_FILE_ATTRIBUTE_READONLY = 0x01
225226 SMB_FILE_ATTRIBUTE_HIDDEN = 0x02
226227 SMB_FILE_ATTRIBUTE_SYSTEM = 0x04
227 SMB_FILE_ATTRIBUTE_VOLUME = 0x08
228 SMB_FILE_ATTRIBUTE_VOLUME = 0x08 # Unsupported for listPath() operations
228229 SMB_FILE_ATTRIBUTE_DIRECTORY = 0x10
229230 SMB_FILE_ATTRIBUTE_ARCHIVE = 0x20
231 # SMB_FILE_ATTRIBUTE_INCL_NORMAL is a special placeholder to include normal files
232 # with other search attributes for listPath() operations. It is not defined in the MS-CIFS specs.
233 SMB_FILE_ATTRIBUTE_INCL_NORMAL = 0x10000
234 # Do not use the following values for listPath() operations as they are not supported for SMB2
230235 SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
231236 SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
232237 SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
236241 # Bitmask for OptionalSupport field in SMB_COM_TREE_CONNECT_ANDX response
237242 SMB_TREE_CONNECTX_SUPPORT_SEARCH = 0x0001
238243 SMB_TREE_CONNECTX_SUPPORT_DFS = 0x0002
244
245 # Bitmask for security information fields, specified as
246 # AdditionalInformation in SMB2
247 # [MS-SMB]: 2.2.7.4
248 # [MS-SMB2]: 2.2.37
249 OWNER_SECURITY_INFORMATION = 0x00000001
250 GROUP_SECURITY_INFORMATION = 0x00000002
251 DACL_SECURITY_INFORMATION = 0x00000004
252 SACL_SECURITY_INFORMATION = 0x00000008
253 LABEL_SECURITY_INFORMATION = 0x00000010
254 ATTRIBUTE_SECURITY_INFORMATION = 0x00000020
255 SCOPE_SECURITY_INFORMATION = 0x00000040
256 BACKUP_SECURITY_INFORMATION = 0x00010000
99 # Set to True if you want to enable SMB2 protocol.
1010 SUPPORT_SMB2 = True
1111
12 # Set to True if you want to enable SMB2.1 and above protocol.
13 SUPPORT_SMB2x = True
14
1215 # Supported dialects
13 DIALECTS = [ ]
14 for i, ( name, dialect ) in enumerate([ ( 'NT_LAN_MANAGER_DIALECT', b'NT LM 0.12' ), ]):
15 DIALECTS.append(dialect)
16 globals()[name] = i
17
18 DIALECTS2 = [ ]
19 for i, ( name, dialect ) in enumerate([ ( 'SMB2_DIALECT', b'SMB 2.002' ) ]):
20 DIALECTS2.append(dialect)
21 globals()[name] = i + len(DIALECTS)
16 NT_LAN_MANAGER_DIALECT = 0 # 'NT LM 0.12' is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)
17
18 # Return the list of support SMB dialects based on the SUPPORT_x constants
19 def init_dialects_list():
20 dialects = [ b'NT LM 0.12' ]
21 if SUPPORT_SMB2:
22 dialects.append(b'SMB 2.002')
23 if SUPPORT_SMB2x:
24 dialects.append(b'SMB 2.???')
25 return dialects
2226
2327
2428 class UnsupportedFeature(Exception):
106110 log = logging.getLogger('SMB.SMBMessage')
107111 protocol = 1
108112
109 def __init__(self, payload = None):
113 def __init__(self, conn, payload = None):
110114 self.reset()
115 self.conn = conn
111116 if payload:
112117 self.payload = payload
113118 self.payload.initMessage(self)
141146 self.parameters_data = b''
142147 self.data = b''
143148 self.payload = None
149
150 @property
151 def isAsync(self):
152 return bool(self.flags & SMB2_FLAGS_ASYNC_COMMAND)
144153
145154 @property
146155 def isReply(self):
288297 def prepare(self, message):
289298 assert message.payload == self
290299 message.parameters_data = b''
291 if SUPPORT_SMB2:
292 message.data = b''.join([b'\x02'+s+b'\x00' for s in DIALECTS + DIALECTS2])
293 else:
294 message.data = b''.join([b'\x02'+s+b'\x00' for s in DIALECTS])
300 message.data = b''.join(map(lambda s: b'\x02'+s+b'\x00', init_dialects_list()))
295301
296302
297303 class ComNegotiateResponse(Payload):
12781284 - [MS-CIFS]: 2.2.4.39.1
12791285 """
12801286
1281 def __init__(self, echo_data = '', echo_count = 1):
1287 def __init__(self, echo_data = b'', echo_count = 1):
12821288 self.echo_count = echo_count
12831289 self.echo_data = echo_data
12841290
8181 dest.C = self.C
8282 dest.D = self.D
8383 dest.count = self.count
84 for i in range(self.count):
84 for i in range(int(self.count)):
8585 dest.buf[i] = self.buf[i]
8686
8787 return dest
8888
8989 #-----------------------------------------------------
9090 def update(self, str):
91
92 buf = []
93 for i in str: buf.append(ord(i))
91 if isinstance(str, bytes):
92 buf = list(str)
93 else:
94 buf = [ord(i) for i in str]
95
9496 ilen = U32(len(buf))
9597
9698 # check if the first length is out of range
226228 res[14]=(temp.D >> 16) & U32(0xFF)
227229 res[15]=(temp.D >> 24) & U32(0xFF)
228230
229 return int_array2str(res)
231 return int_array2str(res).encode('UTF-16LE')
230232
231233 #====================================================================
232234 # helpers
33 from nose.tools import with_setup
44 from smb import smb_structs
55
6 conn = None
6 conn, conn2, conn3 = None, None, None
77
88 def teardown_func():
9 global conn
10 conn.close()
9 global conn, conn2, conn3
10 if conn:
11 conn.close()
12 if conn2:
13 conn2.close()
14 if conn3:
15 conn3.close();
1116
1217 @with_setup(teardown = teardown_func)
1318 def test_NTLMv1_auth_SMB1():
1419 global conn
15 smb_structs.SUPPORT_SMB2 = False
20 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1621 info = getConnectionInfo()
17 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False, is_direct_tcp = True)
1823 assert conn.connect(info['server_ip'], info['server_port'])
24
25 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
26 assert not conn2.connect(info['server_ip'], info['server_port'])
27
28 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
29 assert not conn3.connect(info['server_ip'], info['server_port'])
1930
2031 @with_setup(teardown = teardown_func)
2132 def test_NTLMv2_auth_SMB1():
2233 global conn
23 smb_structs.SUPPORT_SMB2 = False
34 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2435 info = getConnectionInfo()
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
36 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
2637 assert conn.connect(info['server_ip'], info['server_port'])
38
39 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 assert not conn2.connect(info['server_ip'], info['server_port'])
41
42 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert not conn3.connect(info['server_ip'], info['server_port'])
2744
2845 @with_setup(teardown = teardown_func)
2946 def test_NTLMv1_auth_SMB2():
3047 global conn
31 smb_structs.SUPPORT_SMB2 = True
48 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
3249 info = getConnectionInfo()
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
50 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
3451 assert conn.connect(info['server_ip'], info['server_port'])
52
53 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
54 assert not conn2.connect(info['server_ip'], info['server_port'])
55
56 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
57 assert not conn3.connect(info['server_ip'], info['server_port'])
3558
3659 @with_setup(teardown = teardown_func)
3760 def test_NTLMv2_auth_SMB2():
3861 global conn
39 smb_structs.SUPPORT_SMB2 = True
62 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
4063 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
64 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
4265 assert conn.connect(info['server_ip'], info['server_port'])
66
67 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
68 assert not conn2.connect(info['server_ip'], info['server_port'])
69
70 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
71 assert not conn3.connect(info['server_ip'], info['server_port'])
11
22 import os, time, random
33 from smb.SMBConnection import SMBConnection
4 from smb.smb2_constants import SMB2_DIALECT_2
45 from .util import getConnectionInfo
56 from nose.tools import with_setup
67 from smb import smb_structs
910
1011 def setup_func_SMB1():
1112 global conn
12 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1314
1415 info = getConnectionInfo()
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
16 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1718
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123
2224 info = getConnectionInfo()
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
26 assert conn.connect(info['server_ip'], info['server_port'])
27
28 def setup_func_SMB2x():
29 global conn
30 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
31
32 info = getConnectionInfo()
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2434 assert conn.connect(info['server_ip'], info['server_port'])
2535
2636 def teardown_func():
3545 conn.createDirectory('smbtest', path)
3646
3747 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
38 names = [e.filename for e in entries]
48 names = map(lambda e: e.filename, entries)
3949 assert os.path.basename(path.replace('/', os.sep)) in names
4050
4151 conn.deleteDirectory('smbtest', path)
4252
4353 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
44 names = [e.filename for e in entries]
54 names = map(lambda e: e.filename, entries)
4555 assert os.path.basename(path.replace('/', os.sep)) not in names
4656
4757 @with_setup(setup_func_SMB2, teardown_func)
4858 def test_english_directory_SMB2():
4959 global conn
60 assert conn.smb2_dialect == SMB2_DIALECT_2
5061
5162 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
5263 conn.createDirectory('smbtest', path)
5364
5465 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
55 names = [e.filename for e in entries]
66 names = map(lambda e: e.filename, entries)
5667 assert os.path.basename(path.replace('/', os.sep)) in names
5768
5869 conn.deleteDirectory('smbtest', path)
5970
6071 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
61 names = [e.filename for e in entries]
72 names = map(lambda e: e.filename, entries)
73 assert os.path.basename(path.replace('/', os.sep)) not in names
74
75 @with_setup(setup_func_SMB2x, teardown_func)
76 def test_english_directory_SMB2x():
77 global conn
78 assert conn.smb2_dialect != SMB2_DIALECT_2
79
80 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
81 conn.createDirectory('smbtest', path)
82
83 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
84 names = map(lambda e: e.filename, entries)
85 assert os.path.basename(path.replace('/', os.sep)) in names
86
87 conn.deleteDirectory('smbtest', path)
88
89 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
90 names = map(lambda e: e.filename, entries)
6291 assert os.path.basename(path.replace('/', os.sep)) not in names
6392
6493 @with_setup(setup_func_SMB1, teardown_func)
6594 def test_unicode_directory_SMB1():
6695 global conn
6796
68 path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
97 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
6998 conn.createDirectory('smbtest', path)
7099
71100 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
72 names = [e.filename for e in entries]
101 names = map(lambda e: e.filename, entries)
73102 assert os.path.basename(path.replace('/', os.sep)) in names
74103
75104 conn.deleteDirectory('smbtest', path)
76105
77106 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
78 names = [e.filename for e in entries]
107 names = map(lambda e: e.filename, entries)
79108 assert os.path.basename(path.replace('/', os.sep)) not in names
80109
81110 @with_setup(setup_func_SMB2, teardown_func)
82111 def test_unicode_directory_SMB2():
83112 global conn
113 assert conn.smb2_dialect == SMB2_DIALECT_2
84114
85 path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
115 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86116 conn.createDirectory('smbtest', path)
87117
88118 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
89 names = [e.filename for e in entries]
119 names = map(lambda e: e.filename, entries)
90120 assert os.path.basename(path.replace('/', os.sep)) in names
91121
92122 conn.deleteDirectory('smbtest', path)
93123
94124 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
95 names = [e.filename for e in entries]
125 names = map(lambda e: e.filename, entries)
96126 assert os.path.basename(path.replace('/', os.sep)) not in names
127
128 @with_setup(setup_func_SMB2x, teardown_func)
129 def test_unicode_directory_SMB2x():
130 global conn
131 assert conn.smb2_dialect != SMB2_DIALECT_2
132
133 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
134 conn.createDirectory('smbtest', path)
135
136 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
137 names = map(lambda e: e.filename, entries)
138 assert os.path.basename(path.replace('/', os.sep)) in names
139
140 conn.deleteDirectory('smbtest', path)
141
142 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
143 names = map(lambda e: e.filename, entries)
144 assert os.path.basename(path.replace('/', os.sep)) not in names
88 def setup_func():
99 global conn
1010 info = getConnectionInfo()
11 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
11 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1212 assert conn.connect(info['server_ip'], info['server_port'])
1313
1414 def teardown_func():
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb_constants import *
4 from smb.smb2_constants import SMB2_DIALECT_2
35 from .util import getConnectionInfo
46 from nose.tools import with_setup
57 from smb import smb_structs
810
911 def setup_func_SMB1():
1012 global conn
11 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1214 info = getConnectionInfo()
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1517
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
1922 info = getConnectionInfo()
20 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29 info = getConnectionInfo()
30 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2131 assert conn.connect(info['server_ip'], info['server_port'])
2232
2333 def teardown_func():
2838 def test_listPath_SMB1():
2939 global conn
3040 results = conn.listPath('smbtest', '/')
31 filenames = [( r.filename, r.isDirectory ) for r in results]
32 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
33 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
34 assert ( 'TestDir1', True ) in filenames # Test short English folder names
35 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
36 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
41 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
42 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
43 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
44 assert ( u'TestDir1', True ) in filenames # Test short English folder names
45 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
46 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
3747
3848 @with_setup(setup_func_SMB1, teardown_func)
3949 def test_listSubPath_SMB1():
4050 global conn
51 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
52 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
53 assert ( u'Test File.txt', False ) in filenames
54 assert ( u'Test Folder', True ) in filenames
55 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
56
57 @with_setup(setup_func_SMB1, teardown_func)
58 def test_listPathWithManyFiles_SMB1():
59 global conn
60 results = conn.listPath('smbtest', '/RFC Archive/')
61 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
62 assert len(filenames)==999
63
64 @with_setup(setup_func_SMB1, teardown_func)
65 def test_listPathWithManyFiles_SMB1():
66 global conn
67 results = conn.listPath('smbtest', '/RFC Archive/')
68 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
69 assert len(list(filenames))==999
70
71 @with_setup(setup_func_SMB2, teardown_func)
72 def test_listPath_SMB2():
73 global conn
74 assert conn.smb2_dialect == SMB2_DIALECT_2
75 results = conn.listPath('smbtest', '/')
76 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
77 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
78 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
79 assert ( u'TestDir1', True ) in filenames # Test short English folder names
80 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
81 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
82
83 @with_setup(setup_func_SMB2x, teardown_func)
84 def test_listPath_SMB2x():
85 global conn
86 assert conn.smb2_dialect != SMB2_DIALECT_2
87 results = conn.listPath('smbtest', '/')
88 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
89 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
90 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
91 assert ( u'TestDir1', True ) in filenames # Test short English folder names
92 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
93 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
94
95 @with_setup(setup_func_SMB2, teardown_func)
96 def test_listSubPath_SMB2():
97 global conn
98 assert conn.smb2_dialect == SMB2_DIALECT_2
99 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
100 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
101 assert ( u'Test File.txt', False ) in filenames
102 assert ( u'Test Folder', True ) in filenames
103 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
104
105 @with_setup(setup_func_SMB2x, teardown_func)
106 def test_listSubPath_SMB2x():
107 global conn
108 assert conn.smb2_dialect != SMB2_DIALECT_2
41109 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
42110 filenames = [( r.filename, r.isDirectory ) for r in results]
43111 assert ( 'Test File.txt', False ) in filenames
45113 assert ( 'å­ę–‡ä»¶å¤¹', True ) in filenames
46114
47115 @with_setup(setup_func_SMB2, teardown_func)
48 def test_listPath_SMB2():
116 def test_listPathWithManyFiles_SMB2():
49117 global conn
50 results = conn.listPath('smbtest', '/')
51 filenames = [( r.filename, r.isDirectory ) for r in results]
52 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
53 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
54 assert ( 'TestDir1', True ) in filenames # Test short English folder names
55 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
56 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
118 results = conn.listPath('smbtest', '/RFC Archive/')
119 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
120 assert len(list(filenames))==999
121
122 @with_setup(setup_func_SMB1, teardown_func)
123 def test_listPathFilterForDirectory_SMB1():
124 global conn
125 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
126 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
127 assert len(list(filenames)) > 0
128 for f, isDirectory in filenames:
129 assert isDirectory
57130
58131 @with_setup(setup_func_SMB2, teardown_func)
59 def test_listSubPath_SMB2():
132 def test_listPathFilterForDirectory_SMB2():
60133 global conn
61 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
62 filenames = [( r.filename, r.isDirectory ) for r in results]
63 assert ( 'Test File.txt', False ) in filenames
64 assert ( 'Test Folder', True ) in filenames
65 assert ( 'å­ę–‡ä»¶å¤¹', True ) in filenames
134 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
135 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
136 assert len(list(filenames)) > 0
137 for f, isDirectory in filenames:
138 assert isDirectory
139
140 @with_setup(setup_func_SMB1, teardown_func)
141 def test_listPathFilterForFiles_SMB1():
142 global conn
143 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
144 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
145 assert len(list(filenames)) > 0
146 for f, isDirectory in filenames:
147 assert not isDirectory
148
149 @with_setup(setup_func_SMB2, teardown_func)
150 def test_listPathFilterForFiles_SMB2():
151 global conn
152 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
153 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
154 assert len(list(filenames)) > 0
155 for f, isDirectory in filenames:
156 assert not isDirectory
157
158 @with_setup(setup_func_SMB1, teardown_func)
159 def test_listPathFilterPattern_SMB1():
160 global conn
161 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
162 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
163 assert len(filenames) == 2
164 assert ( u'Test File.txt', False ) in filenames
165 assert ( u'Test Folder', True ) in filenames
166 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
167
168 @with_setup(setup_func_SMB2, teardown_func)
169 def test_listPathFilterPattern_SMB2():
170 global conn
171 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
172 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
173 assert len(filenames) == 2
174 assert ( u'Test File.txt', False ) in filenames
175 assert ( u'Test Folder', True ) in filenames
176 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
177
178 @with_setup(setup_func_SMB1, teardown_func)
179 def test_listPathFilterUnicodePattern_SMB1():
180 global conn
181 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
182 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
183 assert len(filenames) == 1
184 assert ( u'Test File.txt', False ) not in filenames
185 assert ( u'Test Folder', True ) not in filenames
186 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
187
188 @with_setup(setup_func_SMB2, teardown_func)
189 def test_listPathFilterUnicodePattern_SMB2():
190 global conn
191 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
192 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
193 assert len(filenames) == 1
194 assert ( u'Test File.txt', False ) not in filenames
195 assert ( u'Test Folder', True ) not in filenames
196 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from .util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1112 info = getConnectionInfo()
12 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1314 assert conn.connect(info['server_ip'], info['server_port'])
1415
1516 def setup_func_SMB2():
1617 global conn
1718 smb_structs.SUPPORT_SMB2 = True
19 smb_structs.SUPPORT_SMB2x = False
1820 info = getConnectionInfo()
19 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
21 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
22 assert conn.connect(info['server_ip'], info['server_port'])
23
24 def setup_func_SMB2x():
25 global conn
26 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
27 info = getConnectionInfo()
28 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2029 assert conn.connect(info['server_ip'], info['server_port'])
2130
2231 def teardown_func():
2736 def test_listshares_SMB1():
2837 global conn
2938 results = conn.listShares()
30 assert 'smbtest' in [r.name.lower() for r in results]
39 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
3140
3241 @with_setup(setup_func_SMB2, teardown_func)
3342 def test_listshares_SMB2():
3443 global conn
44 assert conn.smb2_dialect == SMB2_DIALECT_2
3545 results = conn.listShares()
36 assert 'smbtest' in [r.name.lower() for r in results]
46 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
47
48 @with_setup(setup_func_SMB2x, teardown_func)
49 def test_listshares_SMB2x():
50 global conn
51 assert conn.smb2_dialect != SMB2_DIALECT_2
52 results = conn.listShares()
53 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from .util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
12
1113 info = getConnectionInfo()
12 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
14 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1315 assert conn.connect(info['server_ip'], info['server_port'])
1416
1517 def setup_func_SMB2():
1618 global conn
1719 smb_structs.SUPPORT_SMB2 = True
20 smb_structs.SUPPORT_SMB2x = False
21
1822 info = getConnectionInfo()
19 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29
30 info = getConnectionInfo()
31 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2032 assert conn.connect(info['server_ip'], info['server_port'])
2133
2234 def teardown_func():
3244 @with_setup(setup_func_SMB2, teardown_func)
3345 def test_listsnapshots_SMB2():
3446 global conn
47 assert conn.smb2_dialect == SMB2_DIALECT_2
3548 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
3649 assert len(results) > 0
50
51 @with_setup(setup_func_SMB2x, teardown_func)
52 def test_listsnapshots_SMB2x():
53 global conn
54 assert conn.smb2_dialect != SMB2_DIALECT_2
55 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
56 assert len(results) > 0
22 import os, time, random
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415 info = getConnectionInfo()
15 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
16 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1718
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123 info = getConnectionInfo()
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
25 assert conn.connect(info['server_ip'], info['server_port'])
26
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30 info = getConnectionInfo()
31 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2332 assert conn.connect(info['server_ip'], info['server_port'])
2433
2534 def teardown_func():
3645 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
3746
3847 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
39 filenames = [e.filename for e in entries]
40 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
41 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
42
43 conn.rename('smbtest', old_path, new_path)
44
45 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
46 filenames = [e.filename for e in entries]
48 filenames = list(map(lambda e: e.filename, entries))
49 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
50 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
51
52 conn.rename('smbtest', old_path, new_path)
53
54 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
55 filenames = list(map(lambda e: e.filename, entries))
4756 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
4857 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
4958
5261 @with_setup(setup_func_SMB2, teardown_func)
5362 def test_rename_english_file_SMB2():
5463 global conn
55
56 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
57 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
58
59 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
60
61 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
62 filenames = [e.filename for e in entries]
63 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
64 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
65
66 conn.rename('smbtest', old_path, new_path)
67
68 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
69 filenames = [e.filename for e in entries]
64 assert conn.smb2_dialect == SMB2_DIALECT_2
65
66 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
67 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
68
69 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
70
71 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
72 filenames = list(map(lambda e: e.filename, entries))
73 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
74 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
75
76 conn.rename('smbtest', old_path, new_path)
77
78 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
79 filenames = list(map(lambda e: e.filename, entries))
80 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
81 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
82
83 conn.deleteFiles('smbtest', new_path)
84
85 @with_setup(setup_func_SMB2x, teardown_func)
86 def test_rename_english_file_SMB2x():
87 global conn
88 assert conn.smb2_dialect != SMB2_DIALECT_2
89
90 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
91 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
92
93 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
94
95 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
96 filenames = list(map(lambda e: e.filename, entries))
97 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
98 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
99
100 conn.rename('smbtest', old_path, new_path)
101
102 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
103 filenames = list(map(lambda e: e.filename, entries))
70104 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
71105 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
72106
76110 def test_rename_unicode_file_SMB1():
77111 global conn
78112
79 old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
80 new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
81
82 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
83
84 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
85 filenames = [e.filename for e in entries]
86 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
87 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
88
89 conn.rename('smbtest', old_path, new_path)
90
91 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
92 filenames = [e.filename for e in entries]
113 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
114 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
115
116 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
117
118 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
119 filenames = list(map(lambda e: e.filename, entries))
120 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
121 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
122
123 conn.rename('smbtest', old_path, new_path)
124
125 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
126 filenames = list(map(lambda e: e.filename, entries))
93127 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
94128 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
95129
98132 @with_setup(setup_func_SMB2, teardown_func)
99133 def test_rename_unicode_file_SMB2():
100134 global conn
101
102 old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
103 new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
104
105 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
106
107 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
108 filenames = [e.filename for e in entries]
109 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
110 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
111
112 conn.rename('smbtest', old_path, new_path)
113
114 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
115 filenames = [e.filename for e in entries]
135 assert conn.smb2_dialect == SMB2_DIALECT_2
136
137 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
138 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
139
140 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
141
142 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
143 filenames = list(map(lambda e: e.filename, entries))
144 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
145 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
146
147 conn.rename('smbtest', old_path, new_path)
148
149 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
150 filenames = list(map(lambda e: e.filename, entries))
151 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
152 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
153
154 conn.deleteFiles('smbtest', new_path)
155
156 @with_setup(setup_func_SMB2x, teardown_func)
157 def test_rename_unicode_file_SMB2x():
158 global conn
159 assert conn.smb2_dialect != SMB2_DIALECT_2
160
161 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
162 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
163
164 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
165
166 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
167 filenames = list(map(lambda e: e.filename, entries))
168 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
169 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
170
171 conn.rename('smbtest', old_path, new_path)
172
173 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
174 filenames = list(map(lambda e: e.filename, entries))
116175 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
117176 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
118177
128187 conn.createDirectory('smbtest', old_path)
129188
130189 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
131 filenames = [e.filename for e in entries]
132 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
133 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
134
135 conn.rename('smbtest', old_path, new_path)
136
137 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
138 filenames = [e.filename for e in entries]
190 filenames = list(map(lambda e: e.filename, entries))
191 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
192 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
193
194 conn.rename('smbtest', old_path, new_path)
195
196 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
197 filenames = list(map(lambda e: e.filename, entries))
139198 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
140199 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
141200
144203 @with_setup(setup_func_SMB2, teardown_func)
145204 def test_rename_english_directory_SMB2():
146205 global conn
147
148 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
149 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
150
151 conn.createDirectory('smbtest', old_path)
152
153 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
154 filenames = [e.filename for e in entries]
155 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
156 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
157
158 conn.rename('smbtest', old_path, new_path)
159
160 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
161 filenames = [e.filename for e in entries]
206 assert conn.smb2_dialect == SMB2_DIALECT_2
207
208 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
209 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
210
211 conn.createDirectory('smbtest', old_path)
212
213 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
214 filenames = list(map(lambda e: e.filename, entries))
215 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
216 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
217
218 conn.rename('smbtest', old_path, new_path)
219
220 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
221 filenames = list(map(lambda e: e.filename, entries))
222 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
223 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
224
225 conn.deleteDirectory('smbtest', new_path)
226
227 @with_setup(setup_func_SMB2x, teardown_func)
228 def test_rename_english_directory_SMB2x():
229 global conn
230 assert conn.smb2_dialect != SMB2_DIALECT_2
231
232 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
233 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
234
235 conn.createDirectory('smbtest', old_path)
236
237 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
238 filenames = list(map(lambda e: e.filename, entries))
239 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
240 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
241
242 conn.rename('smbtest', old_path, new_path)
243
244 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
245 filenames = list(map(lambda e: e.filename, entries))
162246 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
163247 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
164248
168252 def test_rename_unicode_directory_SMB1():
169253 global conn
170254
171 old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
172 new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
173
174 conn.createDirectory('smbtest', old_path)
175
176 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
177 filenames = [e.filename for e in entries]
178 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
179 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
180
181 conn.rename('smbtest', old_path, new_path)
182
183 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
184 filenames = [e.filename for e in entries]
255 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
256 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
257
258 conn.createDirectory('smbtest', old_path)
259
260 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
261 filenames = list(map(lambda e: e.filename, entries))
262 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
263 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
264
265 conn.rename('smbtest', old_path, new_path)
266
267 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
268 filenames = list(map(lambda e: e.filename, entries))
185269 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
186270 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
187271
190274 @with_setup(setup_func_SMB2, teardown_func)
191275 def test_rename_unicode_directory_SMB2():
192276 global conn
193
194 old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
195 new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
196
197 conn.createDirectory('smbtest', old_path)
198
199 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
200 filenames = [e.filename for e in entries]
201 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
202 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
203
204 conn.rename('smbtest', old_path, new_path)
205
206 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
207 filenames = [e.filename for e in entries]
208 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
209 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
210
211 conn.deleteDirectory('smbtest', new_path)
277 assert conn.smb2_dialect == SMB2_DIALECT_2
278
279 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
280 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
281
282 conn.createDirectory('smbtest', old_path)
283
284 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
285 filenames = list(map(lambda e: e.filename, entries))
286 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
287 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
288
289 conn.rename('smbtest', old_path, new_path)
290
291 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
292 filenames = list(map(lambda e: e.filename, entries))
293 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
294 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
295
296 conn.deleteDirectory('smbtest', new_path)
297
298 @with_setup(setup_func_SMB2x, teardown_func)
299 def test_rename_unicode_directory_SMB2x():
300 global conn
301 assert conn.smb2_dialect != SMB2_DIALECT_2
302
303 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
304 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
305
306 conn.createDirectory('smbtest', old_path)
307
308 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
309 filenames = list(map(lambda e: e.filename, entries))
310 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
311 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
312
313 conn.rename('smbtest', old_path, new_path)
314
315 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
316 filenames = list(map(lambda e: e.filename, entries))
317 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
318 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
319
320 conn.deleteDirectory('smbtest', new_path)
22 import os, tempfile
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1718
1819 def setup_func_SMB1():
1920 global conn
20 smb_structs.SUPPORT_SMB2 = False
21 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
22
2123 info = getConnectionInfo()
22 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2426
2527 def setup_func_SMB2():
2628 global conn
2729 smb_structs.SUPPORT_SMB2 = True
30 smb_structs.SUPPORT_SMB2x = False
31
2832 info = getConnectionInfo()
29 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
33 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
34 assert conn.connect(info['server_ip'], info['server_port'])
35
36 def setup_func_SMB2x():
37 global conn
38 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
39
40 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
3042 assert conn.connect(info['server_ip'], info['server_port'])
3143
3244 def teardown_func():
5163 def test_retr_multiplereads_SMB2():
5264 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
5365 global conn
66 assert conn.smb2_dialect == SMB2_DIALECT_2
67
5468 temp_fh = BytesIO()
5569 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
5670
6175
6276 temp_fh.close()
6377
78 @with_setup(setup_func_SMB2x, teardown_func)
79 def test_retr_multiplereads_SMB2x():
80 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
81 global conn
82 assert conn.smb2_dialect != SMB2_DIALECT_2
83
84 temp_fh = BytesIO()
85 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
86
87 md = MD5()
88 md.update(temp_fh.getvalue())
89 assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
90 assert filesize == 158437
91
92 temp_fh.close()
93
6494 @with_setup(setup_func_SMB1, teardown_func)
6595 def test_retr_longfilename_SMB1():
6696 # Test file retrieval that has a long English filename
79109 def test_retr_longfilename_SMB2():
80110 # Test file retrieval that has a long English filename
81111 global conn
112 assert conn.smb2_dialect == SMB2_DIALECT_2
113
82114 temp_fh = BytesIO()
83115 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
84116
89121
90122 temp_fh.close()
91123
124 @with_setup(setup_func_SMB2x, teardown_func)
125 def test_retr_longfilename_SMB2x():
126 # Test file retrieval that has a long English filename
127 global conn
128 assert conn.smb2_dialect != SMB2_DIALECT_2
129
130 temp_fh = BytesIO()
131 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
132
133 md = MD5()
134 md.update(temp_fh.getvalue())
135 assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
136 assert filesize == 421269
137
138 temp_fh.close()
139
92140 @with_setup(setup_func_SMB1, teardown_func)
93141 def test_retr_unicodefilename_SMB1():
94142 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
95143 global conn
96144 temp_fh = BytesIO()
97 file_attributes, filesize = conn.retrieveFile('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
145 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
98146
99147 md = MD5()
100148 md.update(temp_fh.getvalue())
107155 def test_retr_unicodefilename_SMB2():
108156 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
109157 global conn
110 temp_fh = BytesIO()
111 file_attributes, filesize = conn.retrieveFile('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
158 assert conn.smb2_dialect == SMB2_DIALECT_2
159
160 temp_fh = BytesIO()
161 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
112162
113163 md = MD5()
114164 md.update(temp_fh.getvalue())
117167
118168 temp_fh.close()
119169
170 @with_setup(setup_func_SMB2x, teardown_func)
171 def test_retr_unicodefilename_SMB2x():
172 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
173 global conn
174 assert conn.smb2_dialect != SMB2_DIALECT_2
175
176 temp_fh = BytesIO()
177 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
178
179 md = MD5()
180 md.update(temp_fh.getvalue())
181 assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
182 assert filesize == 256000
183
184 temp_fh.close()
185
120186 @with_setup(setup_func_SMB1, teardown_func)
121187 def test_retr_offset_SMB1():
122188 # Test file retrieval from offset to EOF
123189 global conn
124190 temp_fh = BytesIO()
125 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
191 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
126192
127193 md = MD5()
128194 md.update(temp_fh.getvalue())
135201 def test_retr_offset_SMB2():
136202 # Test file retrieval from offset to EOF
137203 global conn
138 temp_fh = BytesIO()
139 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
204 assert conn.smb2_dialect == SMB2_DIALECT_2
205
206 temp_fh = BytesIO()
207 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
140208
141209 md = MD5()
142210 md.update(temp_fh.getvalue())
145213
146214 temp_fh.close()
147215
216 @with_setup(setup_func_SMB2x, teardown_func)
217 def test_retr_offset_SMB2x():
218 # Test file retrieval from offset to EOF
219 global conn
220 assert conn.smb2_dialect != SMB2_DIALECT_2
221
222 temp_fh = BytesIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
224
225 md = MD5()
226 md.update(temp_fh.getvalue())
227 assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
228 assert filesize == 156000
229
230 temp_fh.close()
231
148232 @with_setup(setup_func_SMB1, teardown_func)
149233 def test_retr_offset_and_biglimit_SMB1():
150234 # Test file retrieval from offset with a big max_length
151235 global conn
152236 temp_fh = BytesIO()
153 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
237 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
154238
155239 md = MD5()
156240 md.update(temp_fh.getvalue())
163247 def test_retr_offset_and_biglimit_SMB2():
164248 # Test file retrieval from offset with a big max_length
165249 global conn
166 temp_fh = BytesIO()
167 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
250 assert conn.smb2_dialect == SMB2_DIALECT_2
251
252 temp_fh = BytesIO()
253 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
168254
169255 md = MD5()
170256 md.update(temp_fh.getvalue())
173259
174260 temp_fh.close()
175261
262 @with_setup(setup_func_SMB2x, teardown_func)
263 def test_retr_offset_and_biglimit_SMB2x():
264 # Test file retrieval from offset with a big max_length
265 global conn
266 assert conn.smb2_dialect != SMB2_DIALECT_2
267
268 temp_fh = BytesIO()
269 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
270
271 md = MD5()
272 md.update(temp_fh.getvalue())
273 assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
274 assert filesize == 100000
275
276 temp_fh.close()
277
176278 @with_setup(setup_func_SMB1, teardown_func)
177279 def test_retr_offset_and_smalllimit_SMB1():
178280 # Test file retrieval from offset with a small max_length
179281 global conn
180282 temp_fh = BytesIO()
181 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
283 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
182284
183285 md = MD5()
184286 md.update(temp_fh.getvalue())
191293 def test_retr_offset_and_smalllimit_SMB2():
192294 # Test file retrieval from offset with a small max_length
193295 global conn
194 temp_fh = BytesIO()
195 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
296 assert conn.smb2_dialect == SMB2_DIALECT_2
297
298 temp_fh = BytesIO()
299 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
196300
197301 md = MD5()
198302 md.update(temp_fh.getvalue())
201305
202306 temp_fh.close()
203307
308 @with_setup(setup_func_SMB2x, teardown_func)
309 def test_retr_offset_and_smalllimit_SMB2x():
310 # Test file retrieval from offset with a small max_length
311 global conn
312 assert conn.smb2_dialect != SMB2_DIALECT_2
313
314 temp_fh = BytesIO()
315 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
316
317 md = MD5()
318 md.update(temp_fh.getvalue())
319 assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
320 assert filesize == 10
321
322 temp_fh.close()
323
204324 @with_setup(setup_func_SMB1, teardown_func)
205325 def test_retr_offset_and_zerolimit_SMB1():
206326 # Test file retrieval from offset to EOF with max_length=0
207327 global conn
208328 temp_fh = BytesIO()
209 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
329 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
210330
211331 md = MD5()
212332 md.update(temp_fh.getvalue())
219339 def test_retr_offset_and_zerolimit_SMB2():
220340 # Test file retrieval from offset to EOF with max_length=0
221341 global conn
222 temp_fh = BytesIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
342 assert conn.smb2_dialect == SMB2_DIALECT_2
343
344 temp_fh = BytesIO()
345 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
224346
225347 md = MD5()
226348 md.update(temp_fh.getvalue())
228350 assert filesize == 0
229351
230352 temp_fh.close()
353
354 @with_setup(setup_func_SMB2x, teardown_func)
355 def test_retr_offset_and_zerolimit_SMB2x():
356 # Test file retrieval from offset to EOF with max_length=0
357 global conn
358 assert conn.smb2_dialect != SMB2_DIALECT_2
359
360 temp_fh = BytesIO()
361 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
362
363 md = MD5()
364 md.update(temp_fh.getvalue())
365 assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
366 assert filesize == 0
367
368 temp_fh.close()
22 import os, tempfile, random, time
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
2122
2223 def setup_func_SMB1():
2324 global conn
24 smb_structs.SUPPORT_SMB2 = False
25
25 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2626 info = getConnectionInfo()
27 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
27 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
2828 assert conn.connect(info['server_ip'], info['server_port'])
2929
3030 def setup_func_SMB2():
3131 global conn
3232 smb_structs.SUPPORT_SMB2 = True
33
33 smb_structs.SUPPORT_SMB2x = False
3434 info = getConnectionInfo()
35 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
35 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
36 assert conn.connect(info['server_ip'], info['server_port'])
37
38 def setup_func_SMB2x():
39 global conn
40 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
41 info = getConnectionInfo()
42 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
3643 assert conn.connect(info['server_ip'], info['server_port'])
3744
3845 def teardown_func():
4249
4350 @with_setup(setup_func_SMB1, teardown_func)
4451 def test_store_long_filename_SMB1():
45 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
46
47 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
48 assert filesize == TEST_FILESIZE
49
50 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
51 filenames = [e.filename for e in entries]
52 assert os.path.basename(filename.replace('/', os.sep)) in filenames
53
54 buf = BytesIO()
55 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
56 assert file_size == TEST_FILESIZE
57
58 md = MD5()
59 md.update(buf.getvalue())
60 assert md.hexdigest() == TEST_DIGEST
61 buf.close()
62
63 conn.deleteFiles('smbtest', filename)
64
52 global conn
53 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
54
55 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
56 assert filesize == TEST_FILESIZE
57
58 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
59 filenames = map(lambda e: e.filename, entries)
60 assert os.path.basename(filename.replace('/', os.sep)) in filenames
61
62 buf = BytesIO()
63 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
64 assert file_size == TEST_FILESIZE
65
66 md = MD5()
67 md.update(buf.getvalue())
68 assert md.hexdigest() == TEST_DIGEST
69 buf.close()
70
71 conn.deleteFiles('smbtest', filename)
72
73 @with_setup(setup_func_SMB1, teardown_func)
74 def test_store_from_offset_SMB1():
75 global conn
76 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
77
78 buf = BytesIO(b'0123456789')
79 filesize = conn.storeFile('smbtest', filename, buf)
80 assert filesize == 10
81
82 buf = BytesIO(b'aa')
83 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
84 assert pos == 7
85
86 buf = BytesIO()
87 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
88 assert file_size == 10
89 assert buf.getvalue() == b'01234aa789'
90 buf.close()
91
92 conn.deleteFiles('smbtest', filename)
6593
6694 @with_setup(setup_func_SMB2, teardown_func)
6795 def test_store_long_filename_SMB2():
68 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
69
70 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
71 assert filesize == TEST_FILESIZE
72
73 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
74 filenames = [e.filename for e in entries]
96 global conn
97 assert conn.smb2_dialect == SMB2_DIALECT_2
98
99 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
100
101 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
102 assert filesize == TEST_FILESIZE
103
104 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
105 filenames = map(lambda e: e.filename, entries)
106 assert os.path.basename(filename.replace('/', os.sep)) in filenames
107
108 buf = BytesIO()
109 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
110 assert file_size == TEST_FILESIZE
111
112 md = MD5()
113 md.update(buf.getvalue())
114 assert md.hexdigest() == TEST_DIGEST
115 buf.close()
116
117 conn.deleteFiles('smbtest', filename)
118
119
120 @with_setup(setup_func_SMB2x, teardown_func)
121 def test_store_long_filename_SMB2x():
122 global conn
123 assert conn.smb2_dialect != SMB2_DIALECT_2
124
125 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
126
127 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
128 assert filesize == TEST_FILESIZE
129
130 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
131 filenames = map(lambda e: e.filename, entries)
75132 assert os.path.basename(filename.replace('/', os.sep)) in filenames
76133
77134 buf = BytesIO()
88145
89146 @with_setup(setup_func_SMB1, teardown_func)
90147 def test_store_unicode_filename_SMB1():
91 filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
92
93 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
94 assert filesize == TEST_FILESIZE
95
96 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
97 filenames = [e.filename for e in entries]
148 global conn
149 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
150
151 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
152 assert filesize == TEST_FILESIZE
153
154 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
155 filenames = map(lambda e: e.filename, entries)
98156 assert os.path.basename(filename.replace('/', os.sep)) in filenames
99157
100158 buf = BytesIO()
111169
112170 @with_setup(setup_func_SMB2, teardown_func)
113171 def test_store_unicode_filename_SMB2():
114 filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
115
116 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
117 assert filesize == TEST_FILESIZE
118
119 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
120 filenames = [e.filename for e in entries]
121 assert os.path.basename(filename.replace('/', os.sep)) in filenames
122
123 buf = BytesIO()
124 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
125 assert file_size == TEST_FILESIZE
126
127 md = MD5()
128 md.update(buf.getvalue())
129 assert md.hexdigest() == TEST_DIGEST
130 buf.close()
131
132 conn.deleteFiles('smbtest', filename)
172 global conn
173 assert conn.smb2_dialect == SMB2_DIALECT_2
174
175 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
176
177 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
178 assert filesize == TEST_FILESIZE
179
180 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
181 filenames = map(lambda e: e.filename, entries)
182 assert os.path.basename(filename.replace('/', os.sep)) in filenames
183
184 buf = BytesIO()
185 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
186 assert file_size == TEST_FILESIZE
187
188 md = MD5()
189 md.update(buf.getvalue())
190 assert md.hexdigest() == TEST_DIGEST
191 buf.close()
192
193 conn.deleteFiles('smbtest', filename)
194
195
196 @with_setup(setup_func_SMB2x, teardown_func)
197 def test_store_unicode_filename_SMB2x():
198 global conn
199 assert conn.smb2_dialect != SMB2_DIALECT_2
200
201 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
202
203 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
204 assert filesize == TEST_FILESIZE
205
206 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
207 filenames = map(lambda e: e.filename, entries)
208 assert os.path.basename(filename.replace('/', os.sep)) in filenames
209
210 buf = BytesIO()
211 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
212 assert file_size == TEST_FILESIZE
213
214 md = MD5()
215 md.update(buf.getvalue())
216 assert md.hexdigest() == TEST_DIGEST
217 buf.close()
218
219 conn.deleteFiles('smbtest', filename)
220
221
222 @with_setup(setup_func_SMB2, teardown_func)
223 def test_store_from_offset_SMB2():
224 global conn
225 assert conn.smb2_dialect == SMB2_DIALECT_2
226
227 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
228
229 buf = BytesIO(b'0123456789')
230 filesize = conn.storeFile('smbtest', filename, buf)
231 assert filesize == 10
232
233 buf = BytesIO(b'aa')
234 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
235 assert pos == 7
236
237 buf = BytesIO()
238 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
239 assert file_size == 10
240 assert buf.getvalue() == b'01234aa789'
241 buf.close()
242
243 conn.deleteFiles('smbtest', filename)
244
245
246 @with_setup(setup_func_SMB2x, teardown_func)
247 def test_store_from_offset_SMB2x():
248 global conn
249 assert conn.smb2_dialect != SMB2_DIALECT_2
250
251 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
252
253 buf = BytesIO(b'0123456789')
254 filesize = conn.storeFile('smbtest', filename, buf)
255 assert filesize == 10
256
257 buf = BytesIO(b'aa')
258 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
259 assert pos == 7
260
261 buf = BytesIO()
262 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
263 assert file_size == 10
264 assert buf.getvalue() == b'01234aa789'
265 buf.close()
266
267 conn.deleteFiles('smbtest', filename)
+0
-77
python3/tests/DirectSMBTwistedTests/test_auth.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class AuthFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 self.d.callback(True)
22
23 def onAuthFailed(self):
24 self.d.callback(False)
25
26
27 @deferred(timeout=5.0)
28 def test_NTLMv1_auth_SMB1():
29 def result(auth_passed):
30 assert auth_passed
31
32 smb_structs.SUPPORT_SMB2 = False
33 info = getConnectionInfo()
34 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
35 factory.d.addCallback(result)
36 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
37 return factory.d
38
39
40 @deferred(timeout=5.0)
41 def test_NTLMv2_auth_SMB1():
42 def result(auth_passed):
43 assert auth_passed
44
45 smb_structs.SUPPORT_SMB2 = False
46 info = getConnectionInfo()
47 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
48 factory.d.addCallback(result)
49 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
50 return factory.d
51
52
53 @deferred(timeout=5.0)
54 def test_NTLMv1_auth_SMB2():
55 def result(auth_passed):
56 assert auth_passed
57
58 smb_structs.SUPPORT_SMB2 = True
59 info = getConnectionInfo()
60 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
61 factory.d.addCallback(result)
62 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
63 return factory.d
64
65
66 @deferred(timeout=5.0)
67 def test_NTLMv2_auth_SMB2():
68 def result(auth_passed):
69 assert auth_passed
70
71 smb_structs.SUPPORT_SMB2 = True
72 info = getConnectionInfo()
73 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
74 factory.d.addCallback(result)
75 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
76 return factory.d
+0
-99
python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, random, time
3 from nose.twistedtools import reactor, deferred
4 from twisted.internet import defer
5 from smb.SMBProtocol import SMBProtocolFactory
6 from smb import smb_structs
7 from .util import getConnectionInfo
8
9
10 class DirectoryFactory(SMBProtocolFactory):
11
12 def __init__(self, *args, **kwargs):
13 SMBProtocolFactory.__init__(self, *args, **kwargs)
14 self.d = defer.Deferred()
15 self.d.addBoth(self.testDone)
16 self.service_name = ''
17 self.path = ''
18
19 def testDone(self, r):
20 if self.instance:
21 self.instance.transport.loseConnection()
22 return r
23
24 def createDone(self, result):
25 d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
26 d.addCallback(self.listComplete)
27 d.addErrback(self.d.errback)
28
29 def listComplete(self, entries):
30 names = [e.filename for e in entries]
31 assert os.path.basename(self.path.replace('/', os.sep)) in names
32
33 d = self.deleteDirectory(self.service_name, self.path)
34 d.addCallback(self.deleteDone)
35 d.addErrback(self.d.errback)
36
37 def deleteDone(self, result):
38 d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
39 d.addCallback(self.list2Complete)
40 d.addErrback(self.d.errback)
41
42 def list2Complete(self, entries):
43 names = [e.filename for e in entries]
44 assert os.path.basename(self.path.replace('/', os.sep)) not in names
45 self.d.callback(True)
46
47 def onAuthOK(self):
48 d = self.createDirectory(self.service_name, self.path)
49 d.addCallback(self.createDone)
50 d.addErrback(self.d.errback)
51
52 def onAuthFailed(self):
53 self.d.errback('Auth failed')
54
55
56 @deferred(timeout=15.0)
57 def test_english_directory_SMB1():
58 info = getConnectionInfo()
59 smb_structs.SUPPORT_SMB2 = False
60
61 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
62 factory.service_name = 'smbtest'
63 factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
64 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
65 return factory.d
66
67 @deferred(timeout=15.0)
68 def test_english_directory_SMB2():
69 info = getConnectionInfo()
70 smb_structs.SUPPORT_SMB2 = True
71
72 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
73 factory.service_name = 'smbtest'
74 factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
75 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
76 return factory.d
77
78 @deferred(timeout=15.0)
79 def test_unicode_directory_SMB1():
80 info = getConnectionInfo()
81 smb_structs.SUPPORT_SMB2 = False
82
83 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
84 factory.service_name = 'smbtest'
85 factory.path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
87 return factory.d
88
89 @deferred(timeout=15.0)
90 def test_unicode_directory_SMB2():
91 info = getConnectionInfo()
92 smb_structs.SUPPORT_SMB2 = True
93
94 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
95 factory.service_name = 'smbtest'
96 factory.path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
97 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
98 return factory.d
+0
-39
python3/tests/DirectSMBTwistedTests/test_echo.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from .util import getConnectionInfo
5
6
7 class EchoFactory(SMBProtocolFactory):
8
9 def __init__(self, *args, **kwargs):
10 SMBProtocolFactory.__init__(self, *args, **kwargs)
11 self.d = defer.Deferred()
12 self.d.addBoth(self.testDone)
13 self.echo_data = 'This is an echo test'
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(data):
22 assert data == self.echo_data
23 self.d.callback(True)
24
25 d = self.echo(self.echo_data)
26 d.addCallback(cb)
27 d.addErrback(self.d.errback)
28
29 def onAuthFailed(self):
30 self.d.errback('Auth failed')
31
32
33 @deferred(timeout=15.0)
34 def test_echo():
35 info = getConnectionInfo()
36 factory = EchoFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
37 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
38 return factory.d
+0
-56
python3/tests/DirectSMBTwistedTests/test_listpath.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListPathFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(results):
22 filenames = [( r.filename, r.isDirectory ) for r in results]
23 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
24 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
25 assert ( 'TestDir1', True ) in filenames # Test short English folder names
26 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
27 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
28
29 self.d.callback(True)
30
31 d = self.listPath('smbtest', '/', timeout = 15)
32 d.addCallback(cb)
33 d.addErrback(self.d.errback)
34
35 def onAuthFailed(self):
36 self.d.errback('Auth failed')
37
38
39 @deferred(timeout=15.0)
40 def test_listPath_SMB1():
41 info = getConnectionInfo()
42 smb_structs.SUPPORT_SMB2 = False
43
44 factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
45 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
46 return factory.d
47
48 @deferred(timeout=15.0)
49 def test_listPath_SMB2():
50 info = getConnectionInfo()
51 smb_structs.SUPPORT_SMB2 = True
52
53 factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
54 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
55 return factory.d
+0
-51
python3/tests/DirectSMBTwistedTests/test_listshares.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListSharesFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(results):
22 assert 'smbtest' in [r.name.lower() for r in results]
23 self.d.callback(True)
24 self.instance.transport.loseConnection()
25
26 d = self.listShares(timeout = 15)
27 d.addCallback(cb)
28 d.addErrback(self.d.errback)
29
30 def onAuthFailed(self):
31 self.d.errback('Auth failed')
32
33
34 @deferred(timeout=15.0)
35 def test_listshares_SMB1():
36 info = getConnectionInfo()
37 smb_structs.SUPPORT_SMB2 = False
38
39 factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
41 return factory.d
42
43 @deferred(timeout=15.0)
44 def test_listshares_SMB2():
45 info = getConnectionInfo()
46 smb_structs.SUPPORT_SMB2 = True
47
48 factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
49 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
50 return factory.d
+0
-57
python3/tests/DirectSMBTwistedTests/test_listsnapshots.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListSnapshotsFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14 self.service_name = None
15 self.path = None
16
17 def testDone(self, r):
18 if self.instance:
19 self.instance.transport.loseConnection()
20 return r
21
22 def onAuthOK(self):
23 def cb(results):
24 assert len(results) > 0
25 self.d.callback(True)
26 self.instance.transport.loseConnection()
27
28 d = self.listSnapshots(self.service_name, self.path, timeout = 15)
29 d.addCallback(cb)
30 d.addErrback(self.d.errback)
31
32 def onAuthFailed(self):
33 self.d.errback('Auth failed')
34
35
36 @deferred(timeout=15.0)
37 def test_listshares_SMB1():
38 info = getConnectionInfo()
39 smb_structs.SUPPORT_SMB2 = False
40
41 factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
42 factory.service_name = 'smbtest'
43 factory.path = '/rfc1001.txt'
44 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
45 return factory.d
46
47 @deferred(timeout=15.0)
48 def test_listshares_SMB2():
49 info = getConnectionInfo()
50 smb_structs.SUPPORT_SMB2 = True
51
52 factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
53 factory.service_name = 'smbtest'
54 factory.path = '/rfc1001.txt'
55 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
56 return factory.d
+0
-174
python3/tests/DirectSMBTwistedTests/test_rename.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, random, time
3 from io import StringIO
4 from nose.twistedtools import reactor, deferred
5 from twisted.internet import defer
6 from smb.SMBProtocol import SMBProtocolFactory
7 from smb import smb_structs
8 from .util import getConnectionInfo
9
10
11 class RenameFactory(SMBProtocolFactory):
12
13 def __init__(self, *args, **kwargs):
14 SMBProtocolFactory.__init__(self, *args, **kwargs)
15 self.d = defer.Deferred()
16 self.d.addBoth(self.testDone)
17 self.service = ''
18 self.new_path = ''
19 self.old_path = ''
20
21 def testDone(self, r):
22 if self.instance:
23 self.instance.transport.loseConnection()
24 return r
25
26 def pathCreated(self, result):
27 d = self.listPath(self.service, os.path.dirname(self.old_path.replace('/', os.sep)))
28 d.addCallback(self.listComplete)
29 d.addErrback(self.d.errback)
30
31 def listComplete(self, entries):
32 filenames = [e.filename for e in entries]
33 assert os.path.basename(self.old_path.replace('/', os.sep)) in filenames
34 assert os.path.basename(self.new_path.replace('/', os.sep)) not in filenames
35
36 d = self.rename(self.service, self.old_path, self.new_path)
37 d.addCallback(self.renameComplete)
38 d.addErrback(self.d.errback)
39
40 def renameComplete(self, result):
41 d = self.listPath(self.service, os.path.dirname(self.new_path.replace('/', os.sep)))
42 d.addCallback(self.list2Complete)
43 d.addErrback(self.d.errback)
44
45 def list2Complete(self, entries):
46 filenames = [e.filename for e in entries]
47 assert os.path.basename(self.new_path.replace('/', os.sep)) in filenames
48 assert os.path.basename(self.old_path.replace('/', os.sep)) not in filenames
49 self.cleanup()
50
51 def onAuthFailed(self):
52 self.d.errback('Auth failed')
53
54
55 class RenameFileFactory(RenameFactory):
56
57 def onAuthOK(self):
58 d = self.storeFile(self.service, self.old_path, StringIO('Rename file test'))
59 d.addCallback(self.pathCreated)
60 d.addErrback(self.d.errback)
61
62 def cleanup(self):
63 d = self.deleteFiles(self.service, self.new_path)
64 d.chainDeferred(self.d)
65
66
67 class RenameDirectoryFactory(RenameFactory):
68
69 def onAuthOK(self):
70 d = self.createDirectory(self.service, self.old_path)
71 d.addCallback(self.pathCreated)
72 d.addErrback(self.d.errback)
73
74 def cleanup(self):
75 d = self.deleteDirectory(self.service, self.new_path)
76 d.chainDeferred(self.d)
77
78
79 @deferred(timeout=30.0)
80 def test_rename_english_file_SMB1():
81 info = getConnectionInfo()
82 smb_structs.SUPPORT_SMB2 = False
83
84 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
85 factory.service = 'smbtest'
86 factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
87 factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
88 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
89 return factory.d
90
91 @deferred(timeout=30.0)
92 def test_rename_english_file_SMB2():
93 info = getConnectionInfo()
94 smb_structs.SUPPORT_SMB2 = True
95
96 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
97 factory.service = 'smbtest'
98 factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
99 factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
100 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
101 return factory.d
102
103 @deferred(timeout=30.0)
104 def test_rename_unicode_file_SMB1():
105 info = getConnectionInfo()
106 smb_structs.SUPPORT_SMB2 = False
107
108 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
109 factory.service = 'smbtest'
110 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
111 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
112 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
113 return factory.d
114
115 @deferred(timeout=30.0)
116 def test_rename_unicode_file_SMB2():
117 info = getConnectionInfo()
118 smb_structs.SUPPORT_SMB2 = True
119
120 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
121 factory.service = 'smbtest'
122 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
123 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
124 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
125 return factory.d
126
127 @deferred(timeout=30.0)
128 def test_rename_english_directory_SMB1():
129 info = getConnectionInfo()
130 smb_structs.SUPPORT_SMB2 = False
131
132 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
133 factory.service = 'smbtest'
134 factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
135 factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
136 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
137 return factory.d
138
139 @deferred(timeout=30.0)
140 def test_rename_english_directory_SMB2():
141 info = getConnectionInfo()
142 smb_structs.SUPPORT_SMB2 = True
143
144 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
145 factory.service = 'smbtest'
146 factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
147 factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
148 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
149 return factory.d
150
151 @deferred(timeout=30.0)
152 def test_rename_unicode_directory_SMB1():
153 info = getConnectionInfo()
154 smb_structs.SUPPORT_SMB2 = False
155
156 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
157 factory.service = 'smbtest'
158 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
159 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
160 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
161 return factory.d
162
163 @deferred(timeout=30.0)
164 def test_rename_unicode_directory_SMB2():
165 info = getConnectionInfo()
166 smb_structs.SUPPORT_SMB2 = True
167
168 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
169 factory.service = 'smbtest'
170 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
171 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
172 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
173 return factory.d
+0
-278
python3/tests/DirectSMBTwistedTests/test_retrievefile.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, tempfile
3 from nose.twistedtools import reactor, deferred
4 from twisted.internet import defer
5 from smb.SMBProtocol import SMBProtocolFactory
6 from smb import smb_structs
7 from .util import getConnectionInfo
8
9 try:
10 import hashlib
11 def MD5(): return hashlib.md5()
12 except ImportError:
13 import md5
14 def MD5(): return md5.new()
15
16
17 class RetrieveFileFactory(SMBProtocolFactory):
18
19 def __init__(self, *args, **kwargs):
20 SMBProtocolFactory.__init__(self, *args, **kwargs)
21 self.d = defer.Deferred()
22 self.d.addBoth(self.testDone)
23 self.temp_fh = tempfile.NamedTemporaryFile(prefix = 'pysmbtest-')
24 self.service = ''
25 self.path = ''
26 self.digest = ''
27 self.offset = 0
28 self.max_length = -1
29 self.filesize = 0
30
31 def testDone(self, r):
32 if self.instance:
33 self.instance.transport.loseConnection()
34 return r
35
36 def fileRetrieved(self, write_result):
37 file_obj, file_attributes, file_size = write_result
38 assert file_obj == self.temp_fh
39
40 md = MD5()
41 filesize = 0
42 self.temp_fh.seek(0)
43 while True:
44 s = self.temp_fh.read(8192)
45 if not s:
46 break
47 md.update(s)
48 filesize += len(s)
49
50 assert self.filesize == filesize
51 assert md.hexdigest() == self.digest
52
53 self.temp_fh.close()
54 self.d.callback(True)
55 self.instance.transport.loseConnection()
56
57 def onAuthOK(self):
58 assert self.service
59 assert self.path
60
61 d = self.retrieveFileFromOffset(self.service, self.path, self.temp_fh, self.offset, self.max_length, timeout = 15)
62 d.addCallback(self.fileRetrieved)
63 d.addErrback(self.d.errback)
64
65 def onAuthFailed(self):
66 self.d.errback('Auth failed')
67
68
69 @deferred(timeout=30.0)
70 def test_retr_multiplereads_SMB1():
71 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
72 info = getConnectionInfo()
73 smb_structs.SUPPORT_SMB2 = False
74
75 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
76 factory.service = 'smbtest'
77 factory.path = '/rfc1001.txt'
78 factory.digest = '5367c2bbf97f521059c78eab65309ad3'
79 factory.filesize = 158437
80 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
81 return factory.d
82
83 @deferred(timeout=30.0)
84 def test_retr_multiplereads_SMB2():
85 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
86 info = getConnectionInfo()
87 smb_structs.SUPPORT_SMB2 = True
88
89 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
90 factory.service = 'smbtest'
91 factory.path = '/rfc1001.txt'
92 factory.digest = '5367c2bbf97f521059c78eab65309ad3'
93 factory.filesize = 158437
94 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
95 return factory.d
96
97 @deferred(timeout=30.0)
98 def test_retr_longfilename_SMB1():
99 # Test file retrieval that has a long English filename
100 info = getConnectionInfo()
101 smb_structs.SUPPORT_SMB2 = False
102
103 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
104 factory.service = 'smbtest'
105 factory.path = '/Implementing CIFS - SMB.html'
106 factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
107 factory.filesize = 421269
108 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
109 return factory.d
110
111 @deferred(timeout=30.0)
112 def test_retr_longfilename_SMB2():
113 # Test file retrieval that has a long English filename
114 info = getConnectionInfo()
115 smb_structs.SUPPORT_SMB2 = True
116
117 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
118 factory.service = 'smbtest'
119 factory.path = '/Implementing CIFS - SMB.html'
120 factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
121 factory.filesize = 421269
122 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
123 return factory.d
124
125 @deferred(timeout=30.0)
126 def test_retr_unicodefilename_SMB1():
127 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
128 info = getConnectionInfo()
129 smb_structs.SUPPORT_SMB2 = False
130
131 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
132 factory.service = 'smbtest'
133 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
134 factory.digest = '8a44c1e80d55e91c92350955cdf83442'
135 factory.filesize = 256000
136 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
137 return factory.d
138
139 @deferred(timeout=30.0)
140 def test_retr_unicodefilename_SMB2():
141 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
142 info = getConnectionInfo()
143 smb_structs.SUPPORT_SMB2 = True
144
145 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
146 factory.service = 'smbtest'
147 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
148 factory.digest = '8a44c1e80d55e91c92350955cdf83442'
149 factory.filesize = 256000
150 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
151 return factory.d
152
153 @deferred(timeout=30.0)
154 def test_retr_offset_SMB1():
155 # Test file retrieval from offset to EOF
156 info = getConnectionInfo()
157 smb_structs.SUPPORT_SMB2 = False
158
159 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
160 factory.service = 'smbtest'
161 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
162 factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
163 factory.filesize = 156000
164 factory.offset = 100000
165 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
166 return factory.d
167
168 @deferred(timeout=30.0)
169 def test_retr_offset_SMB2():
170 # Test file retrieval from offset to EOF
171 info = getConnectionInfo()
172 smb_structs.SUPPORT_SMB2 = True
173
174 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
175 factory.service = 'smbtest'
176 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
177 factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
178 factory.filesize = 156000
179 factory.offset = 100000
180 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
181 return factory.d
182
183 @deferred(timeout=30.0)
184 def test_retr_offset_and_biglimit_SMB1():
185 # Test file retrieval from offset with a big max_length
186 info = getConnectionInfo()
187 smb_structs.SUPPORT_SMB2 = False
188
189 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
190 factory.service = 'smbtest'
191 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
192 factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
193 factory.filesize = 100000
194 factory.offset = 100000
195 factory.max_length = 100000
196 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
197 return factory.d
198
199 @deferred(timeout=30.0)
200 def test_retr_offset_and_biglimit_SMB2():
201 # Test file retrieval from offset with a big max_length
202 info = getConnectionInfo()
203 smb_structs.SUPPORT_SMB2 = True
204
205 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
206 factory.service = 'smbtest'
207 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
208 factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
209 factory.filesize = 100000
210 factory.offset = 100000
211 factory.max_length = 100000
212 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
213 return factory.d
214
215 @deferred(timeout=30.0)
216 def test_retr_offset_and_smalllimit_SMB1():
217 # Test file retrieval from offset with a small max_length
218 info = getConnectionInfo()
219 smb_structs.SUPPORT_SMB2 = False
220
221 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
222 factory.service = 'smbtest'
223 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
224 factory.digest = '746f60a96b39b712a7b6e17ddde19986'
225 factory.filesize = 10
226 factory.offset = 100000
227 factory.max_length = 10
228 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
229 return factory.d
230
231 @deferred(timeout=30.0)
232 def test_retr_offset_and_smalllimit_SMB2():
233 # Test file retrieval from offset with a small max_length
234 info = getConnectionInfo()
235 smb_structs.SUPPORT_SMB2 = True
236
237 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
238 factory.service = 'smbtest'
239 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
240 factory.digest = '746f60a96b39b712a7b6e17ddde19986'
241 factory.filesize = 10
242 factory.offset = 100000
243 factory.max_length = 10
244 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
245 return factory.d
246
247 @deferred(timeout=30.0)
248 def test_retr_offset_and_zerolimit_SMB1():
249 # Test file retrieval from offset to EOF with max_length=0
250 info = getConnectionInfo()
251 smb_structs.SUPPORT_SMB2 = False
252
253 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
254 factory.service = 'smbtest'
255 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
256 factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
257 factory.filesize = 0
258 factory.offset = 100000
259 factory.max_length = 0
260 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
261 return factory.d
262
263 @deferred(timeout=30.0)
264 def test_retr_offset_and_zerolimit_SMB2():
265 # Test file retrieval from offset to EOF with max_length=0
266 info = getConnectionInfo()
267 smb_structs.SUPPORT_SMB2 = True
268
269 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
270 factory.service = 'smbtest'
271 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
272 factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
273 factory.filesize = 0
274 factory.offset = 100000
275 factory.max_length = 0
276 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
277 return factory.d
+0
-141
python3/tests/DirectSMBTwistedTests/test_storefile.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, time, random
3 from io import StringIO
4 from nose.twistedtools import reactor, deferred
5 from twisted.internet import defer
6 from smb.SMBProtocol import SMBProtocolFactory
7 from smb import smb_structs
8 from .util import getConnectionInfo
9
10 try:
11 import hashlib
12 def MD5(): return hashlib.md5()
13 except ImportError:
14 import md5
15 def MD5(): return md5.new()
16
17 class StoreFilesFactory(SMBProtocolFactory):
18 """
19 A super test factory that tests store file, list files, retrieve file and delete file functionlities in sequence.
20 """
21
22 TEST_FILENAME = os.path.join(os.path.dirname(__file__), os.pardir, 'SupportFiles', 'binary.dat')
23 TEST_FILESIZE = 256000
24 TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
25
26 def __init__(self, *args, **kwargs):
27 SMBProtocolFactory.__init__(self, *args, **kwargs)
28 self.d = defer.Deferred()
29 self.d.addBoth(self.testDone)
30 self.service_name = ''
31 self.filename = ''
32
33 def testDone(self, r):
34 if self.instance:
35 self.instance.transport.loseConnection()
36 return r
37
38 def storeComplete(self, result):
39 file_obj, filesize = result
40 file_obj.close()
41 assert filesize == self.TEST_FILESIZE
42
43 d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
44 d.addCallback(self.listComplete)
45 d.addErrback(self.d.errback)
46
47 def listComplete(self, entries):
48 filenames = [e.filename for e in entries]
49 assert os.path.basename(self.filename.replace('/', os.sep)) in filenames
50
51 for entry in entries:
52 if os.path.basename(self.filename.replace('/', os.sep)) == entry.filename:
53 # The following asserts will fail if the remote machine's time is not in sync with the test machine's time
54 assert abs(entry.create_time - time.time()) < 3
55 assert abs(entry.last_access_time - time.time()) < 3
56 assert abs(entry.last_write_time - time.time()) < 3
57 assert abs(entry.last_attr_change_time - time.time()) < 3
58 break
59
60 d = self.retrieveFile(self.service_name, self.filename, StringIO())
61 d.addCallback(self.retrieveComplete)
62 d.addErrback(self.d.errback)
63
64 def retrieveComplete(self, result):
65 file_obj, file_attributes, file_size = result
66
67 md = MD5()
68 md.update(file_obj.getvalue())
69 file_obj.close()
70
71 assert file_size == self.TEST_FILESIZE
72 assert md.hexdigest() == self.TEST_DIGEST
73
74 d = self.deleteFiles(self.service_name, self.filename)
75 d.addCallback(self.deleteComplete)
76 d.addErrback(self.d.errback)
77
78 def deleteComplete(self, result):
79 d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
80 d.addCallback(self.list2Complete)
81 d.addErrback(self.d.errback)
82
83 def list2Complete(self, entries):
84 filenames = [e.filename for e in entries]
85 assert os.path.basename(self.filename.replace('/', os.sep)) not in filenames
86 self.d.callback(True)
87 self.instance.transport.loseConnection()
88
89 def onAuthOK(self):
90 d = self.storeFile(self.service_name, self.filename, open(self.TEST_FILENAME, 'rb'))
91 d.addCallback(self.storeComplete)
92 d.addErrback(self.d.errback)
93
94 def onAuthFailed(self):
95 self.d.errback('Auth failed')
96
97
98 @deferred(timeout=30.0)
99 def test_store_long_filename_SMB1():
100 info = getConnectionInfo()
101 smb_structs.SUPPORT_SMB2 = False
102
103 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
104 factory.service_name = 'smbtest'
105 factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
106 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
107 return factory.d
108
109 @deferred(timeout=30.0)
110 def test_store_long_filename_SMB2():
111 info = getConnectionInfo()
112 smb_structs.SUPPORT_SMB2 = True
113
114 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
115 factory.service_name = 'smbtest'
116 factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
117 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
118 return factory.d
119
120 @deferred(timeout=30.0)
121 def test_store_unicode_filename_SMB1():
122 info = getConnectionInfo()
123 smb_structs.SUPPORT_SMB2 = False
124
125 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
126 factory.service_name = 'smbtest'
127 factory.filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
128 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
129 return factory.d
130
131 @deferred(timeout=30.0)
132 def test_store_unicode_filename_SMB2():
133 info = getConnectionInfo()
134 smb_structs.SUPPORT_SMB2 = True
135
136 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
137 factory.service_name = 'smbtest'
138 factory.filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
139 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
140 return factory.d
+0
-19
python3/tests/DirectSMBTwistedTests/util.py less more
0
1 import os
2 from ConfigParser import SafeConfigParser
3
4 def getConnectionInfo():
5 config_filename = os.path.join(os.path.dirname(__file__), os.path.pardir, 'connection.ini')
6 cp = SafeConfigParser()
7 cp.read(config_filename)
8
9 info = {
10 'server_name': cp.get('server', 'name'),
11 'server_ip': cp.get('server', 'ip'),
12 'server_port': cp.getint('server', 'direct_port'),
13 'client_name': cp.get('client', 'name'),
14 'user': cp.get('user', 'name'),
15 'password': cp.get('user', 'password'),
16 'is_direct_tcp': True,
17 }
18 return info
+0
-0
python3/tests/NetBIOSTwistedTests/__init__.py less more
(Empty file)
+0
-21
python3/tests/NetBIOSTwistedTests/test_queryname.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from nmb.NetBIOSProtocol import NBNSProtocol
4 from nose.tools import with_setup
5
6
7 @deferred(timeout=15.0)
8 def test_broadcast():
9 def cb(results):
10 assert results
11
12 def cleanup(r):
13 p.transport.stopListening()
14
15 p = NBNSProtocol()
16 d = p.queryName('MICHAEL-I5PC', timeout = 10)
17 d.addCallback(cb)
18 d.addBoth(cleanup)
19
20 return d
0
1 Steps to Follow to Run the Unit Tests
2 =====================================
3
4 1. Install Nose Testing Framework
5 All the unit tests here are designed to be conducted with the nose testing framework.
6 You can install the latest nose testing framework by running: easy_install nose
7 For more information on nose testing, please visit http://readthedocs.org/docs/nose/en/latest/
8
9 2. Prepare a Shared Folder "smbtest" on a Remote Server
10 To run the unit tests here, besides installing the nose testing framework, you will
11 also need to prepare a shared folder on a remote server.
12 pysmb has been tested against Samba 3.x, Windows XP SP3 and Windows Vista.
13 The shared folder must be named "smbtest".
14
15 3. Download smbtest.zip from https://miketeo.net/files/Projects/pysmb/smbtest.zip
16 Unzip the contents of this zip file in the shared folder.
17
18 4. Update Connection Details in connection.ini
19 In the same folder where you are viewing this readme file, there should be an ini file
20 called "connection.ini". Edit this file's connection details to match the shared folder's
21 access information.
22
23 5. Run the Unit Tests in the python2 folder
24 Just run: nosetests3 -v tests
25 or selectively: nosetests3 -v tests/SMBConnectionTests
33 from nose.tools import with_setup
44 from smb import smb_structs
55
6 conn = None
6 conn, conn2, conn3 = None, None, None
77
88 def teardown_func():
9 global conn
10 conn.close()
9 global conn, conn2, conn3
10 if conn:
11 conn.close()
12 if conn2:
13 conn2.close()
14 if conn3:
15 conn3.close();
1116
1217 @with_setup(teardown = teardown_func)
1318 def test_NTLMv1_auth_SMB1():
1419 global conn
15 smb_structs.SUPPORT_SMB2 = False
20 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1621 info = getConnectionInfo()
1722 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
1823 assert conn.connect(info['server_ip'], info['server_port'])
1924
25 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
26 assert not conn2.connect(info['server_ip'], info['server_port'])
27
28 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
29 assert not conn3.connect(info['server_ip'], info['server_port'])
30
2031 @with_setup(teardown = teardown_func)
2132 def test_NTLMv2_auth_SMB1():
2233 global conn
23 smb_structs.SUPPORT_SMB2 = False
34 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2435 info = getConnectionInfo()
2536 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
2637 assert conn.connect(info['server_ip'], info['server_port'])
2738
39 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 assert not conn2.connect(info['server_ip'], info['server_port'])
41
42 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert not conn3.connect(info['server_ip'], info['server_port'])
44
2845 @with_setup(teardown = teardown_func)
2946 def test_NTLMv1_auth_SMB2():
3047 global conn
31 smb_structs.SUPPORT_SMB2 = True
48 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
3249 info = getConnectionInfo()
3350 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
3451 assert conn.connect(info['server_ip'], info['server_port'])
3552
53 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
54 assert not conn2.connect(info['server_ip'], info['server_port'])
55
56 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
57 assert not conn3.connect(info['server_ip'], info['server_port'])
58
3659 @with_setup(teardown = teardown_func)
3760 def test_NTLMv2_auth_SMB2():
3861 global conn
39 smb_structs.SUPPORT_SMB2 = True
62 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
4063 info = getConnectionInfo()
4164 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
4265 assert conn.connect(info['server_ip'], info['server_port'])
66
67 conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
68 assert not conn2.connect(info['server_ip'], info['server_port'])
69
70 conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
71 assert not conn3.connect(info['server_ip'], info['server_port'])
11
22 import os, time, random
33 from smb.SMBConnection import SMBConnection
4 from smb.smb2_constants import SMB2_DIALECT_2
45 from .util import getConnectionInfo
56 from nose.tools import with_setup
67 from smb import smb_structs
910
1011 def setup_func_SMB1():
1112 global conn
12 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1314
1415 info = getConnectionInfo()
1516 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
23
24 info = getConnectionInfo()
25 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
26 assert conn.connect(info['server_ip'], info['server_port'])
27
28 def setup_func_SMB2x():
29 global conn
30 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
2131
2232 info = getConnectionInfo()
2333 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
3545 conn.createDirectory('smbtest', path)
3646
3747 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
38 names = [e.filename for e in entries]
48 names = map(lambda e: e.filename, entries)
3949 assert os.path.basename(path.replace('/', os.sep)) in names
4050
4151 conn.deleteDirectory('smbtest', path)
4252
4353 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
44 names = [e.filename for e in entries]
54 names = map(lambda e: e.filename, entries)
4555 assert os.path.basename(path.replace('/', os.sep)) not in names
4656
4757 @with_setup(setup_func_SMB2, teardown_func)
4858 def test_english_directory_SMB2():
4959 global conn
60 assert conn.smb2_dialect == SMB2_DIALECT_2
5061
5162 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
5263 conn.createDirectory('smbtest', path)
5364
5465 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
55 names = [e.filename for e in entries]
66 names = map(lambda e: e.filename, entries)
5667 assert os.path.basename(path.replace('/', os.sep)) in names
5768
5869 conn.deleteDirectory('smbtest', path)
5970
6071 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
61 names = [e.filename for e in entries]
72 names = map(lambda e: e.filename, entries)
73 assert os.path.basename(path.replace('/', os.sep)) not in names
74
75 @with_setup(setup_func_SMB2x, teardown_func)
76 def test_english_directory_SMB2x():
77 global conn
78 assert conn.smb2_dialect != SMB2_DIALECT_2
79
80 path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
81 conn.createDirectory('smbtest', path)
82
83 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
84 names = map(lambda e: e.filename, entries)
85 assert os.path.basename(path.replace('/', os.sep)) in names
86
87 conn.deleteDirectory('smbtest', path)
88
89 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
90 names = map(lambda e: e.filename, entries)
6291 assert os.path.basename(path.replace('/', os.sep)) not in names
6392
6493 @with_setup(setup_func_SMB1, teardown_func)
6594 def test_unicode_directory_SMB1():
6695 global conn
6796
68 path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
97 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
6998 conn.createDirectory('smbtest', path)
7099
71100 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
72 names = [e.filename for e in entries]
101 names = map(lambda e: e.filename, entries)
73102 assert os.path.basename(path.replace('/', os.sep)) in names
74103
75104 conn.deleteDirectory('smbtest', path)
76105
77106 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
78 names = [e.filename for e in entries]
107 names = map(lambda e: e.filename, entries)
79108 assert os.path.basename(path.replace('/', os.sep)) not in names
80109
81110 @with_setup(setup_func_SMB2, teardown_func)
82111 def test_unicode_directory_SMB2():
83112 global conn
113 assert conn.smb2_dialect == SMB2_DIALECT_2
84114
85 path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
115 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86116 conn.createDirectory('smbtest', path)
87117
88118 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
89 names = [e.filename for e in entries]
119 names = map(lambda e: e.filename, entries)
90120 assert os.path.basename(path.replace('/', os.sep)) in names
91121
92122 conn.deleteDirectory('smbtest', path)
93123
94124 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
95 names = [e.filename for e in entries]
125 names = map(lambda e: e.filename, entries)
96126 assert os.path.basename(path.replace('/', os.sep)) not in names
127
128 @with_setup(setup_func_SMB2x, teardown_func)
129 def test_unicode_directory_SMB2x():
130 global conn
131 assert conn.smb2_dialect != SMB2_DIALECT_2
132
133 path = os.sep + u'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
134 conn.createDirectory('smbtest', path)
135
136 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
137 names = map(lambda e: e.filename, entries)
138 assert os.path.basename(path.replace('/', os.sep)) in names
139
140 conn.deleteDirectory('smbtest', path)
141
142 entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
143 names = map(lambda e: e.filename, entries)
144 assert os.path.basename(path.replace('/', os.sep)) not in names
22 import os, time, random
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415
1516 info = getConnectionInfo()
1617 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1920 def setup_func_SMB2():
2021 global conn
2122 smb_structs.SUPPORT_SMB2 = True
23 smb_structs.SUPPORT_SMB2x = False
24
25 info = getConnectionInfo()
26 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
27 assert conn.connect(info['server_ip'], info['server_port'])
28
29 def setup_func_SMB2x():
30 global conn
31 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
2232
2333 info = getConnectionInfo()
2434 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
7080 @with_setup(setup_func_SMB2, teardown_func)
7181 def test_delete_SMB2():
7282 global conn
83 assert conn.smb2_dialect == SMB2_DIALECT_2
7384
7485 path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
7586 conn.createDirectory('smbtest', path)
102113 assert 'aaTest.bin' not in filenames
103114 assert 'aaBest.bin' in filenames
104115 assert 'random.txt' in filenames
116
117 @with_setup(setup_func_SMB2x, teardown_func)
118 def test_delete_SMB2x():
119 global conn
120 assert conn.smb2_dialect != SMB2_DIALECT_2
121
122 path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
123 conn.createDirectory('smbtest', path)
124
125 for filename in [ 'aaTest.txt', 'aaBest.txt', 'aaTest.bin', 'aaBest.bin', 'random.txt' ]:
126 conn.storeFile('smbtest', path+"/"+filename, BytesIO(b"0123456789"))
127
128 results = conn.listPath('smbtest', path)
129 filenames = list(map(lambda r: r.filename, results))
130 assert 'aaTest.txt' in filenames
131 assert 'aaBest.txt' in filenames
132 assert 'aaTest.bin' in filenames
133 assert 'aaBest.bin' in filenames
134 assert 'random.txt' in filenames
135
136 conn.deleteFiles('smbtest', path+'/aa*.txt')
137
138 results = conn.listPath('smbtest', path)
139 filenames = list(map(lambda r: r.filename, results))
140 assert 'aaTest.txt' not in filenames
141 assert 'aaBest.txt' not in filenames
142 assert 'aaTest.bin' in filenames
143 assert 'aaBest.bin' in filenames
144 assert 'random.txt' in filenames
145
146 conn.deleteFiles('smbtest', path+'/aaTest.*')
147
148 results = conn.listPath('smbtest', path)
149 filenames = list(map(lambda r: r.filename, results))
150 assert 'aaTest.bin' not in filenames
151 assert 'aaBest.bin' in filenames
152 assert 'random.txt' in filenames
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb2_constants import SMB2_DIALECT_2
34 from .util import getConnectionInfo
45 from nose.tools import with_setup
56 from smb import smb_structs
89
910 def setup_func_SMB1():
1011 global conn
11 smb_structs.SUPPORT_SMB2 = False
12 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
13
1214 info = getConnectionInfo()
1315 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
22
23 info = getConnectionInfo()
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
25 assert conn.connect(info['server_ip'], info['server_port'])
26
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30
1931 info = getConnectionInfo()
2032 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2133 assert conn.connect(info['server_ip'], info['server_port'])
2335 def teardown_func():
2436 global conn
2537 conn.close()
26
38
2739 @with_setup(setup_func_SMB2, teardown_func)
2840 def test_getAttributes_SMB2():
2941 global conn
42 assert conn.smb2_dialect == SMB2_DIALECT_2
43
3044 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
3145 assert info.isDirectory
32
46
3347 info = conn.getAttributes('smbtest', '/rfc1001.txt')
3448 assert not info.isDirectory
3549 assert info.file_size == 158437
3650 assert info.alloc_size == 159744
37
51
3852 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
3953 assert info.isDirectory
40
54
55 @with_setup(setup_func_SMB2x, teardown_func)
56 def test_getAttributes_SMB2x():
57 global conn
58 assert conn.smb2_dialect != SMB2_DIALECT_2
59
60 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
61 assert info.isDirectory
62
63 info = conn.getAttributes('smbtest', '/rfc1001.txt')
64 assert not info.isDirectory
65 assert info.file_size == 158437
66 assert info.alloc_size == 159744
67
68 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
69 assert info.isDirectory
70
4171 @with_setup(setup_func_SMB1, teardown_func)
4272 def test_getAttributes_SMB1():
4373 global conn
4474 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
4575 assert info.isDirectory
46
76
4777 info = conn.getAttributes('smbtest', '/rfc1001.txt')
4878 assert not info.isDirectory
4979 assert info.file_size == 158437
5080 assert info.alloc_size == 159744
51
81
5282 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
5383 assert info.isDirectory
54
55 āŽ
00 # -*- coding: utf-8 -*-
11
22 from smb.SMBConnection import SMBConnection
3 from smb.smb_constants import *
4 from smb.smb2_constants import SMB2_DIALECT_2
35 from .util import getConnectionInfo
46 from nose.tools import with_setup
57 from smb import smb_structs
810
911 def setup_func_SMB1():
1012 global conn
11 smb_structs.SUPPORT_SMB2 = False
13 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1214 info = getConnectionInfo()
1315 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1416 assert conn.connect(info['server_ip'], info['server_port'])
1618 def setup_func_SMB2():
1719 global conn
1820 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
1922 info = getConnectionInfo()
2023 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2124 assert conn.connect(info['server_ip'], info['server_port'])
2225
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29 info = getConnectionInfo()
30 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
31 assert conn.connect(info['server_ip'], info['server_port'])
32
2333 def teardown_func():
2434 global conn
2535 conn.close()
2838 def test_listPath_SMB1():
2939 global conn
3040 results = conn.listPath('smbtest', '/')
31 filenames = [( r.filename, r.isDirectory ) for r in results]
32 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
33 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
34 assert ( 'TestDir1', True ) in filenames # Test short English folder names
35 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
36 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
41 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
42 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
43 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
44 assert ( u'TestDir1', True ) in filenames # Test short English folder names
45 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
46 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
3747
3848 @with_setup(setup_func_SMB1, teardown_func)
3949 def test_listSubPath_SMB1():
4050 global conn
51 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
52 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
53 assert ( u'Test File.txt', False ) in filenames
54 assert ( u'Test Folder', True ) in filenames
55 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
56
57 @with_setup(setup_func_SMB1, teardown_func)
58 def test_listPathWithManyFiles_SMB1():
59 global conn
60 results = conn.listPath('smbtest', '/RFC Archive/')
61 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
62 assert len(filenames)==999
63
64 @with_setup(setup_func_SMB1, teardown_func)
65 def test_listPathWithManyFiles_SMB1():
66 global conn
67 results = conn.listPath('smbtest', '/RFC Archive/')
68 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
69 assert len(list(filenames))==999
70
71 @with_setup(setup_func_SMB2, teardown_func)
72 def test_listPath_SMB2():
73 global conn
74 assert conn.smb2_dialect == SMB2_DIALECT_2
75 results = conn.listPath('smbtest', '/')
76 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
77 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
78 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
79 assert ( u'TestDir1', True ) in filenames # Test short English folder names
80 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
81 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
82
83 @with_setup(setup_func_SMB2x, teardown_func)
84 def test_listPath_SMB2x():
85 global conn
86 assert conn.smb2_dialect != SMB2_DIALECT_2
87 results = conn.listPath('smbtest', '/')
88 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
89 assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
90 assert ( u'Test Folder with Long Name', True ) in filenames # Test long English folder names
91 assert ( u'TestDir1', True ) in filenames # Test short English folder names
92 assert ( u'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
93 assert ( u'rfc1001.txt', False ) in filenames # Test short English file names
94
95 @with_setup(setup_func_SMB2, teardown_func)
96 def test_listSubPath_SMB2():
97 global conn
98 assert conn.smb2_dialect == SMB2_DIALECT_2
99 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
100 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
101 assert ( u'Test File.txt', False ) in filenames
102 assert ( u'Test Folder', True ) in filenames
103 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
104
105 @with_setup(setup_func_SMB2x, teardown_func)
106 def test_listSubPath_SMB2x():
107 global conn
108 assert conn.smb2_dialect != SMB2_DIALECT_2
41109 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
42110 filenames = [( r.filename, r.isDirectory ) for r in results]
43111 assert ( 'Test File.txt', False ) in filenames
45113 assert ( 'å­ę–‡ä»¶å¤¹', True ) in filenames
46114
47115 @with_setup(setup_func_SMB2, teardown_func)
48 def test_listPath_SMB2():
49 global conn
50 results = conn.listPath('smbtest', '/')
51 filenames = [( r.filename, r.isDirectory ) for r in results]
52 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
53 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
54 assert ( 'TestDir1', True ) in filenames # Test short English folder names
55 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
56 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
57
58 @with_setup(setup_func_SMB2, teardown_func)
59 def test_listSubPath_SMB2():
60 global conn
61 results = conn.listPath('smbtest', '/Test Folder with Long Name/')
62 filenames = [( r.filename, r.isDirectory ) for r in results]
63 assert ( 'Test File.txt', False ) in filenames
64 assert ( 'Test Folder', True ) in filenames
65 assert ( 'å­ę–‡ä»¶å¤¹', True ) in filenames
116 def test_listPathWithManyFiles_SMB2():
117 global conn
118 results = conn.listPath('smbtest', '/RFC Archive/')
119 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
120 assert len(list(filenames))==999
121
122 @with_setup(setup_func_SMB1, teardown_func)
123 def test_listPathFilterForDirectory_SMB1():
124 global conn
125 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
126 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
127 assert len(list(filenames)) > 0
128 for f, isDirectory in filenames:
129 assert isDirectory
130
131 @with_setup(setup_func_SMB2, teardown_func)
132 def test_listPathFilterForDirectory_SMB2():
133 global conn
134 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
135 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
136 assert len(list(filenames)) > 0
137 for f, isDirectory in filenames:
138 assert isDirectory
139
140 @with_setup(setup_func_SMB1, teardown_func)
141 def test_listPathFilterForFiles_SMB1():
142 global conn
143 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
144 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
145 assert len(list(filenames)) > 0
146 for f, isDirectory in filenames:
147 assert not isDirectory
148
149 @with_setup(setup_func_SMB2, teardown_func)
150 def test_listPathFilterForFiles_SMB2():
151 global conn
152 results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
153 filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
154 assert len(list(filenames)) > 0
155 for f, isDirectory in filenames:
156 assert not isDirectory
157
158 @with_setup(setup_func_SMB1, teardown_func)
159 def test_listPathFilterPattern_SMB1():
160 global conn
161 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
162 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
163 assert len(filenames) == 2
164 assert ( u'Test File.txt', False ) in filenames
165 assert ( u'Test Folder', True ) in filenames
166 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
167
168 @with_setup(setup_func_SMB2, teardown_func)
169 def test_listPathFilterPattern_SMB2():
170 global conn
171 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
172 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
173 assert len(filenames) == 2
174 assert ( u'Test File.txt', False ) in filenames
175 assert ( u'Test Folder', True ) in filenames
176 assert ( u'å­ę–‡ä»¶å¤¹', True ) not in filenames
177
178 @with_setup(setup_func_SMB1, teardown_func)
179 def test_listPathFilterUnicodePattern_SMB1():
180 global conn
181 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
182 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
183 assert len(filenames) == 1
184 assert ( u'Test File.txt', False ) not in filenames
185 assert ( u'Test Folder', True ) not in filenames
186 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
187
188 @with_setup(setup_func_SMB2, teardown_func)
189 def test_listPathFilterUnicodePattern_SMB2():
190 global conn
191 results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
192 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
193 assert len(filenames) == 1
194 assert ( u'Test File.txt', False ) not in filenames
195 assert ( u'Test Folder', True ) not in filenames
196 assert ( u'å­ę–‡ä»¶å¤¹', True ) in filenames
197
198 @with_setup(setup_func_SMB1, teardown_func)
199 def test_listPathFilterEmptyList_SMB1():
200 global conn
201 results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
202 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
203
204 @with_setup(setup_func_SMB2, teardown_func)
205 def test_listPathFilterEmptyList_SMB2():
206 global conn
207 results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
208 filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from .util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1112 info = getConnectionInfo()
1213 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1314 assert conn.connect(info['server_ip'], info['server_port'])
1516 def setup_func_SMB2():
1617 global conn
1718 smb_structs.SUPPORT_SMB2 = True
19 smb_structs.SUPPORT_SMB2x = False
20 info = getConnectionInfo()
21 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
22 assert conn.connect(info['server_ip'], info['server_port'])
23
24 def setup_func_SMB2x():
25 global conn
26 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
1827 info = getConnectionInfo()
1928 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2029 assert conn.connect(info['server_ip'], info['server_port'])
2736 def test_listshares_SMB1():
2837 global conn
2938 results = conn.listShares()
30 assert 'smbtest' in [r.name.lower() for r in results]
39 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
3140
3241 @with_setup(setup_func_SMB2, teardown_func)
3342 def test_listshares_SMB2():
3443 global conn
44 assert conn.smb2_dialect == SMB2_DIALECT_2
3545 results = conn.listShares()
36 assert 'smbtest' in [r.name.lower() for r in results]
46 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
47
48 @with_setup(setup_func_SMB2x, teardown_func)
49 def test_listshares_SMB2x():
50 global conn
51 assert conn.smb2_dialect != SMB2_DIALECT_2
52 results = conn.listShares()
53 assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
00
11 from smb.SMBConnection import SMBConnection
2 from smb.smb2_constants import SMB2_DIALECT_2
23 from .util import getConnectionInfo
34 from nose.tools import with_setup
45 from smb import smb_structs
78
89 def setup_func_SMB1():
910 global conn
10 smb_structs.SUPPORT_SMB2 = False
11 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
12
1113 info = getConnectionInfo()
1214 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1315 assert conn.connect(info['server_ip'], info['server_port'])
1517 def setup_func_SMB2():
1618 global conn
1719 smb_structs.SUPPORT_SMB2 = True
20 smb_structs.SUPPORT_SMB2x = False
21
22 info = getConnectionInfo()
23 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
24 assert conn.connect(info['server_ip'], info['server_port'])
25
26 def setup_func_SMB2x():
27 global conn
28 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
29
1830 info = getConnectionInfo()
1931 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2032 assert conn.connect(info['server_ip'], info['server_port'])
3244 @with_setup(setup_func_SMB2, teardown_func)
3345 def test_listsnapshots_SMB2():
3446 global conn
47 assert conn.smb2_dialect == SMB2_DIALECT_2
3548 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
3649 assert len(results) > 0
50
51 @with_setup(setup_func_SMB2x, teardown_func)
52 def test_listsnapshots_SMB2x():
53 global conn
54 assert conn.smb2_dialect != SMB2_DIALECT_2
55 results = conn.listSnapshots('smbtest', '/rfc1001.txt')
56 assert len(results) > 0
22 import os, time, random
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1011
1112 def setup_func_SMB1():
1213 global conn
13 smb_structs.SUPPORT_SMB2 = False
14 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
1415 info = getConnectionInfo()
1516 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
1617 assert conn.connect(info['server_ip'], info['server_port'])
1819 def setup_func_SMB2():
1920 global conn
2021 smb_structs.SUPPORT_SMB2 = True
22 smb_structs.SUPPORT_SMB2x = False
2123 info = getConnectionInfo()
2224 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2426
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30 info = getConnectionInfo()
31 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
32 assert conn.connect(info['server_ip'], info['server_port'])
33
2534 def teardown_func():
2635 global conn
2736 conn.close()
3645 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
3746
3847 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
39 filenames = [e.filename for e in entries]
40 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
41 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
42
43 conn.rename('smbtest', old_path, new_path)
44
45 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
46 filenames = [e.filename for e in entries]
48 filenames = list(map(lambda e: e.filename, entries))
49 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
50 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
51
52 conn.rename('smbtest', old_path, new_path)
53
54 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
55 filenames = list(map(lambda e: e.filename, entries))
4756 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
4857 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
4958
5261 @with_setup(setup_func_SMB2, teardown_func)
5362 def test_rename_english_file_SMB2():
5463 global conn
55
56 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
57 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
58
59 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
60
61 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
62 filenames = [e.filename for e in entries]
63 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
64 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
65
66 conn.rename('smbtest', old_path, new_path)
67
68 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
69 filenames = [e.filename for e in entries]
64 assert conn.smb2_dialect == SMB2_DIALECT_2
65
66 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
67 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
68
69 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
70
71 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
72 filenames = list(map(lambda e: e.filename, entries))
73 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
74 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
75
76 conn.rename('smbtest', old_path, new_path)
77
78 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
79 filenames = list(map(lambda e: e.filename, entries))
80 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
81 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
82
83 conn.deleteFiles('smbtest', new_path)
84
85 @with_setup(setup_func_SMB2x, teardown_func)
86 def test_rename_english_file_SMB2x():
87 global conn
88 assert conn.smb2_dialect != SMB2_DIALECT_2
89
90 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
91 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
92
93 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
94
95 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
96 filenames = list(map(lambda e: e.filename, entries))
97 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
98 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
99
100 conn.rename('smbtest', old_path, new_path)
101
102 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
103 filenames = list(map(lambda e: e.filename, entries))
70104 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
71105 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
72106
76110 def test_rename_unicode_file_SMB1():
77111 global conn
78112
79 old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
80 new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
81
82 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
83
84 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
85 filenames = [e.filename for e in entries]
86 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
87 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
88
89 conn.rename('smbtest', old_path, new_path)
90
91 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
92 filenames = [e.filename for e in entries]
113 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
114 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
115
116 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
117
118 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
119 filenames = list(map(lambda e: e.filename, entries))
120 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
121 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
122
123 conn.rename('smbtest', old_path, new_path)
124
125 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
126 filenames = list(map(lambda e: e.filename, entries))
93127 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
94128 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
95129
98132 @with_setup(setup_func_SMB2, teardown_func)
99133 def test_rename_unicode_file_SMB2():
100134 global conn
101
102 old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
103 new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
104
105 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
106
107 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
108 filenames = [e.filename for e in entries]
109 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
110 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
111
112 conn.rename('smbtest', old_path, new_path)
113
114 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
115 filenames = [e.filename for e in entries]
135 assert conn.smb2_dialect == SMB2_DIALECT_2
136
137 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
138 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
139
140 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
141
142 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
143 filenames = list(map(lambda e: e.filename, entries))
144 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
145 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
146
147 conn.rename('smbtest', old_path, new_path)
148
149 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
150 filenames = list(map(lambda e: e.filename, entries))
151 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
152 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
153
154 conn.deleteFiles('smbtest', new_path)
155
156 @with_setup(setup_func_SMB2x, teardown_func)
157 def test_rename_unicode_file_SMB2x():
158 global conn
159 assert conn.smb2_dialect != SMB2_DIALECT_2
160
161 old_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
162 new_path = u'/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
163
164 conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
165
166 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
167 filenames = list(map(lambda e: e.filename, entries))
168 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
169 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
170
171 conn.rename('smbtest', old_path, new_path)
172
173 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
174 filenames = list(map(lambda e: e.filename, entries))
116175 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
117176 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
118177
128187 conn.createDirectory('smbtest', old_path)
129188
130189 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
131 filenames = [e.filename for e in entries]
132 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
133 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
134
135 conn.rename('smbtest', old_path, new_path)
136
137 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
138 filenames = [e.filename for e in entries]
190 filenames = list(map(lambda e: e.filename, entries))
191 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
192 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
193
194 conn.rename('smbtest', old_path, new_path)
195
196 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
197 filenames = list(map(lambda e: e.filename, entries))
139198 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
140199 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
141200
144203 @with_setup(setup_func_SMB2, teardown_func)
145204 def test_rename_english_directory_SMB2():
146205 global conn
147
148 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
149 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
150
151 conn.createDirectory('smbtest', old_path)
152
153 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
154 filenames = [e.filename for e in entries]
155 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
156 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
157
158 conn.rename('smbtest', old_path, new_path)
159
160 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
161 filenames = [e.filename for e in entries]
206 assert conn.smb2_dialect == SMB2_DIALECT_2
207
208 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
209 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
210
211 conn.createDirectory('smbtest', old_path)
212
213 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
214 filenames = list(map(lambda e: e.filename, entries))
215 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
216 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
217
218 conn.rename('smbtest', old_path, new_path)
219
220 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
221 filenames = list(map(lambda e: e.filename, entries))
222 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
223 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
224
225 conn.deleteDirectory('smbtest', new_path)
226
227 @with_setup(setup_func_SMB2x, teardown_func)
228 def test_rename_english_directory_SMB2x():
229 global conn
230 assert conn.smb2_dialect != SMB2_DIALECT_2
231
232 old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
233 new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
234
235 conn.createDirectory('smbtest', old_path)
236
237 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
238 filenames = list(map(lambda e: e.filename, entries))
239 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
240 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
241
242 conn.rename('smbtest', old_path, new_path)
243
244 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
245 filenames = list(map(lambda e: e.filename, entries))
162246 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
163247 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
164248
168252 def test_rename_unicode_directory_SMB1():
169253 global conn
170254
171 old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
172 new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
173
174 conn.createDirectory('smbtest', old_path)
175
176 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
177 filenames = [e.filename for e in entries]
178 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
179 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
180
181 conn.rename('smbtest', old_path, new_path)
182
183 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
184 filenames = [e.filename for e in entries]
255 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
256 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
257
258 conn.createDirectory('smbtest', old_path)
259
260 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
261 filenames = list(map(lambda e: e.filename, entries))
262 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
263 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
264
265 conn.rename('smbtest', old_path, new_path)
266
267 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
268 filenames = list(map(lambda e: e.filename, entries))
185269 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
186270 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
187271
190274 @with_setup(setup_func_SMB2, teardown_func)
191275 def test_rename_unicode_directory_SMB2():
192276 global conn
193
194 old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
195 new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
196
197 conn.createDirectory('smbtest', old_path)
198
199 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
200 filenames = [e.filename for e in entries]
201 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
202 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
203
204 conn.rename('smbtest', old_path, new_path)
205
206 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
207 filenames = [e.filename for e in entries]
208 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
209 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
210
211 conn.deleteDirectory('smbtest', new_path)
277 assert conn.smb2_dialect == SMB2_DIALECT_2
278
279 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
280 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
281
282 conn.createDirectory('smbtest', old_path)
283
284 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
285 filenames = list(map(lambda e: e.filename, entries))
286 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
287 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
288
289 conn.rename('smbtest', old_path, new_path)
290
291 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
292 filenames = list(map(lambda e: e.filename, entries))
293 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
294 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
295
296 conn.deleteDirectory('smbtest', new_path)
297
298 @with_setup(setup_func_SMB2x, teardown_func)
299 def test_rename_unicode_directory_SMB2x():
300 global conn
301 assert conn.smb2_dialect != SMB2_DIALECT_2
302
303 old_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
304 new_path = u'/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
305
306 conn.createDirectory('smbtest', old_path)
307
308 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
309 filenames = list(map(lambda e: e.filename, entries))
310 assert os.path.basename(old_path.replace('/', os.sep)) in filenames
311 assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
312
313 conn.rename('smbtest', old_path, new_path)
314
315 entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
316 filenames = list(map(lambda e: e.filename, entries))
317 assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
318 assert os.path.basename(new_path.replace('/', os.sep)) in filenames
319
320 conn.deleteDirectory('smbtest', new_path)
22 import os, tempfile
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
1718
1819 def setup_func_SMB1():
1920 global conn
20 smb_structs.SUPPORT_SMB2 = False
21 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
22
2123 info = getConnectionInfo()
2224 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2325 assert conn.connect(info['server_ip'], info['server_port'])
2527 def setup_func_SMB2():
2628 global conn
2729 smb_structs.SUPPORT_SMB2 = True
30 smb_structs.SUPPORT_SMB2x = False
31
2832 info = getConnectionInfo()
2933 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
3034 assert conn.connect(info['server_ip'], info['server_port'])
3135
36 def setup_func_SMB2x():
37 global conn
38 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
39
40 info = getConnectionInfo()
41 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
42 assert conn.connect(info['server_ip'], info['server_port'])
43
3244 def teardown_func():
3345 global conn
3446 conn.close()
5163 def test_retr_multiplereads_SMB2():
5264 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
5365 global conn
66 assert conn.smb2_dialect == SMB2_DIALECT_2
67
5468 temp_fh = BytesIO()
5569 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
5670
6175
6276 temp_fh.close()
6377
78 @with_setup(setup_func_SMB2x, teardown_func)
79 def test_retr_multiplereads_SMB2x():
80 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
81 global conn
82 assert conn.smb2_dialect != SMB2_DIALECT_2
83
84 temp_fh = BytesIO()
85 file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
86
87 md = MD5()
88 md.update(temp_fh.getvalue())
89 assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
90 assert filesize == 158437
91
92 temp_fh.close()
93
6494 @with_setup(setup_func_SMB1, teardown_func)
6595 def test_retr_longfilename_SMB1():
6696 # Test file retrieval that has a long English filename
79109 def test_retr_longfilename_SMB2():
80110 # Test file retrieval that has a long English filename
81111 global conn
112 assert conn.smb2_dialect == SMB2_DIALECT_2
113
82114 temp_fh = BytesIO()
83115 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
84116
89121
90122 temp_fh.close()
91123
124 @with_setup(setup_func_SMB2x, teardown_func)
125 def test_retr_longfilename_SMB2x():
126 # Test file retrieval that has a long English filename
127 global conn
128 assert conn.smb2_dialect != SMB2_DIALECT_2
129
130 temp_fh = BytesIO()
131 file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
132
133 md = MD5()
134 md.update(temp_fh.getvalue())
135 assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
136 assert filesize == 421269
137
138 temp_fh.close()
139
92140 @with_setup(setup_func_SMB1, teardown_func)
93141 def test_retr_unicodefilename_SMB1():
94142 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
95143 global conn
96144 temp_fh = BytesIO()
97 file_attributes, filesize = conn.retrieveFile('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
145 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
98146
99147 md = MD5()
100148 md.update(temp_fh.getvalue())
107155 def test_retr_unicodefilename_SMB2():
108156 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
109157 global conn
110 temp_fh = BytesIO()
111 file_attributes, filesize = conn.retrieveFile('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
158 assert conn.smb2_dialect == SMB2_DIALECT_2
159
160 temp_fh = BytesIO()
161 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
112162
113163 md = MD5()
114164 md.update(temp_fh.getvalue())
117167
118168 temp_fh.close()
119169
170 @with_setup(setup_func_SMB2x, teardown_func)
171 def test_retr_unicodefilename_SMB2x():
172 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
173 global conn
174 assert conn.smb2_dialect != SMB2_DIALECT_2
175
176 temp_fh = BytesIO()
177 file_attributes, filesize = conn.retrieveFile('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh)
178
179 md = MD5()
180 md.update(temp_fh.getvalue())
181 assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
182 assert filesize == 256000
183
184 temp_fh.close()
185
120186 @with_setup(setup_func_SMB1, teardown_func)
121187 def test_retr_offset_SMB1():
122188 # Test file retrieval from offset to EOF
123189 global conn
124190 temp_fh = BytesIO()
125 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
191 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
126192
127193 md = MD5()
128194 md.update(temp_fh.getvalue())
135201 def test_retr_offset_SMB2():
136202 # Test file retrieval from offset to EOF
137203 global conn
138 temp_fh = BytesIO()
139 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
204 assert conn.smb2_dialect == SMB2_DIALECT_2
205
206 temp_fh = BytesIO()
207 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
140208
141209 md = MD5()
142210 md.update(temp_fh.getvalue())
145213
146214 temp_fh.close()
147215
216 @with_setup(setup_func_SMB2x, teardown_func)
217 def test_retr_offset_SMB2x():
218 # Test file retrieval from offset to EOF
219 global conn
220 assert conn.smb2_dialect != SMB2_DIALECT_2
221
222 temp_fh = BytesIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000)
224
225 md = MD5()
226 md.update(temp_fh.getvalue())
227 assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
228 assert filesize == 156000
229
230 temp_fh.close()
231
148232 @with_setup(setup_func_SMB1, teardown_func)
149233 def test_retr_offset_and_biglimit_SMB1():
150234 # Test file retrieval from offset with a big max_length
151235 global conn
152236 temp_fh = BytesIO()
153 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
237 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
154238
155239 md = MD5()
156240 md.update(temp_fh.getvalue())
163247 def test_retr_offset_and_biglimit_SMB2():
164248 # Test file retrieval from offset with a big max_length
165249 global conn
166 temp_fh = BytesIO()
167 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
250 assert conn.smb2_dialect == SMB2_DIALECT_2
251
252 temp_fh = BytesIO()
253 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
168254
169255 md = MD5()
170256 md.update(temp_fh.getvalue())
173259
174260 temp_fh.close()
175261
262 @with_setup(setup_func_SMB2x, teardown_func)
263 def test_retr_offset_and_biglimit_SMB2x():
264 # Test file retrieval from offset with a big max_length
265 global conn
266 assert conn.smb2_dialect != SMB2_DIALECT_2
267
268 temp_fh = BytesIO()
269 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 100000)
270
271 md = MD5()
272 md.update(temp_fh.getvalue())
273 assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
274 assert filesize == 100000
275
276 temp_fh.close()
277
176278 @with_setup(setup_func_SMB1, teardown_func)
177279 def test_retr_offset_and_smalllimit_SMB1():
178280 # Test file retrieval from offset with a small max_length
179281 global conn
180282 temp_fh = BytesIO()
181 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
283 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
182284
183285 md = MD5()
184286 md.update(temp_fh.getvalue())
191293 def test_retr_offset_and_smalllimit_SMB2():
192294 # Test file retrieval from offset with a small max_length
193295 global conn
194 temp_fh = BytesIO()
195 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
296 assert conn.smb2_dialect == SMB2_DIALECT_2
297
298 temp_fh = BytesIO()
299 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
196300
197301 md = MD5()
198302 md.update(temp_fh.getvalue())
201305
202306 temp_fh.close()
203307
308 @with_setup(setup_func_SMB2x, teardown_func)
309 def test_retr_offset_and_smalllimit_SMB2x():
310 # Test file retrieval from offset with a small max_length
311 global conn
312 assert conn.smb2_dialect != SMB2_DIALECT_2
313
314 temp_fh = BytesIO()
315 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 10)
316
317 md = MD5()
318 md.update(temp_fh.getvalue())
319 assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
320 assert filesize == 10
321
322 temp_fh.close()
323
204324 @with_setup(setup_func_SMB1, teardown_func)
205325 def test_retr_offset_and_zerolimit_SMB1():
206326 # Test file retrieval from offset to EOF with max_length=0
207327 global conn
208328 temp_fh = BytesIO()
209 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
329 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
210330
211331 md = MD5()
212332 md.update(temp_fh.getvalue())
219339 def test_retr_offset_and_zerolimit_SMB2():
220340 # Test file retrieval from offset to EOF with max_length=0
221341 global conn
222 temp_fh = BytesIO()
223 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
342 assert conn.smb2_dialect == SMB2_DIALECT_2
343
344 temp_fh = BytesIO()
345 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
224346
225347 md = MD5()
226348 md.update(temp_fh.getvalue())
228350 assert filesize == 0
229351
230352 temp_fh.close()
353
354 @with_setup(setup_func_SMB2x, teardown_func)
355 def test_retr_offset_and_zerolimit_SMB2x():
356 # Test file retrieval from offset to EOF with max_length=0
357 global conn
358 assert conn.smb2_dialect != SMB2_DIALECT_2
359
360 temp_fh = BytesIO()
361 file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat', temp_fh, offset = 100000, max_length = 0)
362
363 md = MD5()
364 md.update(temp_fh.getvalue())
365 assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
366 assert filesize == 0
367
368 temp_fh.close()
0 # -*- coding: utf-8 -*-
1
2 import os, tempfile
3 from smb.SMBConnection import SMBConnection
4 from smb.smb2_constants import SMB2_DIALECT_2
5 from .util import getConnectionInfo
6 from nose.tools import with_setup
7 from smb import smb_structs
8
9 try:
10 import hashlib
11 def MD5(): return hashlib.md5()
12 except ImportError:
13 import md5
14 def MD5(): return md5.new()
15
16 conn = None
17
18 def setup_func_SMB2():
19 global conn
20 smb_structs.SUPPORT_SMB2 = True
21 smb_structs.SUPPORT_SMB2x = False
22
23 info = getConnectionInfo()
24 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
25 assert conn.connect(info['server_ip'], info['server_port'])
26
27 def setup_func_SMB2x():
28 global conn
29 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
30
31 info = getConnectionInfo()
32 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
33 assert conn.connect(info['server_ip'], info['server_port'])
34
35 def teardown_func():
36 global conn
37 conn.close()
38
39 @with_setup(setup_func_SMB2, teardown_func)
40 def test_security_SMB2():
41 global conn
42 assert conn.smb2_dialect == SMB2_DIALECT_2
43 # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
44 attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
45
46 @with_setup(setup_func_SMB2x, teardown_func)
47 def test_security_SMB2x():
48 global conn
49 assert conn.smb2_dialect != SMB2_DIALECT_2
50 # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
51 attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
22 import os, tempfile, random, time
33 from io import BytesIO
44 from smb.SMBConnection import SMBConnection
5 from smb.smb2_constants import SMB2_DIALECT_2
56 from .util import getConnectionInfo
67 from nose.tools import with_setup
78 from smb import smb_structs
2122
2223 def setup_func_SMB1():
2324 global conn
24 smb_structs.SUPPORT_SMB2 = False
25
25 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
2626 info = getConnectionInfo()
2727 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
2828 assert conn.connect(info['server_ip'], info['server_port'])
3030 def setup_func_SMB2():
3131 global conn
3232 smb_structs.SUPPORT_SMB2 = True
33
33 smb_structs.SUPPORT_SMB2x = False
3434 info = getConnectionInfo()
3535 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
3636 assert conn.connect(info['server_ip'], info['server_port'])
3737
38 def setup_func_SMB2x():
39 global conn
40 smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
41 info = getConnectionInfo()
42 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
43 assert conn.connect(info['server_ip'], info['server_port'])
44
3845 def teardown_func():
3946 global conn
4047 conn.close()
4249
4350 @with_setup(setup_func_SMB1, teardown_func)
4451 def test_store_long_filename_SMB1():
45 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
46
47 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
48 assert filesize == TEST_FILESIZE
49
50 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
51 filenames = [e.filename for e in entries]
52 assert os.path.basename(filename.replace('/', os.sep)) in filenames
53
54 buf = BytesIO()
55 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
56 assert file_size == TEST_FILESIZE
57
58 md = MD5()
59 md.update(buf.getvalue())
60 assert md.hexdigest() == TEST_DIGEST
61 buf.close()
62
63 conn.deleteFiles('smbtest', filename)
64
65
66 @with_setup(setup_func_SMB2, teardown_func)
67 def test_store_long_filename_SMB2():
68 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
69
70 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
71 assert filesize == TEST_FILESIZE
72
73 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
74 filenames = [e.filename for e in entries]
75 assert os.path.basename(filename.replace('/', os.sep)) in filenames
76
77 buf = BytesIO()
78 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
79 assert file_size == TEST_FILESIZE
80
81 md = MD5()
82 md.update(buf.getvalue())
83 assert md.hexdigest() == TEST_DIGEST
84 buf.close()
85
86 conn.deleteFiles('smbtest', filename)
87
88
89 @with_setup(setup_func_SMB1, teardown_func)
90 def test_store_unicode_filename_SMB1():
91 filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
92
93 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
94 assert filesize == TEST_FILESIZE
95
96 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
97 filenames = [e.filename for e in entries]
98 assert os.path.basename(filename.replace('/', os.sep)) in filenames
99
100 buf = BytesIO()
101 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
102 assert file_size == TEST_FILESIZE
103
104 md = MD5()
105 md.update(buf.getvalue())
106 assert md.hexdigest() == TEST_DIGEST
107 buf.close()
108
109 conn.deleteFiles('smbtest', filename)
110
52 global conn
53 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
54
55 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
56 assert filesize == TEST_FILESIZE
57
58 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
59 filenames = map(lambda e: e.filename, entries)
60 assert os.path.basename(filename.replace('/', os.sep)) in filenames
61
62 buf = BytesIO()
63 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
64 assert file_size == TEST_FILESIZE
65
66 md = MD5()
67 md.update(buf.getvalue())
68 assert md.hexdigest() == TEST_DIGEST
69 buf.close()
70
71 conn.deleteFiles('smbtest', filename)
11172
11273 @with_setup(setup_func_SMB1, teardown_func)
11374 def test_store_from_offset_SMB1():
75 global conn
11476 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
11577
11678 buf = BytesIO(b'0123456789')
13092 conn.deleteFiles('smbtest', filename)
13193
13294 @with_setup(setup_func_SMB2, teardown_func)
95 def test_store_long_filename_SMB2():
96 global conn
97 assert conn.smb2_dialect == SMB2_DIALECT_2
98
99 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
100
101 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
102 assert filesize == TEST_FILESIZE
103
104 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
105 filenames = map(lambda e: e.filename, entries)
106 assert os.path.basename(filename.replace('/', os.sep)) in filenames
107
108 buf = BytesIO()
109 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
110 assert file_size == TEST_FILESIZE
111
112 md = MD5()
113 md.update(buf.getvalue())
114 assert md.hexdigest() == TEST_DIGEST
115 buf.close()
116
117 conn.deleteFiles('smbtest', filename)
118
119
120 @with_setup(setup_func_SMB2x, teardown_func)
121 def test_store_long_filename_SMB2x():
122 global conn
123 assert conn.smb2_dialect != SMB2_DIALECT_2
124
125 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
126
127 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
128 assert filesize == TEST_FILESIZE
129
130 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
131 filenames = map(lambda e: e.filename, entries)
132 assert os.path.basename(filename.replace('/', os.sep)) in filenames
133
134 buf = BytesIO()
135 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
136 assert file_size == TEST_FILESIZE
137
138 md = MD5()
139 md.update(buf.getvalue())
140 assert md.hexdigest() == TEST_DIGEST
141 buf.close()
142
143 conn.deleteFiles('smbtest', filename)
144
145
146 @with_setup(setup_func_SMB1, teardown_func)
147 def test_store_unicode_filename_SMB1():
148 global conn
149 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
150
151 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
152 assert filesize == TEST_FILESIZE
153
154 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
155 filenames = map(lambda e: e.filename, entries)
156 assert os.path.basename(filename.replace('/', os.sep)) in filenames
157
158 buf = BytesIO()
159 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
160 assert file_size == TEST_FILESIZE
161
162 md = MD5()
163 md.update(buf.getvalue())
164 assert md.hexdigest() == TEST_DIGEST
165 buf.close()
166
167 conn.deleteFiles('smbtest', filename)
168
169
170 @with_setup(setup_func_SMB2, teardown_func)
133171 def test_store_unicode_filename_SMB2():
134 filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
135
136 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
137 assert filesize == TEST_FILESIZE
138
139 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
140 filenames = [e.filename for e in entries]
141 assert os.path.basename(filename.replace('/', os.sep)) in filenames
142
143 buf = BytesIO()
144 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
145 assert file_size == TEST_FILESIZE
146
147 md = MD5()
148 md.update(buf.getvalue())
149 assert md.hexdigest() == TEST_DIGEST
150 buf.close()
151
152 conn.deleteFiles('smbtest', filename)
172 global conn
173 assert conn.smb2_dialect == SMB2_DIALECT_2
174
175 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
176
177 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
178 assert filesize == TEST_FILESIZE
179
180 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
181 filenames = map(lambda e: e.filename, entries)
182 assert os.path.basename(filename.replace('/', os.sep)) in filenames
183
184 buf = BytesIO()
185 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
186 assert file_size == TEST_FILESIZE
187
188 md = MD5()
189 md.update(buf.getvalue())
190 assert md.hexdigest() == TEST_DIGEST
191 buf.close()
192
193 conn.deleteFiles('smbtest', filename)
194
195
196 @with_setup(setup_func_SMB2x, teardown_func)
197 def test_store_unicode_filename_SMB2x():
198 global conn
199 assert conn.smb2_dialect != SMB2_DIALECT_2
200
201 filename = os.sep + u'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
202
203 filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
204 assert filesize == TEST_FILESIZE
205
206 entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
207 filenames = map(lambda e: e.filename, entries)
208 assert os.path.basename(filename.replace('/', os.sep)) in filenames
209
210 buf = BytesIO()
211 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
212 assert file_size == TEST_FILESIZE
213
214 md = MD5()
215 md.update(buf.getvalue())
216 assert md.hexdigest() == TEST_DIGEST
217 buf.close()
218
219 conn.deleteFiles('smbtest', filename)
220
153221
154222 @with_setup(setup_func_SMB2, teardown_func)
155223 def test_store_from_offset_SMB2():
224 global conn
225 assert conn.smb2_dialect == SMB2_DIALECT_2
226
156227 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
157228
158229 buf = BytesIO(b'0123456789')
170241 buf.close()
171242
172243 conn.deleteFiles('smbtest', filename)
173 āŽ
244
245
246 @with_setup(setup_func_SMB2x, teardown_func)
247 def test_store_from_offset_SMB2x():
248 global conn
249 assert conn.smb2_dialect != SMB2_DIALECT_2
250
251 filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
252
253 buf = BytesIO(b'0123456789')
254 filesize = conn.storeFile('smbtest', filename, buf)
255 assert filesize == 10
256
257 buf = BytesIO(b'aa')
258 pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
259 assert pos == 7
260
261 buf = BytesIO()
262 file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
263 assert file_size == 10
264 assert buf.getvalue() == b'01234aa789'
265 buf.close()
266
267 conn.deleteFiles('smbtest', filename)
0 # -*- coding: utf-8 -*-
1
2 from smb.SMBConnection import SMBConnection
3 from .util import getConnectionInfo
4
5 def test_context():
6 info = getConnectionInfo()
7 with SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True) as conn:
8 assert conn.connect(info['server_ip'], info['server_port'])
9
10 assert conn.sock is None
+0
-0
python3/tests/SMBTwistedTests/__init__.py less more
(Empty file)
+0
-77
python3/tests/SMBTwistedTests/test_auth.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class AuthFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 self.d.callback(True)
22
23 def onAuthFailed(self):
24 self.d.callback(False)
25
26
27 @deferred(timeout=5.0)
28 def test_NTLMv1_auth_SMB1():
29 def result(auth_passed):
30 assert auth_passed
31
32 smb_structs.SUPPORT_SMB2 = False
33 info = getConnectionInfo()
34 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
35 factory.d.addCallback(result)
36 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
37 return factory.d
38
39
40 @deferred(timeout=5.0)
41 def test_NTLMv2_auth_SMB1():
42 def result(auth_passed):
43 assert auth_passed
44
45 smb_structs.SUPPORT_SMB2 = False
46 info = getConnectionInfo()
47 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
48 factory.d.addCallback(result)
49 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
50 return factory.d
51
52
53 @deferred(timeout=5.0)
54 def test_NTLMv1_auth_SMB2():
55 def result(auth_passed):
56 assert auth_passed
57
58 smb_structs.SUPPORT_SMB2 = True
59 info = getConnectionInfo()
60 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
61 factory.d.addCallback(result)
62 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
63 return factory.d
64
65
66 @deferred(timeout=5.0)
67 def test_NTLMv2_auth_SMB2():
68 def result(auth_passed):
69 assert auth_passed
70
71 smb_structs.SUPPORT_SMB2 = True
72 info = getConnectionInfo()
73 factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
74 factory.d.addCallback(result)
75 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
76 return factory.d
+0
-99
python3/tests/SMBTwistedTests/test_createdeletedirectory.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, random, time
3 from nose.twistedtools import reactor, deferred
4 from twisted.internet import defer
5 from smb.SMBProtocol import SMBProtocolFactory
6 from smb import smb_structs
7 from .util import getConnectionInfo
8
9
10 class DirectoryFactory(SMBProtocolFactory):
11
12 def __init__(self, *args, **kwargs):
13 SMBProtocolFactory.__init__(self, *args, **kwargs)
14 self.d = defer.Deferred()
15 self.d.addBoth(self.testDone)
16 self.service_name = ''
17 self.path = ''
18
19 def testDone(self, r):
20 if self.instance:
21 self.instance.transport.loseConnection()
22 return r
23
24 def createDone(self, result):
25 d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
26 d.addCallback(self.listComplete)
27 d.addErrback(self.d.errback)
28
29 def listComplete(self, entries):
30 names = [e.filename for e in entries]
31 assert os.path.basename(self.path.replace('/', os.sep)) in names
32
33 d = self.deleteDirectory(self.service_name, self.path)
34 d.addCallback(self.deleteDone)
35 d.addErrback(self.d.errback)
36
37 def deleteDone(self, result):
38 d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
39 d.addCallback(self.list2Complete)
40 d.addErrback(self.d.errback)
41
42 def list2Complete(self, entries):
43 names = [e.filename for e in entries]
44 assert os.path.basename(self.path.replace('/', os.sep)) not in names
45 self.d.callback(True)
46
47 def onAuthOK(self):
48 d = self.createDirectory(self.service_name, self.path)
49 d.addCallback(self.createDone)
50 d.addErrback(self.d.errback)
51
52 def onAuthFailed(self):
53 self.d.errback('Auth failed')
54
55
56 @deferred(timeout=15.0)
57 def test_english_directory_SMB1():
58 info = getConnectionInfo()
59 smb_structs.SUPPORT_SMB2 = False
60
61 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
62 factory.service_name = 'smbtest'
63 factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
64 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
65 return factory.d
66
67 @deferred(timeout=15.0)
68 def test_english_directory_SMB2():
69 info = getConnectionInfo()
70 smb_structs.SUPPORT_SMB2 = True
71
72 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
73 factory.service_name = 'smbtest'
74 factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
75 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
76 return factory.d
77
78 @deferred(timeout=15.0)
79 def test_unicode_directory_SMB1():
80 info = getConnectionInfo()
81 smb_structs.SUPPORT_SMB2 = False
82
83 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
84 factory.service_name = 'smbtest'
85 factory.path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
86 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
87 return factory.d
88
89 @deferred(timeout=15.0)
90 def test_unicode_directory_SMB2():
91 info = getConnectionInfo()
92 smb_structs.SUPPORT_SMB2 = True
93
94 factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
95 factory.service_name = 'smbtest'
96 factory.path = os.sep + 'ę–‡ä»¶å¤¹åˆ›å»ŗ %d-%d' % ( time.time(), random.randint(0, 1000) )
97 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
98 return factory.d
+0
-39
python3/tests/SMBTwistedTests/test_echo.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from .util import getConnectionInfo
5
6
7 class EchoFactory(SMBProtocolFactory):
8
9 def __init__(self, *args, **kwargs):
10 SMBProtocolFactory.__init__(self, *args, **kwargs)
11 self.d = defer.Deferred()
12 self.d.addBoth(self.testDone)
13 self.echo_data = 'This is an echo test'
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(data):
22 assert data == self.echo_data
23 self.d.callback(True)
24
25 d = self.echo(self.echo_data)
26 d.addCallback(cb)
27 d.addErrback(self.d.errback)
28
29 def onAuthFailed(self):
30 self.d.errback('Auth failed')
31
32
33 @deferred(timeout=15.0)
34 def test_echo():
35 info = getConnectionInfo()
36 factory = EchoFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
37 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
38 return factory.d
+0
-100
python3/tests/SMBTwistedTests/test_getattributes.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from util import getConnectionInfo
6
7
8 class GetAttributesFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14 self.path = ''
15 self.is_directory = False
16
17 def testDone(self, r):
18 if self.instance:
19 self.instance.transport.loseConnection()
20 return r
21
22 def onAuthOK(self):
23 def cb(info):
24 assert info.isDirectory == self.is_directory
25 self.d.callback(True)
26
27 d = self.getAttributes('smbtest', self.path, timeout = 15)
28 d.addCallback(cb)
29 d.addErrback(self.d.errback)
30
31 def onAuthFailed(self):
32 self.d.errback('Auth failed')
33
34
35 @deferred(timeout=15.0)
36 def test_getAttributes_SMB1_test1():
37 info = getConnectionInfo()
38 smb_structs.SUPPORT_SMB2 = False
39
40 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
41 factory.path = '/Test Folder with Long Name/'
42 factory.is_directory = True
43 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
44 return factory.d
45
46 @deferred(timeout=15.0)
47 def test_getAttributes_SMB1_test2():
48 info = getConnectionInfo()
49 smb_structs.SUPPORT_SMB2 = False
50
51 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
52 factory.path = '/rfc1001.txt'
53 factory.is_directory = False
54 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
55 return factory.d
56
57 @deferred(timeout=15.0)
58 def test_getAttributes_SMB1_test3():
59 info = getConnectionInfo()
60 smb_structs.SUPPORT_SMB2 = False
61
62 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
63 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
64 factory.is_directory = True
65 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
66 return factory.d
67
68 @deferred(timeout=15.0)
69 def test_getAttributes_SMB2_test1():
70 info = getConnectionInfo()
71 smb_structs.SUPPORT_SMB2 = True
72
73 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
74 factory.path = '/Test Folder with Long Name/'
75 factory.is_directory = True
76 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
77 return factory.d
78
79 @deferred(timeout=15.0)
80 def test_getAttributes_SMB2_test2():
81 info = getConnectionInfo()
82 smb_structs.SUPPORT_SMB2 = True
83
84 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
85 factory.path = '/rfc1001.txt'
86 factory.is_directory = False
87 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
88 return factory.d
89
90 @deferred(timeout=15.0)
91 def test_getAttributes_SMB2_test3():
92 info = getConnectionInfo()
93 smb_structs.SUPPORT_SMB2 = True
94
95 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
96 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
97 factory.is_directory = True
98 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
99 return factory.d
+0
-56
python3/tests/SMBTwistedTests/test_listpath.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListPathFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(results):
22 filenames = [( r.filename, r.isDirectory ) for r in results]
23 assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames # Test non-English folder names
24 assert ( 'Test Folder with Long Name', True ) in filenames # Test long English folder names
25 assert ( 'TestDir1', True ) in filenames # Test short English folder names
26 assert ( 'Implementing CIFS - SMB.html', False ) in filenames # Test long English file names
27 assert ( 'rfc1001.txt', False ) in filenames # Test short English file names
28
29 self.d.callback(True)
30
31 d = self.listPath('smbtest', '/', timeout = 15)
32 d.addCallback(cb)
33 d.addErrback(self.d.errback)
34
35 def onAuthFailed(self):
36 self.d.errback('Auth failed')
37
38
39 @deferred(timeout=15.0)
40 def test_listPath_SMB1():
41 info = getConnectionInfo()
42 smb_structs.SUPPORT_SMB2 = False
43
44 factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
45 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
46 return factory.d
47
48 @deferred(timeout=15.0)
49 def test_listPath_SMB2():
50 info = getConnectionInfo()
51 smb_structs.SUPPORT_SMB2 = True
52
53 factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
54 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
55 return factory.d
+0
-51
python3/tests/SMBTwistedTests/test_listshares.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListSharesFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14
15 def testDone(self, r):
16 if self.instance:
17 self.instance.transport.loseConnection()
18 return r
19
20 def onAuthOK(self):
21 def cb(results):
22 assert 'smbtest' in [r.name.lower() for r in results]
23 self.d.callback(True)
24 self.instance.transport.loseConnection()
25
26 d = self.listShares(timeout = 15)
27 d.addCallback(cb)
28 d.addErrback(self.d.errback)
29
30 def onAuthFailed(self):
31 self.d.errback('Auth failed')
32
33
34 @deferred(timeout=15.0)
35 def test_listshares_SMB1():
36 info = getConnectionInfo()
37 smb_structs.SUPPORT_SMB2 = False
38
39 factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
40 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
41 return factory.d
42
43 @deferred(timeout=15.0)
44 def test_listshares_SMB2():
45 info = getConnectionInfo()
46 smb_structs.SUPPORT_SMB2 = True
47
48 factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
49 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
50 return factory.d
+0
-57
python3/tests/SMBTwistedTests/test_listsnapshots.py less more
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from .util import getConnectionInfo
6
7
8 class ListSnapshotsFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14 self.service_name = None
15 self.path = None
16
17 def testDone(self, r):
18 if self.instance:
19 self.instance.transport.loseConnection()
20 return r
21
22 def onAuthOK(self):
23 def cb(results):
24 assert len(results) > 0
25 self.d.callback(True)
26 self.instance.transport.loseConnection()
27
28 d = self.listSnapshots(self.service_name, self.path, timeout = 15)
29 d.addCallback(cb)
30 d.addErrback(self.d.errback)
31
32 def onAuthFailed(self):
33 self.d.errback('Auth failed')
34
35
36 @deferred(timeout=15.0)
37 def test_listshares_SMB1():
38 info = getConnectionInfo()
39 smb_structs.SUPPORT_SMB2 = False
40
41 factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
42 factory.service_name = 'smbtest'
43 factory.path = '/rfc1001.txt'
44 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
45 return factory.d
46
47 @deferred(timeout=15.0)
48 def test_listshares_SMB2():
49 info = getConnectionInfo()
50 smb_structs.SUPPORT_SMB2 = True
51
52 factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
53 factory.service_name = 'smbtest'
54 factory.path = '/rfc1001.txt'
55 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
56 return factory.d
+0
-174
python3/tests/SMBTwistedTests/test_rename.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, random, time
3 from io import StringIO
4 from nose.twistedtools import reactor, deferred
5 from twisted.internet import defer
6 from smb.SMBProtocol import SMBProtocolFactory
7 from smb import smb_structs
8 from .util import getConnectionInfo
9
10
11 class RenameFactory(SMBProtocolFactory):
12
13 def __init__(self, *args, **kwargs):
14 SMBProtocolFactory.__init__(self, *args, **kwargs)
15 self.d = defer.Deferred()
16 self.d.addBoth(self.testDone)
17 self.service = ''
18 self.new_path = ''
19 self.old_path = ''
20
21 def testDone(self, r):
22 if self.instance:
23 self.instance.transport.loseConnection()
24 return r
25
26 def pathCreated(self, result):
27 d = self.listPath(self.service, os.path.dirname(self.old_path.replace('/', os.sep)))
28 d.addCallback(self.listComplete)
29 d.addErrback(self.d.errback)
30
31 def listComplete(self, entries):
32 filenames = [e.filename for e in entries]
33 assert os.path.basename(self.old_path.replace('/', os.sep)) in filenames
34 assert os.path.basename(self.new_path.replace('/', os.sep)) not in filenames
35
36 d = self.rename(self.service, self.old_path, self.new_path)
37 d.addCallback(self.renameComplete)
38 d.addErrback(self.d.errback)
39
40 def renameComplete(self, result):
41 d = self.listPath(self.service, os.path.dirname(self.new_path.replace('/', os.sep)))
42 d.addCallback(self.list2Complete)
43 d.addErrback(self.d.errback)
44
45 def list2Complete(self, entries):
46 filenames = [e.filename for e in entries]
47 assert os.path.basename(self.new_path.replace('/', os.sep)) in filenames
48 assert os.path.basename(self.old_path.replace('/', os.sep)) not in filenames
49 self.cleanup()
50
51 def onAuthFailed(self):
52 self.d.errback('Auth failed')
53
54
55 class RenameFileFactory(RenameFactory):
56
57 def onAuthOK(self):
58 d = self.storeFile(self.service, self.old_path, StringIO('Rename file test'))
59 d.addCallback(self.pathCreated)
60 d.addErrback(self.d.errback)
61
62 def cleanup(self):
63 d = self.deleteFiles(self.service, self.new_path)
64 d.chainDeferred(self.d)
65
66
67 class RenameDirectoryFactory(RenameFactory):
68
69 def onAuthOK(self):
70 d = self.createDirectory(self.service, self.old_path)
71 d.addCallback(self.pathCreated)
72 d.addErrback(self.d.errback)
73
74 def cleanup(self):
75 d = self.deleteDirectory(self.service, self.new_path)
76 d.chainDeferred(self.d)
77
78
79 @deferred(timeout=30.0)
80 def test_rename_english_file_SMB1():
81 info = getConnectionInfo()
82 smb_structs.SUPPORT_SMB2 = False
83
84 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
85 factory.service = 'smbtest'
86 factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
87 factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
88 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
89 return factory.d
90
91 @deferred(timeout=30.0)
92 def test_rename_english_file_SMB2():
93 info = getConnectionInfo()
94 smb_structs.SUPPORT_SMB2 = True
95
96 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
97 factory.service = 'smbtest'
98 factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
99 factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
100 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
101 return factory.d
102
103 @deferred(timeout=30.0)
104 def test_rename_unicode_file_SMB1():
105 info = getConnectionInfo()
106 smb_structs.SUPPORT_SMB2 = False
107
108 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
109 factory.service = 'smbtest'
110 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
111 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
112 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
113 return factory.d
114
115 @deferred(timeout=30.0)
116 def test_rename_unicode_file_SMB2():
117 info = getConnectionInfo()
118 smb_structs.SUPPORT_SMB2 = True
119
120 factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
121 factory.service = 'smbtest'
122 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
123 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
124 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
125 return factory.d
126
127 @deferred(timeout=30.0)
128 def test_rename_english_directory_SMB1():
129 info = getConnectionInfo()
130 smb_structs.SUPPORT_SMB2 = False
131
132 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
133 factory.service = 'smbtest'
134 factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
135 factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
136 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
137 return factory.d
138
139 @deferred(timeout=30.0)
140 def test_rename_english_directory_SMB2():
141 info = getConnectionInfo()
142 smb_structs.SUPPORT_SMB2 = True
143
144 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
145 factory.service = 'smbtest'
146 factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
147 factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
148 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
149 return factory.d
150
151 @deferred(timeout=30.0)
152 def test_rename_unicode_directory_SMB1():
153 info = getConnectionInfo()
154 smb_structs.SUPPORT_SMB2 = False
155
156 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
157 factory.service = 'smbtest'
158 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
159 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
160 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
161 return factory.d
162
163 @deferred(timeout=30.0)
164 def test_rename_unicode_directory_SMB2():
165 info = getConnectionInfo()
166 smb_structs.SUPPORT_SMB2 = True
167
168 factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
169 factory.service = 'smbtest'
170 factory.old_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
171 factory.new_path = '/ę”¹åęµ‹čƕ %d-%d' % ( time.time(), random.randint(1000, 9999) )
172 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
173 return factory.d
+0
-278
python3/tests/SMBTwistedTests/test_retrievefile.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, tempfile
3 from nose.twistedtools import reactor, deferred
4 from twisted.internet import defer
5 from smb.SMBProtocol import SMBProtocolFactory
6 from smb import smb_structs
7 from .util import getConnectionInfo
8
9 try:
10 import hashlib
11 def MD5(): return hashlib.md5()
12 except ImportError:
13 import md5
14 def MD5(): return md5.new()
15
16
17 class RetrieveFileFactory(SMBProtocolFactory):
18
19 def __init__(self, *args, **kwargs):
20 SMBProtocolFactory.__init__(self, *args, **kwargs)
21 self.d = defer.Deferred()
22 self.d.addBoth(self.testDone)
23 self.temp_fh = tempfile.NamedTemporaryFile(prefix = 'pysmbtest-')
24 self.service = ''
25 self.path = ''
26 self.digest = ''
27 self.offset = 0
28 self.max_length = -1
29 self.filesize = 0
30
31 def testDone(self, r):
32 if self.instance:
33 self.instance.transport.loseConnection()
34 return r
35
36 def fileRetrieved(self, write_result):
37 file_obj, file_attributes, file_size = write_result
38 assert file_obj == self.temp_fh
39
40 md = MD5()
41 filesize = 0
42 self.temp_fh.seek(0)
43 while True:
44 s = self.temp_fh.read(8192)
45 if not s:
46 break
47 md.update(s)
48 filesize += len(s)
49
50 assert self.filesize == filesize
51 assert md.hexdigest() == self.digest
52
53 self.temp_fh.close()
54 self.d.callback(True)
55 self.instance.transport.loseConnection()
56
57 def onAuthOK(self):
58 assert self.service
59 assert self.path
60
61 d = self.retrieveFileFromOffset(self.service, self.path, self.temp_fh, self.offset, self.max_length, timeout = 15)
62 d.addCallback(self.fileRetrieved)
63 d.addErrback(self.d.errback)
64
65 def onAuthFailed(self):
66 self.d.errback('Auth failed')
67
68
69 @deferred(timeout=30.0)
70 def test_retr_multiplereads_SMB1():
71 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
72 info = getConnectionInfo()
73 smb_structs.SUPPORT_SMB2 = False
74
75 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
76 factory.service = 'smbtest'
77 factory.path = '/rfc1001.txt'
78 factory.digest = '5367c2bbf97f521059c78eab65309ad3'
79 factory.filesize = 158437
80 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
81 return factory.d
82
83 @deferred(timeout=30.0)
84 def test_retr_multiplereads_SMB2():
85 # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
86 info = getConnectionInfo()
87 smb_structs.SUPPORT_SMB2 = True
88
89 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
90 factory.service = 'smbtest'
91 factory.path = '/rfc1001.txt'
92 factory.digest = '5367c2bbf97f521059c78eab65309ad3'
93 factory.filesize = 158437
94 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
95 return factory.d
96
97 @deferred(timeout=30.0)
98 def test_retr_longfilename_SMB1():
99 # Test file retrieval that has a long English filename
100 info = getConnectionInfo()
101 smb_structs.SUPPORT_SMB2 = False
102
103 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
104 factory.service = 'smbtest'
105 factory.path = '/Implementing CIFS - SMB.html'
106 factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
107 factory.filesize = 421269
108 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
109 return factory.d
110
111 @deferred(timeout=30.0)
112 def test_retr_longfilename_SMB2():
113 # Test file retrieval that has a long English filename
114 info = getConnectionInfo()
115 smb_structs.SUPPORT_SMB2 = True
116
117 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
118 factory.service = 'smbtest'
119 factory.path = '/Implementing CIFS - SMB.html'
120 factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
121 factory.filesize = 421269
122 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
123 return factory.d
124
125 @deferred(timeout=30.0)
126 def test_retr_unicodefilename_SMB1():
127 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
128 info = getConnectionInfo()
129 smb_structs.SUPPORT_SMB2 = False
130
131 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
132 factory.service = 'smbtest'
133 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
134 factory.digest = '8a44c1e80d55e91c92350955cdf83442'
135 factory.filesize = 256000
136 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
137 return factory.d
138
139 @deferred(timeout=30.0)
140 def test_retr_unicodefilename_SMB2():
141 # Test file retrieval that has a long non-English filename inside a folder with a non-English name
142 info = getConnectionInfo()
143 smb_structs.SUPPORT_SMB2 = True
144
145 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
146 factory.service = 'smbtest'
147 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
148 factory.digest = '8a44c1e80d55e91c92350955cdf83442'
149 factory.filesize = 256000
150 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
151 return factory.d
152
153 @deferred(timeout=30.0)
154 def test_retr_offset_SMB1():
155 # Test file retrieval from offset to EOF
156 info = getConnectionInfo()
157 smb_structs.SUPPORT_SMB2 = False
158
159 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
160 factory.service = 'smbtest'
161 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
162 factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
163 factory.filesize = 156000
164 factory.offset = 100000
165 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
166 return factory.d
167
168 @deferred(timeout=30.0)
169 def test_retr_offset_SMB2():
170 # Test file retrieval from offset to EOF
171 info = getConnectionInfo()
172 smb_structs.SUPPORT_SMB2 = True
173
174 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
175 factory.service = 'smbtest'
176 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
177 factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
178 factory.filesize = 156000
179 factory.offset = 100000
180 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
181 return factory.d
182
183 @deferred(timeout=30.0)
184 def test_retr_offset_and_biglimit_SMB1():
185 # Test file retrieval from offset with a big max_length
186 info = getConnectionInfo()
187 smb_structs.SUPPORT_SMB2 = False
188
189 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
190 factory.service = 'smbtest'
191 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
192 factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
193 factory.filesize = 100000
194 factory.offset = 100000
195 factory.max_length = 100000
196 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
197 return factory.d
198
199 @deferred(timeout=30.0)
200 def test_retr_offset_and_biglimit_SMB2():
201 # Test file retrieval from offset with a big max_length
202 info = getConnectionInfo()
203 smb_structs.SUPPORT_SMB2 = True
204
205 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
206 factory.service = 'smbtest'
207 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
208 factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
209 factory.filesize = 100000
210 factory.offset = 100000
211 factory.max_length = 100000
212 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
213 return factory.d
214
215 @deferred(timeout=30.0)
216 def test_retr_offset_and_smalllimit_SMB1():
217 # Test file retrieval from offset with a small max_length
218 info = getConnectionInfo()
219 smb_structs.SUPPORT_SMB2 = False
220
221 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
222 factory.service = 'smbtest'
223 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
224 factory.digest = '746f60a96b39b712a7b6e17ddde19986'
225 factory.filesize = 10
226 factory.offset = 100000
227 factory.max_length = 10
228 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
229 return factory.d
230
231 @deferred(timeout=30.0)
232 def test_retr_offset_and_smalllimit_SMB2():
233 # Test file retrieval from offset with a small max_length
234 info = getConnectionInfo()
235 smb_structs.SUPPORT_SMB2 = True
236
237 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
238 factory.service = 'smbtest'
239 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
240 factory.digest = '746f60a96b39b712a7b6e17ddde19986'
241 factory.filesize = 10
242 factory.offset = 100000
243 factory.max_length = 10
244 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
245 return factory.d
246
247 @deferred(timeout=30.0)
248 def test_retr_offset_and_zerolimit_SMB1():
249 # Test file retrieval from offset to EOF with max_length=0
250 info = getConnectionInfo()
251 smb_structs.SUPPORT_SMB2 = False
252
253 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
254 factory.service = 'smbtest'
255 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
256 factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
257 factory.filesize = 0
258 factory.offset = 100000
259 factory.max_length = 0
260 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
261 return factory.d
262
263 @deferred(timeout=30.0)
264 def test_retr_offset_and_zerolimit_SMB2():
265 # Test file retrieval from offset to EOF with max_length=0
266 info = getConnectionInfo()
267 smb_structs.SUPPORT_SMB2 = True
268
269 factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
270 factory.service = 'smbtest'
271 factory.path = '/굋čÆ•ę–‡ä»¶å¤¹/åžƒåœ¾ę–‡ä»¶.dat'
272 factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
273 factory.filesize = 0
274 factory.offset = 100000
275 factory.max_length = 0
276 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
277 return factory.d
+0
-141
python3/tests/SMBTwistedTests/test_storefile.py less more
0 # -*- coding: utf-8 -*-
1
2 import os, time, random
3 from io import StringIO
4 from nose.twistedtools import reactor, deferred
5 from twisted.internet import defer
6 from smb.SMBProtocol import SMBProtocolFactory
7 from smb import smb_structs
8 from .util import getConnectionInfo
9
10 try:
11 import hashlib
12 def MD5(): return hashlib.md5()
13 except ImportError:
14 import md5
15 def MD5(): return md5.new()
16
17 class StoreFilesFactory(SMBProtocolFactory):
18 """
19 A super test factory that tests store file, list files, retrieve file and delete file functionlities in sequence.
20 """
21
22 TEST_FILENAME = os.path.join(os.path.dirname(__file__), os.pardir, 'SupportFiles', 'binary.dat')
23 TEST_FILESIZE = 256000
24 TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
25
26 def __init__(self, *args, **kwargs):
27 SMBProtocolFactory.__init__(self, *args, **kwargs)
28 self.d = defer.Deferred()
29 self.d.addBoth(self.testDone)
30 self.service_name = ''
31 self.filename = ''
32
33 def testDone(self, r):
34 if self.instance:
35 self.instance.transport.loseConnection()
36 return r
37
38 def storeComplete(self, result):
39 file_obj, filesize = result
40 file_obj.close()
41 assert filesize == self.TEST_FILESIZE
42
43 d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
44 d.addCallback(self.listComplete)
45 d.addErrback(self.d.errback)
46
47 def listComplete(self, entries):
48 filenames = [e.filename for e in entries]
49 assert os.path.basename(self.filename.replace('/', os.sep)) in filenames
50
51 for entry in entries:
52 if os.path.basename(self.filename.replace('/', os.sep)) == entry.filename:
53 # The following asserts will fail if the remote machine's time is not in sync with the test machine's time
54 assert abs(entry.create_time - time.time()) < 3
55 assert abs(entry.last_access_time - time.time()) < 3
56 assert abs(entry.last_write_time - time.time()) < 3
57 assert abs(entry.last_attr_change_time - time.time()) < 3
58 break
59
60 d = self.retrieveFile(self.service_name, self.filename, StringIO())
61 d.addCallback(self.retrieveComplete)
62 d.addErrback(self.d.errback)
63
64 def retrieveComplete(self, result):
65 file_obj, file_attributes, file_size = result
66
67 md = MD5()
68 md.update(file_obj.getvalue())
69 file_obj.close()
70
71 assert file_size == self.TEST_FILESIZE
72 assert md.hexdigest() == self.TEST_DIGEST
73
74 d = self.deleteFiles(self.service_name, self.filename)
75 d.addCallback(self.deleteComplete)
76 d.addErrback(self.d.errback)
77
78 def deleteComplete(self, result):
79 d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
80 d.addCallback(self.list2Complete)
81 d.addErrback(self.d.errback)
82
83 def list2Complete(self, entries):
84 filenames = [e.filename for e in entries]
85 assert os.path.basename(self.filename.replace('/', os.sep)) not in filenames
86 self.d.callback(True)
87 self.instance.transport.loseConnection()
88
89 def onAuthOK(self):
90 d = self.storeFile(self.service_name, self.filename, open(self.TEST_FILENAME, 'rb'))
91 d.addCallback(self.storeComplete)
92 d.addErrback(self.d.errback)
93
94 def onAuthFailed(self):
95 self.d.errback('Auth failed')
96
97
98 @deferred(timeout=30.0)
99 def test_store_long_filename_SMB1():
100 info = getConnectionInfo()
101 smb_structs.SUPPORT_SMB2 = False
102
103 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
104 factory.service_name = 'smbtest'
105 factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
106 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
107 return factory.d
108
109 @deferred(timeout=30.0)
110 def test_store_long_filename_SMB2():
111 info = getConnectionInfo()
112 smb_structs.SUPPORT_SMB2 = True
113
114 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
115 factory.service_name = 'smbtest'
116 factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
117 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
118 return factory.d
119
120 @deferred(timeout=30.0)
121 def test_store_unicode_filename_SMB1():
122 info = getConnectionInfo()
123 smb_structs.SUPPORT_SMB2 = False
124
125 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
126 factory.service_name = 'smbtest'
127 factory.filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
128 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
129 return factory.d
130
131 @deferred(timeout=30.0)
132 def test_store_unicode_filename_SMB2():
133 info = getConnectionInfo()
134 smb_structs.SUPPORT_SMB2 = True
135
136 factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
137 factory.service_name = 'smbtest'
138 factory.filename = os.sep + 'äøŠč½½ęµ‹čƕ %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
139 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
140 return factory.d
+0
-19
python3/tests/SMBTwistedTests/util.py less more
0
1 import os
2 from configparser import SafeConfigParser
3
4 def getConnectionInfo():
5 config_filename = os.path.join(os.path.dirname(__file__), os.path.pardir, 'connection.ini')
6 cp = SafeConfigParser()
7 cp.read(config_filename)
8
9 info = {
10 'server_name': cp.get('server', 'name'),
11 'server_ip': cp.get('server', 'ip'),
12 'server_port': cp.getint('server', 'port'),
13 'client_name': cp.get('client', 'name'),
14 'user': cp.get('user', 'name'),
15 'password': cp.get('user', 'password'),
16 }
17 return info
18
22 name = SERVER
33 ip = 192.168.1.1
44 port = 139
5 direct_port = 445
56
67 [client]
78 name = TESTCLIENT
python3/tests/smbtest.7z less more
Binary diff not shown
0 import binascii
1
2 from smb import security_descriptors as sd
3 from smb import smb_constants as sc
4
5
6 def test_sid_string_representation():
7 sid = sd.SID(1, 5, [2, 3, 4])
8 assert str(sid) == "S-1-5-2-3-4"
9 sid = sd.SID(1, 2**32 + 3, [])
10 assert str(sid) == "S-1-0x100000003"
11 sid = sd.SID(1, 2**32, [3, 2, 1])
12 assert str(sid) == "S-1-0x100000000-3-2-1"
13
14
15 def test_sid_binary_parsing():
16 raw_sid = binascii.unhexlify(b"""
17 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
18 2a 4f da ca c1 79 a6 32 b1 04 00 00
19 """.translate(None, b' \n'))
20 assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
21 raw_sid += b"garbage"
22 assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
23 sid, tail = sd.SID.from_bytes(raw_sid, return_tail=True)
24 assert str(sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
25 assert tail == b"garbage"
26
27
28 def test_ace_binary_parsing():
29 raw_ace = binascii.unhexlify(b"""
30 00 10 24 00 ff 01 1f 00 01 05 00 00 00 00 00 05
31 15 00 00 00 de 53 c1 2a 2a 4f da ca c1 79 a6 32
32 6e 04 00 00
33 """.translate(None, b' \n'))
34 ace = sd.ACE.from_bytes(raw_ace)
35 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1134"
36 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
37 assert ace.flags == sd.ACE_FLAG_INHERITED
38 assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
39 | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
40 | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
41 | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
42 | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
43 | sc.FILE_WRITE_ATTRIBUTES)
44 assert not ace.additional_data
45
46 raw_ace = binascii.unhexlify(b"""
47 00 13 18 00 a9 00 12 00 01 02 00 00 00 00 00 05
48 20 00 00 00 21 02 00 00
49 """.translate(None, b' \n'))
50 ace = sd.ACE.from_bytes(raw_ace)
51 assert str(ace.sid) == "S-1-5-32-545"
52 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
53 assert ace.flags == (sd.ACE_FLAG_INHERITED | sd.ACE_FLAG_CONTAINER_INHERIT
54 | sd.ACE_FLAG_OBJECT_INHERIT)
55 assert ace.mask == (sc.SYNCHRONIZE | sc.READ_CONTROL | sc.FILE_READ_DATA
56 | sc.FILE_READ_EA | sc.FILE_EXECUTE
57 | sc.FILE_READ_ATTRIBUTES)
58 assert not ace.additional_data
59
60 raw_ace = binascii.unhexlify(b"""
61 01 03 24 00 a9 00 02 00 01 05 00 00 00 00 00 05
62 15 00 00 00 de 53 c1 2a 2a 4f da ca c1 79 a6 32
63 6c 04 00 00
64 """.translate(None, b' \n'))
65 ace = sd.ACE.from_bytes(raw_ace)
66 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1132"
67 assert ace.type == sd.ACE_TYPE_ACCESS_DENIED
68 assert ace.flags == (sd.ACE_FLAG_CONTAINER_INHERIT
69 | sd.ACE_FLAG_OBJECT_INHERIT)
70 assert ace.mask == (sc.READ_CONTROL | sc.FILE_READ_DATA | sc.FILE_READ_EA
71 | sc.FILE_EXECUTE | sc.FILE_READ_ATTRIBUTES)
72 assert not ace.additional_data
73
74
75 def test_acl_binary_parsing():
76 raw_acl = binascii.unhexlify(b"""
77 02 00 70 00 04 00 00 00 00 10 18 00 89 00 10 00
78 01 02 00 00 00 00 00 05 20 00 00 00 21 02 00 00
79 00 10 14 00 ff 01 1f 00 01 01 00 00 00 00 00 05
80 12 00 00 00 00 10 18 00 ff 01 1f 00 01 02 00 00
81 00 00 00 05 20 00 00 00 20 02 00 00 00 10 24 00
82 ff 01 1f 00 01 05 00 00 00 00 00 05 15 00 00 00
83 de 53 c1 2a 2a 4f da ca c1 79 a6 32 b1 04 00 00
84 """.translate(None, b' \n'))
85 acl = sd.ACL.from_bytes(raw_acl)
86 assert acl.revision == 2
87 assert len(acl.aces) == 4
88
89 ace = acl.aces[0]
90 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
91 assert str(ace.sid) == "S-1-5-32-545"
92 assert ace.flags == sd.ACE_FLAG_INHERITED
93 assert ace.mask == (sc.SYNCHRONIZE | sc.FILE_READ_DATA | sc.FILE_READ_EA
94 | sc.FILE_READ_ATTRIBUTES)
95
96 ace = acl.aces[3]
97 assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
98 assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
99 assert ace.flags == sd.ACE_FLAG_INHERITED
100 assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
101 | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
102 | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
103 | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
104 | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
105 | sc.FILE_WRITE_ATTRIBUTES)
106
107
108 def test_descriptor_binary_parsing():
109 raw_descriptor = binascii.unhexlify(b"""
110 01 00 04 84 14 00 00 00 30 00 00 00 00 00 00 00
111 4c 00 00 00 01 05 00 00 00 00 00 05 15 00 00 00
112 de 53 c1 2a 2a 4f da ca c1 79 a6 32 b1 04 00 00
113 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
114 2a 4f da ca c1 79 a6 32 01 02 00 00 02 00 70 00
115 04 00 00 00 00 10 18 00 89 00 10 00 01 02 00 00
116 00 00 00 05 20 00 00 00 21 02 00 00 00 10 14 00
117 ff 01 1f 00 01 01 00 00 00 00 00 05 12 00 00 00
118 00 10 18 00 ff 01 1f 00 01 02 00 00 00 00 00 05
119 20 00 00 00 20 02 00 00 00 10 24 00 ff 01 1f 00
120 01 05 00 00 00 00 00 05 15 00 00 00 de 53 c1 2a
121 2a 4f da ca c1 79 a6 32 b1 04 00 00
122 """.translate(None, b' \n'))
123 descriptor = sd.SecurityDescriptor.from_bytes(raw_descriptor)
124 assert descriptor.flags == (sd.SECURITY_DESCRIPTOR_SELF_RELATIVE
125 | sd.SECURITY_DESCRIPTOR_DACL_PRESENT
126 | sd.SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED)
127 assert descriptor.dacl is not None
128 assert descriptor.sacl is None
129 assert str(descriptor.owner) == "S-1-5-21-717312990-3403304746-849770945-1201"
130 assert str(descriptor.group) == "S-1-5-21-717312990-3403304746-849770945-513"
131
132 acl = descriptor.dacl
133 assert acl.revision == 2
134 assert len(acl.aces) == 4
135 assert str(acl.aces[0].sid) == sd.SID_BUILTIN_USERS
136 assert str(acl.aces[1].sid) == sd.SID_LOCAL_SYSTEM
137 assert str(acl.aces[2].sid) == sd.SID_BUILTIN_ADMINISTRATORS
138 assert str(acl.aces[3].sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
0 [egg_info]
1 tag_build =
2 tag_date = 0
3 tag_svn_revision = 0
4
77
88 setup(
99 name = "pysmb",
10 version = "1.1.19",
10 version = "1.1.26",
1111 author = "Michael Teo",
1212 author_email = "[email protected]",
1313 license = "zlib/libpng",
2626 "Operating System :: Microsoft :: Windows",
2727 "Operating System :: POSIX",
2828 "Programming Language :: Python",
29 "Programming Language :: Python :: 2.4",
30 "Programming Language :: Python :: 2.5",
31 "Programming Language :: Python :: 2.6",
3229 "Programming Language :: Python :: 2.7",
3330 "Programming Language :: Python :: 3",
3431 "Topic :: Communications :: File Sharing",
0 twisted>=15.0.0
1 pyasn1>=0.3.0
0
1 Security Descriptors
2 ====================
3
4 .. module:: smb.security_descriptors
5 :synopsis: Data structures used in Windows security descriptors.
6
7 This module implements security descriptors, and associated data
8 structures, as specified in `[MS-DTYP]`_.
9
10 .. autoclass:: SID
11 :members:
12
13 .. autoclass:: ACE
14 :members:
15
16 .. autoclass:: ACL
17 :members:
18
19 .. autoclass:: SecurityDescriptor
20 :members:
21
22 .. _[MS-DTYP]: https://msdn.microsoft.com/en-us/library/cc230273.aspx
4141
4242 # General information about the project.
4343 project = u'pysmb'
44 copyright = u'2001-2015, Michael Teo http://miketeo.net/'
44 copyright = u'2001-2018, Michael Teo http://miketeo.net/'
4545
4646 # The version info for the project you're documenting, acts as replacement for
4747 # |version| and |release|, also used in various other places throughout the
4848 # built documents.
4949 #
5050 # The short X.Y version.
51 version = '1.1.18'
51 version = '1.1.26'
5252 # The full version, including alpha/beta/rc tags.
53 release = '1.1.18'
53 release = '1.1.26'
5454
5555 # The language for content autogenerated by Sphinx. Refer to documentation
5656 # for a list of supported languages.