Codebase list pysmb / a9469f9
Update docs for pysmb 1.1.8 Michael Teo 7 years ago
51 changed file(s) with 11533 addition(s) and 10070 deletion(s). Raw diff Collapse all Expand all
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: a42114e33de6782bb30ba5a44ec67f36
2 config: 8ec856095809db2990831edf01ebc5a4
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.15 documentation</title>
8 <title>Overview: module code &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
2626 </head>
27 <body>
28 <div class="related">
27 <body role="document">
28 <div class="related" role="navigation" aria-label="related navigation">
2929 <h3>Navigation</h3>
3030 <ul>
3131 <li class="right" style="margin-right: 10px">
3232 <a href="../genindex.html" title="General Index"
3333 accesskey="I">index</a></li>
34 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
34 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
3535 </ul>
3636 </div>
37 <div class="sphinxsidebar">
37 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
3838 <div class="sphinxsidebarwrapper">
39 <div id="searchbox" style="display: none">
39 <div id="searchbox" style="display: none" role="search">
4040 <h3>Quick search</h3>
4141 <form class="search" action="../search.html" method="get">
4242 <input type="text" name="q" />
5555 <div class="document">
5656 <div class="documentwrapper">
5757 <div class="bodywrapper">
58 <div class="body">
58 <div class="body" role="main">
5959
6060 <h1>All modules for which code is available</h1>
6161 <ul><li><a href="nmb/NetBIOS.html">nmb.NetBIOS</a></li>
7171 </div>
7272 <div class="clearer"></div>
7373 </div>
74 <div class="related">
74 <div class="related" role="navigation" aria-label="related navigation">
7575 <h3>Navigation</h3>
7676 <ul>
7777 <li class="right" style="margin-right: 10px">
7878 <a href="../genindex.html" title="General Index"
7979 >index</a></li>
80 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
80 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
8181 </ul>
8282 </div>
83 <div class="footer">
83 <div class="footer" role="contentinfo">
8484 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
85 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
85 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
8686 </div>
8787 </body>
8888 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>nmb.NetBIOS &mdash; pysmb 1.1.15 documentation</title>
8 <title>nmb.NetBIOS &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for nmb.NetBIOS</h1><div class="highlight"><pre>
63
6364 <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">random</span><span class="o">,</span> <span class="nn">socket</span><span class="o">,</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">select</span>
6465 <span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">NBNS</span><span class="p">,</span> <span class="n">NotConnectedError</span>
6566 <span class="kn">from</span> <span class="nn">nmb_constants</span> <span class="kn">import</span> <span class="n">TYPE_CLIENT</span><span class="p">,</span> <span class="n">TYPE_SERVER</span><span class="p">,</span> <span class="n">TYPE_WORKSTATION</span>
6667
67 <span class="k">class</span> <span class="nc">NetBIOS</span><span class="p">(</span><span class="n">NBNS</span><span class="p">):</span>
68 <div class="viewcode-block" id="NetBIOS"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS">[docs]</a>
69 <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="s">&#39;NMB.NetBIOS&#39;</span><span class="p">)</span>
70
71 <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">broadcast</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">listen_port</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
72 <div class="viewcode-block" id="NetBIOS.__init__"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.__init__">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
68 <div class="viewcode-block" id="NetBIOS"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS">[docs]</a><span class="k">class</span> <span class="nc">NetBIOS</span><span class="p">(</span><span class="n">NBNS</span><span class="p">):</span>
69
70 <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;NMB.NetBIOS&#39;</span><span class="p">)</span>
71
72 <div class="viewcode-block" id="NetBIOS.__init__"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.__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">broadcast</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">listen_port</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
73 <span class="sd">&quot;&quot;&quot;</span>
7374 <span class="sd"> Instantiate a NetBIOS instance, and creates a IPv4 UDP socket to listen/send NBNS packets.</span>
7475
7576 <span class="sd"> :param boolean broadcast: A boolean flag to indicate if we should setup the listening UDP port in broadcast mode</span>
8081 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span><span class="p">:</span>
8182 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_BROADCAST</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
8283 <span class="k">if</span> <span class="n">listen_port</span><span class="p">:</span>
83 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">listen_port</span> <span class="p">))</span>
84
85 <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
86 <div class="viewcode-block" id="NetBIOS.close"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.close">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
84 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">listen_port</span> <span class="p">))</span></div>
85
86 <div class="viewcode-block" id="NetBIOS.close"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.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>
87 <span class="sd">&quot;&quot;&quot;</span>
8788 <span class="sd"> Close the underlying and free resources.</span>
8889
8990 <span class="sd"> The NetBIOS instance should not be used to perform any operations after this method returns.</span>
9192 <span class="sd"> :return: None</span>
9293 <span class="sd"> &quot;&quot;&quot;</span>
9394 <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>
94 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
95
96 <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> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span><span class="p">):</span></div>
97 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s">&#39;Socket is already closed&#39;</span>
95 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span></div>
96
97 <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> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span><span class="p">):</span>
98 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s1">&#39;Socket is already closed&#39;</span>
9899 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">sendto</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="p">))</span>
99100
100 <span class="k">def</span> <span class="nf">queryName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ip</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
101 <div class="viewcode-block" id="NetBIOS.queryName"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.queryName">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
101 <div class="viewcode-block" id="NetBIOS.queryName"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.queryName">[docs]</a> <span class="k">def</span> <span class="nf">queryName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ip</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
102 <span class="sd">&quot;&quot;&quot;</span>
102103 <span class="sd"> Send a query on the network and hopes that if machine matching the *name* will reply with its IP address.</span>
103104
104105 <span class="sd"> :param string ip: If the NBNSProtocol instance was instianted with broadcast=True, then this parameter can be an empty string. We will leave it to the OS to determine an appropriate broadcast address.</span>
107108 <span class="sd"> :param integer/float timeout: Number of seconds to wait for a reply, after which the method will return None</span>
108109 <span class="sd"> :return: A list of IP addresses in dotted notation (aaa.bbb.ccc.ddd). On timeout, returns None.</span>
109110 <span class="sd"> &quot;&quot;&quot;</span>
110 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s">&#39;Socket is already closed&#39;</span>
111 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s1">&#39;Socket is already closed&#39;</span>
111112
112113 <span class="n">trn_id</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mh">0xFFFF</span><span class="p">)</span>
113114 <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prepareNameQuery</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
114115 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ip</span><span class="p">:</span>
115 <span class="n">ip</span> <span class="o">=</span> <span class="s">&#39;&lt;broadcast&gt;&#39;</span>
116 <span class="n">ip</span> <span class="o">=</span> <span class="s1">&#39;&lt;broadcast&gt;&#39;</span>
116117 <span class="k">elif</span> <span class="ow">not</span> <span class="n">ip</span><span class="p">:</span>
117 <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="s">&#39;queryName: ip parameter is empty. OS might not transmit this query to the network&#39;</span><span class="p">)</span>
118 <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;queryName: ip parameter is empty. OS might not transmit this query to the network&#39;</span><span class="p">)</span>
118119
119120 <span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
120121
121 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
122
123 <span class="k">def</span> <span class="nf">queryIPForName</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">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span></div>
124 <div class="viewcode-block" id="NetBIOS.queryIPForName"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.queryIPForName">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
122 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
123
124 <div class="viewcode-block" id="NetBIOS.queryIPForName"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.queryIPForName">[docs]</a> <span class="k">def</span> <span class="nf">queryIPForName</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">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
125 <span class="sd">&quot;&quot;&quot;</span>
125126 <span class="sd"> Send a query to the machine with *ip* and hopes that the machine will reply back with its name.</span>
126127
127128 <span class="sd"> The implementation of this function is contributed by Jason Anderson.</span>
132133 <span class="sd"> :param integer/float timeout: Number of seconds to wait for a reply, after which the method will return None</span>
133134 <span class="sd"> :return: A list of string containing the names of the machine at *ip*. On timeout, returns None.</span>
134135 <span class="sd"> &quot;&quot;&quot;</span>
135 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s">&#39;Socket is already closed&#39;</span>
136 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">,</span> <span class="s1">&#39;Socket is already closed&#39;</span>
136137
137138 <span class="n">trn_id</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mh">0xFFFF</span><span class="p">)</span>
138139 <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prepareNetNameQuery</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
141142 <span class="k">if</span> <span class="n">ret</span><span class="p">:</span>
142143 <span class="k">return</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="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">TYPE_SERVER</span><span class="p">,</span> <span class="n">ret</span><span class="p">))</span>
143144 <span class="k">else</span><span class="p">:</span>
144 <span class="k">return</span> <span class="bp">None</span>
145
146 <span class="c">#</span>
147 <span class="c"># Protected Methods</span>
148 <span class="c">#</span>
149
150 <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">wait_trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span></div>
145 <span class="k">return</span> <span class="bp">None</span></div>
146
147 <span class="c1">#</span>
148 <span class="c1"># Protected Methods</span>
149 <span class="c1">#</span>
150
151 <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">wait_trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
151152 <span class="n">end_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>
152153 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
153154 <span class="k">try</span><span class="p">:</span>
174175 <span class="k">else</span><span class="p">:</span>
175176 <span class="k">raise</span> <span class="n">ex</span>
176177
177 <span class="c">#</span>
178 <span class="c"># Contributed by Jason Anderson</span>
179 <span class="c">#</span>
178 <span class="c1">#</span>
179 <span class="c1"># Contributed by Jason Anderson</span>
180 <span class="c1">#</span>
180181 <span class="k">def</span> <span class="nf">_pollForQueryPacket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">wait_trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
181182 <span class="n">end_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>
182183 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
202203 <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>
203204 <span class="k">raise</span> <span class="n">ex</span>
204205 <span class="k">else</span><span class="p">:</span>
205 <span class="k">raise</span> <span class="n">ex</span>
206 </pre></div></div>
206 <span class="k">raise</span> <span class="n">ex</span></div>
207 </pre></div>
207208
208209 </div>
209210 </div>
210211 </div>
211212 <div class="clearer"></div>
212213 </div>
213 <div class="related">
214 <div class="related" role="navigation" aria-label="related navigation">
214215 <h3>Navigation</h3>
215216 <ul>
216217 <li class="right" style="margin-right: 10px">
217218 <a href="../../genindex.html" title="General Index"
218219 >index</a></li>
219 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
220 <li><a href="../index.html" >Module code</a> &raquo;</li>
220 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
221 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
221222 </ul>
222223 </div>
223 <div class="footer">
224 <div class="footer" role="contentinfo">
224225 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
225 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
226 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
226227 </div>
227228 </body>
228229 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.15 documentation</title>
8 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for nmb.NetBIOSProtocol</h1><div class="highlight"><pre>
63
6364 <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">random</span><span class="o">,</span> <span class="nn">socket</span><span class="o">,</span> <span class="nn">time</span>
6465 <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>
6566 <span class="kn">from</span> <span class="nn">twisted.internet.protocol</span> <span class="kn">import</span> <span class="n">DatagramProtocol</span>
6869
6970 <span class="n">IP_QUERY</span><span class="p">,</span> <span class="n">NAME_QUERY</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
7071
71 <span class="k">class</span> <span class="nc">NetBIOSTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
72 <div class="viewcode-block" id="NetBIOSTimeout"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NetBIOSTimeout">[docs]</a> <span class="sd">&quot;&quot;&quot;Raised in NBNSProtocol via Deferred.errback method when queryName method has timeout waiting for reply&quot;&quot;&quot;</span>
73 <span class="k">pass</span>
74
75 <span class="k">class</span> <span class="nc">NBNSProtocol</span><span class="p">(</span><span class="n">DatagramProtocol</span><span class="p">,</span> <span class="n">NBNS</span><span class="p">):</span></div>
76 <div class="viewcode-block" id="NBNSProtocol"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol">[docs]</a>
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="s">&#39;NMB.NBNSProtocol&#39;</span><span class="p">)</span>
78
79 <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">broadcast</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">listen_port</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
80 <div class="viewcode-block" id="NBNSProtocol.__init__"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.__init__">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
72 <div class="viewcode-block" id="NetBIOSTimeout"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NetBIOSTimeout">[docs]</a><span class="k">class</span> <span class="nc">NetBIOSTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
73 <span class="sd">&quot;&quot;&quot;Raised in NBNSProtocol via Deferred.errback method when queryName method has timeout waiting for reply&quot;&quot;&quot;</span>
74 <span class="k">pass</span></div>
75
76 <div class="viewcode-block" id="NBNSProtocol"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol">[docs]</a><span class="k">class</span> <span class="nc">NBNSProtocol</span><span class="p">(</span><span class="n">DatagramProtocol</span><span class="p">,</span> <span class="n">NBNS</span><span class="p">):</span>
77
78 <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;NMB.NBNSProtocol&#39;</span><span class="p">)</span>
79
80 <div class="viewcode-block" id="NBNSProtocol.__init__"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.__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">broadcast</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">listen_port</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
81 <span class="sd">&quot;&quot;&quot;</span>
8182 <span class="sd"> Instantiate a NBNSProtocol instance.</span>
8283
8384 <span class="sd"> This automatically calls reactor.listenUDP method to start listening for incoming packets, so you **must not** call the listenUDP method again.</span>
8687 <span class="sd"> :param integer listen_port: Specifies the UDP port number to bind to for listening. If zero, OS will automatically select a free port number.</span>
8788 <span class="sd"> &quot;&quot;&quot;</span>
8889 <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span> <span class="o">=</span> <span class="n">broadcast</span>
89 <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c"># TRN ID -&gt; ( expiry_time, name, Deferred instance )</span>
90 <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c1"># TRN ID -&gt; ( expiry_time, name, Deferred instance )</span>
9091 <span class="bp">self</span><span class="o">.</span><span class="n">transport</span> <span class="o">=</span> <span class="n">reactor</span><span class="o">.</span><span class="n">listenUDP</span><span class="p">(</span><span class="n">listen_port</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
9192 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span><span class="p">:</span>
9293 <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">getHandle</span><span class="p">()</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_BROADCAST</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
93 <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">cleanupPendingTrns</span><span class="p">)</span>
94
95 <span class="k">def</span> <span class="nf">datagramReceived</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">from_info</span><span class="p">):</span></div>
94 <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">cleanupPendingTrns</span><span class="p">)</span></div>
95
96 <span class="k">def</span> <span class="nf">datagramReceived</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">from_info</span><span class="p">):</span>
9697 <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">from_info</span>
9798 <span class="n">trn_id</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">decodePacket</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
9899
99 <span class="c"># pending transaction exists for trn_id - handle it and remove from queue</span>
100 <span class="c1"># pending transaction exists for trn_id - handle it and remove from queue</span>
100101 <span class="k">if</span> <span class="n">trn_id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="p">:</span>
101102 <span class="n">_</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">trn_id</span><span class="p">)</span>
102103 <span class="k">if</span> <span class="n">ip</span> <span class="ow">is</span> <span class="n">NAME_QUERY</span><span class="p">:</span>
103 <span class="c"># decode as query packet</span>
104 <span class="c1"># decode as query packet</span>
104105 <span class="n">trn_id</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">decodeIPQueryPacket</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
105106 <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
106107
107108 <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> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span><span class="p">):</span>
108 <span class="c"># We don&#39;t use the transport.write method directly as it keeps raising DeprecationWarning for ip=&#39;&lt;broadcast&gt;&#39;</span>
109 <span class="c1"># We don&#39;t use the transport.write method directly as it keeps raising DeprecationWarning for ip=&#39;&lt;broadcast&gt;&#39;</span>
109110 <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">getHandle</span><span class="p">()</span><span class="o">.</span><span class="n">sendto</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="p">))</span>
110111
111 <span class="k">def</span> <span class="nf">queryName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ip</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
112 <div class="viewcode-block" id="NBNSProtocol.queryName"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.queryName">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
112 <div class="viewcode-block" id="NBNSProtocol.queryName"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.queryName">[docs]</a> <span class="k">def</span> <span class="nf">queryName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ip</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
113 <span class="sd">&quot;&quot;&quot;</span>
113114 <span class="sd"> Send a query on the network and hopes that if machine matching the *name* will reply with its IP address.</span>
114115
115116 <span class="sd"> :param string ip: If the NBNSProtocol instance was instianted with broadcast=True, then this parameter can be an empty string. We will leave it to the OS to determine an appropriate broadcast address.</span>
128129
129130 <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prepareNameQuery</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
130131 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ip</span><span class="p">:</span>
131 <span class="n">ip</span> <span class="o">=</span> <span class="s">&#39;&lt;broadcast&gt;&#39;</span>
132 <span class="n">ip</span> <span class="o">=</span> <span class="s1">&#39;&lt;broadcast&gt;&#39;</span>
132133 <span class="k">elif</span> <span class="ow">not</span> <span class="n">ip</span><span class="p">:</span>
133 <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="s">&#39;queryName: ip parameter is empty. OS might not transmit this query to the network&#39;</span><span class="p">)</span>
134 <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;queryName: ip parameter is empty. OS might not transmit this query to the network&#39;</span><span class="p">)</span>
134135
135136 <span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
136137
137138 <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>
138139 <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="p">[</span><span class="n">trn_id</span><span class="p">]</span> <span class="o">=</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">name</span><span class="p">,</span> <span class="n">d</span> <span class="p">)</span>
139 <span class="k">return</span> <span class="n">d</span>
140
141 <span class="k">def</span> <span class="nf">queryIPForName</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">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span></div>
142 <div class="viewcode-block" id="NBNSProtocol.queryIPForName"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
140 <span class="k">return</span> <span class="n">d</span></div>
141
142 <div class="viewcode-block" id="NBNSProtocol.queryIPForName"><a class="viewcode-back" href="../../api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName">[docs]</a> <span class="k">def</span> <span class="nf">queryIPForName</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">137</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
143 <span class="sd">&quot;&quot;&quot;</span>
143144 <span class="sd"> Send a query to the machine with *ip* and hopes that the machine will reply back with its name.</span>
144145
145146 <span class="sd"> The implementation of this function is contributed by Jason Anderson.</span>
166167 <span class="n">d2</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
167168
168169 <span class="k">def</span> <span class="nf">stripCode</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
169 <span class="k">if</span> <span class="n">ret</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># got valid response. Somehow the callback is also called when there is an error.</span>
170 <span class="k">if</span> <span class="n">ret</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="c1"># got valid response. Somehow the callback is also called when there is an error.</span>
170171 <span class="n">d</span><span class="o">.</span><span class="n">callback</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="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">TYPE_SERVER</span><span class="p">,</span> <span class="n">ret</span><span class="p">)))</span>
171172
172173 <span class="n">d2</span><span class="o">.</span><span class="n">addCallback</span><span class="p">(</span><span class="n">stripCode</span><span class="p">)</span>
173174 <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="p">[</span><span class="n">trn_id</span><span class="p">]</span> <span class="o">=</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">NAME_QUERY</span><span class="p">,</span> <span class="n">d2</span> <span class="p">)</span>
174 <span class="k">return</span> <span class="n">d</span>
175
176 <span class="k">def</span> <span class="nf">stopProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
175 <span class="k">return</span> <span class="n">d</span></div>
176
177 <span class="k">def</span> <span class="nf">stopProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
177178 <span class="n">DatagramProtocol</span><span class="o">.</span><span class="n">stopProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
178179
179180 <span class="k">def</span> <span class="nf">cleanupPendingTrns</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
180181 <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>
181182
182 <span class="c"># reply should have been received in the past</span>
183 <span class="c1"># reply should have been received in the past</span>
183184 <span class="n">expired</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="p">(</span><span class="n">expiry_time</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">d</span><span class="p">)):</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="o">.</span><span class="n">iteritems</span><span class="p">())</span>
184185
185 <span class="c"># remove expired items from dict + call errback</span>
186 <span class="c1"># remove expired items from dict + call errback</span>
186187 <span class="k">def</span> <span class="nf">expire_item</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
187188 <span class="n">trn_id</span><span class="p">,</span> <span class="p">(</span><span class="n">expiry_time</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span> <span class="o">=</span> <span class="n">item</span>
188189
194195 <span class="nb">map</span><span class="p">(</span><span class="n">expire_item</span><span class="p">,</span> <span class="n">expired</span><span class="p">)</span>
195196
196197 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="p">:</span>
197 <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">cleanupPendingTrns</span><span class="p">)</span>
198 </pre></div></div>
198 <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">cleanupPendingTrns</span><span class="p">)</span></div>
199 </pre></div>
199200
200201 </div>
201202 </div>
202203 </div>
203204 <div class="clearer"></div>
204205 </div>
205 <div class="related">
206 <div class="related" role="navigation" aria-label="related navigation">
206207 <h3>Navigation</h3>
207208 <ul>
208209 <li class="right" style="margin-right: 10px">
209210 <a href="../../genindex.html" title="General Index"
210211 >index</a></li>
211 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
212 <li><a href="../index.html" >Module code</a> &raquo;</li>
212 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
213 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
213214 </ul>
214215 </div>
215 <div class="footer">
216 <div class="footer" role="contentinfo">
216217 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
217 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
218 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
218219 </div>
219220 </body>
220221 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>smb.SMBConnection &mdash; pysmb 1.1.15 documentation</title>
8 <title>smb.SMBConnection &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for smb.SMBConnection</h1><div class="highlight"><pre>
63 <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">types</span><span class="o">,</span> <span class="nn">struct</span>
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>
6465 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
6566 <span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
6667 <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>
6768
6869
69 <span class="k">class</span> <span class="nc">SMBConnection</span><span class="p">(</span><span class="n">SMB</span><span class="p">):</span>
70 <div class="viewcode-block" id="SMBConnection"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">[docs]</a>
71 <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="s">&#39;SMB.SMBConnection&#39;</span><span class="p">)</span>
72
73 <span class="c">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
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>
7475 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
75 <span class="c">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
76 <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
7677 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
77 <span class="c">#: SMB messages will only be signed when remote server requires signing.</span>
78 <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
7879 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
7980
80 <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="s">&#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>
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="sd">&quot;&quot;&quot;</span>
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>
8283 <span class="sd"> Create a new SMBConnection instance.</span>
8384
8485 <span class="sd"> *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
110111 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
111112 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
112113 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
113 <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>
114
115 <span class="c">#</span>
116 <span class="c"># SMB (and its superclass) Methods</span>
117 <span class="c">#</span>
118
119 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
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>
120121 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">True</span>
121122
122123 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
129130 <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>
130131 <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>
131132 <span class="k">if</span> <span class="n">sent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
132 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Server disconnected&#39;</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>
133134 <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>
134135
135 <span class="c">#</span>
136 <span class="c"># Misc Properties</span>
137 <span class="c">#</span>
136 <span class="c1">#</span>
137 <span class="c1"># Misc Properties</span>
138 <span class="c1">#</span>
138139
139140 <span class="nd">@property</span>
140141 <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
141 <div class="viewcode-block" id="SMBConnection.isUsingSMB2"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.isUsingSMB2">[docs]</a> <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>
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>
142143 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span>
143144
144145
145 <span class="c">#</span>
146 <span class="c"># Public Methods</span>
147 <span class="c">#</span>
148
149 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
151152 <span class="sd"> Establish the SMB connection to the remote SMB/CIFS server.</span>
152153
153154 <span class="sd"> You must call this method before attempting any of the file operations with the remote server.</span>
174175 <span class="k">finally</span><span class="p">:</span>
175176 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
176177
177 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span>
178
179 <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
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="sd">&quot;&quot;&quot;</span>
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>
181182 <span class="sd"> Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</span>
182183 <span class="sd"> &quot;&quot;&quot;</span>
183184 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
184185 <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>
185 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
186
187 <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></div>
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="sd">&quot;&quot;&quot;</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>
189190 <span class="sd"> Retrieve a list of shared resources on remote server.</span>
190191
191192 <span class="sd"> :return: A list of :doc:`smb.base.SharedDevice&lt;smb_SharedDevice&gt;` instances describing the shared resource</span>
192193 <span class="sd"> &quot;&quot;&quot;</span>
193194 <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>
194 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
195196
196197 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
197198
211212 <span class="k">finally</span><span class="p">:</span>
212213 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
213214
214 <span class="k">return</span> <span class="n">results</span>
215
216 <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></div>
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="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>
218 <span class="n">pattern</span> <span class="o">=</span> <span class="s">&#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>
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>
219220 <span class="sd">&quot;&quot;&quot;</span>
220221 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
221222
227228 <span class="sd"> :return: A list of :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instances.</span>
228229 <span class="sd"> &quot;&quot;&quot;</span>
229230 <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>
230 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
231232
232233 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
233234
247248 <span class="k">finally</span><span class="p">:</span>
248249 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
249250
250 <span class="k">return</span> <span class="n">results</span>
251
252 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
254255 <span class="sd"> Retrieve a list of available snapshots (shadow copies) for *path*.</span>
255256
256257 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
260261 <span class="sd"> :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone</span>
261262 <span class="sd"> &quot;&quot;&quot;</span>
262263 <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>
263 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
264265
265266 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
266267
280281 <span class="k">finally</span><span class="p">:</span>
281282 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
282283
283 <span class="k">return</span> <span class="n">results</span>
284
285 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
287288 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
288 <span class="sd"> </span>
289
289290 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
290291 <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>
291292 <span class="sd"> :return: A :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
292293 <span class="sd"> &quot;&quot;&quot;</span>
293294 <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>
294 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
295296
296297 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
297298
311312 <span class="k">finally</span><span class="p">:</span>
312313 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
313314
314 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
315
316 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
318319 <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>
319320
320321 <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>
325326 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
326327 <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>
327328 <span class="sd"> &quot;&quot;&quot;</span>
328 <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>
329
330 <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></div>
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="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>
332333 <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>
333334
334335 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
341342 <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>
342343 <span class="sd"> &quot;&quot;&quot;</span>
343344 <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>
344 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
345346
346347 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
347348
361362 <span class="k">finally</span><span class="p">:</span>
362363 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
363364
364 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
365
366 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
368369 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
369370 <span class="sd"> If the file already exists on the remote server, it will be truncated and overwritten.</span>
370371
374375 <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>
375376 <span class="sd"> :return: Number of bytes uploaded</span>
376377 <span class="sd"> &quot;&quot;&quot;</span>
377 <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>
378
379 <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></div>
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="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>
381382 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
382383
383384 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
389390 <span class="sd"> :return: the file position where the next byte will be written.</span>
390391 <span class="sd"> &quot;&quot;&quot;</span>
391392 <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>
392 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
393394
394395 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
395396
409410 <span class="k">finally</span><span class="p">:</span>
410411 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
411412
412 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
413
414 <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></div>
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="sd">&quot;&quot;&quot;</span>
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>
416417 <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>
417418
418419 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
422423 <span class="sd"> :return: None</span>
423424 <span class="sd"> &quot;&quot;&quot;</span>
424425 <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>
425 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
426427
427428 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
428429 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
437438 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
438439 <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>
439440 <span class="k">finally</span><span class="p">:</span>
440 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
441
442 <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></div>
443 <div class="viewcode-block" id="SMBConnection.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.createDirectory">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
444476 <span class="sd"> Creates a new directory *path* on the *service_name*.</span>
445477
446478 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
449481 <span class="sd"> :return: None</span>
450482 <span class="sd"> &quot;&quot;&quot;</span>
451483 <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>
452 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
453485
454486 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
455487 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
464496 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
465497 <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>
466498 <span class="k">finally</span><span class="p">:</span>
467 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
468
469 <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></div>
470 <div class="viewcode-block" id="SMBConnection.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteDirectory">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
471503 <span class="sd"> Delete the empty folder at *path* on *service_name*</span>
472504
473505 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
476508 <span class="sd"> :return: None</span>
477509 <span class="sd"> &quot;&quot;&quot;</span>
478510 <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>
479 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
480512
481513 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
482514 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
491523 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
492524 <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>
493525 <span class="k">finally</span><span class="p">:</span>
494 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
495
496 <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></div>
497 <div class="viewcode-block" id="SMBConnection.rename"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.rename">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
498530 <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>
499531
500532 <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>
504536 <span class="sd"> :return: None</span>
505537 <span class="sd"> &quot;&quot;&quot;</span>
506538 <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>
507 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
508540
509541 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
510542 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
519551 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
520552 <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>
521553 <span class="k">finally</span><span class="p">:</span>
522 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
523
524 <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></div>
525 <div class="viewcode-block" id="SMBConnection.echo"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.echo">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
526558 <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>
527559
528560 <span class="sd"> :param string data: Data to send to the remote server.</span>
529561 <span class="sd"> :return: The *data* parameter</span>
530562 <span class="sd"> &quot;&quot;&quot;</span>
531563 <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>
532 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
533565
534566 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
535567
549581 <span class="k">finally</span><span class="p">:</span>
550582 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
551583
552 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
553
554 <span class="c">#</span>
555 <span class="c"># Protected Methods</span>
556 <span class="c">#</span>
557
558 <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></div>
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>
559591 <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>
560592 <span class="n">read_len</span> <span class="o">=</span> <span class="mi">4</span>
561 <span class="n">data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
593 <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
562594
563595 <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>
564596 <span class="k">try</span><span class="p">:</span>
576608 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
577609 <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>
578610 <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>
579 <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span> <span class="ow">is</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</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>
580612 <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>
581613 <span class="k">raise</span> <span class="n">ex</span>
582614 <span class="k">else</span><span class="p">:</span>
583615 <span class="k">raise</span> <span class="n">ex</span>
584616
585 <span class="nb">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="s">&#39;&gt;BBH&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
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>
586618 <span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="mh">0x01</span><span class="p">:</span>
587619 <span class="n">length</span> <span class="o">=</span> <span class="n">length</span> <span class="o">|</span> <span class="mh">0x10000</span>
588620
603635 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
604636 <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>
605637 <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>
606 <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span> <span class="ow">is</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</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>
607639 <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>
608640 <span class="k">raise</span> <span class="n">ex</span>
609641 <span class="k">else</span><span class="p">:</span>
610642 <span class="k">raise</span> <span class="n">ex</span>
611643
612 <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>
613 </pre></div></div>
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>
614646
615647 </div>
616648 </div>
617649 </div>
618650 <div class="clearer"></div>
619651 </div>
620 <div class="related">
652 <div class="related" role="navigation" aria-label="related navigation">
621653 <h3>Navigation</h3>
622654 <ul>
623655 <li class="right" style="margin-right: 10px">
624656 <a href="../../genindex.html" title="General Index"
625657 >index</a></li>
626 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
627 <li><a href="../index.html" >Module code</a> &raquo;</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>
628660 </ul>
629661 </div>
630 <div class="footer">
662 <div class="footer" role="contentinfo">
631663 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
632 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
664 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
633665 </div>
634666 </body>
635667 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>smb.SMBProtocol &mdash; pysmb 1.1.15 documentation</title>
8 <title>smb.SMBProtocol &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for smb.SMBProtocol</h1><div class="highlight"><pre>
63
6364 <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>
6465 <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>
6566 <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>
6869 <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>
6970
7071
71 <span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span> <span class="s">&#39;SMBProtocolFactory&#39;</span><span class="p">,</span> <span class="s">&#39;NotConnectedError&#39;</span><span class="p">,</span> <span class="s">&#39;NotReadyError&#39;</span> <span class="p">]</span>
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>
7273
7374
7475 <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>
7576
76 <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="s">&#39;SMB.SMBProtocol&#39;</span><span class="p">)</span>
77
78 <span class="c">#</span>
79 <span class="c"># Protocol Methods</span>
80 <span class="c">#</span>
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>
8182
8283 <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
8384 <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>
9394 <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>
9495 <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>
9596
96 <span class="c">#</span>
97 <span class="c"># SMB (and its superclass) Methods</span>
98 <span class="c">#</span>
97 <span class="c1">#</span>
98 <span class="c1"># SMB (and its superclass) Methods</span>
99 <span class="c1">#</span>
99100
100101 <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>
101102 <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>
110111 <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>
111112
112113 <span class="k">def</span> <span class="nf">onNMBSessionFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
113 <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="s">&#39;Cannot establish NetBIOS session. You might have provided a wrong remote_name&#39;</span><span class="p">)</span>
114
115 <span class="c">#</span>
116 <span class="c"># Protected Methods</span>
117 <span class="c">#</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>
118119
119120 <span class="k">def</span> <span class="nf">_cleanupPendingRequests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
120121 <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>
121122 <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>
122124 <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>
123125 <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>
124126 <span class="k">try</span><span class="p">:</span>
125127 <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>
126128 <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="k">pass</span>
127 <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>
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>
128133
129134 <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>
130135
131136
132 <span class="k">class</span> <span class="nc">SMBProtocolFactory</span><span class="p">(</span><span class="n">ClientFactory</span><span class="p">):</span>
133 <div class="viewcode-block" id="SMBProtocolFactory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory">[docs]</a>
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
134139 <span class="n">protocol</span> <span class="o">=</span> <span class="n">SMBProtocol</span>
135 <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="s">&#39;SMB.SMBFactory&#39;</span><span class="p">)</span>
136
137 <span class="c">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</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>
138143 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
139 <span class="c">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
144 <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
140145 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
141 <span class="c">#: SMB messages will only be signed when remote server requires signing.</span>
146 <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
142147 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
143148
144 <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="s">&#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>
145 <div class="viewcode-block" id="SMBProtocolFactory.__init__"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.__init__">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
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>
146151 <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>
147152 <span class="sd"> Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
148153 <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>
175180 <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>
176181 <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>
177182 <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>
178 <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="c">#: The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</span>
179
180 <span class="c">#</span>
181 <span class="c"># Public Property</span>
182 <span class="c">#</span>
183
184 <span class="nd">@property</span></div>
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>
185190 <span class="k">def</span> <span class="nf">isReady</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
186 <div class="viewcode-block" id="SMBProtocolFactory.isReady"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isReady">[docs]</a> <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>
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>
187192 <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>
188193
189 <span class="nd">@property</span></div>
194 <span class="nd">@property</span>
190195 <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
191 <div class="viewcode-block" id="SMBProtocolFactory.isUsingSMB2"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">[docs]</a> <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>
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>
192197 <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>
193198
194 <span class="c">#</span>
195 <span class="c"># Public Methods for Callbacks</span>
196 <span class="c">#</span>
197
198 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
199 <div class="viewcode-block" id="SMBProtocolFactory.onAuthOK"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthOK">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
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>
200205 <span class="sd"> Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
201206 <span class="sd"> This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
202207 <span class="sd"> File operations can proceed when this method has been called.</span>
203208 <span class="sd"> &quot;&quot;&quot;</span>
204 <span class="k">pass</span>
205
206 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
207 <div class="viewcode-block" id="SMBProtocolFactory.onAuthFailed"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">[docs]</a> <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>
208213 <span class="sd"> Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
209214 <span class="sd"> This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
210215
213218 <span class="sd"> 2. Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</span>
214219 <span class="sd"> 3. Call ``reactor.connectTCP`` with the new instance to re-establish the SMB connection</span>
215220 <span class="sd"> &quot;&quot;&quot;</span>
216 <span class="k">pass</span>
217
218 <span class="c">#</span>
219 <span class="c"># Public Methods</span>
220 <span class="c">#</span>
221
222 <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></div>
223 <div class="viewcode-block" id="SMBProtocolFactory.listShares"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listShares">[docs]</a> <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>
224229 <span class="sd"> Retrieve a list of shared resources on remote server.</span>
225230
226231 <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>
227232 <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>
228233 <span class="sd"> &quot;&quot;&quot;</span>
229234 <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>
230 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
231236
232237 <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>
233238 <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>
234 <span class="k">return</span> <span class="n">d</span>
235
236 <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></div>
237 <div class="viewcode-block" id="SMBProtocolFactory.listPath"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listPath">[docs]</a> <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>
238 <span class="n">pattern</span> <span class="o">=</span> <span class="s">&#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>
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>
239244 <span class="sd">&quot;&quot;&quot;</span>
240245 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
241246
248253 <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>
249254 <span class="sd"> &quot;&quot;&quot;</span>
250255 <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>
251 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
252257
253258 <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>
254259 <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>
255 <span class="k">return</span> <span class="n">d</span>
256
257 <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></div>
258 <div class="viewcode-block" id="SMBProtocolFactory.listSnapshots"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listSnapshots">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
259264 <span class="sd"> Retrieve a list of available snapshots (a.k.a. shadow copies) for *path*.</span>
260265
261266 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
266271 <span class="sd"> instances in GMT/UTC time zone</span>
267272 <span class="sd"> &quot;&quot;&quot;</span>
268273 <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>
269 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
270275
271276 <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>
272277 <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>
273 <span class="k">return</span> <span class="n">d</span>
274
275 <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></div>
276 <div class="viewcode-block" id="SMBProtocolFactory.getAttributes"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
277282 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
278 <span class="sd"> </span>
283
279284 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
280285 <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>
281286 <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>
282287 <span class="sd"> &quot;&quot;&quot;</span>
283288 <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>
284 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
285290
286291 <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>
287292 <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>
288 <span class="k">return</span> <span class="n">d</span>
289
290 <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></div>
291 <div class="viewcode-block" id="SMBProtocolFactory.retrieveFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFile">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
292297 <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>
293298
294299 <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>
303308 <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>
304309 <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>
305310 <span class="sd"> &quot;&quot;&quot;</span>
306 <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>
307
308 <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></div>
309 <div class="viewcode-block" id="SMBProtocolFactory.retrieveFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">[docs]</a> <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>
310315 <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>
311316
312317 <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>
323328 <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>
324329 <span class="sd"> &quot;&quot;&quot;</span>
325330 <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>
326 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
327332
328333 <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>
329334 <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>
330 <span class="k">return</span> <span class="n">d</span>
331
332 <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></div>
333 <div class="viewcode-block" id="SMBProtocolFactory.storeFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.storeFile">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
334339 <span class="sd"> Store the contents of the *file_obj* at *path* on the *service_name*.</span>
335340
336341 <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>
345350 <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>
346351 <span class="sd"> &quot;&quot;&quot;</span>
347352 <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>
348 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
349354
350355 <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>
351356 <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>
352 <span class="k">return</span> <span class="n">d</span>
353
354 <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></div>
355 <div class="viewcode-block" id="SMBProtocolFactory.deleteFiles"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteFiles">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
356361 <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>
357362
358363 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
363368 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path_file_pattern* parameter.</span>
364369 <span class="sd"> &quot;&quot;&quot;</span>
365370 <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>
366 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
367372
368373 <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>
369374 <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>
370 <span class="k">return</span> <span class="n">d</span>
371
372 <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></div>
373 <div class="viewcode-block" id="SMBProtocolFactory.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.createDirectory">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
374379 <span class="sd"> Creates a new directory *path* on the *service_name*.</span>
375380
376381 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
380385 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
381386 <span class="sd"> &quot;&quot;&quot;</span>
382387 <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>
383 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
384389
385390 <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>
386391 <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>
387 <span class="k">return</span> <span class="n">d</span>
388
389 <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></div>
390 <div class="viewcode-block" id="SMBProtocolFactory.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
391396 <span class="sd"> Delete the empty folder at *path* on *service_name*</span>
392397
393398 <span class="sd"> :param string/unicode service_name: Contains the name of the shared folder.</span>
397402 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
398403 <span class="sd"> &quot;&quot;&quot;</span>
399404 <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>
400 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
401406
402407 <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>
403408 <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>
404 <span class="k">return</span> <span class="n">d</span>
405
406 <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></div>
407 <div class="viewcode-block" id="SMBProtocolFactory.rename"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.rename">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
408413 <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>
409414
410415 <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>
415420 <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>
416421 <span class="sd"> &quot;&quot;&quot;</span>
417422 <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>
418 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
419424
420425 <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>
421426 <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>
422 <span class="k">return</span> <span class="n">d</span>
423
424 <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></div>
425 <div class="viewcode-block" id="SMBProtocolFactory.echo"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.echo">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
426431 <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>
427432
428433 <span class="sd"> :param string data: Data to send to the remote server.</span>
430435 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.</span>
431436 <span class="sd"> &quot;&quot;&quot;</span>
432437 <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>
433 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</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>
434439
435440 <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>
436441 <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>
437 <span class="k">return</span> <span class="n">d</span>
438
439 <span class="k">def</span> <span class="nf">closeConnection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
440 <div class="viewcode-block" id="SMBProtocolFactory.closeConnection"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.closeConnection">[docs]</a> <span class="sd">&quot;&quot;&quot;</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>
441446 <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>
442447
443448 <span class="sd"> :return: None</span>
444449 <span class="sd"> &quot;&quot;&quot;</span>
445450 <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>
446 <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s">&#39;Not connected to server&#39;</span><span class="p">)</span>
447
448 <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>
449
450 <span class="c">#</span>
451 <span class="c"># ClientFactory methods</span>
452 <span class="c"># (Do not touch these unless you know what you are doing)</span>
453 <span class="c">#</span>
454
455 <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></div>
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>
456461 <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>
457462 <span class="n">p</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">self</span>
458 <span class="k">return</span> <span class="n">p</span>
459 </pre></div></div>
463 <span class="k">return</span> <span class="n">p</span></div>
464 </pre></div>
460465
461466 </div>
462467 </div>
463468 </div>
464469 <div class="clearer"></div>
465470 </div>
466 <div class="related">
471 <div class="related" role="navigation" aria-label="related navigation">
467472 <h3>Navigation</h3>
468473 <ul>
469474 <li class="right" style="margin-right: 10px">
470475 <a href="../../genindex.html" title="General Index"
471476 >index</a></li>
472 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
473 <li><a href="../index.html" >Module code</a> &raquo;</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>
474479 </ul>
475480 </div>
476 <div class="footer">
481 <div class="footer" role="contentinfo">
477482 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
478 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
483 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
479484 </div>
480485 </body>
481486 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>smb.base &mdash; pysmb 1.1.15 documentation</title>
8 <title>smb.base &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for smb.base</h1><div class="highlight"><pre>
63
6364 <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>
6465 <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
6566 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
7778 <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">sha256</span>
7879
7980
80 <span class="k">class</span> <span class="nc">NotReadyError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
81 <div class="viewcode-block" id="NotReadyError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotReadyError">[docs]</a> <span class="sd">&quot;&quot;&quot;Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)&quot;&quot;&quot;</span>
82 <span class="k">pass</span>
83
84 <span class="k">class</span> <span class="nc">NotConnectedError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span></div>
85 <div class="viewcode-block" id="NotConnectedError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotConnectedError">[docs]</a> <span class="sd">&quot;&quot;&quot;Raised when underlying SMB connection has been disconnected or not connected yet&quot;&quot;&quot;</span>
86 <span class="k">pass</span>
87
88 <span class="k">class</span> <span class="nc">SMBTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span></div>
89 <div class="viewcode-block" id="SMBTimeout"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.SMBTimeout">[docs]</a> <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>
90 <span class="k">pass</span>
91
92
93 <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></div>
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>
9495 <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>
95 <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="s">&quot;utf-8&quot;</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>
9697 <span class="k">return</span> <span class="n">string</span>
9798
9899
111112 <span class="sd"> - [MS-CIFS]: 3.2.1</span>
112113 <span class="sd"> &quot;&quot;&quot;</span>
113114
114 <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="s">&#39;SMB.SMB&#39;</span><span class="p">)</span>
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>
115116
116117 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
117118 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
118119 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
119120
120 <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="s">&#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>
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>
121122 <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>
122123 <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>
123124 <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>
124125 <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>
125126 <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>
126127 <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>
127 <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="c">#: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1</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>
128129 <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>
129 <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="c">#: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True</span>
130 <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="c">#: MID mapped to _PendingRequest instance</span>
131 <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="c">#: Share name mapped to TID</span>
132 <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="c">#: 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>
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>
133134
134135 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">False</span>
135136 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
136 <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="c">#: 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>
137 <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="c">#: Session key for signing packets, if signing is active. Similar to SigningSessionKey as described in [MS-CIFS] 3.2.1.2</span>
138 <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="c">#: Contains the challenge response for signing, if signing is active. Similar to SigningChallengeResponse as described in [MS-CIFS] 3.2.1.2</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>
139140 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>
140141 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="mi">0</span>
141 <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="c">#: Similar to ClientNextSendSequenceNumber as described in [MS-CIFS] 3.2.1.2</span>
142
143 <span class="c"># SMB1 and SMB2 attributes</span>
144 <span class="c"># Note that the interpretations of the values may differ between SMB1 and SMB2 protocols</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>
145146 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="mi">0</span>
146 <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="c">#: Initialized from the SecurityMode field of the SMB_COM_NEGOTIATE message</span>
147
148 <span class="c"># SMB1 attributes</span>
149 <span class="c"># Most of the following attributes will be initialized upon receipt of SMB_COM_NEGOTIATE message from server (via self._updateServerInfo_SMB1 method)</span>
150 <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="c">#: Similar to PlaintextAuthenticationPolicy in in [MS-CIFS] 3.2.1.1</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>
151152 <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>
152 <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="c">#: Similar to MaxBufferSize as described in [MS-CIFS] 3.2.1.1</span>
153 <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="c">#: Similar to MaxMpxCount as described in [MS-CIFS] 3.2.1.1</span>
154
155 <span class="c"># SMB2 attributes</span>
156 <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="c">#: Similar to MaxReadSize as described in [MS-SMB2] 2.2.4</span>
157 <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="c">#: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4</span>
158 <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="c">#: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4</span>
159 <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="c">#: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method</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>
160161
161162 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB1Methods</span><span class="p">()</span>
162163
163 <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="s">&#39;Authentication with remote machine &quot;</span><span class="si">%s</span><span class="s">&quot; for user &quot;</span><span class="si">%s</span><span class="s">&quot; will be using NTLM </span><span class="si">%s</span><span class="s"> authentication (</span><span class="si">%s</span><span class="s"> extended security)&#39;</span><span class="p">,</span>
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>
164165 <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>
165 <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="s">&#39;v2&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s">&#39;v1&#39;</span><span class="p">,</span>
166 <span class="p">(</span><span class="n">SUPPORT_EXTENDED_SECURITY</span> <span class="ow">and</span> <span class="s">&#39;with&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s">&#39;without&#39;</span><span class="p">)</span>
167
168
169 <span class="c">#</span>
170 <span class="c"># NMBSession Methods</span>
171 <span class="c">#</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>
172173
173174 <span class="k">def</span> <span class="nf">onNMBSessionOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
174175 <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>
181182 <span class="k">try</span><span class="p">:</span>
182183 <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>
183184 <span class="k">except</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">:</span>
184 <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="s">&#39;Now switching over to SMB2 protocol communication&#39;</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>
185186 <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>
186 <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="c"># Must reset messageID counter, or else remote SMB2 server will disconnect</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>
187188 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB2Methods</span><span class="p">()</span>
188189 <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>
189190 <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>
194195
195196 <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
196197 <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>
197 <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="s">&#39;Received SMB message &quot;</span><span class="si">%s</span><span class="s">&quot; (command:0x</span><span class="si">%2X</span><span class="s"> flags:0x</span><span class="si">%02X</span><span class="s"> flags2:0x</span><span class="si">%04X</span><span class="s"> TID:</span><span class="si">%d</span><span class="s"> UID:</span><span class="si">%d</span><span class="s">)&#39;</span><span class="p">,</span>
198 <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="s">&#39;&lt;unknown&gt;&#39;</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>
199200 <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>
200201 <span class="k">else</span><span class="p">:</span>
201 <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="s">&#39;Received SMB2 message &quot;</span><span class="si">%s</span><span class="s">&quot; (command:0x</span><span class="si">%04X</span><span class="s"> flags:0x</span><span class="si">%04x</span><span class="s">)&#39;</span><span class="p">,</span>
202 <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="s">&#39;&lt;unknown&gt;&#39;</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>
203204 <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>
204205 <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>
205 <span class="c"># We need to create a new instance instead of calling reset() because the instance could be captured in the message history.</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>
206207 <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>
207208
208209 <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>
210211 <span class="k">else</span><span class="p">:</span>
211212 <span class="k">break</span>
212213
213 <span class="c">#</span>
214 <span class="c"># Public Methods for Overriding in Subclasses</span>
215 <span class="c">#</span>
214 <span class="c1">#</span>
215 <span class="c1"># Public Methods for Overriding in Subclasses</span>
216 <span class="c1">#</span>
216217
217218 <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
218219 <span class="k">pass</span>
220221 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
221222 <span class="k">pass</span>
222223
223 <span class="c">#</span>
224 <span class="c"># Protected Methods</span>
225 <span class="c">#</span>
224 <span class="c1">#</span>
225 <span class="c1"># Protected Methods</span>
226 <span class="c1">#</span>
226227
227228 <span class="k">def</span> <span class="nf">_setupSMB1Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
228229 <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMBMessage</span>
240241 <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>
241242 <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>
242243 <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>
243245 <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>
244246 <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>
245247 <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>
261263 <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>
262264 <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>
263265 <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>
264267 <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>
265268 <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>
266269 <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>
270273 <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>
271274 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span>
272275
273 <span class="c">#</span>
274 <span class="c"># SMB2 Methods Family</span>
275 <span class="c">#</span>
276 <span class="c1">#</span>
277 <span class="c1"># SMB2 Methods Family</span>
278 <span class="c1">#</span>
276279
277280 <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>
278281 <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>
287290 <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>
288291
289292 <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>
290 <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="s">&#39;MID is </span><span class="si">%d</span><span class="s">. Signature is </span><span class="si">%s</span><span class="s">. Total raw message is </span><span class="si">%d</span><span class="s"> 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>
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>
291294 <span class="k">else</span><span class="p">:</span>
292295 <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>
293296 <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>
301304 <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>
302305 <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>
303306 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
304 <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="s">&#39;SMB2 dialect negotiation successful&#39;</span><span class="p">)</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>
305308 <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>
306309 <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>
307310 <span class="k">else</span><span class="p">:</span>
308 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s">) 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>
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>
309312 <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>
310313 <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>
311314 <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>
314317 <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>
315318 <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>
316319 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
317 <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="s">&#39;Authentication (on SMB2) successful!&#39;</span><span class="p">)</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>
318321 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
319322 <span class="k">else</span><span class="p">:</span>
320 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s">&#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>
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>
321324 <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>
322325 <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>
323 <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="c"># STATUS_MORE_PROCESSING_REQUIRED</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>
324327 <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>
325328 <span class="k">try</span><span class="p">:</span>
326329 <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>
328331 <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>
329332 <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>
330333 <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>
331 <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="c"># STATUS_LOGON_FAILURE</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>
332335 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
333 <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="s">&#39;Authentication (on SMB2) failed. Please check username and password.&#39;</span><span class="p">)</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>
334337 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
335338 <span class="k">else</span><span class="p">:</span>
336 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s">) 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>
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>
337340 <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>
338341
339342 <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>
348351 <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>
349352 <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>
350353 <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>
351 <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="c"># SMB2 never allows plaintext authentication</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>
352355
353356
354357 <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>
360363 <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>
361364 <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>
362365
363 <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="s">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s">&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>
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>
364367
365368 <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>
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="s">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s">&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>
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>
367370 <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>
368371 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
369372 <span class="n">server_challenge</span><span class="p">,</span>
371374 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
372375
373376 <span class="k">else</span><span class="p">:</span>
374 <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="s">&#39;Performing NTLMv1 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s">&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>
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>
375378 <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>
376379
377380 <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>
382385 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
383386
384387 <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>
385 <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="s">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s">&quot; (</span><span class="si">%d</span><span class="s"> 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>
386 <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="s">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s">&quot; (</span><span class="si">%d</span><span class="s"> 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>
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>
387390
388391 <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>
389392 <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>
390393
391394 <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>
392 <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="s">&#39;Server requires all SMB messages to be signed&#39;</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>
393396 <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>
394397 <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>
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="s">&#39;Server supports SMB signing&#39;</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>
396399 <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>
397400 <span class="k">else</span><span class="p">:</span>
398401 <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>
399402
400403 <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>
401 <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="s">&quot;SMB signing activated. All SMB messages will be signed.&quot;</span><span class="p">)</span>
402 <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="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="mi">16</span><span class="p">)[:</span><span class="mi">16</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>
403406 <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>
404407 <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>
405408 <span class="k">else</span><span class="p">:</span>
406409 <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>
407410 <span class="k">else</span><span class="p">:</span>
408 <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="s">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</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>
409412
410413
411414 <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>
412415 <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>
413 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
414417
415418 <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>
416 <span class="n">path</span> <span class="o">=</span> <span class="s">&#39;IPC$&#39;</span>
419 <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
417420 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
418421
419422 <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
420 <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="s">&#39;srvsvc&#39;</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>
421424 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
422425 <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>
423426 <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>
435438 <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>
436439 <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>
437440 <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>
438 <span class="c"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
439 <span class="c"># 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>
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>
440443 <span class="n">data_bytes</span> <span class="o">=</span> \
441 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
442 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
443 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&quot;&quot;&quot;</span>
444 <span class="s">b8 10 b8 10 00 00 00 00 02 00 00 00 00 00 01 00</span>
445 <span class="s">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
446 <span class="s">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
447 <span class="s">2b 10 48 60 02 00 00 00 01 00 01 00 c8 4f 32 4b</span>
448 <span class="s">70 16 d3 01 12 78 5a 47 bf 6e e1 88 03 00 00 00</span>
449 <span class="s">2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00</span>
450 <span class="s">01 00 00 00</span>
451 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</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>
452455 <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>
453456 <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>
454457 <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>
455458 <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>
456459 <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>
457460 <span class="k">else</span><span class="p">:</span>
458 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
459462
460463 <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>
461464 <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>
462465 <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>
463 <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="s">&#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>
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>
464467 <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>
465468 <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>
466 <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="s">&#39;fid&#39;</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>
467470 <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>
468471 <span class="k">else</span><span class="p">:</span>
469 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s">&#39;Failed to list shares: Unable to read from Server Service RPC endpoint&#39;</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>
470473
471474 <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>
472475 <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>
473476 <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>
474477 <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>
475478
476 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
477 <span class="n">remote_name</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\\\\</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span>
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>
478481 <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>
479482 <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>
480483 <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>
481 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</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>
482485 <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
483486
484 <span class="c"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
485 <span class="c"># 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>
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>
486489 <span class="n">data_bytes</span> <span class="o">=</span> \
487 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
488 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#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> \
489 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
490 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#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> \
491 <span class="p">(</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</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="s">&quot;&quot;&quot;</span>
493 <span class="s">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
494 <span class="s">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
495 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span>
496 <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="s">&#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>
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>
497500 <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>
498501 <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>
499 <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="s">&#39;fid&#39;</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>
500503 <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>
501504 <span class="k">else</span><span class="p">:</span>
502 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s">&#39;Failed to list shares: Unable to bind to Server Service RPC endpoint&#39;</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>
503506
504507 <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>
505508 <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>
506509 <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>
507 <span class="c"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</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>
508511 <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>
509512
510513 <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>
511 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
512 <span class="k">else</span><span class="p">:</span>
513 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
514 <span class="k">else</span><span class="p">:</span>
515 <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="s">&#39;fid&#39;</span><span class="p">])</span>
516 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
517522
518523 <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>
519 <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="s">&#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>
520 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span> <span class="c"># A list of SharedDevice instances</span>
521 <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="c"># You need to study the byte stream to understand the meaning of these constants</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>
522527 <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>
523 <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="s">&#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>
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>
524529 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
525530
526531 <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>
527 <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="s">&#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>
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>
528533 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
529 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</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>
530535
531536 <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>
532537 <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>
533538 <span class="k">else</span><span class="p">:</span>
534539 <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>
535540
536 <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="s">&#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>
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>
537542 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
538 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</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>
539544
540545 <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>
541546 <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>
560565 <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>
561566
562567 <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>
563 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
564 <span class="k">else</span><span class="p">:</span>
565 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
566 <span class="k">else</span><span class="p">:</span>
567 <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="s">&#39;fid&#39;</span><span class="p">])</span>
568 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
569574
570575 <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>
571576 <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>
575580 <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>
576581
577582 <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>
578 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
579 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;results&#39;</span><span class="p">])</span>
580 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
581 <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="s">&#39;error&#39;</span><span class="p">],</span> <span class="n">messages_history</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>
582587
583588 <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>
584589 <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>
587592 <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>
588593 <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>
589594 <span class="k">else</span><span class="p">:</span>
590 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
591
592 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
593598 <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>
594599 <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>
595600 <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>
598603
599604 <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>
600605 <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>
601 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
602607
603608 <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>
604 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
605 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
606611 <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>
607 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
608613 <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>
609614 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
610615 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
611616
612617 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
613 <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="s">&quot;&quot;&quot;</span>
614 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
615 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
616 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
617 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
618 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
619 <span class="s">51 46 69 64 00 00 00 00</span>
620 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
621626 <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>
622627 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
623628 <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>
635640 <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>
636641 <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>
637642 <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>
638 <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="s">&#39;&#39;</span><span class="p">)</span>
639 <span class="k">else</span><span class="p">:</span>
640 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
641646
642647 <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>
643648 <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>
644 <span class="n">info_class</span> <span class="o">=</span> <span class="mh">0x03</span><span class="p">,</span> <span class="c"># FileBothDirectoryInformation</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>
645650 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
646651 <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>
647652 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
652657 <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>
653658 <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>
654659 <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>
655 <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="s">&#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>
656 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_buf</span><span class="p">)</span>
657 <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="c"># STATUS_NO_MORE_FILES</span>
658 <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="s">&#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>
659 <span class="k">else</span><span class="p">:</span>
660 <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="s">&#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>
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>
661666
662667 <span class="k">def</span> <span class="nf">decodeQueryStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
663 <span class="c"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
664 <span class="n">info_format</span> <span class="o">=</span> <span class="s">&#39;&lt;IIQQQQQQIIIBB24s&#39;</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>
665670 <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>
666671
667672 <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>
679684 <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>
680685 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
681686
682 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
683 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
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>
684689 <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>
685690 <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>
686691 <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>
689694 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
690695 <span class="k">else</span><span class="p">:</span>
691696 <span class="k">break</span>
692 <span class="k">return</span> <span class="s">&#39;&#39;</span>
697 <span class="k">return</span> <span class="s1">&#39;&#39;</span>
693698
694699 <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>
695700 <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>
699704 <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>
700705
701706 <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>
702 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
703 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;results&#39;</span><span class="p">])</span>
704 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
705 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s">&#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="s">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</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>
706711
707712 <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>
708713 <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>
711716 <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>
712717 <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>
713718 <span class="k">else</span><span class="p">:</span>
714 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
715
716 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
717722 <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>
718723 <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>
719724 <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>
722727
723728 <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>
724729 <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>
725 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
726
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
727732 <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>
728 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
729 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
730735 <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>
731 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
732737 <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>
733738 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
734739
735740 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
736 <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="s">&quot;&quot;&quot;</span>
737 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
738 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
739 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
740 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
741 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
742 <span class="s">51 46 69 64 00 00 00 00</span>
743 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
744749 <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>
745750 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
746751 <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>
764769 <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>
765770 <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>
766771 <span class="k">else</span><span class="p">:</span>
767 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
768773
769774 <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>
770775 <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>
774779 <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>
775780
776781 <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>
777 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
778 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;info&#39;</span><span class="p">])</span>
779 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
780 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s">&#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="s">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</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>
781786
782787 <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>
783788 <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>
786791 <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>
787792 <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>
788793 <span class="k">else</span><span class="p">:</span>
789 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
790
791 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
792797 <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>
793798 <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>
794799 <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>
800805
801806 <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>
802807 <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>
803 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
804809
805810 <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>
806 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
807 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
808813 <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>
809 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
810815 <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>
811816 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
812817 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
813818
814819 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
815 <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="s">&quot;&quot;&quot;</span>
816 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
817 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
818 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
819 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
820 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
821 <span class="s">51 46 69 64 00 00 00 00</span>
822 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
823828 <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>
824829 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
825830 <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>
841846 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
842847 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
843848 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
844 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x16</span><span class="p">,</span> <span class="c"># FileStreamInformation [MS-FSCC] 2.4</span>
845 <span class="n">input_buf</span> <span class="o">=</span> <span class="s">&#39;&#39;</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>
846851 <span class="n">output_buf_len</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">))</span>
847852 <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>
848853 <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>
850855 <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>
851856 <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>
852857 <span class="k">else</span><span class="p">:</span>
853 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
854859
855860 <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>
856861 <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>
857862 <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>
858 <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="s">&#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>
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>
859864 <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>
860 <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="s">&#39;fid&#39;</span><span class="p">])</span>
861 <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="s">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="mi">0</span> <span class="p">))</span> <span class="c"># Note that this is a tuple of 3-elements</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>
862867 <span class="k">else</span><span class="p">:</span>
863868 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">max_length</span>
864869 <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>
865870 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span>
866871 <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>
867872 <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>
868 <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="s">&#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="s">&#39;file_attributes&#39;</span><span class="p">])</span>
869 <span class="k">else</span><span class="p">:</span>
870 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
871876
872877 <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>
873878 <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>
881886 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">)</span>
882887
883888 <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>
884 <span class="c"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</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>
885890 <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>
886891 <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>
887892 <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>
888893
889 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;remaining_len&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">data_len</span>
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>
890895
891896 <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>
892 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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="s">&#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="s">&#39;file_attributes&#39;</span><span class="p">])</span>
893 <span class="k">else</span><span class="p">:</span>
894 <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="s">&#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="s">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;read_len&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</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>
895900 <span class="k">else</span><span class="p">:</span>
896901 <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>
897 <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="s">&#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>
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>
898903
899904 <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>
900905 <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>
904909 <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>
905910
906911 <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>
907 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
908 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;ret&#39;</span><span class="p">])</span>
909 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
910 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
911916
912917 <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>
913918 <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>
916921 <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>
917922 <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>
918923 <span class="k">else</span><span class="p">:</span>
919 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
920
921 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
922927 <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>
923928 <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>
924929 <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>
930935
931936 <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>
932937 <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>
933 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
934
935 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
936 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
937942 <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>
938 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
939944 <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>
940945 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
941946
942947 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
943 <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="s">&quot;&quot;&quot;</span>
944 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
945 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
946 <span class="s">00 00 00 00 00 00 00 00 20 00 00 00 10 00 04 00</span>
947 <span class="s">00 00 18 00 08 00 00 00 41 6c 53 69 00 00 00 00</span>
948 <span class="s">85 62 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
949 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
950 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
951 <span class="s">51 46 69 64 00 00 00 00</span>
952 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
953958 <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>
954959 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">ATTR_ARCHIVE</span><span class="p">,</span>
955 <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">WRITE_DAC</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</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>
956961 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
957962 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
958963 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
969974 <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>
970975 <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>
971976 <span class="k">else</span><span class="p">:</span>
972 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
973978
974979 <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>
975980 <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>
984989 <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>
985990
986991 <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>
987 <span class="c"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</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>
988993 <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>
989 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;offset&#39;</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>
990995 <span class="k">else</span><span class="p">:</span>
991996 <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>
992 <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="s">&#39;fid&#39;</span><span class="p">])</span>
993 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
994999
9951000 <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>
9961001 <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>
10001005 <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>
10011006
10021007 <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>
1003 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1004 <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="s">&#39;offset&#39;</span><span class="p">]</span> <span class="p">))</span> <span class="c"># Note that this is a tuple of 2-elements</span>
1005 <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1006 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
10071012
10081013 <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>
10091014 <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>
10121017 <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>
10131018 <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>
10141019 <span class="k">else</span><span class="p">:</span>
1015 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1016
1017 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
10181023 <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>
10191024 <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>
10201025 <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>
10241029
10251030 <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>
10261031 <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>
1027 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
10281033
10291034 <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>
1030 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1031 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
10321037 <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>
1033 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
10341039 <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>
10351040 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
10361041
10371042 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1038 <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="s">&quot;&quot;&quot;</span>
1039 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1040 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1041 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1042 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1043 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1044 <span class="s">51 46 69 64 00 00 00 00</span>
1045 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
10461051 <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>
10471052 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
10481053 <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>
10621067 <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>
10631068 <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>
10641069 <span class="k">else</span><span class="p">:</span>
1065 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
10661071
10671072 <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>
10681073 <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>
10691074 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
10701075 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1071 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="c"># SMB2_FILE_DISPOSITION_INFO</span>
1072 <span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x01</span><span class="s">&#39;</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>
10731083 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
10741084 <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>
10751085 <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>
10781088 <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>
10791089 <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>
10801090 <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>
1081 <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="s">&#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>
1082 <span class="k">else</span><span class="p">:</span>
1083 <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="s">&#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>
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>
10841094
10851095 <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>
10861096 <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>
10901100 <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>
10911101
10921102 <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>
1093 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</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>
10941104 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
10951105 <span class="k">else</span><span class="p">:</span>
1096 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
10971107
10981108 <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>
10991109 <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>
11021112 <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>
11031113 <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>
11041114 <span class="k">else</span><span class="p">:</span>
1105 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1106
1107 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
11081215 <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>
11091216 <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>
11101217 <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>
11131220
11141221 <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>
11151222 <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>
1116 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
11171224
11181225 <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>
1119 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1120 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
11211228 <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>
1122 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
11231230 <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>
11241231 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
11251232
11261233 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1127 <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="s">&quot;&quot;&quot;</span>
1128 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1129 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1130 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1131 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1132 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1133 <span class="s">51 46 69 64 00 00 00 00</span>
1134 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
11351242 <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>
11361243 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1137 <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">WRITE_DAC</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>
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>
11381245 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
11391246 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
11401247 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
11511258 <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>
11521259 <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>
11531260 <span class="k">else</span><span class="p">:</span>
1154 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to create directory </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
11551262
11561263 <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>
11571264 <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>
11701277 <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>
11711278 <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>
11721279 <span class="k">else</span><span class="p">:</span>
1173 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to create directory </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1174
1175 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
11761283 <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>
11771284 <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>
11781285 <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>
11811288
11821289 <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>
11831290 <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>
1184 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
11851292
11861293 <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>
1187 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1188 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
11891296 <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>
1190 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
11911298 <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>
11921299 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
11931300
11941301 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1195 <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="s">&quot;&quot;&quot;</span>
1196 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1197 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1198 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1199 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1200 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1201 <span class="s">51 46 69 64 00 00 00 00</span>
1202 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
12031310 <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>
12041311 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
12051312 <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>
12191326 <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>
12201327 <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>
12211328 <span class="k">else</span><span class="p">:</span>
1222 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
12231330
12241331 <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>
12251332 <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>
12261333 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
12271334 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1228 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="c"># SMB2_FILE_DISPOSITION_INFO</span>
1229 <span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x01</span><span class="s">&#39;</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>
12301337 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
12311338 <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>
12321339 <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>
12351342 <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>
12361343 <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>
12371344 <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>
1238 <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="s">&#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>
1239 <span class="k">else</span><span class="p">:</span>
1240 <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="s">&#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>
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>
12411348
12421349 <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>
12431350 <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>
12471354 <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>
12481355
12491356 <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>
1250 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</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>
12511358 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
12521359 <span class="k">else</span><span class="p">:</span>
1253 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
12541361
12551362 <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>
12561363 <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>
12591366 <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>
12601367 <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>
12611368 <span class="k">else</span><span class="p">:</span>
1262 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1263
1264 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
12651372 <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>
12661373 <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>
12671374 <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>
12701377
12711378 <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>
12721379 <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>
1273 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
12741381
12751382 <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>
12761383 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
12771384
1278 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1279 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</span>
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>
12801387 <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>
1281 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
12821389 <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>
12831390
1284 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1285 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</span>
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>
12861393 <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>
1287 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
12881395 <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>
1289
1396
12901397 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1291 <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="s">&quot;&quot;&quot;</span>
1292 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1293 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1294 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1295 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1296 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1297 <span class="s">51 46 69 64 00 00 00 00</span>
1298 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
12991406 <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>
13001407 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
13011408 <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>
13151422 <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>
13161423 <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>
13171424 <span class="k">else</span><span class="p">:</span>
1318 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to rename </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
13191426
13201427 <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>
1321 <span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x00</span><span class="s">&#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="s">&#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="s">&#39;UTF-16LE&#39;</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>
13221429 <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>
13231430 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
13241431 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1325 <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="c"># SMB2_FILE_RENAME_INFO</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>
13261433 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
13271434 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
13281435 <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>
13321439 <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>
13331440 <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>
13341441 <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>
1335 <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="s">&#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>
1336 <span class="k">else</span><span class="p">:</span>
1337 <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="s">&#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>
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>
13381445
13391446 <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>
13401447 <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>
13441451 <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>
13451452
13461453 <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>
1347 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</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>
13481455 <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>
13491456 <span class="k">else</span><span class="p">:</span>
1350 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to rename </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
13511458
13521459 <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>
13531460 <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>
13561463 <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>
13571464 <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>
13581465 <span class="k">else</span><span class="p">:</span>
1359 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to rename </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1360
1361 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
13621469 <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>
13631470 <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>
13641471 <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>
13671474
13681475 <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>
13691476 <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>
1370 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
13711478
13721479 <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>
1373 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1374 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
13751482 <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>
1376 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
13771484 <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>
13781485 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
13791486
13801487 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1381 <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="s">&quot;&quot;&quot;</span>
1382 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1383 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1384 <span class="s">00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00</span>
1385 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1386 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</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>
13871494 <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>
13881495 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
13891496 <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>
14031510 <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>
14041511 <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>
14051512 <span class="k">else</span><span class="p">:</span>
1406 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
14071514
14081515 <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>
14091516 <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>
1410 <span class="n">ctlcode</span> <span class="o">=</span> <span class="mh">0x00144064</span><span class="p">,</span> <span class="c"># FSCTL_SRV_ENUMERATE_SNAPSHOTS</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>
14111518 <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>
1412 <span class="n">in_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</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>
14131520 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
14141521 <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>
14151522 <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>
14191526 <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>
14201527 <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>
14211528 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1422 <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="s">&#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>
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>
14231530 <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>
1424 <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="s">&#39;UTF-16LE&#39;</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>
14251532 <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>
1426 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1427 <span class="k">else</span><span class="p">:</span>
1428 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
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>
14291536
14301537 <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>
14311538 <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>
14351542 <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>
14361543
14371544 <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>
1438 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1439 <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;results&#39;</span><span class="p">])</span>
1440 <span class="k">else</span><span class="p">:</span>
1441 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
14421549
14431550 <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>
14441551 <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>
14471554 <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>
14481555 <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>
14491556 <span class="k">else</span><span class="p">:</span>
1450 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
1451
1452 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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>
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>
14531560 <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>
14541561 <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>
14551562 <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>
14641571 <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>
14651572 <span class="n">callback</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
14661573 <span class="k">else</span><span class="p">:</span>
1467 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</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>
14681575
14691576 <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>
14701577 <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>
14721579 <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>
14731580
14741581
1475 <span class="c">#</span>
1476 <span class="c"># SMB1 Methods Family</span>
1477 <span class="c">#</span>
1582 <span class="c1">#</span>
1583 <span class="c1"># SMB1 Methods Family</span>
1584 <span class="c1">#</span>
14781585
14791586 <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>
14801587 <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>
14841591 <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>
14851592 <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>
14861593
1487 <span class="c"># Increment the next_signing_id as described in [MS-CIFS] 3.2.4.1.3</span>
1594 <span class="c1"># Increment the next_signing_id as described in [MS-CIFS] 3.2.4.1.3</span>
14881595 <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>
1489 <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="c"># All our defined messages currently have responses, so always increment by 2</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>
14901597 <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>
14911598
14921599 <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>
14951602 <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>
14961603 <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>
14971604
1498 <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="s">&#39;MID is </span><span class="si">%d</span><span class="s">. Signing ID is </span><span class="si">%d</span><span class="s">. Signature is </span><span class="si">%s</span><span class="s">. Total raw message is </span><span class="si">%d</span><span class="s"> 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>
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>
14991606 <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>
15001607 <span class="k">else</span><span class="p">:</span>
15011608 <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>
15031610
15041611 <span class="k">def</span> <span class="nf">_getNextMID_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
15051612 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
1506 <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="c"># MID cannot be 0xFFFF. [MS-CIFS]: 2.2.1.6.2</span>
1507 <span class="c"># We don&#39;t use MID of 0 as MID can be reused for SMB_COM_TRANSACTION2_SECONDARY messages</span>
1508 <span class="c"># where if mid=0, _sendSMBMessage will re-assign new MID values again</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>
15091616 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">1</span>
15101617 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
15111618
15141621 <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>
15151622 <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>
15161623 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
1517 <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="s">&#39;SMB dialect negotiation successful (ExtendedSecurity:</span><span class="si">%s</span><span class="s">)&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">)</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>
15181625 <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>
15191626 <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>
15201627 <span class="k">else</span><span class="p">:</span>
1521 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s">) 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>
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>
15221629 <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>
15231630 <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>
15241631 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
15261633 <span class="k">try</span><span class="p">:</span>
15271634 <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>
15281635 <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>
1529 <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="s">&#39;SMB uid is now </span><span class="si">%d</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</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>
15301637 <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>
15311638 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
1532 <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="s">&#39;Authentication (with extended security) successful!&#39;</span><span class="p">)</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>
15331640 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
15341641 <span class="k">else</span><span class="p">:</span>
1535 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;SMB_COM_SESSION_SETUP_ANDX status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s">&#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>
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>
15361643 <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>
15371644 <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>
1538 <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="c"># STATUS_MORE_PROCESSING_REQUIRED</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>
15391646 <span class="k">try</span><span class="p">:</span>
15401647 <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>
15411648 <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>
15421649 <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>
15431650 <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>
15441651 <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>
1545 <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="c"># STATUS_LOGON_FAILURE</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>
15461653 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
1547 <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="s">&#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>
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>
15481655 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
15491656 <span class="k">else</span><span class="p">:</span>
1550 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s">) 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>
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>
15511658 <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>
15521659 <span class="k">else</span><span class="p">:</span>
15531660 <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>
1554 <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="s">&#39;SMB uid is now </span><span class="si">%d</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</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>
15551662 <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>
15561663 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
1557 <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="s">&#39;Authentication (without extended security) successful!&#39;</span><span class="p">)</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>
15581665 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
15591666 <span class="k">else</span><span class="p">:</span>
15601667 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
1561 <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="s">&#39;Authentication (without extended security) failed. Please check username and password&#39;</span><span class="p">)</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>
15621669 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
15631670 <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>
15641671 <span class="k">try</span><span class="p">:</span>
15671674 <span class="k">pass</span>
15681675 <span class="k">else</span><span class="p">:</span>
15691676 <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>
1570 <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="s">&#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>
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>
15711678
15721679 <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>
15731680 <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
15841691 <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>
15851692
15861693 <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>
1587 <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="s">&#39;Remote server only supports plaintext authentication. Your password can be stolen easily over the network.&#39;</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>
15881695
15891696
15901697 <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>
15951702
15961703 <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>
15971704 <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>
1598 <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="s">&#39;Performing NTLMv2 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s">&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>
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>
15991706 <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>
16001707 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
16011708 <span class="n">server_challenge</span><span class="p">,</span>
16031710 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
16041711
16051712 <span class="k">else</span><span class="p">:</span>
1606 <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="s">&#39;Performing NTLMv1 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s">&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>
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>
16071714 <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>
16081715
16091716 <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>
16141721 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
16151722
16161723 <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>
1617 <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="s">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s">&quot; (</span><span class="si">%d</span><span class="s"> 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>
1618 <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="s">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s">&quot; (</span><span class="si">%d</span><span class="s"> 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>
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>
16191726
16201727 <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>
16211728 <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>
16221729
16231730 <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>
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="s">&#39;Server requires all SMB messages to be signed&#39;</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>
16251732 <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>
16261733 <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>
1627 <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="s">&#39;Server supports SMB signing&#39;</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>
16281735 <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>
16291736 <span class="k">else</span><span class="p">:</span>
16301737 <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>
16311738
16321739 <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>
1633 <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="s">&quot;SMB signing activated. All SMB messages will be signed.&quot;</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>
16341741 <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>
16351742 <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>
16361743 <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>
16371744 <span class="k">else</span><span class="p">:</span>
16381745 <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>
16391746 <span class="k">else</span><span class="p">:</span>
1640 <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="s">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</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>
16411748
16421749
16431750 <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>
16501757 <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>
16511758 <span class="k">else</span><span class="p">:</span>
16521759 <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>
1653 <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="s">&#39;Performing NTLMv1 authentication (without extended security) with challenge &quot;</span><span class="si">%s</span><span class="s">&quot; and hashed password of &quot;</span><span class="si">%s</span><span class="s">&quot;&#39;</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>
16541761 <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>
16551762 <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>
16561763 <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>
16571764 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
16581765 <span class="n">nt_password</span><span class="p">,</span>
16591766 <span class="bp">True</span><span class="p">,</span>
1660 <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">domain</span><span class="p">)))</span>
1767 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)))</span>
16611768
16621769 <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>
16631770 <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>
1664 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
16651772
16661773 <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>
1667 <span class="n">path</span> <span class="o">=</span> <span class="s">&#39;IPC$&#39;</span>
1774 <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
16681775 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
16691776
16701777 <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1671 <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="s">&#39;</span><span class="se">\\</span><span class="s">srvsvc&#39;</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>
16721779 <span class="n">flags</span> <span class="o">=</span> <span class="n">NT_CREATE_REQUEST_EXTENDED_RESPONSE</span><span class="p">,</span>
16731780 <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>
16741781 <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>
16851792 <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>
16861793 <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>
16871794 <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>
1688 <span class="c"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
1689 <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="s">&#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>
1690 <span class="c"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
1691 <span class="c"># 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>
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>
16921799 <span class="n">data_bytes</span> <span class="o">=</span> \
1693 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1694 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
1695 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&quot;&quot;&quot;</span>
1696 <span class="s">b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00</span>
1697 <span class="s">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
1698 <span class="s">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
1699 <span class="s">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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</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>
17001807 <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>
17011808 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
17021809 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
17071814 <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>
17081815 <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>
17091816 <span class="k">else</span><span class="p">:</span>
1710 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
17111818
17121819 <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>
17131820 <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>
17141821 <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>
17151822 <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>
17161823
1717 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1824 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
17181825 <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>
17191826 <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>
17201827 <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>
1721 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</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>
17221829 <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
17231830
1724 <span class="c"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
1725 <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="s">&#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="s">&#39;fid&#39;</span><span class="p">])</span>
1726 <span class="c"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
1727 <span class="c"># 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>
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>
17281835 <span class="n">data_bytes</span> <span class="o">=</span> \
1729 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1730 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#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> \
1731 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&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="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
1732 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#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> \
1733 <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="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> \
1734 <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s">&quot;&quot;&quot;</span>
1735 <span class="s">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
1736 <span class="s">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
1737 <span class="s">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">))</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>
17381845 <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>
17391846 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
17401847 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
17421849 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
17431850 <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>
17441851 <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>
1745 <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="s">&#39;fid&#39;</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>
17461853 <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>
17471854 <span class="k">else</span><span class="p">:</span>
1748 <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="s">&#39;fid&#39;</span><span class="p">])</span>
1749 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
17501857
17511858 <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>
17521859 <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>
17531860 <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>
1754 <span class="c"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</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>
17551862 <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>
17561863
17571864 <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>
1758 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
1759 <span class="k">else</span><span class="p">:</span>
1760 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
1761 <span class="k">else</span><span class="p">:</span>
1762 <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="s">&#39;fid&#39;</span><span class="p">])</span>
1763 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
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>
17641871
17651872 <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>
1766 <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="s">&#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>
1767 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span> <span class="c"># A list of SharedDevice instances</span>
1768 <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="c"># You need to study the byte stream to understand the meaning of these constants</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>
17691876 <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>
1770 <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="s">&#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>
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>
17711878 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
17721879
17731880 <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>
1774 <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="s">&#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>
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>
17751882 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1776 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</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>
17771884
17781885 <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>
17791886 <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>
17801887 <span class="k">else</span><span class="p">:</span>
17811888 <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>
17821889
1783 <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="s">&#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>
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>
17841891 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1785 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</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>
17861893
17871894 <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>
17881895 <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>
18091916 <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>
18101917
18111918 <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>
1812 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1813 <span class="k">else</span><span class="p">:</span>
1814 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1815 <span class="k">else</span><span class="p">:</span>
1816 <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="s">&#39;fid&#39;</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="s">&#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>
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>
18181925
18191926 <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>
18201927 <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>
18281935 <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>
18291936 <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>
18301937 <span class="k">else</span><span class="p">:</span>
1831 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#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>
1832
1833 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
18341941 <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>
18351942 <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>
18361943 <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>
18371944
18381945 <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>
18391946 <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>
1840 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
18411948
18421949 <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>
1843 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
1844 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</span>
1845 <span class="n">path</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
18461953 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
18471954 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
18481955
18491956 <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>
1850 <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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0001</span><span class="p">)</span> <span class="c"># TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1</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>
18511958 <span class="n">params_bytes</span> <span class="o">=</span> \
1852 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#39;&lt;HHHHI&#39;</span><span class="p">,</span>
1853 <span class="n">search</span><span class="p">,</span> <span class="c"># SearchAttributes</span>
1854 <span class="mi">100</span><span class="p">,</span> <span class="c"># SearchCount</span>
1855 <span class="mh">0x0006</span><span class="p">,</span> <span class="c"># Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
1856 <span class="mh">0x0104</span><span class="p">,</span> <span class="c"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
1857 <span class="mh">0x0000</span><span class="p">)</span> <span class="c"># SearchStorageType</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>
18581965 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
1859 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1860 <span class="k">else</span><span class="p">:</span>
1861 <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="s">&#39;UTF-16LE&#39;</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>
18621969
18631970 <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>
18641971 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
18731980 <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>
18741981
18751982 <span class="k">def</span> <span class="nf">decodeFindStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
1876 <span class="c"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
1877 <span class="n">info_format</span> <span class="o">=</span> <span class="s">&#39;&lt;IIQQQQQQIIIBB24s&#39;</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>
18781985 <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>
18791986
18801987 <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>
18921999 <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>
18932000 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
18942001
1895 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1896 <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="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
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>
18972004 <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>
18982005 <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>
18992006 <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>
19022009 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
19032010 <span class="k">else</span><span class="p">:</span>
19042011 <span class="k">break</span>
1905 <span class="k">return</span> <span class="s">&#39;&#39;</span>
2012 <span class="k">return</span> <span class="s1">&#39;&#39;</span>
19062013
19072014 <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>
19082015 <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>
19092016 <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>
1910 <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="s">&#39;total_count&#39;</span><span class="p">):</span>
1911 <span class="c"># TRANS2_FIND_FIRST2 response. [MS-CIFS]: 2.2.6.2.2</span>
1912 <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="s">&#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>
1913 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s">&#39;sid&#39;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s">&#39;&#39;</span> <span class="p">})</span>
1914 <span class="k">else</span><span class="p">:</span>
1915 <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="s">&#39;sid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;last_name_offset&#39;</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>
19162023
19172024 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
19182025 <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>
1919 <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="s">&#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>
1920 <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="s">&#39;data_count&#39;</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>
19212028 <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>
1922 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s">&#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>
1923 <span class="s">&#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>
1924 <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</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>
19252032 <span class="p">})</span>
19262033 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
19272034 <span class="k">else</span><span class="p">:</span>
1928 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1929 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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="s">&#39;total_count&#39;</span><span class="p">])</span>
1930 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
1931 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;total_count&#39;</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>
19322039 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
19332040
19342041 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
19362043 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
19372044 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
19382045 <span class="k">else</span><span class="p">:</span>
1939 <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="p">[</span><span class="s">&#39;support_dfs&#39;</span><span class="p">])</span>
1940 <span class="k">else</span><span class="p">:</span>
1941 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
19422049
19432050 <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>
1944 <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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0002</span><span class="p">)</span> <span class="c"># TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1</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>
19452052 <span class="n">params_bytes</span> <span class="o">=</span> \
1946 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#39;&lt;HHHIH&#39;</span><span class="p">,</span>
1947 <span class="n">sid</span><span class="p">,</span> <span class="c"># SID</span>
1948 <span class="mi">100</span><span class="p">,</span> <span class="c"># SearchCount</span>
1949 <span class="mh">0x0104</span><span class="p">,</span> <span class="c"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
1950 <span class="n">resume_key</span><span class="p">,</span> <span class="c"># ResumeKey</span>
1951 <span class="mh">0x000a</span><span class="p">)</span> <span class="c"># Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</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>
19522059 <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
1953 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
1954 <span class="k">else</span><span class="p">:</span>
1955 <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="s">&#39;UTF-16LE&#39;</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>
19562063
19572064 <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>
19582065 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
19692076 <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>
19702077 <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>
19712078 <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>
1972 <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="s">&#39;total_count&#39;</span><span class="p">):</span>
1973 <span class="c"># TRANS2_FIND_NEXT2 response. [MS-CIFS]: 2.2.6.3.2</span>
1974 <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="s">&#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>
1975 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s">&#39;&#39;</span> <span class="p">})</span>
1976 <span class="k">else</span><span class="p">:</span>
1977 <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="s">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;last_name_offset&#39;</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>
19782085
19792086 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
19802087 <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>
1981 <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="s">&#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>
1982 <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="s">&#39;data_count&#39;</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>
19832090 <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>
1984 <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s">&#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>
1985 <span class="s">&#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>
1986 <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</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>
19872094 <span class="p">})</span>
19882095 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
19892096 <span class="k">else</span><span class="p">:</span>
1990 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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>
1991 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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="s">&#39;total_count&#39;</span><span class="p">])</span>
1992 <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
1993 <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;total_count&#39;</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>
19942101 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
19952102
19962103 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
19982105 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
19992106 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
20002107 <span class="k">else</span><span class="p">:</span>
2001 <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="s">&#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="p">[</span><span class="s">&#39;support_dfs&#39;</span><span class="p">])</span>
2002 <span class="k">else</span><span class="p">:</span>
2003 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
20042111
20052112 <span class="k">def</span> <span class="nf">sendDFSReferral</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2006 <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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0010</span><span class="p">)</span> <span class="c"># TRANS2_GET_DFS_REFERRAL sub-command. See [MS-CIFS]: 2.2.6.16.1</span>
2007 <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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c"># Max referral level 3</span>
2008 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&quot;</span><span class="se">\\</span><span class="s">&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="s">&#39;UTF-16LE&#39;</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>
20092116
20102117 <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>
20112118 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
20162123 <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>
20172124 <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>
20182125 <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>
2019
2126
20202127 <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>
20212128 <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>
2022
2129
20232130 <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>
20242131 <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>
20252132 <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>
20302137 <span class="k">else</span><span class="p">:</span>
20312138 <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>
20322139 <span class="k">else</span><span class="p">:</span>
2033 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2034
2035 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
20362143 <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>
20372144 <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>
20382145 <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>
20412148
20422149 <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>
20432150 <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>
2044 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
20452152
20462153 <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>
2047 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
2048 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</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>
20492156 <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>
2050 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
20512158 <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>
20522159 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2053
2160
20542161 <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2055 <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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0005</span><span class="p">)</span> <span class="c"># TRANS2_QUERY_PATH_INFORMATION sub-command. See [MS-CIFS]: 2.2.6.6.1</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>
20562163 <span class="n">params_bytes</span> <span class="o">=</span> \
2057 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&#39;&lt;HI&#39;</span><span class="p">,</span>
2058 <span class="mh">0x0107</span><span class="p">,</span> <span class="c"># SMB_QUERY_FILE_ALL_INFO ([MS-CIFS] 2.2.2.3.3)</span>
2059 <span class="mh">0x0000</span><span class="p">)</span> <span class="c"># Reserved</span>
2060 <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="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</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>
20612168
20622169 <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>
20632170 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">65535</span><span class="p">,</span>
20682175 <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>
20692176 <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>
20702177 <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>
2071
2178
20722179 <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>
20732180 <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>
20742181 <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>
2075 <span class="n">info_format</span> <span class="o">=</span> <span class="s">&#39;&lt;QQQQIIQQ&#39;</span>
2182 <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;QQQQIIQQ&#39;</span>
20762183 <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>
20772184 <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> \
20782185 <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>
2079
2186
20802187 <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>
20812188 <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>
20822189 <span class="n">callback</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
20832190 <span class="k">else</span><span class="p">:</span>
2084 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
20852192
20862193 <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>
20872194 <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>
20902197 <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>
20912198 <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>
20922199 <span class="k">else</span><span class="p">:</span>
2093 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2094
2095 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
20962203 <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>
20972204 <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>
20982205 <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>
20992206 <span class="k">else</span><span class="p">:</span>
21002207 <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>
2101
2208
21022209 <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>
21032210 <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>
21042211
21052212 <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>
21062213 <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>
2107 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2108
2109 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
21102217 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
21112218
21122219 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
21132220 <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>
2114 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span> <span class="c"># Sharing mode: Deny nothing to others</span>
2115 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span> <span class="c"># Failed if file does not exist</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>
21162223 <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>
21172224 <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>
21182225 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
21292236 <span class="k">else</span><span class="p">:</span>
21302237 <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>
21312238 <span class="k">else</span><span class="p">:</span>
2132 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
21332240
21342241 <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>
21352242 <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>
21432250 <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>
21442251
21452252 <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>
2146 <span class="c"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</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>
21472254 <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>
2148 <span class="n">read_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;read_len&#39;</span><span class="p">]</span>
2149 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;remaining_len&#39;</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>
21502257 <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>
21512258 <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>
21522259 <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>
21622269 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
21632270
21642271 <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>
2165 <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="s">&#39;fid&#39;</span><span class="p">])</span>
2166 <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="s">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">read_len</span> <span class="p">))</span> <span class="c"># Note that this is a tuple of 3-elements</span>
2167 <span class="k">else</span><span class="p">:</span>
2168 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#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="s">&#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>
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>
21692276 <span class="k">else</span><span class="p">:</span>
21702277 <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>
2171 <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="s">&#39;fid&#39;</span><span class="p">])</span>
2172 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
21732280
21742281 <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>
21752282 <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>
21842291 <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>
21852292 <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>
21862293 <span class="k">else</span><span class="p">:</span>
2187 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2188
2189 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
21902297 <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>
21912298 <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>
21922299 <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>
21932300 <span class="k">else</span><span class="p">:</span>
21942301 <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>
2195
2196 <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>
2197 <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>
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>
21982305
21992306 <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>
22002307 <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>
2201 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2202
2203 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
22042311 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
22052312
22062313 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
22072314 <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>
2208 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0041</span><span class="p">,</span> <span class="c"># Sharing mode: Deny nothing to others + Open for writing</span>
2209 <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="c"># Create file if file does not exist. Overwrite or append depending on truncate parameter.</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>
22102317 <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>
22112318 <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>
22122319 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
22192326 <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>
22202327 <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>
22212328 <span class="k">else</span><span class="p">:</span>
2222 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
22232330
22242331 <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>
2225 <span class="c"># 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>
2226 <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="c"># Need to minus 1 byte from 0xFFFF because of the first NULL byte in the ComWriteAndxRequest message data</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>
22272334 <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>
22282335 <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>
22292336 <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>
22332340 <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>
22342341 <span class="k">else</span><span class="p">:</span>
22352342 <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>
2236 <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="c"># Note that this is a tuple of 2-elements</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>
22372344
22382345 <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>
2239 <span class="c"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</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>
22402347 <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>
2241 <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="s">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;offset&#39;</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>
22422349 <span class="k">else</span><span class="p">:</span>
22432350 <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>
2244 <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="s">&#39;fid&#39;</span><span class="p">])</span>
2245 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
22462353
22472354 <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>
22482355 <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>
22572364 <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>
22582365 <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>
22592366 <span class="k">else</span><span class="p">:</span>
2260 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2261
2262 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
22632370 <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>
22642371 <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>
22652372 <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>
22682375
22692376 <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>
22702377 <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>
2271 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2272
2273 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
22742381 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
22752382
22762383 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
22862393 <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>
22872394 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
22882395 <span class="k">else</span><span class="p">:</span>
2289 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to store </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
22902397
22912398 <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>
22922399 <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>
22952402 <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>
22962403 <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>
22972404 <span class="k">else</span><span class="p">:</span>
2298 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2299
2300 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
23012408 <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>
23022409 <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>
23032410 <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>
23042411 <span class="k">else</span><span class="p">:</span>
23052412 <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>
23062416
23072417 <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>
23082418 <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>
2309 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2310
2311 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
23122422 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
23132423
23142424 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
23232433 <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>
23242434 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
23252435 <span class="k">else</span><span class="p">:</span>
2326 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to create directory </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
23272437
23282438 <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>
23292439 <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>
23322442 <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>
23332443 <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>
23342444 <span class="k">else</span><span class="p">:</span>
2335 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to create directory </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2336
2337 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
23382448 <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>
23392449 <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>
23402450 <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>
23432453
23442454 <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>
23452455 <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>
2346 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2347
2348 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
23492459 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
23502460
23512461 <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
23602470 <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>
23612471 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
23622472 <span class="k">else</span><span class="p">:</span>
2363 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete directory </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
23642474
23652475 <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>
23662476 <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>
23692479 <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>
23702480 <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>
23712481 <span class="k">else</span><span class="p">:</span>
2372 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to delete </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2373
2374 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
23752485 <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>
23762486 <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>
23772487 <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>
23802490
23812491 <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>
23822492 <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>
2383 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2384
2385 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
2386 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
23872497 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
23882498
23892499 <span class="k">def</span> <span class="nf">sendRename</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
23982508 <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>
23992509 <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>
24002510 <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>
2401 <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="c"># Note that this is a tuple of 2-elements</span>
2402 <span class="k">else</span><span class="p">:</span>
2403 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to rename </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
24042514
24052515 <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>
24062516 <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>
24092519 <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>
24102520 <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>
24112521 <span class="k">else</span><span class="p">:</span>
2412 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to rename </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2413
2414 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
24152525 <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>
24162526 <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>
24172527 <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>
24202530
24212531 <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>
24222532 <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>
2423 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</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>
24242534
24252535 <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>
2426 <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="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span>
2427 <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="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">):</span>
2428 <span class="n">path</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</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>
24292539 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
24302540 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
24312541
24322542 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
24332543 <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>
2434 <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span> <span class="c"># Sharing mode: Deny nothing to others</span>
2435 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span> <span class="c"># Failed if file does not exist</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>
24362546 <span class="n">search_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
24372547 <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>
24382548 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
24452555 <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>
24462556 <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>
24472557 <span class="k">else</span><span class="p">:</span>
2448 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
24492559
24502560 <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>
2451 <span class="c"># [MS-CIFS]: 2.2.7.2</span>
2452 <span class="c"># [MS-SMB]: 2.2.7.2.1</span>
2453 <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="s">&#39;&lt;IHBB&#39;</span><span class="p">,</span>
2454 <span class="mh">0x00144064</span><span class="p">,</span> <span class="c"># [MS-SMB]: 2.2.7.2.1</span>
2455 <span class="n">fid</span><span class="p">,</span> <span class="c"># FID</span>
2456 <span class="mh">0x01</span><span class="p">,</span> <span class="c"># IsFctl</span>
2457 <span class="mi">0</span><span class="p">)</span> <span class="c"># IsFlags</span>
2458 <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="c"># NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1</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>
24592569 <span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
24602570 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mh">0xFFFF</span><span class="p">,</span>
24612571 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
24692579 <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>
24702580 <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>
24712581 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2472 <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="s">&#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>
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>
24732583 <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>
2474 <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="s">&#39;UTF-16LE&#39;</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>
24752585 <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>
2476 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;fid&#39;</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>
24772587 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
24782588 <span class="k">else</span><span class="p">:</span>
2479 <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;fid&#39;</span><span class="p">])</span>
2480 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
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>
24812591
24822592 <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>
24832593 <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>
24922602 <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>
24932603 <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>
24942604 <span class="k">else</span><span class="p">:</span>
2495 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s"> on </span><span class="si">%s</span><span class="s">: 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>
2496
2497 <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="s">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s">\</span><span class="si">%s</span><span class="s">&#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="s">&#39;&#39;</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>
24982608 <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>
24992609 <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>
25002610 <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>
25092619 <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>
25102620 <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>
25112621 <span class="k">else</span><span class="p">:</span>
2512 <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</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>
25132623
25142624 <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>
25152625 <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>
25172627 <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>
25182628
25192629
2520 <span class="k">class</span> <span class="nc">SharedDevice</span><span class="p">:</span>
2521 <div class="viewcode-block" id="SharedDevice"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
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>
25222632 <span class="sd"> Contains information about a single shared device on the remote server.</span>
25232633 <span class="sd"> &quot;&quot;&quot;</span>
25242634
2525 <span class="c"># The following constants are taken from [MS-SRVS]: 2.2.2.4</span>
2526 <span class="c"># They are used to identify the type of shared resource from the results from the NetrShareEnum in Server Service RPC</span>
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>
25272637 <span class="n">DISK_TREE</span> <span class="o">=</span> <span class="mh">0x00</span>
25282638 <span class="n">PRINT_QUEUE</span> <span class="o">=</span> <span class="mh">0x01</span>
25292639 <span class="n">COMM_DEVICE</span> <span class="o">=</span> <span class="mh">0x02</span>
25312641
25322642 <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>
25332643 <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">=</span> <span class="nb">type</span>
2534 <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="c">#: An unicode string containing the name of the shared device</span>
2535 <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="c">#: An unicode string containing the user description of the shared device</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>
25362646
25372647 <span class="nd">@property</span>
25382648 <span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2539 <div class="viewcode-block" id="SharedDevice.type"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice.type">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
2649 <span class="sd">&quot;&quot;&quot;</span>
25402650 <span class="sd"> Returns one of the following integral constants.</span>
25412651 <span class="sd"> - SharedDevice.DISK_TREE</span>
25422652 <span class="sd"> - SharedDevice.PRINT_QUEUE</span>
25452655 <span class="sd"> &quot;&quot;&quot;</span>
25462656 <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>
25472657
2548 <span class="nd">@property</span></div>
2658 <span class="nd">@property</span>
25492659 <span class="k">def</span> <span class="nf">isSpecial</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2550 <div class="viewcode-block" id="SharedDevice.isSpecial"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice.isSpecial">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
2660 <span class="sd">&quot;&quot;&quot;</span>
25512661 <span class="sd"> Returns True if this shared device is a special share reserved for interprocess communication (IPC$)</span>
25522662 <span class="sd"> or remote administration of the server (ADMIN$). Can also refer to administrative shares such as</span>
25532663 <span class="sd"> C$, D$, E$, and so forth</span>
25542664 <span class="sd"> &quot;&quot;&quot;</span>
25552665 <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>
25562666
2557 <span class="nd">@property</span></div>
2667 <span class="nd">@property</span>
25582668 <span class="k">def</span> <span class="nf">isTemporary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2559 <div class="viewcode-block" id="SharedDevice.isTemporary"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice.isTemporary">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
2669 <span class="sd">&quot;&quot;&quot;</span>
25602670 <span class="sd"> Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</span>
25612671 <span class="sd"> &quot;&quot;&quot;</span>
25622672 <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>
25632673
2564 <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
2565 <span class="k">return</span> <span class="s">u&#39;Shared device: </span><span class="si">%s</span><span class="s"> (type:0x</span><span class="si">%02x</span><span class="s"> comments:</span><span class="si">%s</span><span class="s">)&#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>
2566
2567
2568 <span class="k">class</span> <span class="nc">SharedFile</span><span class="p">:</span></div>
2569 <div class="viewcode-block" id="SharedFile"><a class="viewcode-back" href="../../api/smb_SharedFile.html#smb.base.SharedFile">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
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>
25702680 <span class="sd"> Contain information about a file/folder entry that is shared on the shared device.</span>
25712681
25722682 <span class="sd"> As an application developer, you should not need to instantiate a *SharedFile* instance directly in your application.</span>
25782688 <span class="sd"> &quot;&quot;&quot;</span>
25792689
25802690 <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>
2581 <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="c">#: 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>
2582 <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="c">#: 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>
2583 <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="c">#: 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>
2584 <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="c">#: 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>
2585 <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="c">#: File size in number of bytes</span>
2586 <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="c">#: Total number of bytes allocated to store this file</span>
2587 <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="c">#: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</span>
2588 <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="c">#: Unicode string containing the short name of this file (usually in 8.3 notation)</span>
2589 <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="c">#: 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>
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>
25902700
25912701 <span class="nd">@property</span>
25922702 <span class="k">def</span> <span class="nf">isDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2593 <div class="viewcode-block" id="SharedFile.isDirectory"><a class="viewcode-back" href="../../api/smb_SharedFile.html#smb.base.SharedFile.isDirectory">[docs]</a> <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>
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>
25942704 <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>
25952705
2596 <span class="nd">@property</span></div>
2706 <span class="nd">@property</span>
25972707 <span class="k">def</span> <span class="nf">isReadOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2598 <div class="viewcode-block" id="SharedFile.isReadOnly"><a class="viewcode-back" href="../../api/smb_SharedFile.html#smb.base.SharedFile.isReadOnly">[docs]</a> <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>
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>
25992709 <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>
2600
2601 <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
2602 <span class="k">return</span> <span class="s">u&#39;Shared file: </span><span class="si">%s</span><span class="s"> (FileSize:</span><span class="si">%d</span><span class="s"> bytes, isDirectory:</span><span class="si">%s</span><span class="s">)&#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>
2603
2604
2605 <span class="k">class</span> <span class="nc">_PendingRequest</span><span class="p">:</span></div>
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>
26062716
26072717 <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>
26082718 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="n">mid</span>
26172727 </div>
26182728 <div class="clearer"></div>
26192729 </div>
2620 <div class="related">
2730 <div class="related" role="navigation" aria-label="related navigation">
26212731 <h3>Navigation</h3>
26222732 <ul>
26232733 <li class="right" style="margin-right: 10px">
26242734 <a href="../../genindex.html" title="General Index"
26252735 >index</a></li>
2626 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
2627 <li><a href="../index.html" >Module code</a> &raquo;</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>
26282738 </ul>
26292739 </div>
2630 <div class="footer">
2740 <div class="footer" role="contentinfo">
26312741 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
2632 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
2742 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
26332743 </div>
26342744 </body>
26352745 </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.15 documentation</title>
8 <title>smb.smb_structs &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
2626 <link rel="up" title="Module code" href="../index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="../../genindex.html" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
36 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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>
3737 </ul>
3838 </div>
39 <div class="sphinxsidebar">
39 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4040 <div class="sphinxsidebarwrapper">
41 <div id="searchbox" style="display: none">
41 <div id="searchbox" style="display: none" role="search">
4242 <h3>Quick search</h3>
4343 <form class="search" action="../../search.html" method="get">
4444 <input type="text" name="q" />
5757 <div class="document">
5858 <div class="documentwrapper">
5959 <div class="bodywrapper">
60 <div class="body">
60 <div class="body" role="main">
6161
6262 <h1>Source code for smb.smb_structs</h1><div class="highlight"><pre>
63
6364 <span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">struct</span><span class="o">,</span> <span class="nn">types</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">binascii</span><span class="o">,</span> <span class="nn">time</span>
6465 <span class="kn">from</span> <span class="nn">StringIO</span> <span class="kn">import</span> <span class="n">StringIO</span>
6566 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
6667
6768
68 <span class="c"># Set to True if you want to enable support for extended security. Required for Windows Vista and later</span>
69 <span class="c1"># Set to True if you want to enable support for extended security. Required for Windows Vista and later</span>
6970 <span class="n">SUPPORT_EXTENDED_SECURITY</span> <span class="o">=</span> <span class="bp">True</span>
7071
71 <span class="c"># Set to True if you want to enable SMB2 protocol.</span>
72 <span class="c1"># Set to True if you want to enable SMB2 protocol.</span>
7273 <span class="n">SUPPORT_SMB2</span> <span class="o">=</span> <span class="bp">True</span>
7374
74 <span class="c"># Supported dialects</span>
75 <span class="c1"># Supported dialects</span>
7576 <span class="n">DIALECTS</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
76 <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="s">&#39;NT_LAN_MANAGER_DIALECT&#39;</span><span class="p">,</span> <span class="s">&#39;NT LM 0.12&#39;</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>
7778 <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>
7879 <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>
7980
8081 <span class="n">DIALECTS2</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
81 <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="s">&#39;SMB2_DIALECT&#39;</span><span class="p">,</span> <span class="s">&#39;SMB 2.002&#39;</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>
8283 <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>
8384 <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>
8485
8586
86 <span class="k">class</span> <span class="nc">UnsupportedFeature</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
87 <div class="viewcode-block" id="UnsupportedFeature"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.UnsupportedFeature">[docs]</a> <span class="sd">&quot;&quot;&quot;</span>
87 <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>
88 <span class="sd">&quot;&quot;&quot;</span>
8889 <span class="sd"> Raised when an supported feature is present/required in the protocol but is not</span>
8990 <span class="sd"> currently supported by pysmb</span>
9091 <span class="sd"> &quot;&quot;&quot;</span>
91 <span class="k">pass</span>
92
93
94 <span class="k">class</span> <span class="nc">ProtocolError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span></div>
95 <div class="viewcode-block" id="ProtocolError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.ProtocolError">[docs]</a>
92 <span class="k">pass</span></div>
93
94
95 <div class="viewcode-block" id="ProtocolError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.ProtocolError">[docs]</a><span class="k">class</span> <span class="nc">ProtocolError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
96
9697 <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">message</span><span class="p">,</span> <span class="n">data_buf</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">smb_message</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
9798 <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
9899 <span class="bp">self</span><span class="o">.</span><span class="n">data_buf</span> <span class="o">=</span> <span class="n">data_buf</span>
102103 <span class="n">b</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
103104 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
104105 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="p">:</span>
105 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s">&#39; SMB Message &#39;</span> <span class="o">+</span> <span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
106 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s1">&#39; SMB Message &#39;</span> <span class="o">+</span> <span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
106107 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="p">))</span>
107108
108109 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_buf</span><span class="p">:</span>
109 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s">&#39; SMB Data Packet (hex) &#39;</span> <span class="o">+</span> <span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
110 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s1">&#39; SMB Data Packet (hex) &#39;</span> <span class="o">+</span> <span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
110111 <span class="n">b</span><span class="o">.</span><span class="n">write</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="bp">self</span><span class="o">.</span><span class="n">data_buf</span><span class="p">))</span>
111112 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
112113
113 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
114
115 <span class="k">class</span> <span class="nc">SMB2ProtocolHeaderError</span><span class="p">(</span><span class="n">ProtocolError</span><span class="p">):</span></div>
114 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span></div>
115
116 <span class="k">class</span> <span class="nc">SMB2ProtocolHeaderError</span><span class="p">(</span><span class="n">ProtocolError</span><span class="p">):</span>
116117
117118 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
118 <span class="n">ProtocolError</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="s">&quot;Packet header belongs to SMB2&quot;</span><span class="p">)</span>
119
120 <span class="k">class</span> <span class="nc">OperationFailure</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
121 <div class="viewcode-block" id="OperationFailure"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.OperationFailure">[docs]</a>
119 <span class="n">ProtocolError</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="s2">&quot;Packet header belongs to SMB2&quot;</span><span class="p">)</span>
120
121 <div class="viewcode-block" id="OperationFailure"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.OperationFailure">[docs]</a><span class="k">class</span> <span class="nc">OperationFailure</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
122
122123 <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">message</span><span class="p">,</span> <span class="n">smb_messages</span><span class="p">):</span>
123124 <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">[</span> <span class="n">message</span> <span class="p">]</span>
124125 <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
129130 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
130131
131132 <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">m</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_messages</span><span class="p">):</span>
132 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s">&#39; SMB Message </span><span class="si">%d</span><span class="s"> &#39;</span> <span class="o">%</span> <span class="n">idx</span> <span class="o">+</span> <span class="s">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
133 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;SMB Header:&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
134 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;-----------&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
133 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="s1">&#39; SMB Message </span><span class="si">%d</span><span class="s1"> &#39;</span> <span class="o">%</span> <span class="n">idx</span> <span class="o">+</span> <span class="s1">&#39;=&#39;</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
134 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;SMB Header:&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
135 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;-----------&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
135136 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">m</span><span class="p">))</span>
136 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;SMB Data Packet (hex):&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
137 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;----------------------&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
137 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;SMB Data Packet (hex):&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
138 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;----------------------&#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
138139 <span class="n">b</span><span class="o">.</span><span class="n">write</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">m</span><span class="o">.</span><span class="n">raw_data</span><span class="p">))</span>
139140 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
140141
141 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
142
143
144 <span class="k">class</span> <span class="nc">SMBError</span><span class="p">:</span></div>
142 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span></div>
143
144
145 <span class="k">class</span> <span class="nc">SMBError</span><span class="p">:</span>
145146
146147 <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
147148 <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
152153
153154 <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
154155 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_ntstatus</span><span class="p">:</span>
155 <span class="k">return</span> <span class="s">&#39;NTSTATUS=0x</span><span class="si">%08X</span><span class="s">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">internal_value</span>
156 <span class="k">return</span> <span class="s1">&#39;NTSTATUS=0x</span><span class="si">%08X</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">internal_value</span>
156157 <span class="k">else</span><span class="p">:</span>
157 <span class="k">return</span> <span class="s">&#39;ErrorClass=0x</span><span class="si">%02X</span><span class="s"> ErrorCode=0x</span><span class="si">%04X</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">&gt;&gt;</span> <span class="mi">24</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span> <span class="p">)</span>
158 <span class="k">return</span> <span class="s1">&#39;ErrorClass=0x</span><span class="si">%02X</span><span class="s1"> ErrorCode=0x</span><span class="si">%04X</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">internal_value</span> <span class="o">&gt;&gt;</span> <span class="mi">24</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span> <span class="p">)</span>
158159
159160 <span class="nd">@property</span>
160161 <span class="k">def</span> <span class="nf">hasError</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
163164
164165 <span class="k">class</span> <span class="nc">SMBMessage</span><span class="p">:</span>
165166
166 <span class="n">HEADER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&quot;&lt;4sBIBHHQxxHHHHB&quot;</span>
167 <span class="n">HEADER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;&lt;4sBIBHHQxxHHHHB&quot;</span>
167168 <span class="n">HEADER_STRUCT_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">HEADER_STRUCT_FORMAT</span><span class="p">)</span>
168169
169 <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="s">&#39;SMB.SMBMessage&#39;</span><span class="p">)</span>
170 <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>
170171 <span class="n">protocol</span> <span class="o">=</span> <span class="mi">1</span>
171172
172173 <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>
177178
178179 <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
179180 <span class="n">b</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
180 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Command: 0x</span><span class="si">%02X</span><span class="s"> (</span><span class="si">%s</span><span class="s">) </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <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">command</span><span class="p">,</span> <span class="s">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
181 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Status: </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&#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="o">.</span><span class="n">status</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
182 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Flags: 0x</span><span class="si">%02X</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</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="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
183 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Flags2: 0x</span><span class="si">%04X</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags2</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
184 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;PID: </span><span class="si">%d</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
185 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;UID: </span><span class="si">%d</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
186 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;MID: </span><span class="si">%d</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
187 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;TID: </span><span class="si">%d</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
188 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Security: 0x</span><span class="si">%016X</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">security</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
189 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Parameters: </span><span class="si">%d</span><span class="s"> bytes </span><span class="si">%s%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</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="bp">self</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
190 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&#39;Data: </span><span class="si">%d</span><span class="s"> bytes </span><span class="si">%s%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
181 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Command: 0x</span><span class="si">%02X</span><span class="s1"> (</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">command</span><span class="p">,</span> <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">command</span><span class="p">,</span> <span class="s1">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
182 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Status: </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="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
183 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Flags: 0x</span><span class="si">%02X</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">flags</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
184 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Flags2: 0x</span><span class="si">%04X</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">flags2</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
185 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;PID: </span><span class="si">%d</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">pid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
186 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;UID: </span><span class="si">%d</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">uid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
187 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;MID: </span><span class="si">%d</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">mid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
188 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;TID: </span><span class="si">%d</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">tid</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
189 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Security: 0x</span><span class="si">%016X</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">security</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
190 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Parameters: </span><span class="si">%d</span><span class="s1"> bytes </span><span class="si">%s%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="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</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="bp">self</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
191 <span class="n">b</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Data: </span><span class="si">%d</span><span class="s1"> bytes </span><span class="si">%s%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="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</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="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span> <span class="p">))</span>
191192 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
192193
193194 <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
194 <span class="bp">self</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
195 <span class="bp">self</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
195196 <span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="mi">0</span>
196197 <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">SMBError</span><span class="p">()</span>
197198 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span>
201202 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="mi">0</span>
202203 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>
203204 <span class="bp">self</span><span class="o">.</span><span class="n">security</span> <span class="o">=</span> <span class="il">0L</span>
204 <span class="bp">self</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
205 <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
205 <span class="bp">self</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
206 <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
206207 <span class="bp">self</span><span class="o">.</span><span class="n">payload</span> <span class="o">=</span> <span class="bp">None</span>
207208
208209 <span class="nd">@property</span>
229230 <span class="k">assert</span> <span class="n">parameters_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
230231
231232 <span class="n">headers_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="bp">self</span><span class="o">.</span><span class="n">HEADER_STRUCT_FORMAT</span><span class="p">,</span>
232 <span class="s">&#39;</span><span class="se">\xFF</span><span class="s">SMB&#39;</span><span class="p">,</span> <span class="bp">self</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">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span>
233 <span class="s1">&#39;</span><span class="se">\xFF</span><span class="s1">SMB&#39;</span><span class="p">,</span> <span class="bp">self</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">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span>
233234 <span class="bp">self</span><span class="o">.</span><span class="n">flags2</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">security</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span>
234235 <span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">,</span> <span class="bp">self</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">parameters_len</span> <span class="o">/</span> <span class="mi">2</span><span class="p">))</span>
235 <span class="k">return</span> <span class="n">headers_data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameters_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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span>
236 <span class="k">return</span> <span class="n">headers_data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameters_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;&lt;H&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span>
236237
237238 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buf</span><span class="p">):</span>
238239 <span class="sd">&quot;&quot;&quot;</span>
248249 <span class="sd"> &quot;&quot;&quot;</span>
249250 <span class="n">buf_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
250251 <span class="k">if</span> <span class="n">buf_len</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span><span class="p">:</span>
251 <span class="c"># We need at least 32 bytes (header) + 1 byte (parameter count)</span>
252 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB header&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
252 <span class="c1"># We need at least 32 bytes (header) + 1 byte (parameter count)</span>
253 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB header&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
253254
254255 <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
255256
257258 <span class="bp">self</span><span class="o">.</span><span class="n">flags2</span><span class="p">,</span> <span class="n">pid_high</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">security</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> \
258259 <span class="n">pid_low</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">params_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="bp">self</span><span class="o">.</span><span class="n">HEADER_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">buf</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span><span class="p">])</span>
259260
260 <span class="k">if</span> <span class="n">protocol</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\xFE</span><span class="s">SMB&#39;</span><span class="p">:</span>
261 <span class="k">if</span> <span class="n">protocol</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\xFE</span><span class="s1">SMB&#39;</span><span class="p">:</span>
261262 <span class="k">raise</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">()</span>
262 <span class="k">if</span> <span class="n">protocol</span> <span class="o">!=</span> <span class="s">&#39;</span><span class="se">\xFF</span><span class="s">SMB&#39;</span><span class="p">:</span>
263 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Invalid 4-byte protocol field&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
263 <span class="k">if</span> <span class="n">protocol</span> <span class="o">!=</span> <span class="s1">&#39;</span><span class="se">\xFF</span><span class="s1">SMB&#39;</span><span class="p">:</span>
264 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Invalid 4-byte protocol field&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
264265
265266 <span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="o">=</span> <span class="p">(</span><span class="n">pid_high</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">|</span> <span class="n">pid_low</span>
266267 <span class="bp">self</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="n">status</span>
268269
269270 <span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span>
270271 <span class="k">if</span> <span class="n">buf_len</span> <span class="o">&lt;</span> <span class="n">params_count</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">:</span>
271 <span class="c"># Not enough data in buf to decode up to body length</span>
272 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data. Parameters list decoding failed&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
272 <span class="c1"># Not enough data in buf to decode up to body length</span>
273 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data. Parameters list decoding failed&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
273274
274275 <span class="n">datalen_offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">params_count</span><span class="o">*</span><span class="mi">2</span>
275 <span class="n">body_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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">[</span><span class="n">datalen_offset</span><span class="p">:</span><span class="n">datalen_offset</span><span class="o">+</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
276 <span class="n">body_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;H&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">[</span><span class="n">datalen_offset</span><span class="p">:</span><span class="n">datalen_offset</span><span class="o">+</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
276277 <span class="k">if</span> <span class="n">body_len</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">buf_len</span> <span class="o">&lt;</span> <span class="p">(</span><span class="n">datalen_offset</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">body_len</span><span class="p">):</span>
277 <span class="c"># Not enough data in buf to decode body</span>
278 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data. Body decoding failed&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
278 <span class="c1"># Not enough data in buf to decode body</span>
279 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data. Body decoding failed&#39;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
279280
280281 <span class="bp">self</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">datalen_offset</span><span class="p">]</span>
281282
315316
316317 <span class="k">class</span> <span class="nc">Payload</span><span class="p">:</span>
317318
318 <span class="n">DEFAULT_ANDX_PARAM_HEADER</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\xFF\x00\x00\x00</span><span class="s">&#39;</span>
319 <span class="n">DEFAULT_ANDX_PARAM_HEADER</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\xFF\x00\x00\x00</span><span class="s1">&#39;</span>
319320 <span class="n">DEFAULT_ANDX_PARAM_SIZE</span> <span class="o">=</span> <span class="mi">4</span>
320321
321322 <span class="k">def</span> <span class="nf">initMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
322 <span class="c"># SMB_FLAGS2_UNICODE must always be enabled. Without this, almost all the Payload subclasses will need to be</span>
323 <span class="c"># rewritten to check for OEM/Unicode strings which will be tedious. Fortunately, almost all tested CIFS services</span>
324 <span class="c"># support SMB_FLAGS2_UNICODE by default.</span>
323 <span class="c1"># SMB_FLAGS2_UNICODE must always be enabled. Without this, almost all the Payload subclasses will need to be</span>
324 <span class="c1"># rewritten to check for OEM/Unicode strings which will be tedious. Fortunately, almost all tested CIFS services</span>
325 <span class="c1"># support SMB_FLAGS2_UNICODE by default.</span>
325326 <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>
326327 <span class="n">message</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">SMB_FLAGS_CASE_INSENSITIVE</span> <span class="o">|</span> <span class="n">SMB_FLAGS_CANONICALIZED_PATHS</span>
327328 <span class="n">message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">=</span> <span class="n">SMB_FLAGS2_UNICODE</span> <span class="o">|</span> <span class="n">SMB_FLAGS2_NT_STATUS</span> <span class="o">|</span> <span class="n">SMB_FLAGS2_LONG_NAMES</span> <span class="o">|</span> <span class="n">SMB_FLAGS2_EAS</span>
350351
351352 <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>
352353 <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>
353 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
354 <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>
354355 <span class="k">if</span> <span class="n">SUPPORT_SMB2</span><span class="p">:</span>
355 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#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="s">&#39;</span><span class="se">\x02</span><span class="s">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s">&#39;</span><span class="se">\x00</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</span> <span class="o">+</span> <span class="n">DIALECTS2</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>
356357 <span class="k">else</span><span class="p">:</span>
357 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#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="s">&#39;</span><span class="se">\x02</span><span class="s">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s">&#39;</span><span class="se">\x00</span><span class="s">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</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>
358359
359360
360361 <span class="k">class</span> <span class="nc">ComNegotiateResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
389390 <span class="sd"> - [MS-CIFS]: 2.2.4.52.2</span>
390391 <span class="sd"> &quot;&quot;&quot;</span>
391392
392 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HBHHIIIIQHB&#39;</span>
393 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HBHHIIIIQHB&#39;</span>
393394 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
394395
395396 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
396397 <span class="k">assert</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>
397398
398399 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
399 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not a SMB_COM_NEGOTIATE reply&#39;</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>
400 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not a SMB_COM_NEGOTIATE reply&#39;</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>
400401
401402 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_number_vcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span><span class="p">,</span> \
402403 <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_time</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">server_time_zone</span><span class="p">,</span> \
404405
405406 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span>
406407 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
407 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_NEGOTIATE dialect_index field&#39;</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>
408
409 <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
408 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_NEGOTIATE dialect_index field&#39;</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>
409
410 <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</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">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
410411 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</span> <span class="o">==</span> <span class="n">NT_LAN_MANAGER_DIALECT</span><span class="p">:</span>
411412 <span class="k">if</span> <span class="n">data_len</span> <span class="o">!=</span> <span class="p">(</span><span class="mh">0x11</span> <span class="o">*</span> <span class="mi">2</span><span class="p">):</span>
412 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;NT LAN Manager dialect selected in SMB_COM_NEGOTIATE but parameters bytes count (</span><span class="si">%d</span><span class="s">) does not meet specs&#39;</span> <span class="o">%</span> <span class="n">data_len</span><span class="p">,</span>
413 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;NT LAN Manager dialect selected in SMB_COM_NEGOTIATE but parameters bytes count (</span><span class="si">%d</span><span class="s1">) does not meet specs&#39;</span> <span class="o">%</span> <span class="n">data_len</span><span class="p">,</span>
413414 <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>
414415 <span class="k">else</span><span class="p">:</span>
415416 <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_number_vcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span><span class="p">,</span> \
416417 <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_time</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">server_time_zone</span><span class="p">,</span> \
417418 <span class="bp">self</span><span class="o">.</span><span class="n">challenge_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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">])</span>
418419 <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</span> <span class="o">==</span> <span class="mh">0xFFFF</span><span class="p">:</span>
419 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Server does not support any of the pysmb dialects. Please email pysmb to add in support for your OS&#39;</span><span class="p">,</span>
420 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Server does not support any of the pysmb dialects. Please email pysmb to add in support for your OS&#39;</span><span class="p">,</span>
420421 <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>
421422 <span class="k">else</span><span class="p">:</span>
422 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Unknown dialect index (0x</span><span class="si">%04X</span><span class="s">)&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</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>
423 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown dialect index (0x</span><span class="si">%04X</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">dialect_index</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>
423424
424425 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
425426 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
426 <span class="bp">self</span><span class="o">.</span><span class="n">challenge</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span>
427 <span class="bp">self</span><span class="o">.</span><span class="n">challenge</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span>
427428 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">challenge_length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
428429 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">challenge_length</span><span class="p">:</span>
429430 <span class="bp">self</span><span class="o">.</span><span class="n">challenge</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">challenge_length</span><span class="p">]</span>
430431
431 <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
432 <span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
432433 <span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">challenge_length</span>
433434 <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_len</span><span class="p">:</span>
434435 <span class="n">_s</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</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">2</span><span class="p">]</span>
435 <span class="k">if</span> <span class="n">_s</span> <span class="o">==</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span><span class="p">:</span>
436 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
436 <span class="k">if</span> <span class="n">_s</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span><span class="p">:</span>
437 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">s</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>
437438 <span class="k">break</span>
438439 <span class="k">else</span><span class="p">:</span>
439440 <span class="n">s</span> <span class="o">+=</span> <span class="n">_s</span>
440441 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">2</span>
441442 <span class="k">else</span><span class="p">:</span>
442 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_NEGOTIATE (without security extensions) Challenge field&#39;</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>
443 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_NEGOTIATE (without security extensions) Challenge field&#39;</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>
443444 <span class="k">else</span><span class="p">:</span>
444445 <span class="k">if</span> <span class="n">data_len</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="p">:</span>
445 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_NEGOTIATE (with security extensions) ServerGUID field&#39;</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>
446 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_NEGOTIATE (with security extensions) ServerGUID field&#39;</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>
446447
447448 <span class="bp">self</span><span class="o">.</span><span class="n">server_guid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="mi">16</span><span class="p">]</span>
448449 <span class="bp">self</span><span class="o">.</span><span class="n">security_blob</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">16</span><span class="p">:]</span>
459460 <span class="sd"> - [MS-SMB]: 2.2.4.6.1</span>
460461 <span class="sd"> &quot;&quot;&quot;</span>
461462
462 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHIHII&#39;</span>
463 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHIHII&#39;</span>
463464
464465 <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">session_key</span><span class="p">,</span> <span class="n">security_blob</span><span class="p">):</span>
465466 <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="o">=</span> <span class="n">session_key</span>
483484
484485 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_blob</span>
485486 <span class="k">if</span> <span class="p">(</span><span class="n">SMBMessage</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">))</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
486 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
487 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span> <span class="o">*</span> <span class="mi">4</span>
487 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
488 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</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">4</span>
488489
489490
490491 <span class="k">class</span> <span class="nc">ComSessionSetupAndxRequest__NoSecurityExtension</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
494495 <span class="sd"> - [MS-CIFS]: 2.2.4.53.1</span>
495496 <span class="sd"> &quot;&quot;&quot;</span>
496497
497 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHIHHII&#39;</span>
498 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHIHHII&#39;</span>
498499
499500 <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">session_key</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">is_unicode</span><span class="p">,</span> <span class="n">domain</span><span class="p">):</span>
500501 <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
523524 <span class="mi">0</span><span class="p">,</span>
524525 <span class="n">CAP_UNICODE</span> <span class="o">|</span> <span class="n">CAP_LARGE_FILES</span> <span class="o">|</span> <span class="n">CAP_STATUS32</span><span class="p">)</span>
525526
526 <span class="n">est_offset</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="c"># To check if data until SMB paramaters are aligned to a 16-bit boundary</span>
527 <span class="n">est_offset</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="c1"># To check if data until SMB paramaters are aligned to a 16-bit boundary</span>
527528
528529 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span>
529530 <span class="k">if</span> <span class="p">(</span><span class="n">est_offset</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">))</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">&amp;</span> <span class="n">SMB_FLAGS2_UNICODE</span><span class="p">:</span>
530 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
531 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
531532
532533 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">&amp;</span> <span class="n">SMB_FLAGS2_UNICODE</span><span class="p">:</span>
533 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
534 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</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="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
534535 <span class="k">else</span><span class="p">:</span>
535 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="nb">str</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="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
536 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="nb">str</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="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
536537
537538 <span class="k">if</span> <span class="p">(</span><span class="n">est_offset</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">))</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">&amp;</span> <span class="n">SMB_FLAGS2_UNICODE</span><span class="p">:</span>
538 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
539 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
539540
540541 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">&amp;</span> <span class="n">SMB_FLAGS2_UNICODE</span><span class="p">:</span>
541 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span> <span class="o">+</span> <span class="s">&#39;pysmb&#39;</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
542 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</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="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;pysmb&#39;</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="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
542543 <span class="k">else</span><span class="p">:</span>
543 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">pysmb</span><span class="se">\0</span><span class="s">&#39;</span>
544 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">pysmb</span><span class="se">\0</span><span class="s1">&#39;</span>
544545
545546
546547 <span class="k">class</span> <span class="nc">ComSessionSetupAndxResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
566567 <span class="sd"> - [MS-CIFS]: 2.2.4.53.2</span>
567568 <span class="sd"> &quot;&quot;&quot;</span>
568569
569 <span class="n">NOSECURE_PARAMETER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHH&#39;</span>
570 <span class="n">NOSECURE_PARAMETER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHH&#39;</span>
570571 <span class="n">NOSECURE_PARAMETER_STRUCT_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">NOSECURE_PARAMETER_STRUCT_FORMAT</span><span class="p">)</span>
571572
572 <span class="n">SECURE_PARAMETER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHHH&#39;</span>
573 <span class="n">SECURE_PARAMETER_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHH&#39;</span>
573574 <span class="n">SECURE_PARAMETER_STRUCT_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">SECURE_PARAMETER_STRUCT_FORMAT</span><span class="p">)</span>
574575
575576 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
577578 <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
578579 <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>
579580 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">NOSECURE_PARAMETER_STRUCT_SIZE</span><span class="p">:</span>
580 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (no security extensions) parameters&#39;</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>
581 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (no security extensions) parameters&#39;</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>
581582
582583 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</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="bp">self</span><span class="o">.</span><span class="n">NOSECURE_PARAMETER_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">NOSECURE_PARAMETER_STRUCT_SIZE</span><span class="p">])</span>
583584 <span class="k">else</span><span class="p">:</span>
584 <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="ow">or</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="c"># STATUS_MORE_PROCESSING_REQUIRED</span>
585 <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="ow">or</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>
585586 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">SECURE_PARAMETER_STRUCT_SIZE</span><span class="p">:</span>
586 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) parameters&#39;</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>
587 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) parameters&#39;</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>
587588
588589 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">action</span><span class="p">,</span> <span class="n">blob_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="bp">self</span><span class="o">.</span><span class="n">SECURE_PARAMETER_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">SECURE_PARAMETER_STRUCT_SIZE</span><span class="p">])</span>
589590 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">blob_length</span><span class="p">:</span>
590 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) security blob&#39;</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>
591 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_SESSION_SETUP_ANDX (with security extensions) security blob&#39;</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>
591592
592593 <span class="bp">self</span><span class="o">.</span><span class="n">security_blob</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="n">blob_length</span><span class="p">]</span>
593594
600601 <span class="sd"> - [MS-SMB]: 2.2.4.7.1</span>
601602 <span class="sd"> &quot;&quot;&quot;</span>
602603
603 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HH&#39;</span>
604 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
605
606 <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">path</span><span class="p">,</span> <span class="n">service</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">):</span>
604 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HH&#39;</span>
605 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
606
607 <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">path</span><span class="p">,</span> <span class="n">service</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">):</span>
607608 <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">path</span>
608609 <span class="bp">self</span><span class="o">.</span><span class="n">service</span> <span class="o">=</span> <span class="n">service</span>
609 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
610 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
610611
611612 <span class="k">def</span> <span class="nf">initMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
612613 <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> <span class="n">message</span><span class="p">)</span>
619620 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
620621 <span class="mh">0x08</span> <span class="o">|</span> \
621622 <span class="p">((</span><span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span> <span class="ow">and</span> <span class="mh">0x0004</span><span class="p">)</span> <span class="ow">or</span> <span class="mh">0x00</span><span class="p">)</span> <span class="o">|</span> \
622 <span class="p">((</span><span class="n">message</span><span class="o">.</span><span class="n">tid</span> <span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">tid</span> <span class="o">!=</span> <span class="mh">0xFFFF</span> <span class="ow">and</span> <span class="mh">0x0001</span><span class="p">)</span> <span class="ow">or</span> <span class="mh">0x00</span><span class="p">),</span> <span class="c"># Disconnect tid, if message.tid must be non-zero</span>
623 <span class="p">((</span><span class="n">message</span><span class="o">.</span><span class="n">tid</span> <span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">tid</span> <span class="o">!=</span> <span class="mh">0xFFFF</span> <span class="ow">and</span> <span class="mh">0x0001</span><span class="p">)</span> <span class="ow">or</span> <span class="mh">0x00</span><span class="p">),</span> <span class="c1"># Disconnect tid, if message.tid must be non-zero</span>
623624 <span class="n">password_len</span><span class="p">)</span>
624625
625 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
626 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
626627 <span class="k">if</span> <span class="n">password_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
627 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
628
629 <span class="c"># Note that service field is never encoded in UTF-16LE. [MS-CIFS]: 2.2.1.1</span>
630 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">service</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
628 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
629
630 <span class="c1"># Note that service field is never encoded in UTF-16LE. [MS-CIFS]: 2.2.1.1</span>
631 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">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> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">service</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
631632
632633
633634 <span class="k">class</span> <span class="nc">ComTreeConnectAndxResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
642643 <span class="sd"> - [MS-CIFS]: 2.2.4.55.2</span>
643644 <span class="sd"> &quot;&quot;&quot;</span>
644645
645 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHH&#39;</span>
646 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHH&#39;</span>
646647 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
647648
648649 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
650651
651652 <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>
652653 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
653 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_TREE_CONNECT_ANDX parameters&#39;</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>
654 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_TREE_CONNECT_ANDX parameters&#39;</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>
654655
655656 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">optional_support</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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">])</span>
656657
663664 <span class="sd"> - [MS-SMB]: 2.2.4.9.1</span>
664665 <span class="sd"> &quot;&quot;&quot;</span>
665666
666 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BHIIIQIIIIIB&#39;</span>
667 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BHIIIQIIIIIB&#39;</span>
667668 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
668669
669670 <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">filename</span><span class="p">,</span> <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">root_fid</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">access_mask</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">allocation_size</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">ext_attr</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
670671 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">create_disp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">impersonation</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">security_flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
671 <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="p">(</span><span class="n">filename</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
672 <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="p">(</span><span class="n">filename</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>
672673 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
673674 <span class="bp">self</span><span class="o">.</span><span class="n">root_fid</span> <span class="o">=</span> <span class="n">root_fid</span>
674675 <span class="bp">self</span><span class="o">.</span><span class="n">access_mask</span> <span class="o">=</span> <span class="n">access_mask</span>
690691 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> \
691692 <span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_ANDX_PARAM_HEADER</span> <span class="o">+</span> \
692693 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
693 <span class="mh">0x00</span><span class="p">,</span> <span class="c"># reserved</span>
694 <span class="n">filename_len</span><span class="p">,</span> <span class="c"># NameLength</span>
695 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="c"># Flags</span>
696 <span class="bp">self</span><span class="o">.</span><span class="n">root_fid</span><span class="p">,</span> <span class="c"># RootDirectoryFID</span>
697 <span class="bp">self</span><span class="o">.</span><span class="n">access_mask</span><span class="p">,</span> <span class="c"># DesiredAccess</span>
698 <span class="bp">self</span><span class="o">.</span><span class="n">allocation_size</span><span class="p">,</span> <span class="c"># AllocationSize</span>
699 <span class="bp">self</span><span class="o">.</span><span class="n">ext_attr</span><span class="p">,</span> <span class="c"># ExtFileAttributes</span>
700 <span class="bp">self</span><span class="o">.</span><span class="n">share_access</span><span class="p">,</span> <span class="c"># ShareAccess</span>
701 <span class="bp">self</span><span class="o">.</span><span class="n">create_disp</span><span class="p">,</span> <span class="c"># CreateDisposition</span>
702 <span class="bp">self</span><span class="o">.</span><span class="n">create_options</span><span class="p">,</span> <span class="c"># CreateOptions</span>
703 <span class="bp">self</span><span class="o">.</span><span class="n">impersonation</span><span class="p">,</span> <span class="c"># ImpersonationLevel</span>
704 <span class="bp">self</span><span class="o">.</span><span class="n">security_flags</span><span class="p">)</span> <span class="c"># SecurityFlags</span>
705
706 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
694 <span class="mh">0x00</span><span class="p">,</span> <span class="c1"># reserved</span>
695 <span class="n">filename_len</span><span class="p">,</span> <span class="c1"># NameLength</span>
696 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="c1"># Flags</span>
697 <span class="bp">self</span><span class="o">.</span><span class="n">root_fid</span><span class="p">,</span> <span class="c1"># RootDirectoryFID</span>
698 <span class="bp">self</span><span class="o">.</span><span class="n">access_mask</span><span class="p">,</span> <span class="c1"># DesiredAccess</span>
699 <span class="bp">self</span><span class="o">.</span><span class="n">allocation_size</span><span class="p">,</span> <span class="c1"># AllocationSize</span>
700 <span class="bp">self</span><span class="o">.</span><span class="n">ext_attr</span><span class="p">,</span> <span class="c1"># ExtFileAttributes</span>
701 <span class="bp">self</span><span class="o">.</span><span class="n">share_access</span><span class="p">,</span> <span class="c1"># ShareAccess</span>
702 <span class="bp">self</span><span class="o">.</span><span class="n">create_disp</span><span class="p">,</span> <span class="c1"># CreateDisposition</span>
703 <span class="bp">self</span><span class="o">.</span><span class="n">create_options</span><span class="p">,</span> <span class="c1"># CreateOptions</span>
704 <span class="bp">self</span><span class="o">.</span><span class="n">impersonation</span><span class="p">,</span> <span class="c1"># ImpersonationLevel</span>
705 <span class="bp">self</span><span class="o">.</span><span class="n">security_flags</span><span class="p">)</span> <span class="c1"># SecurityFlags</span>
706
707 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
707708 <span class="k">if</span> <span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">))</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
708 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
709 <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
709710
710711 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">padding</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span>
711712
722723 <span class="sd"> ===========</span>
723724 <span class="sd"> - [MS-CIFS]: 2.2.4.64.2</span>
724725 <span class="sd"> &quot;&quot;&quot;</span>
725 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHBH&#39;</span>
726 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHBH&#39;</span>
726727 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
727728
728729 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
730731
731732 <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>
732733 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
733 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_NT_CREATE_ANDX parameters&#39;</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>
734 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_NT_CREATE_ANDX parameters&#39;</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>
734735
735736 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">oplock_level</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fid</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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">])</span>
736737
742743 <span class="sd"> - [MS-CIFS]: 2.2.4.33.1</span>
743744 <span class="sd"> &quot;&quot;&quot;</span>
744745
745 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHHBBHIHHHHHH&#39;</span>
746 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHHBBHIHHHHHH&#39;</span>
746747 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
747748
748749 <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">max_params_count</span><span class="p">,</span> <span class="n">max_data_count</span><span class="p">,</span> <span class="n">max_setup_count</span><span class="p">,</span>
749750 <span class="n">total_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">total_data_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
750 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span>
751 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\\</span><span class="s">PIPE</span><span class="se">\\</span><span class="s">&quot;</span><span class="p">):</span>
751 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
752 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">PIPE</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">):</span>
752753 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span> <span class="o">=</span> <span class="n">total_params_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">params_bytes</span><span class="p">)</span>
753754 <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span> <span class="o">=</span> <span class="n">total_data_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
754755 <span class="bp">self</span><span class="o">.</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="n">max_params_count</span>
766767 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_TRANSACTION</span>
767768
768769 <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>
769 <span class="n">name</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="o">+</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span>
770 <span class="n">name</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="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>
770771 <span class="n">name_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
771772 <span class="n">setup_bytes_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">setup_bytes</span><span class="p">)</span>
772773 <span class="n">params_bytes_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">params_bytes</span><span class="p">)</span>
773774 <span class="n">data_bytes_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">data_bytes</span><span class="p">)</span>
774775
775 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
776 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
776 <span class="n">padding0</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
777 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
777778 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
778 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
779 <span class="n">padding0</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
779780 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">1</span>
780781
781 <span class="n">offset</span> <span class="o">+=</span> <span class="n">name_len</span> <span class="c"># For the name field</span>
782 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
782 <span class="n">offset</span> <span class="o">+=</span> <span class="n">name_len</span> <span class="c1"># For the name field</span>
783 <span class="n">padding1</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
783784 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
784 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
785 <span class="n">padding1</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
785786 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
786787
787788 <span class="k">if</span> <span class="n">params_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
790791 <span class="k">else</span><span class="p">:</span>
791792 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="mi">0</span>
792793
793 <span class="n">padding2</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
794 <span class="n">padding2</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
794795 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
795 <span class="n">padding2</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
796 <span class="n">padding2</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
796797 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
797798
798799 <span class="k">if</span> <span class="n">data_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
807808 <span class="bp">self</span><span class="o">.</span><span class="n">max_params_count</span><span class="p">,</span>
808809 <span class="bp">self</span><span class="o">.</span><span class="n">max_data_count</span><span class="p">,</span>
809810 <span class="bp">self</span><span class="o">.</span><span class="n">max_setup_count</span><span class="p">,</span>
810 <span class="mh">0x00</span><span class="p">,</span> <span class="c"># Reserved1. Must be 0x00</span>
811 <span class="mh">0x00</span><span class="p">,</span> <span class="c1"># Reserved1. Must be 0x00</span>
811812 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span>
812813 <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span>
813 <span class="mh">0x0000</span><span class="p">,</span> <span class="c"># Reserved2. Must be 0x0000</span>
814 <span class="mh">0x0000</span><span class="p">,</span> <span class="c1"># Reserved2. Must be 0x0000</span>
814815 <span class="n">params_bytes_len</span><span class="p">,</span>
815816 <span class="n">params_bytes_offset</span><span class="p">,</span>
816817 <span class="n">data_bytes_len</span><span class="p">,</span>
837838 <span class="sd"> - [MS-CIFS]: 2.2.4.33.2</span>
838839 <span class="sd"> &quot;&quot;&quot;</span>
839840
840 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHHHHHHHH&#39;</span>
841 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHHHHHHHH&#39;</span>
841842 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
842843
843844 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
845846
846847 <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>
847848 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
848 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
849 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
849850
850851 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
851852 <span class="n">params_bytes_len</span><span class="p">,</span> <span class="n">params_bytes_offset</span><span class="p">,</span> <span class="n">params_bytes_displ</span><span class="p">,</span> \
856857 <span class="n">setup_bytes_len</span> <span class="o">=</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span>
857858
858859 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span><span class="p">:</span>
859 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
860 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
860861
861862 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="o">+</span><span class="n">setup_bytes_len</span><span class="p">]</span>
862863 <span class="k">else</span><span class="p">:</span>
863 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
864
865 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
864 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
865
866 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
866867
867868 <span class="k">if</span> <span class="n">params_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
868869 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">params_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="p">:</span><span class="n">params_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="o">+</span><span class="n">params_bytes_len</span><span class="p">]</span>
869870 <span class="k">else</span><span class="p">:</span>
870 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
871 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
871872
872873 <span class="k">if</span> <span class="n">data_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
873874 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">data_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="p">:</span><span class="n">data_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="o">+</span><span class="n">data_bytes_len</span><span class="p">]</span>
874875 <span class="k">else</span><span class="p">:</span>
875 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
876 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
876877
877878
878879 <span class="k">class</span> <span class="nc">ComTransaction2Request</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
882883 <span class="sd"> - [MS-CIFS]: 2.2.4.46.1</span>
883884 <span class="sd"> &quot;&quot;&quot;</span>
884885
885 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;HHHHBBHIHHHHHH&#39;</span>
886 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;HHHHBBHIHHHHHH&#39;</span>
886887 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
887888
888889 <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">max_params_count</span><span class="p">,</span> <span class="n">max_data_count</span><span class="p">,</span> <span class="n">max_setup_count</span><span class="p">,</span>
889890 <span class="n">total_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">total_data_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
890 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span>
891 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
891892 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
892893 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span> <span class="o">=</span> <span class="n">total_params_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">params_bytes</span><span class="p">)</span>
893894 <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span> <span class="o">=</span> <span class="n">total_data_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
908909 <span class="n">setup_bytes_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">setup_bytes</span><span class="p">)</span>
909910 <span class="n">params_bytes_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">params_bytes</span><span class="p">)</span>
910911 <span class="n">data_bytes_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">data_bytes</span><span class="p">)</span>
911 <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
912
913 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
914 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
912 <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
913
914 <span class="n">padding0</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
915 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
915916 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
916 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span>
917 <span class="n">padding0</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span>
917918 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">1</span>
918919
919 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">2</span> <span class="c"># For the name field</span>
920 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
920 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">2</span> <span class="c1"># For the name field</span>
921 <span class="n">padding1</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
921922 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
922 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
923 <span class="n">padding1</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
923924
924925 <span class="k">if</span> <span class="n">params_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
925926 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="n">offset</span>
927928 <span class="k">else</span><span class="p">:</span>
928929 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="mi">0</span>
929930
930 <span class="n">padding2</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
931 <span class="n">padding2</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
931932 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
932 <span class="n">padding2</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
933 <span class="n">padding2</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
933934
934935 <span class="k">if</span> <span class="n">data_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
935936 <span class="n">data_bytes_offset</span> <span class="o">=</span> <span class="n">offset</span>
943944 <span class="bp">self</span><span class="o">.</span><span class="n">max_params_count</span><span class="p">,</span>
944945 <span class="bp">self</span><span class="o">.</span><span class="n">max_data_count</span><span class="p">,</span>
945946 <span class="bp">self</span><span class="o">.</span><span class="n">max_setup_count</span><span class="p">,</span>
946 <span class="mh">0x00</span><span class="p">,</span> <span class="c"># Reserved1. Must be 0x00</span>
947 <span class="mh">0x00</span><span class="p">,</span> <span class="c1"># Reserved1. Must be 0x00</span>
947948 <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span>
948949 <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span>
949 <span class="mh">0x0000</span><span class="p">,</span> <span class="c"># Reserved2. Must be 0x0000</span>
950 <span class="mh">0x0000</span><span class="p">,</span> <span class="c1"># Reserved2. Must be 0x0000</span>
950951 <span class="n">params_bytes_len</span><span class="p">,</span>
951952 <span class="n">params_bytes_offset</span><span class="p">,</span>
952953 <span class="n">data_bytes_len</span><span class="p">,</span>
973974 <span class="sd"> - [MS-CIFS]: 2.2.4.46.2</span>
974975 <span class="sd"> &quot;&quot;&quot;</span>
975976
976 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHHHHHHHBB&#39;</span>
977 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHHHHHHHBB&#39;</span>
977978 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
978979
979980 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
981982
982983 <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>
983984 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
984 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_TRANSACTION2 parameters&#39;</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>
985 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_TRANSACTION2 parameters&#39;</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>
985986
986987 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
987988 <span class="n">params_bytes_len</span><span class="p">,</span> <span class="n">params_bytes_offset</span><span class="p">,</span> <span class="n">params_bytes_displ</span><span class="p">,</span> \
992993 <span class="n">setup_bytes_len</span> <span class="o">=</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span>
993994
994995 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span><span class="p">:</span>
995 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
996 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_TRANSACTION parameters&#39;</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>
996997
997998 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="o">+</span><span class="n">setup_bytes_len</span><span class="p">]</span>
998999 <span class="k">else</span><span class="p">:</span>
999 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1000
1001 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
1000 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
1001
1002 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
10021003
10031004 <span class="k">if</span> <span class="n">params_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
10041005 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">params_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="p">:</span><span class="n">params_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="o">+</span><span class="n">params_bytes_len</span><span class="p">]</span>
10051006 <span class="k">else</span><span class="p">:</span>
1006 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1007 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
10071008
10081009 <span class="k">if</span> <span class="n">data_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
10091010 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">data_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="p">:</span><span class="n">data_bytes_offset</span><span class="o">-</span><span class="n">offset</span><span class="o">+</span><span class="n">data_bytes_len</span><span class="p">]</span>
10101011 <span class="k">else</span><span class="p">:</span>
1011 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1012 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
10121013
10131014
10141015 <span class="k">class</span> <span class="nc">ComCloseRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
10181019 <span class="sd"> - [MS-CIFS]: 2.2.4.5.1</span>
10191020 <span class="sd"> &quot;&quot;&quot;</span>
10201021
1021 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HI&#39;</span>
1022 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HI&#39;</span>
10221023 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
10231024
10241025 <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">fid</span><span class="p">,</span> <span class="n">last_modified_time</span> <span class="o">=</span> <span class="mh">0xFFFFFFFF</span><span class="p">):</span>
10311032
10321033 <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>
10331034 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_modified_time</span><span class="p">)</span>
1034 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1035 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
10351036
10361037
10371038 <span class="k">class</span> <span class="nc">ComOpenAndxRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
10411042 <span class="sd"> - [MS-CIFS]: 2.2.4.41.1</span>
10421043 <span class="sd"> &quot;&quot;&quot;</span>
10431044
1044 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HHHHIHIII&#39;</span>
1045 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HHHHIHIII&#39;</span>
10451046 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
10461047
10471048 <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">filename</span><span class="p">,</span> <span class="n">access_mode</span><span class="p">,</span> <span class="n">open_mode</span><span class="p">,</span> <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x0000</span><span class="p">,</span> <span class="n">search_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">create_time</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
10741075 <span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span>
10751076 <span class="bp">self</span><span class="o">.</span><span class="n">create_time</span><span class="p">,</span>
10761077 <span class="bp">self</span><span class="o">.</span><span class="n">open_mode</span><span class="p">,</span>
1077 <span class="mi">0</span><span class="p">,</span> <span class="c"># AllocationSize</span>
1078 <span class="mi">0</span><span class="p">,</span> <span class="c"># Timeout (in milli-secs)</span>
1079 <span class="mi">0</span><span class="p">)</span> <span class="c"># Reserved</span>
1080
1081 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
1078 <span class="mi">0</span><span class="p">,</span> <span class="c1"># AllocationSize</span>
1079 <span class="mi">0</span><span class="p">,</span> <span class="c1"># Timeout (in milli-secs)</span>
1080 <span class="mi">0</span><span class="p">)</span> <span class="c1"># Reserved</span>
1081
1082 <span class="n">message</span><span class="o">.</span><span class="n">data</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="bp">self</span><span class="o">.</span><span class="n">filename</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="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
10821083
10831084
10841085 <span class="k">class</span> <span class="nc">ComOpenAndxResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
10991100 <span class="sd"> - [MS-SMB]: 2.2.4.1.2</span>
11001101 <span class="sd"> &quot;&quot;&quot;</span>
11011102
1102 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHHHIIHHHHHHH&#39;</span>
1103 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHHIIHHHHHHH&#39;</span>
11031104 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
11041105
11051106 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
11071108
11081109 <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>
11091110 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
1110 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_OPEN_ANDX parameters&#39;</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>
1111 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_OPEN_ANDX parameters&#39;</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>
11111112
11121113 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_write_time</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
11131114 <span class="bp">self</span><span class="o">.</span><span class="n">access_rights</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">resource_type</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_results</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
11221123 <span class="sd"> - [MS-SMB]: 2.2.4.3.1</span>
11231124 <span class="sd"> &quot;&quot;&quot;</span>
11241125
1125 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HIIHHHHHI&#39;</span>
1126 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HIIHHHHHI&#39;</span>
11261127 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
11271128
11281129 <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">fid</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">write_mode</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
11411142 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_WRITE_ANDX</span>
11421143
11431144 <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>
1144 <span class="c"># constant 1 is to account for the pad byte in the message.data</span>
1145 <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
1145 <span class="c1"># constant 1 is to account for the pad byte in the message.data</span>
1146 <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
11461147 <span class="n">data_offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_ANDX_PARAM_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
11471148 <span class="n">data_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">data_bytes</span><span class="p">)</span>
11481149
11531154 <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">,</span>
11541155 <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span>
11551156 <span class="bp">self</span><span class="o">.</span><span class="n">write_mode</span><span class="p">,</span>
1156 <span class="n">data_len</span><span class="p">,</span> <span class="c"># Remaining</span>
1157 <span class="mh">0x0000</span><span class="p">,</span> <span class="c"># Reserved</span>
1158 <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span> <span class="c"># DataLength</span>
1159 <span class="n">data_offset</span><span class="p">,</span> <span class="c"># DataOffset</span>
1160 <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">&gt;&gt;</span> <span class="mi">32</span><span class="p">)</span> <span class="c"># OffsetHigh field defined in [MS-SMB]: 2.2.4.3.1</span>
1161
1162 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span>
1157 <span class="n">data_len</span><span class="p">,</span> <span class="c1"># Remaining</span>
1158 <span class="mh">0x0000</span><span class="p">,</span> <span class="c1"># Reserved</span>
1159 <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span> <span class="c1"># DataLength</span>
1160 <span class="n">data_offset</span><span class="p">,</span> <span class="c1"># DataOffset</span>
1161 <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">&gt;&gt;</span> <span class="mi">32</span><span class="p">)</span> <span class="c1"># OffsetHigh field defined in [MS-SMB]: 2.2.4.3.1</span>
1162
1163 <span class="n">message</span><span class="o">.</span><span class="n">data</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="bp">self</span><span class="o">.</span><span class="n">data_bytes</span>
11631164
11641165
11651166 <span class="k">class</span> <span class="nc">ComWriteAndxResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
11701171 <span class="sd"> - [MS-SMB]: 2.2.4.3.2</span>
11711172 <span class="sd"> &quot;&quot;&quot;</span>
11721173
1173 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHHHHH&#39;</span> <span class="c"># We follow the SMB_COM_WRITEX_ANDX server extensions in [MS-SMB]: 2.2.4.3.2</span>
1174 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHHHH&#39;</span> <span class="c1"># We follow the SMB_COM_WRITEX_ANDX server extensions in [MS-SMB]: 2.2.4.3.2</span>
11741175 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
11751176
11761177 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
11781179
11791180 <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>
11801181 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
1181 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_WRITE_ANDX parameters&#39;</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>
1182 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_WRITE_ANDX parameters&#39;</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>
11821183
11831184 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">available</span><span class="p">,</span> <span class="n">high_count</span><span class="p">,</span> <span class="n">_</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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">])</span>
11841185 <span class="bp">self</span><span class="o">.</span><span class="n">count</span> <span class="o">=</span> <span class="p">(</span><span class="n">count</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">high_count</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">)</span>
11921193 <span class="sd"> - [MS-SMB]: 2.2.4.2.1</span>
11931194 <span class="sd"> &quot;&quot;&quot;</span>
11941195
1195 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;HIHHIHI&#39;</span>
1196 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;HIHHIHI&#39;</span>
11961197 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
11971198
11981199 <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">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_return_bytes_count</span><span class="p">,</span> <span class="n">min_return_bytes_count</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
12191220 <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">,</span>
12201221 <span class="bp">self</span><span class="o">.</span><span class="n">max_return_bytes_count</span><span class="p">,</span>
12211222 <span class="bp">self</span><span class="o">.</span><span class="n">min_return_bytes_count</span><span class="p">,</span>
1222 <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_return_bytes_count</span> <span class="o">&gt;&gt;</span> <span class="mi">32</span><span class="p">),</span> <span class="c"># Note that in [MS-SMB]: 2.2.4.2.1, this field can also act as MaxCountHigh field</span>
1223 <span class="bp">self</span><span class="o">.</span><span class="n">remaining</span><span class="p">,</span> <span class="c"># In [MS-CIFS]: 2.2.4.42.1, this field must be set to 0x0000</span>
1223 <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_return_bytes_count</span> <span class="o">&gt;&gt;</span> <span class="mi">32</span><span class="p">),</span> <span class="c1"># Note that in [MS-SMB]: 2.2.4.2.1, this field can also act as MaxCountHigh field</span>
1224 <span class="bp">self</span><span class="o">.</span><span class="n">remaining</span><span class="p">,</span> <span class="c1"># In [MS-CIFS]: 2.2.4.42.1, this field must be set to 0x0000</span>
12241225 <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">&gt;&gt;</span> <span class="mi">32</span><span class="p">)</span>
12251226
1226 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1227 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
12271228
12281229
12291230 <span class="k">class</span> <span class="nc">ComReadAndxResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
12341235 <span class="sd"> - [MS-SMB]: 2.2.4.2.2</span>
12351236 <span class="sd"> &quot;&quot;&quot;</span>
12361237
1237 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BBHHHHHHHHHHH&#39;</span>
1238 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHHHHHHHHHH&#39;</span>
12381239 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
12391240
12401241 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
12421243
12431244 <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>
12441245 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">:</span>
1245 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s">&#39;Not enough data to decode SMB_COM_READ_ANDX parameters&#39;</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>
1246 <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Not enough data to decode SMB_COM_READ_ANDX parameters&#39;</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>
12461247
12471248 <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_length</span><span class="p">,</span> <span class="n">data_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</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="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
12481249 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span><span class="p">])</span>
12491250
1250 <span class="n">offset</span> <span class="o">=</span> <span class="n">data_offset</span> <span class="o">-</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">-</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
1251 <span class="n">offset</span> <span class="o">=</span> <span class="n">data_offset</span> <span class="o">-</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">-</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
12511252 <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</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="bp">self</span><span class="o">.</span><span class="n">data_length</span><span class="p">]</span>
12521253 <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_length</span>
12531254
12681269 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_DELETE</span>
12691270
12701271 <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>
1271 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_attributes</span><span class="p">)</span>
1272 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x04</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename_pattern</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
1272 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_attributes</span><span class="p">)</span>
1273 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x04</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename_pattern</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="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
12731274
12741275
12751276 <span class="k">class</span> <span class="nc">ComCreateDirectoryRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
12901291 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_CREATE_DIRECTORY</span>
12911292
12921293 <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>
1293 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1294 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x04</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
1294 <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>
1295 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x04</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">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> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
12951296
12961297
12971298 <span class="k">class</span> <span class="nc">ComDeleteDirectoryRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
13091310 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_DELETE_DIRECTORY</span>
13101311
13111312 <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>
1312 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1313 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x04</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\0\0</span><span class="s">&#39;</span>
1313 <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>
1314 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x04</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">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> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
13141315
13151316
13161317 <span class="k">class</span> <span class="nc">ComRenameRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
13301331 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_RENAME</span>
13311332
13321333 <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>
1333 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_attributes</span><span class="p">)</span>
1334 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\x04</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\x00\x00\x04\x00</span><span class="s">&#39;</span> <span class="o">+</span> <span class="bp">self</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="s">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\x00\x00</span><span class="s">&#39;</span>
1334 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_attributes</span><span class="p">)</span>
1335 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x04</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_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> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\x00\x00\x04\x00</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</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> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\x00\x00</span><span class="s1">&#39;</span>
13351336
13361337
13371338 <span class="k">class</span> <span class="nc">ComEchoRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
13411342 <span class="sd"> - [MS-CIFS]: 2.2.4.39.1</span>
13421343 <span class="sd"> &quot;&quot;&quot;</span>
13431344
1344 <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="s">&#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>
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>
13451346 <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>
13461347 <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>
13471348
13511352 <span class="n">message</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="mh">0xFFFF</span>
13521353
13531354 <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>
1354 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">echo_count</span><span class="p">)</span>
1355 <span class="n">message</span><span class="o">.</span><span class="n">parameters_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;&lt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">echo_count</span><span class="p">)</span>
13551356 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">echo_data</span>
13561357
13571358
13631364 <span class="sd"> &quot;&quot;&quot;</span>
13641365
13651366 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1366 <span class="bp">self</span><span class="o">.</span><span class="n">sequence_number</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="s">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
1367 <span class="bp">self</span><span class="o">.</span><span class="n">sequence_number</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">message</span><span class="o">.</span><span class="n">parameters_data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
13671368 <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span>
13681369
13691370
13731374 <span class="sd"> ===========</span>
13741375 <span class="sd"> - [MS-CIFS]: 2.2.4.62.1</span>
13751376 <span class="sd"> &quot;&quot;&quot;</span>
1376 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BHIIIIIIIIBH&#39;</span>
1377 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BHIIIIIIIIBH&#39;</span>
13771378 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
13781379
13791380 <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">function</span><span class="p">,</span> <span class="n">max_params_count</span><span class="p">,</span> <span class="n">max_data_count</span><span class="p">,</span> <span class="n">max_setup_count</span><span class="p">,</span>
13801381 <span class="n">total_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">total_data_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1381 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">):</span>
1382 <span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">setup_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">):</span>
13821383 <span class="bp">self</span><span class="o">.</span><span class="n">function</span> <span class="o">=</span> <span class="n">function</span>
13831384 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span> <span class="o">=</span> <span class="n">total_params_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">params_bytes</span><span class="p">)</span>
13841385 <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span> <span class="o">=</span> <span class="n">total_data_count</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
13981399 <span class="n">params_bytes_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">params_bytes</span><span class="p">)</span>
13991400 <span class="n">data_bytes_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">data_bytes</span><span class="p">)</span>
14001401
1401 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1402 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
1402 <span class="n">padding0</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
1403 <span class="n">offset</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_bytes_len</span> <span class="o">+</span> <span class="mi">2</span> <span class="c1"># constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters)</span>
14031404 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
1404 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
1405 <span class="n">padding0</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
14051406 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
14061407
14071408 <span class="k">if</span> <span class="n">params_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
14101411 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="mi">0</span>
14111412
14121413 <span class="n">offset</span> <span class="o">+=</span> <span class="n">params_bytes_len</span>
1413 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1414 <span class="n">padding1</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
14141415 <span class="k">if</span> <span class="n">offset</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
1415 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\0</span><span class="s">&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
1416 <span class="n">padding1</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="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
14161417 <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">4</span><span class="o">-</span><span class="n">offset</span><span class="o">%</span><span class="mi">4</span><span class="p">)</span>
14171418
14181419 <span class="k">if</span> <span class="n">data_bytes_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
14231424 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> \
14241425 <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
14251426 <span class="bp">self</span><span class="o">.</span><span class="n">max_setup_count</span><span class="p">,</span>
1426 <span class="mh">0x00</span><span class="p">,</span> <span class="c"># Reserved1. Must be 0x00</span>
1427 <span class="mh">0x00</span><span class="p">,</span> <span class="c1"># Reserved1. Must be 0x00</span>
14271428 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span><span class="p">,</span>
14281429 <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
14291430 <span class="bp">self</span><span class="o">.</span><span class="n">max_params_count</span><span class="p">,</span>
14541455 <span class="sd"> ===========</span>
14551456 <span class="sd"> - [MS-CIFS]: 2.2.4.62.2</span>
14561457 <span class="sd"> &quot;&quot;&quot;</span>
1457 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;3sIIIIIIIIBH&#39;</span>
1458 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;3sIIIIIIIIBH&#39;</span>
14581459 <span class="n">PAYLOAD_STRUCT_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">)</span>
14591460
14601461 <span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
14721473 <span class="n">params_offset</span> <span class="o">-=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span>
14731474 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">params_offset</span><span class="p">:</span><span class="n">params_offset</span><span class="o">+</span><span class="n">params_count</span><span class="p">]</span>
14741475 <span class="k">else</span><span class="p">:</span>
1475 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1476 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
14761477
14771478 <span class="k">if</span> <span class="n">data_count</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
14781479 <span class="n">data_offset</span> <span class="o">-=</span> <span class="n">message</span><span class="o">.</span><span class="n">HEADER_STRUCT_SIZE</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">PAYLOAD_STRUCT_SIZE</span> <span class="o">+</span> <span class="n">setup_count</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span>
14791480 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">data_offset</span><span class="p">:</span><span class="n">data_offset</span><span class="o">+</span><span class="n">data_count</span><span class="p">]</span>
14801481 <span class="k">else</span><span class="p">:</span>
1481 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1482 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
14821483 </pre></div>
14831484
14841485 </div>
14861487 </div>
14871488 <div class="clearer"></div>
14881489 </div>
1489 <div class="related">
1490 <div class="related" role="navigation" aria-label="related navigation">
14901491 <h3>Navigation</h3>
14911492 <ul>
14921493 <li class="right" style="margin-right: 10px">
14931494 <a href="../../genindex.html" title="General Index"
14941495 >index</a></li>
1495 <li><a href="../../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
1496 <li><a href="../index.html" >Module code</a> &raquo;</li>
1496 <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
1497 <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li>
14971498 </ul>
14981499 </div>
1499 <div class="footer">
1500 <div class="footer" role="contentinfo">
15001501 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
1501 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
1502 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
15021503 </div>
15031504 </body>
15041505 </html>
33 *
44 * Sphinx stylesheet -- basic theme.
55 *
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
196196 h4:hover > a.headerlink,
197197 h5:hover > a.headerlink,
198198 h6:hover > a.headerlink,
199 dt:hover > a.headerlink {
199 dt:hover > a.headerlink,
200 caption:hover > a.headerlink,
201 p.caption:hover > a.headerlink,
202 div.code-block-caption:hover > a.headerlink {
200203 visibility: visible;
201204 }
202205
313316 border-collapse: collapse;
314317 }
315318
319 table caption span.caption-number {
320 font-style: italic;
321 }
322
323 table caption span.caption-text {
324 }
325
316326 table.docutils td, table.docutils th {
317327 padding: 1px 8px 1px 5px;
318328 border-top: 0;
343353 border-bottom: none;
344354 }
345355
356 /* -- figures --------------------------------------------------------------- */
357
358 div.figure {
359 margin: 0.5em;
360 padding: 0.5em;
361 }
362
363 div.figure p.caption {
364 padding: 0.3em;
365 }
366
367 div.figure p.caption span.caption-number {
368 font-style: italic;
369 }
370
371 div.figure p.caption span.caption-text {
372 }
373
374
346375 /* -- other body styles ----------------------------------------------------- */
347376
348377 ol.arabic {
403432
404433 .optional {
405434 font-size: 1.3em;
435 }
436
437 .sig-paren {
438 font-size: larger;
406439 }
407440
408441 .versionmodified {
470503 padding: 0 0.5em 0 0.5em;
471504 }
472505
473 tt.descname {
506 div.code-block-caption {
507 padding: 2px 5px;
508 font-size: small;
509 }
510
511 div.code-block-caption code {
474512 background-color: transparent;
513 }
514
515 div.code-block-caption + div > div.highlight > pre {
516 margin-top: 0;
517 }
518
519 div.code-block-caption span.caption-number {
520 padding: 0.1em 0.3em;
521 font-style: italic;
522 }
523
524 div.code-block-caption span.caption-text {
525 }
526
527 div.literal-block-wrapper {
528 padding: 1em 1em 0;
529 }
530
531 div.literal-block-wrapper div.highlight {
532 margin: 0;
533 }
534
535 code.descname {
536 background-color: transparent;
475537 font-weight: bold;
476538 font-size: 1.2em;
477539 }
478540
479 tt.descclassname {
541 code.descclassname {
480542 background-color: transparent;
481543 }
482544
483 tt.xref, a tt {
545 code.xref, a code {
484546 background-color: transparent;
485547 font-weight: bold;
486548 }
487549
488 h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
550 h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
489551 background-color: transparent;
490552 }
491553
33 *
44 * Sphinx JavaScript utilities for all documentation.
55 *
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
9090 });
9191 };
9292
93 /*
94 * backward compatibility for jQuery.browser
95 * This will be supported until firefox bug is fixed.
96 */
97 if (!jQuery.browser) {
98 jQuery.uaMatch = function(ua) {
99 ua = ua.toLowerCase();
100
101 var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
102 /(webkit)[ \/]([\w.]+)/.exec(ua) ||
103 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
104 /(msie) ([\w.]+)/.exec(ua) ||
105 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
106 [];
107
108 return {
109 browser: match[ 1 ] || "",
110 version: match[ 2 ] || "0"
111 };
112 };
113 jQuery.browser = {};
114 jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
115 }
116
93117 /**
94118 * Small JavaScript module for the documentation.
95119 */
151175
152176 /**
153177 * workaround a firefox stupidity
178 * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
154179 */
155180 fixFirefoxAnchorBug : function() {
156 if (document.location.hash && $.browser.mozilla)
181 if (document.location.hash)
157182 window.setTimeout(function() {
158183 document.location.href += '';
159184 }, 10);
Binary diff not shown
Binary diff not shown
00 /*!
1 * jQuery JavaScript Library v1.7.2
1 * jQuery JavaScript Library v1.11.3
22 * http://jquery.com/
3 *
4 * Copyright 2011, John Resig
5 * Dual licensed under the MIT or GPL Version 2 licenses.
6 * http://jquery.org/license
73 *
84 * Includes Sizzle.js
95 * http://sizzlejs.com/
10 * Copyright 2011, The Dojo Foundation
11 * Released under the MIT, BSD, and GPL Licenses.
126 *
13 * Date: Fri Jul 5 14:07:58 UTC 2013
7 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
8 * Released under the MIT license
9 * http://jquery.org/license
10 *
11 * Date: 2015-09-23T12:31Z
1412 */
15 (function( window, undefined ) {
16
17 // Use the correct document accordingly with window argument (sandbox)
18 var document = window.document,
19 navigator = window.navigator,
20 location = window.location;
21 var jQuery = (function() {
22
23 // Define a local copy of jQuery
24 var jQuery = function( selector, context ) {
13
14 (function( global, factory ) {
15
16 if ( typeof module === "object" && typeof module.exports === "object" ) {
17 // For CommonJS and CommonJS-like environments where a proper window is present,
18 // execute the factory and get jQuery
19 // For environments that do not inherently posses a window with a document
20 // (such as Node.js), expose a jQuery-making factory as module.exports
21 // This accentuates the need for the creation of a real window
22 // e.g. var jQuery = require("jquery")(window);
23 // See ticket #14549 for more info
24 module.exports = global.document ?
25 factory( global, true ) :
26 function( w ) {
27 if ( !w.document ) {
28 throw new Error( "jQuery requires a window with a document" );
29 }
30 return factory( w );
31 };
32 } else {
33 factory( global );
34 }
35
36 // Pass this if window is not defined yet
37 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
38
39 // Can't do this because several apps including ASP.NET trace
40 // the stack via arguments.caller.callee and Firefox dies if
41 // you try to trace through "use strict" call chains. (#13335)
42 // Support: Firefox 18+
43 //
44 var deletedIds = [];
45
46 var slice = deletedIds.slice;
47
48 var concat = deletedIds.concat;
49
50 var push = deletedIds.push;
51
52 var indexOf = deletedIds.indexOf;
53
54 var class2type = {};
55
56 var toString = class2type.toString;
57
58 var hasOwn = class2type.hasOwnProperty;
59
60 var support = {};
61
62
63
64 var
65 version = "1.11.3",
66
67 // Define a local copy of jQuery
68 jQuery = function( selector, context ) {
2569 // The jQuery object is actually just the init constructor 'enhanced'
26 return new jQuery.fn.init( selector, context, rootjQuery );
27 },
28
29 // Map over jQuery in case of overwrite
30 _jQuery = window.jQuery,
31
32 // Map over the $ in case of overwrite
33 _$ = window.$,
34
35 // A central reference to the root jQuery(document)
36 rootjQuery,
37
38 // A simple way to check for HTML strings or ID strings
39 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
40 quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
41
42 // Check if a string has a non-whitespace character in it
43 rnotwhite = /\S/,
44
45 // Used for trimming whitespace
46 trimLeft = /^\s+/,
47 trimRight = /\s+$/,
48
49 // Match a standalone tag
50 rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51
52 // JSON RegExp
53 rvalidchars = /^[\],:{}\s]*$/,
54 rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
55 rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
56 rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
57
58 // Useragent RegExp
59 rwebkit = /(webkit)[ \/]([\w.]+)/,
60 ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
61 rmsie = /(msie) ([\w.]+)/,
62 rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
70 // Need init if jQuery is called (just allow error to be thrown if not included)
71 return new jQuery.fn.init( selector, context );
72 },
73
74 // Support: Android<4.1, IE<9
75 // Make sure we trim BOM and NBSP
76 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
6377
6478 // Matches dashed string for camelizing
65 rdashAlpha = /-([a-z]|[0-9])/ig,
6679 rmsPrefix = /^-ms-/,
80 rdashAlpha = /-([\da-z])/gi,
6781
6882 // Used by jQuery.camelCase as callback to replace()
6983 fcamelCase = function( all, letter ) {
70 return ( letter + "" ).toUpperCase();
71 },
72
73 // Keep a UserAgent string for use with jQuery.browser
74 userAgent = navigator.userAgent,
75
76 // For matching the engine and version of the browser
77 browserMatch,
78
79 // The deferred used on DOM ready
80 readyList,
81
82 // The ready event handler
83 DOMContentLoaded,
84
85 // Save a reference to some core methods
86 toString = Object.prototype.toString,
87 hasOwn = Object.prototype.hasOwnProperty,
88 push = Array.prototype.push,
89 slice = Array.prototype.slice,
90 trim = String.prototype.trim,
91 indexOf = Array.prototype.indexOf,
92
93 // [[Class]] -> type pairs
94 class2type = {};
84 return letter.toUpperCase();
85 };
9586
9687 jQuery.fn = jQuery.prototype = {
88 // The current version of jQuery being used
89 jquery: version,
90
9791 constructor: jQuery,
98 init: function( selector, context, rootjQuery ) {
99 var match, elem, ret, doc;
100
101 // Handle $(""), $(null), or $(undefined)
92
93 // Start with an empty selector
94 selector: "",
95
96 // The default length of a jQuery object is 0
97 length: 0,
98
99 toArray: function() {
100 return slice.call( this );
101 },
102
103 // Get the Nth element in the matched element set OR
104 // Get the whole matched element set as a clean array
105 get: function( num ) {
106 return num != null ?
107
108 // Return just the one element from the set
109 ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
110
111 // Return all the elements in a clean array
112 slice.call( this );
113 },
114
115 // Take an array of elements and push it onto the stack
116 // (returning the new matched element set)
117 pushStack: function( elems ) {
118
119 // Build a new jQuery matched element set
120 var ret = jQuery.merge( this.constructor(), elems );
121
122 // Add the old object onto the stack (as a reference)
123 ret.prevObject = this;
124 ret.context = this.context;
125
126 // Return the newly-formed element set
127 return ret;
128 },
129
130 // Execute a callback for every element in the matched set.
131 // (You can seed the arguments with an array of args, but this is
132 // only used internally.)
133 each: function( callback, args ) {
134 return jQuery.each( this, callback, args );
135 },
136
137 map: function( callback ) {
138 return this.pushStack( jQuery.map(this, function( elem, i ) {
139 return callback.call( elem, i, elem );
140 }));
141 },
142
143 slice: function() {
144 return this.pushStack( slice.apply( this, arguments ) );
145 },
146
147 first: function() {
148 return this.eq( 0 );
149 },
150
151 last: function() {
152 return this.eq( -1 );
153 },
154
155 eq: function( i ) {
156 var len = this.length,
157 j = +i + ( i < 0 ? len : 0 );
158 return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
159 },
160
161 end: function() {
162 return this.prevObject || this.constructor(null);
163 },
164
165 // For internal use only.
166 // Behaves like an Array's method, not like a jQuery method.
167 push: push,
168 sort: deletedIds.sort,
169 splice: deletedIds.splice
170 };
171
172 jQuery.extend = jQuery.fn.extend = function() {
173 var src, copyIsArray, copy, name, options, clone,
174 target = arguments[0] || {},
175 i = 1,
176 length = arguments.length,
177 deep = false;
178
179 // Handle a deep copy situation
180 if ( typeof target === "boolean" ) {
181 deep = target;
182
183 // skip the boolean and the target
184 target = arguments[ i ] || {};
185 i++;
186 }
187
188 // Handle case when target is a string or something (possible in deep copy)
189 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
190 target = {};
191 }
192
193 // extend jQuery itself if only one argument is passed
194 if ( i === length ) {
195 target = this;
196 i--;
197 }
198
199 for ( ; i < length; i++ ) {
200 // Only deal with non-null/undefined values
201 if ( (options = arguments[ i ]) != null ) {
202 // Extend the base object
203 for ( name in options ) {
204 src = target[ name ];
205 copy = options[ name ];
206
207 // Prevent never-ending loop
208 if ( target === copy ) {
209 continue;
210 }
211
212 // Recurse if we're merging plain objects or arrays
213 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
214 if ( copyIsArray ) {
215 copyIsArray = false;
216 clone = src && jQuery.isArray(src) ? src : [];
217
218 } else {
219 clone = src && jQuery.isPlainObject(src) ? src : {};
220 }
221
222 // Never move original objects, clone them
223 target[ name ] = jQuery.extend( deep, clone, copy );
224
225 // Don't bring in undefined values
226 } else if ( copy !== undefined ) {
227 target[ name ] = copy;
228 }
229 }
230 }
231 }
232
233 // Return the modified object
234 return target;
235 };
236
237 jQuery.extend({
238 // Unique for each copy of jQuery on the page
239 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
240
241 // Assume jQuery is ready without the ready module
242 isReady: true,
243
244 error: function( msg ) {
245 throw new Error( msg );
246 },
247
248 noop: function() {},
249
250 // See test/unit/core.js for details concerning isFunction.
251 // Since version 1.3, DOM methods and functions like alert
252 // aren't supported. They return false on IE (#2968).
253 isFunction: function( obj ) {
254 return jQuery.type(obj) === "function";
255 },
256
257 isArray: Array.isArray || function( obj ) {
258 return jQuery.type(obj) === "array";
259 },
260
261 isWindow: function( obj ) {
262 /* jshint eqeqeq: false */
263 return obj != null && obj == obj.window;
264 },
265
266 isNumeric: function( obj ) {
267 // parseFloat NaNs numeric-cast false positives (null|true|false|"")
268 // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
269 // subtraction forces infinities to NaN
270 // adding 1 corrects loss of precision from parseFloat (#15100)
271 return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
272 },
273
274 isEmptyObject: function( obj ) {
275 var name;
276 for ( name in obj ) {
277 return false;
278 }
279 return true;
280 },
281
282 isPlainObject: function( obj ) {
283 var key;
284
285 // Must be an Object.
286 // Because of IE, we also have to check the presence of the constructor property.
287 // Make sure that DOM nodes and window objects don't pass through, as well
288 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
289 return false;
290 }
291
292 try {
293 // Not own constructor property must be Object
294 if ( obj.constructor &&
295 !hasOwn.call(obj, "constructor") &&
296 !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
297 return false;
298 }
299 } catch ( e ) {
300 // IE8,9 Will throw exceptions on certain host objects #9897
301 return false;
302 }
303
304 // Support: IE<9
305 // Handle iteration over inherited properties before own properties.
306 if ( support.ownLast ) {
307 for ( key in obj ) {
308 return hasOwn.call( obj, key );
309 }
310 }
311
312 // Own properties are enumerated firstly, so to speed up,
313 // if last one is own, then all properties are own.
314 for ( key in obj ) {}
315
316 return key === undefined || hasOwn.call( obj, key );
317 },
318
319 type: function( obj ) {
320 if ( obj == null ) {
321 return obj + "";
322 }
323 return typeof obj === "object" || typeof obj === "function" ?
324 class2type[ toString.call(obj) ] || "object" :
325 typeof obj;
326 },
327
328 // Evaluates a script in a global context
329 // Workarounds based on findings by Jim Driscoll
330 // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
331 globalEval: function( data ) {
332 if ( data && jQuery.trim( data ) ) {
333 // We use execScript on Internet Explorer
334 // We use an anonymous function so that context is window
335 // rather than jQuery in Firefox
336 ( window.execScript || function( data ) {
337 window[ "eval" ].call( window, data );
338 } )( data );
339 }
340 },
341
342 // Convert dashed to camelCase; used by the css and data modules
343 // Microsoft forgot to hump their vendor prefix (#9572)
344 camelCase: function( string ) {
345 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
346 },
347
348 nodeName: function( elem, name ) {
349 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
350 },
351
352 // args is for internal usage only
353 each: function( obj, callback, args ) {
354 var value,
355 i = 0,
356 length = obj.length,
357 isArray = isArraylike( obj );
358
359 if ( args ) {
360 if ( isArray ) {
361 for ( ; i < length; i++ ) {
362 value = callback.apply( obj[ i ], args );
363
364 if ( value === false ) {
365 break;
366 }
367 }
368 } else {
369 for ( i in obj ) {
370 value = callback.apply( obj[ i ], args );
371
372 if ( value === false ) {
373 break;
374 }
375 }
376 }
377
378 // A special, fast, case for the most common use of each
379 } else {
380 if ( isArray ) {
381 for ( ; i < length; i++ ) {
382 value = callback.call( obj[ i ], i, obj[ i ] );
383
384 if ( value === false ) {
385 break;
386 }
387 }
388 } else {
389 for ( i in obj ) {
390 value = callback.call( obj[ i ], i, obj[ i ] );
391
392 if ( value === false ) {
393 break;
394 }
395 }
396 }
397 }
398
399 return obj;
400 },
401
402 // Support: Android<4.1, IE<9
403 trim: function( text ) {
404 return text == null ?
405 "" :
406 ( text + "" ).replace( rtrim, "" );
407 },
408
409 // results is for internal usage only
410 makeArray: function( arr, results ) {
411 var ret = results || [];
412
413 if ( arr != null ) {
414 if ( isArraylike( Object(arr) ) ) {
415 jQuery.merge( ret,
416 typeof arr === "string" ?
417 [ arr ] : arr
418 );
419 } else {
420 push.call( ret, arr );
421 }
422 }
423
424 return ret;
425 },
426
427 inArray: function( elem, arr, i ) {
428 var len;
429
430 if ( arr ) {
431 if ( indexOf ) {
432 return indexOf.call( arr, elem, i );
433 }
434
435 len = arr.length;
436 i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
437
438 for ( ; i < len; i++ ) {
439 // Skip accessing in sparse arrays
440 if ( i in arr && arr[ i ] === elem ) {
441 return i;
442 }
443 }
444 }
445
446 return -1;
447 },
448
449 merge: function( first, second ) {
450 var len = +second.length,
451 j = 0,
452 i = first.length;
453
454 while ( j < len ) {
455 first[ i++ ] = second[ j++ ];
456 }
457
458 // Support: IE<9
459 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
460 if ( len !== len ) {
461 while ( second[j] !== undefined ) {
462 first[ i++ ] = second[ j++ ];
463 }
464 }
465
466 first.length = i;
467
468 return first;
469 },
470
471 grep: function( elems, callback, invert ) {
472 var callbackInverse,
473 matches = [],
474 i = 0,
475 length = elems.length,
476 callbackExpect = !invert;
477
478 // Go through the array, only saving the items
479 // that pass the validator function
480 for ( ; i < length; i++ ) {
481 callbackInverse = !callback( elems[ i ], i );
482 if ( callbackInverse !== callbackExpect ) {
483 matches.push( elems[ i ] );
484 }
485 }
486
487 return matches;
488 },
489
490 // arg is for internal usage only
491 map: function( elems, callback, arg ) {
492 var value,
493 i = 0,
494 length = elems.length,
495 isArray = isArraylike( elems ),
496 ret = [];
497
498 // Go through the array, translating each of the items to their new values
499 if ( isArray ) {
500 for ( ; i < length; i++ ) {
501 value = callback( elems[ i ], i, arg );
502
503 if ( value != null ) {
504 ret.push( value );
505 }
506 }
507
508 // Go through every key on the object,
509 } else {
510 for ( i in elems ) {
511 value = callback( elems[ i ], i, arg );
512
513 if ( value != null ) {
514 ret.push( value );
515 }
516 }
517 }
518
519 // Flatten any nested arrays
520 return concat.apply( [], ret );
521 },
522
523 // A global GUID counter for objects
524 guid: 1,
525
526 // Bind a function to a context, optionally partially applying any
527 // arguments.
528 proxy: function( fn, context ) {
529 var args, proxy, tmp;
530
531 if ( typeof context === "string" ) {
532 tmp = fn[ context ];
533 context = fn;
534 fn = tmp;
535 }
536
537 // Quick check to determine if target is callable, in the spec
538 // this throws a TypeError, but we will just return undefined.
539 if ( !jQuery.isFunction( fn ) ) {
540 return undefined;
541 }
542
543 // Simulated bind
544 args = slice.call( arguments, 2 );
545 proxy = function() {
546 return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
547 };
548
549 // Set the guid of unique handler to the same of original handler, so it can be removed
550 proxy.guid = fn.guid = fn.guid || jQuery.guid++;
551
552 return proxy;
553 },
554
555 now: function() {
556 return +( new Date() );
557 },
558
559 // jQuery.support is not used in Core but other projects attach their
560 // properties to it so it needs to exist.
561 support: support
562 });
563
564 // Populate the class2type map
565 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
566 class2type[ "[object " + name + "]" ] = name.toLowerCase();
567 });
568
569 function isArraylike( obj ) {
570
571 // Support: iOS 8.2 (not reproducible in simulator)
572 // `in` check used to prevent JIT error (gh-2145)
573 // hasOwn isn't used here due to false negatives
574 // regarding Nodelist length in IE
575 var length = "length" in obj && obj.length,
576 type = jQuery.type( obj );
577
578 if ( type === "function" || jQuery.isWindow( obj ) ) {
579 return false;
580 }
581
582 if ( obj.nodeType === 1 && length ) {
583 return true;
584 }
585
586 return type === "array" || length === 0 ||
587 typeof length === "number" && length > 0 && ( length - 1 ) in obj;
588 }
589 var Sizzle =
590 /*!
591 * Sizzle CSS Selector Engine v2.2.0-pre
592 * http://sizzlejs.com/
593 *
594 * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
595 * Released under the MIT license
596 * http://jquery.org/license
597 *
598 * Date: 2014-12-16
599 */
600 (function( window ) {
601
602 var i,
603 support,
604 Expr,
605 getText,
606 isXML,
607 tokenize,
608 compile,
609 select,
610 outermostContext,
611 sortInput,
612 hasDuplicate,
613
614 // Local document vars
615 setDocument,
616 document,
617 docElem,
618 documentIsHTML,
619 rbuggyQSA,
620 rbuggyMatches,
621 matches,
622 contains,
623
624 // Instance-specific data
625 expando = "sizzle" + 1 * new Date(),
626 preferredDoc = window.document,
627 dirruns = 0,
628 done = 0,
629 classCache = createCache(),
630 tokenCache = createCache(),
631 compilerCache = createCache(),
632 sortOrder = function( a, b ) {
633 if ( a === b ) {
634 hasDuplicate = true;
635 }
636 return 0;
637 },
638
639 // General-purpose constants
640 MAX_NEGATIVE = 1 << 31,
641
642 // Instance methods
643 hasOwn = ({}).hasOwnProperty,
644 arr = [],
645 pop = arr.pop,
646 push_native = arr.push,
647 push = arr.push,
648 slice = arr.slice,
649 // Use a stripped-down indexOf as it's faster than native
650 // http://jsperf.com/thor-indexof-vs-for/5
651 indexOf = function( list, elem ) {
652 var i = 0,
653 len = list.length;
654 for ( ; i < len; i++ ) {
655 if ( list[i] === elem ) {
656 return i;
657 }
658 }
659 return -1;
660 },
661
662 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
663
664 // Regular expressions
665
666 // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
667 whitespace = "[\\x20\\t\\r\\n\\f]",
668 // http://www.w3.org/TR/css3-syntax/#characters
669 characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
670
671 // Loosely modeled on CSS identifier characters
672 // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
673 // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
674 identifier = characterEncoding.replace( "w", "w#" ),
675
676 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
677 attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
678 // Operator (capture 2)
679 "*([*^$|!~]?=)" + whitespace +
680 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
681 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
682 "*\\]",
683
684 pseudos = ":(" + characterEncoding + ")(?:\\((" +
685 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
686 // 1. quoted (capture 3; capture 4 or capture 5)
687 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
688 // 2. simple (capture 6)
689 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
690 // 3. anything else (capture 2)
691 ".*" +
692 ")\\)|)",
693
694 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
695 rwhitespace = new RegExp( whitespace + "+", "g" ),
696 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
697
698 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
699 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
700
701 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
702
703 rpseudo = new RegExp( pseudos ),
704 ridentifier = new RegExp( "^" + identifier + "$" ),
705
706 matchExpr = {
707 "ID": new RegExp( "^#(" + characterEncoding + ")" ),
708 "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
709 "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
710 "ATTR": new RegExp( "^" + attributes ),
711 "PSEUDO": new RegExp( "^" + pseudos ),
712 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
713 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
714 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
715 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
716 // For use in libraries implementing .is()
717 // We use this for POS matching in `select`
718 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
719 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
720 },
721
722 rinputs = /^(?:input|select|textarea|button)$/i,
723 rheader = /^h\d$/i,
724
725 rnative = /^[^{]+\{\s*\[native \w/,
726
727 // Easily-parseable/retrievable ID or TAG or CLASS selectors
728 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
729
730 rsibling = /[+~]/,
731 rescape = /'|\\/g,
732
733 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
734 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
735 funescape = function( _, escaped, escapedWhitespace ) {
736 var high = "0x" + escaped - 0x10000;
737 // NaN means non-codepoint
738 // Support: Firefox<24
739 // Workaround erroneous numeric interpretation of +"0x"
740 return high !== high || escapedWhitespace ?
741 escaped :
742 high < 0 ?
743 // BMP codepoint
744 String.fromCharCode( high + 0x10000 ) :
745 // Supplemental Plane codepoint (surrogate pair)
746 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
747 },
748
749 // Used for iframes
750 // See setDocument()
751 // Removing the function wrapper causes a "Permission Denied"
752 // error in IE
753 unloadHandler = function() {
754 setDocument();
755 };
756
757 // Optimize for push.apply( _, NodeList )
758 try {
759 push.apply(
760 (arr = slice.call( preferredDoc.childNodes )),
761 preferredDoc.childNodes
762 );
763 // Support: Android<4.0
764 // Detect silently failing push.apply
765 arr[ preferredDoc.childNodes.length ].nodeType;
766 } catch ( e ) {
767 push = { apply: arr.length ?
768
769 // Leverage slice if possible
770 function( target, els ) {
771 push_native.apply( target, slice.call(els) );
772 } :
773
774 // Support: IE<9
775 // Otherwise append directly
776 function( target, els ) {
777 var j = target.length,
778 i = 0;
779 // Can't trust NodeList.length
780 while ( (target[j++] = els[i++]) ) {}
781 target.length = j - 1;
782 }
783 };
784 }
785
786 function Sizzle( selector, context, results, seed ) {
787 var match, elem, m, nodeType,
788 // QSA vars
789 i, groups, old, nid, newContext, newSelector;
790
791 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
792 setDocument( context );
793 }
794
795 context = context || document;
796 results = results || [];
797 nodeType = context.nodeType;
798
799 if ( typeof selector !== "string" || !selector ||
800 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
801
802 return results;
803 }
804
805 if ( !seed && documentIsHTML ) {
806
807 // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
808 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
809 // Speed-up: Sizzle("#ID")
810 if ( (m = match[1]) ) {
811 if ( nodeType === 9 ) {
812 elem = context.getElementById( m );
813 // Check parentNode to catch when Blackberry 4.6 returns
814 // nodes that are no longer in the document (jQuery #6963)
815 if ( elem && elem.parentNode ) {
816 // Handle the case where IE, Opera, and Webkit return items
817 // by name instead of ID
818 if ( elem.id === m ) {
819 results.push( elem );
820 return results;
821 }
822 } else {
823 return results;
824 }
825 } else {
826 // Context is not a document
827 if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
828 contains( context, elem ) && elem.id === m ) {
829 results.push( elem );
830 return results;
831 }
832 }
833
834 // Speed-up: Sizzle("TAG")
835 } else if ( match[2] ) {
836 push.apply( results, context.getElementsByTagName( selector ) );
837 return results;
838
839 // Speed-up: Sizzle(".CLASS")
840 } else if ( (m = match[3]) && support.getElementsByClassName ) {
841 push.apply( results, context.getElementsByClassName( m ) );
842 return results;
843 }
844 }
845
846 // QSA path
847 if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
848 nid = old = expando;
849 newContext = context;
850 newSelector = nodeType !== 1 && selector;
851
852 // qSA works strangely on Element-rooted queries
853 // We can work around this by specifying an extra ID on the root
854 // and working up from there (Thanks to Andrew Dupont for the technique)
855 // IE 8 doesn't work on object elements
856 if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
857 groups = tokenize( selector );
858
859 if ( (old = context.getAttribute("id")) ) {
860 nid = old.replace( rescape, "\\$&" );
861 } else {
862 context.setAttribute( "id", nid );
863 }
864 nid = "[id='" + nid + "'] ";
865
866 i = groups.length;
867 while ( i-- ) {
868 groups[i] = nid + toSelector( groups[i] );
869 }
870 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
871 newSelector = groups.join(",");
872 }
873
874 if ( newSelector ) {
875 try {
876 push.apply( results,
877 newContext.querySelectorAll( newSelector )
878 );
879 return results;
880 } catch(qsaError) {
881 } finally {
882 if ( !old ) {
883 context.removeAttribute("id");
884 }
885 }
886 }
887 }
888 }
889
890 // All others
891 return select( selector.replace( rtrim, "$1" ), context, results, seed );
892 }
893
894 /**
895 * Create key-value caches of limited size
896 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
897 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
898 * deleting the oldest entry
899 */
900 function createCache() {
901 var keys = [];
902
903 function cache( key, value ) {
904 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
905 if ( keys.push( key + " " ) > Expr.cacheLength ) {
906 // Only keep the most recent entries
907 delete cache[ keys.shift() ];
908 }
909 return (cache[ key + " " ] = value);
910 }
911 return cache;
912 }
913
914 /**
915 * Mark a function for special use by Sizzle
916 * @param {Function} fn The function to mark
917 */
918 function markFunction( fn ) {
919 fn[ expando ] = true;
920 return fn;
921 }
922
923 /**
924 * Support testing using an element
925 * @param {Function} fn Passed the created div and expects a boolean result
926 */
927 function assert( fn ) {
928 var div = document.createElement("div");
929
930 try {
931 return !!fn( div );
932 } catch (e) {
933 return false;
934 } finally {
935 // Remove from its parent by default
936 if ( div.parentNode ) {
937 div.parentNode.removeChild( div );
938 }
939 // release memory in IE
940 div = null;
941 }
942 }
943
944 /**
945 * Adds the same handler for all of the specified attrs
946 * @param {String} attrs Pipe-separated list of attributes
947 * @param {Function} handler The method that will be applied
948 */
949 function addHandle( attrs, handler ) {
950 var arr = attrs.split("|"),
951 i = attrs.length;
952
953 while ( i-- ) {
954 Expr.attrHandle[ arr[i] ] = handler;
955 }
956 }
957
958 /**
959 * Checks document order of two siblings
960 * @param {Element} a
961 * @param {Element} b
962 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
963 */
964 function siblingCheck( a, b ) {
965 var cur = b && a,
966 diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
967 ( ~b.sourceIndex || MAX_NEGATIVE ) -
968 ( ~a.sourceIndex || MAX_NEGATIVE );
969
970 // Use IE sourceIndex if available on both nodes
971 if ( diff ) {
972 return diff;
973 }
974
975 // Check if b follows a
976 if ( cur ) {
977 while ( (cur = cur.nextSibling) ) {
978 if ( cur === b ) {
979 return -1;
980 }
981 }
982 }
983
984 return a ? 1 : -1;
985 }
986
987 /**
988 * Returns a function to use in pseudos for input types
989 * @param {String} type
990 */
991 function createInputPseudo( type ) {
992 return function( elem ) {
993 var name = elem.nodeName.toLowerCase();
994 return name === "input" && elem.type === type;
995 };
996 }
997
998 /**
999 * Returns a function to use in pseudos for buttons
1000 * @param {String} type
1001 */
1002 function createButtonPseudo( type ) {
1003 return function( elem ) {
1004 var name = elem.nodeName.toLowerCase();
1005 return (name === "input" || name === "button") && elem.type === type;
1006 };
1007 }
1008
1009 /**
1010 * Returns a function to use in pseudos for positionals
1011 * @param {Function} fn
1012 */
1013 function createPositionalPseudo( fn ) {
1014 return markFunction(function( argument ) {
1015 argument = +argument;
1016 return markFunction(function( seed, matches ) {
1017 var j,
1018 matchIndexes = fn( [], seed.length, argument ),
1019 i = matchIndexes.length;
1020
1021 // Match elements found at the specified indexes
1022 while ( i-- ) {
1023 if ( seed[ (j = matchIndexes[i]) ] ) {
1024 seed[j] = !(matches[j] = seed[j]);
1025 }
1026 }
1027 });
1028 });
1029 }
1030
1031 /**
1032 * Checks a node for validity as a Sizzle context
1033 * @param {Element|Object=} context
1034 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1035 */
1036 function testContext( context ) {
1037 return context && typeof context.getElementsByTagName !== "undefined" && context;
1038 }
1039
1040 // Expose support vars for convenience
1041 support = Sizzle.support = {};
1042
1043 /**
1044 * Detects XML nodes
1045 * @param {Element|Object} elem An element or a document
1046 * @returns {Boolean} True iff elem is a non-HTML XML node
1047 */
1048 isXML = Sizzle.isXML = function( elem ) {
1049 // documentElement is verified for cases where it doesn't yet exist
1050 // (such as loading iframes in IE - #4833)
1051 var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1052 return documentElement ? documentElement.nodeName !== "HTML" : false;
1053 };
1054
1055 /**
1056 * Sets document-related variables once based on the current document
1057 * @param {Element|Object} [doc] An element or document object to use to set the document
1058 * @returns {Object} Returns the current document
1059 */
1060 setDocument = Sizzle.setDocument = function( node ) {
1061 var hasCompare, parent,
1062 doc = node ? node.ownerDocument || node : preferredDoc;
1063
1064 // If no document and documentElement is available, return
1065 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1066 return document;
1067 }
1068
1069 // Set our document
1070 document = doc;
1071 docElem = doc.documentElement;
1072 parent = doc.defaultView;
1073
1074 // Support: IE>8
1075 // If iframe document is assigned to "document" variable and if iframe has been reloaded,
1076 // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1077 // IE6-8 do not support the defaultView property so parent will be undefined
1078 if ( parent && parent !== parent.top ) {
1079 // IE11 does not have attachEvent, so all must suffer
1080 if ( parent.addEventListener ) {
1081 parent.addEventListener( "unload", unloadHandler, false );
1082 } else if ( parent.attachEvent ) {
1083 parent.attachEvent( "onunload", unloadHandler );
1084 }
1085 }
1086
1087 /* Support tests
1088 ---------------------------------------------------------------------- */
1089 documentIsHTML = !isXML( doc );
1090
1091 /* Attributes
1092 ---------------------------------------------------------------------- */
1093
1094 // Support: IE<8
1095 // Verify that getAttribute really returns attributes and not properties
1096 // (excepting IE8 booleans)
1097 support.attributes = assert(function( div ) {
1098 div.className = "i";
1099 return !div.getAttribute("className");
1100 });
1101
1102 /* getElement(s)By*
1103 ---------------------------------------------------------------------- */
1104
1105 // Check if getElementsByTagName("*") returns only elements
1106 support.getElementsByTagName = assert(function( div ) {
1107 div.appendChild( doc.createComment("") );
1108 return !div.getElementsByTagName("*").length;
1109 });
1110
1111 // Support: IE<9
1112 support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
1113
1114 // Support: IE<10
1115 // Check if getElementById returns elements by name
1116 // The broken getElementById methods don't pick up programatically-set names,
1117 // so use a roundabout getElementsByName test
1118 support.getById = assert(function( div ) {
1119 docElem.appendChild( div ).id = expando;
1120 return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1121 });
1122
1123 // ID find and filter
1124 if ( support.getById ) {
1125 Expr.find["ID"] = function( id, context ) {
1126 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1127 var m = context.getElementById( id );
1128 // Check parentNode to catch when Blackberry 4.6 returns
1129 // nodes that are no longer in the document #6963
1130 return m && m.parentNode ? [ m ] : [];
1131 }
1132 };
1133 Expr.filter["ID"] = function( id ) {
1134 var attrId = id.replace( runescape, funescape );
1135 return function( elem ) {
1136 return elem.getAttribute("id") === attrId;
1137 };
1138 };
1139 } else {
1140 // Support: IE6/7
1141 // getElementById is not reliable as a find shortcut
1142 delete Expr.find["ID"];
1143
1144 Expr.filter["ID"] = function( id ) {
1145 var attrId = id.replace( runescape, funescape );
1146 return function( elem ) {
1147 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
1148 return node && node.value === attrId;
1149 };
1150 };
1151 }
1152
1153 // Tag
1154 Expr.find["TAG"] = support.getElementsByTagName ?
1155 function( tag, context ) {
1156 if ( typeof context.getElementsByTagName !== "undefined" ) {
1157 return context.getElementsByTagName( tag );
1158
1159 // DocumentFragment nodes don't have gEBTN
1160 } else if ( support.qsa ) {
1161 return context.querySelectorAll( tag );
1162 }
1163 } :
1164
1165 function( tag, context ) {
1166 var elem,
1167 tmp = [],
1168 i = 0,
1169 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1170 results = context.getElementsByTagName( tag );
1171
1172 // Filter out possible comments
1173 if ( tag === "*" ) {
1174 while ( (elem = results[i++]) ) {
1175 if ( elem.nodeType === 1 ) {
1176 tmp.push( elem );
1177 }
1178 }
1179
1180 return tmp;
1181 }
1182 return results;
1183 };
1184
1185 // Class
1186 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1187 if ( documentIsHTML ) {
1188 return context.getElementsByClassName( className );
1189 }
1190 };
1191
1192 /* QSA/matchesSelector
1193 ---------------------------------------------------------------------- */
1194
1195 // QSA and matchesSelector support
1196
1197 // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1198 rbuggyMatches = [];
1199
1200 // qSa(:focus) reports false when true (Chrome 21)
1201 // We allow this because of a bug in IE8/9 that throws an error
1202 // whenever `document.activeElement` is accessed on an iframe
1203 // So, we allow :focus to pass through QSA all the time to avoid the IE error
1204 // See http://bugs.jquery.com/ticket/13378
1205 rbuggyQSA = [];
1206
1207 if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1208 // Build QSA regex
1209 // Regex strategy adopted from Diego Perini
1210 assert(function( div ) {
1211 // Select is set to empty string on purpose
1212 // This is to test IE's treatment of not explicitly
1213 // setting a boolean content attribute,
1214 // since its presence should be enough
1215 // http://bugs.jquery.com/ticket/12359
1216 docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
1217 "<select id='" + expando + "-\f]' msallowcapture=''>" +
1218 "<option selected=''></option></select>";
1219
1220 // Support: IE8, Opera 11-12.16
1221 // Nothing should be selected when empty strings follow ^= or $= or *=
1222 // The test attribute must be unknown in Opera but "safe" for WinRT
1223 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1224 if ( div.querySelectorAll("[msallowcapture^='']").length ) {
1225 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1226 }
1227
1228 // Support: IE8
1229 // Boolean attributes and "value" are not treated correctly
1230 if ( !div.querySelectorAll("[selected]").length ) {
1231 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1232 }
1233
1234 // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
1235 if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1236 rbuggyQSA.push("~=");
1237 }
1238
1239 // Webkit/Opera - :checked should return selected option elements
1240 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1241 // IE8 throws error here and will not see later tests
1242 if ( !div.querySelectorAll(":checked").length ) {
1243 rbuggyQSA.push(":checked");
1244 }
1245
1246 // Support: Safari 8+, iOS 8+
1247 // https://bugs.webkit.org/show_bug.cgi?id=136851
1248 // In-page `selector#id sibing-combinator selector` fails
1249 if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
1250 rbuggyQSA.push(".#.+[+~]");
1251 }
1252 });
1253
1254 assert(function( div ) {
1255 // Support: Windows 8 Native Apps
1256 // The type and name attributes are restricted during .innerHTML assignment
1257 var input = doc.createElement("input");
1258 input.setAttribute( "type", "hidden" );
1259 div.appendChild( input ).setAttribute( "name", "D" );
1260
1261 // Support: IE8
1262 // Enforce case-sensitivity of name attribute
1263 if ( div.querySelectorAll("[name=d]").length ) {
1264 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1265 }
1266
1267 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1268 // IE8 throws error here and will not see later tests
1269 if ( !div.querySelectorAll(":enabled").length ) {
1270 rbuggyQSA.push( ":enabled", ":disabled" );
1271 }
1272
1273 // Opera 10-11 does not throw on post-comma invalid pseudos
1274 div.querySelectorAll("*,:x");
1275 rbuggyQSA.push(",.*:");
1276 });
1277 }
1278
1279 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1280 docElem.webkitMatchesSelector ||
1281 docElem.mozMatchesSelector ||
1282 docElem.oMatchesSelector ||
1283 docElem.msMatchesSelector) )) ) {
1284
1285 assert(function( div ) {
1286 // Check to see if it's possible to do matchesSelector
1287 // on a disconnected node (IE 9)
1288 support.disconnectedMatch = matches.call( div, "div" );
1289
1290 // This should fail with an exception
1291 // Gecko does not error, returns false instead
1292 matches.call( div, "[s!='']:x" );
1293 rbuggyMatches.push( "!=", pseudos );
1294 });
1295 }
1296
1297 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1298 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1299
1300 /* Contains
1301 ---------------------------------------------------------------------- */
1302 hasCompare = rnative.test( docElem.compareDocumentPosition );
1303
1304 // Element contains another
1305 // Purposefully does not implement inclusive descendent
1306 // As in, an element does not contain itself
1307 contains = hasCompare || rnative.test( docElem.contains ) ?
1308 function( a, b ) {
1309 var adown = a.nodeType === 9 ? a.documentElement : a,
1310 bup = b && b.parentNode;
1311 return a === bup || !!( bup && bup.nodeType === 1 && (
1312 adown.contains ?
1313 adown.contains( bup ) :
1314 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1315 ));
1316 } :
1317 function( a, b ) {
1318 if ( b ) {
1319 while ( (b = b.parentNode) ) {
1320 if ( b === a ) {
1321 return true;
1322 }
1323 }
1324 }
1325 return false;
1326 };
1327
1328 /* Sorting
1329 ---------------------------------------------------------------------- */
1330
1331 // Document order sorting
1332 sortOrder = hasCompare ?
1333 function( a, b ) {
1334
1335 // Flag for duplicate removal
1336 if ( a === b ) {
1337 hasDuplicate = true;
1338 return 0;
1339 }
1340
1341 // Sort on method existence if only one input has compareDocumentPosition
1342 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1343 if ( compare ) {
1344 return compare;
1345 }
1346
1347 // Calculate position if both inputs belong to the same document
1348 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1349 a.compareDocumentPosition( b ) :
1350
1351 // Otherwise we know they are disconnected
1352 1;
1353
1354 // Disconnected nodes
1355 if ( compare & 1 ||
1356 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1357
1358 // Choose the first element that is related to our preferred document
1359 if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1360 return -1;
1361 }
1362 if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1363 return 1;
1364 }
1365
1366 // Maintain original order
1367 return sortInput ?
1368 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1369 0;
1370 }
1371
1372 return compare & 4 ? -1 : 1;
1373 } :
1374 function( a, b ) {
1375 // Exit early if the nodes are identical
1376 if ( a === b ) {
1377 hasDuplicate = true;
1378 return 0;
1379 }
1380
1381 var cur,
1382 i = 0,
1383 aup = a.parentNode,
1384 bup = b.parentNode,
1385 ap = [ a ],
1386 bp = [ b ];
1387
1388 // Parentless nodes are either documents or disconnected
1389 if ( !aup || !bup ) {
1390 return a === doc ? -1 :
1391 b === doc ? 1 :
1392 aup ? -1 :
1393 bup ? 1 :
1394 sortInput ?
1395 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1396 0;
1397
1398 // If the nodes are siblings, we can do a quick check
1399 } else if ( aup === bup ) {
1400 return siblingCheck( a, b );
1401 }
1402
1403 // Otherwise we need full lists of their ancestors for comparison
1404 cur = a;
1405 while ( (cur = cur.parentNode) ) {
1406 ap.unshift( cur );
1407 }
1408 cur = b;
1409 while ( (cur = cur.parentNode) ) {
1410 bp.unshift( cur );
1411 }
1412
1413 // Walk down the tree looking for a discrepancy
1414 while ( ap[i] === bp[i] ) {
1415 i++;
1416 }
1417
1418 return i ?
1419 // Do a sibling check if the nodes have a common ancestor
1420 siblingCheck( ap[i], bp[i] ) :
1421
1422 // Otherwise nodes in our document sort first
1423 ap[i] === preferredDoc ? -1 :
1424 bp[i] === preferredDoc ? 1 :
1425 0;
1426 };
1427
1428 return doc;
1429 };
1430
1431 Sizzle.matches = function( expr, elements ) {
1432 return Sizzle( expr, null, null, elements );
1433 };
1434
1435 Sizzle.matchesSelector = function( elem, expr ) {
1436 // Set document vars if needed
1437 if ( ( elem.ownerDocument || elem ) !== document ) {
1438 setDocument( elem );
1439 }
1440
1441 // Make sure that attribute selectors are quoted
1442 expr = expr.replace( rattributeQuotes, "='$1']" );
1443
1444 if ( support.matchesSelector && documentIsHTML &&
1445 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1446 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1447
1448 try {
1449 var ret = matches.call( elem, expr );
1450
1451 // IE 9's matchesSelector returns false on disconnected nodes
1452 if ( ret || support.disconnectedMatch ||
1453 // As well, disconnected nodes are said to be in a document
1454 // fragment in IE 9
1455 elem.document && elem.document.nodeType !== 11 ) {
1456 return ret;
1457 }
1458 } catch (e) {}
1459 }
1460
1461 return Sizzle( expr, document, null, [ elem ] ).length > 0;
1462 };
1463
1464 Sizzle.contains = function( context, elem ) {
1465 // Set document vars if needed
1466 if ( ( context.ownerDocument || context ) !== document ) {
1467 setDocument( context );
1468 }
1469 return contains( context, elem );
1470 };
1471
1472 Sizzle.attr = function( elem, name ) {
1473 // Set document vars if needed
1474 if ( ( elem.ownerDocument || elem ) !== document ) {
1475 setDocument( elem );
1476 }
1477
1478 var fn = Expr.attrHandle[ name.toLowerCase() ],
1479 // Don't get fooled by Object.prototype properties (jQuery #13807)
1480 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1481 fn( elem, name, !documentIsHTML ) :
1482 undefined;
1483
1484 return val !== undefined ?
1485 val :
1486 support.attributes || !documentIsHTML ?
1487 elem.getAttribute( name ) :
1488 (val = elem.getAttributeNode(name)) && val.specified ?
1489 val.value :
1490 null;
1491 };
1492
1493 Sizzle.error = function( msg ) {
1494 throw new Error( "Syntax error, unrecognized expression: " + msg );
1495 };
1496
1497 /**
1498 * Document sorting and removing duplicates
1499 * @param {ArrayLike} results
1500 */
1501 Sizzle.uniqueSort = function( results ) {
1502 var elem,
1503 duplicates = [],
1504 j = 0,
1505 i = 0;
1506
1507 // Unless we *know* we can detect duplicates, assume their presence
1508 hasDuplicate = !support.detectDuplicates;
1509 sortInput = !support.sortStable && results.slice( 0 );
1510 results.sort( sortOrder );
1511
1512 if ( hasDuplicate ) {
1513 while ( (elem = results[i++]) ) {
1514 if ( elem === results[ i ] ) {
1515 j = duplicates.push( i );
1516 }
1517 }
1518 while ( j-- ) {
1519 results.splice( duplicates[ j ], 1 );
1520 }
1521 }
1522
1523 // Clear input after sorting to release objects
1524 // See https://github.com/jquery/sizzle/pull/225
1525 sortInput = null;
1526
1527 return results;
1528 };
1529
1530 /**
1531 * Utility function for retrieving the text value of an array of DOM nodes
1532 * @param {Array|Element} elem
1533 */
1534 getText = Sizzle.getText = function( elem ) {
1535 var node,
1536 ret = "",
1537 i = 0,
1538 nodeType = elem.nodeType;
1539
1540 if ( !nodeType ) {
1541 // If no nodeType, this is expected to be an array
1542 while ( (node = elem[i++]) ) {
1543 // Do not traverse comment nodes
1544 ret += getText( node );
1545 }
1546 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1547 // Use textContent for elements
1548 // innerText usage removed for consistency of new lines (jQuery #11153)
1549 if ( typeof elem.textContent === "string" ) {
1550 return elem.textContent;
1551 } else {
1552 // Traverse its children
1553 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1554 ret += getText( elem );
1555 }
1556 }
1557 } else if ( nodeType === 3 || nodeType === 4 ) {
1558 return elem.nodeValue;
1559 }
1560 // Do not include comment or processing instruction nodes
1561
1562 return ret;
1563 };
1564
1565 Expr = Sizzle.selectors = {
1566
1567 // Can be adjusted by the user
1568 cacheLength: 50,
1569
1570 createPseudo: markFunction,
1571
1572 match: matchExpr,
1573
1574 attrHandle: {},
1575
1576 find: {},
1577
1578 relative: {
1579 ">": { dir: "parentNode", first: true },
1580 " ": { dir: "parentNode" },
1581 "+": { dir: "previousSibling", first: true },
1582 "~": { dir: "previousSibling" }
1583 },
1584
1585 preFilter: {
1586 "ATTR": function( match ) {
1587 match[1] = match[1].replace( runescape, funescape );
1588
1589 // Move the given value to match[3] whether quoted or unquoted
1590 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1591
1592 if ( match[2] === "~=" ) {
1593 match[3] = " " + match[3] + " ";
1594 }
1595
1596 return match.slice( 0, 4 );
1597 },
1598
1599 "CHILD": function( match ) {
1600 /* matches from matchExpr["CHILD"]
1601 1 type (only|nth|...)
1602 2 what (child|of-type)
1603 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1604 4 xn-component of xn+y argument ([+-]?\d*n|)
1605 5 sign of xn-component
1606 6 x of xn-component
1607 7 sign of y-component
1608 8 y of y-component
1609 */
1610 match[1] = match[1].toLowerCase();
1611
1612 if ( match[1].slice( 0, 3 ) === "nth" ) {
1613 // nth-* requires argument
1614 if ( !match[3] ) {
1615 Sizzle.error( match[0] );
1616 }
1617
1618 // numeric x and y parameters for Expr.filter.CHILD
1619 // remember that false/true cast respectively to 0/1
1620 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1621 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1622
1623 // other types prohibit arguments
1624 } else if ( match[3] ) {
1625 Sizzle.error( match[0] );
1626 }
1627
1628 return match;
1629 },
1630
1631 "PSEUDO": function( match ) {
1632 var excess,
1633 unquoted = !match[6] && match[2];
1634
1635 if ( matchExpr["CHILD"].test( match[0] ) ) {
1636 return null;
1637 }
1638
1639 // Accept quoted arguments as-is
1640 if ( match[3] ) {
1641 match[2] = match[4] || match[5] || "";
1642
1643 // Strip excess characters from unquoted arguments
1644 } else if ( unquoted && rpseudo.test( unquoted ) &&
1645 // Get excess from tokenize (recursively)
1646 (excess = tokenize( unquoted, true )) &&
1647 // advance to the next closing parenthesis
1648 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1649
1650 // excess is a negative index
1651 match[0] = match[0].slice( 0, excess );
1652 match[2] = unquoted.slice( 0, excess );
1653 }
1654
1655 // Return only captures needed by the pseudo filter method (type and argument)
1656 return match.slice( 0, 3 );
1657 }
1658 },
1659
1660 filter: {
1661
1662 "TAG": function( nodeNameSelector ) {
1663 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1664 return nodeNameSelector === "*" ?
1665 function() { return true; } :
1666 function( elem ) {
1667 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1668 };
1669 },
1670
1671 "CLASS": function( className ) {
1672 var pattern = classCache[ className + " " ];
1673
1674 return pattern ||
1675 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1676 classCache( className, function( elem ) {
1677 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1678 });
1679 },
1680
1681 "ATTR": function( name, operator, check ) {
1682 return function( elem ) {
1683 var result = Sizzle.attr( elem, name );
1684
1685 if ( result == null ) {
1686 return operator === "!=";
1687 }
1688 if ( !operator ) {
1689 return true;
1690 }
1691
1692 result += "";
1693
1694 return operator === "=" ? result === check :
1695 operator === "!=" ? result !== check :
1696 operator === "^=" ? check && result.indexOf( check ) === 0 :
1697 operator === "*=" ? check && result.indexOf( check ) > -1 :
1698 operator === "$=" ? check && result.slice( -check.length ) === check :
1699 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1700 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1701 false;
1702 };
1703 },
1704
1705 "CHILD": function( type, what, argument, first, last ) {
1706 var simple = type.slice( 0, 3 ) !== "nth",
1707 forward = type.slice( -4 ) !== "last",
1708 ofType = what === "of-type";
1709
1710 return first === 1 && last === 0 ?
1711
1712 // Shortcut for :nth-*(n)
1713 function( elem ) {
1714 return !!elem.parentNode;
1715 } :
1716
1717 function( elem, context, xml ) {
1718 var cache, outerCache, node, diff, nodeIndex, start,
1719 dir = simple !== forward ? "nextSibling" : "previousSibling",
1720 parent = elem.parentNode,
1721 name = ofType && elem.nodeName.toLowerCase(),
1722 useCache = !xml && !ofType;
1723
1724 if ( parent ) {
1725
1726 // :(first|last|only)-(child|of-type)
1727 if ( simple ) {
1728 while ( dir ) {
1729 node = elem;
1730 while ( (node = node[ dir ]) ) {
1731 if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
1732 return false;
1733 }
1734 }
1735 // Reverse direction for :only-* (if we haven't yet done so)
1736 start = dir = type === "only" && !start && "nextSibling";
1737 }
1738 return true;
1739 }
1740
1741 start = [ forward ? parent.firstChild : parent.lastChild ];
1742
1743 // non-xml :nth-child(...) stores cache data on `parent`
1744 if ( forward && useCache ) {
1745 // Seek `elem` from a previously-cached index
1746 outerCache = parent[ expando ] || (parent[ expando ] = {});
1747 cache = outerCache[ type ] || [];
1748 nodeIndex = cache[0] === dirruns && cache[1];
1749 diff = cache[0] === dirruns && cache[2];
1750 node = nodeIndex && parent.childNodes[ nodeIndex ];
1751
1752 while ( (node = ++nodeIndex && node && node[ dir ] ||
1753
1754 // Fallback to seeking `elem` from the start
1755 (diff = nodeIndex = 0) || start.pop()) ) {
1756
1757 // When found, cache indexes on `parent` and break
1758 if ( node.nodeType === 1 && ++diff && node === elem ) {
1759 outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1760 break;
1761 }
1762 }
1763
1764 // Use previously-cached element index if available
1765 } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
1766 diff = cache[1];
1767
1768 // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
1769 } else {
1770 // Use the same loop as above to seek `elem` from the start
1771 while ( (node = ++nodeIndex && node && node[ dir ] ||
1772 (diff = nodeIndex = 0) || start.pop()) ) {
1773
1774 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
1775 // Cache the index of each encountered element
1776 if ( useCache ) {
1777 (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
1778 }
1779
1780 if ( node === elem ) {
1781 break;
1782 }
1783 }
1784 }
1785 }
1786
1787 // Incorporate the offset, then check against cycle size
1788 diff -= last;
1789 return diff === first || ( diff % first === 0 && diff / first >= 0 );
1790 }
1791 };
1792 },
1793
1794 "PSEUDO": function( pseudo, argument ) {
1795 // pseudo-class names are case-insensitive
1796 // http://www.w3.org/TR/selectors/#pseudo-classes
1797 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1798 // Remember that setFilters inherits from pseudos
1799 var args,
1800 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1801 Sizzle.error( "unsupported pseudo: " + pseudo );
1802
1803 // The user may use createPseudo to indicate that
1804 // arguments are needed to create the filter function
1805 // just as Sizzle does
1806 if ( fn[ expando ] ) {
1807 return fn( argument );
1808 }
1809
1810 // But maintain support for old signatures
1811 if ( fn.length > 1 ) {
1812 args = [ pseudo, pseudo, "", argument ];
1813 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1814 markFunction(function( seed, matches ) {
1815 var idx,
1816 matched = fn( seed, argument ),
1817 i = matched.length;
1818 while ( i-- ) {
1819 idx = indexOf( seed, matched[i] );
1820 seed[ idx ] = !( matches[ idx ] = matched[i] );
1821 }
1822 }) :
1823 function( elem ) {
1824 return fn( elem, 0, args );
1825 };
1826 }
1827
1828 return fn;
1829 }
1830 },
1831
1832 pseudos: {
1833 // Potentially complex pseudos
1834 "not": markFunction(function( selector ) {
1835 // Trim the selector passed to compile
1836 // to avoid treating leading and trailing
1837 // spaces as combinators
1838 var input = [],
1839 results = [],
1840 matcher = compile( selector.replace( rtrim, "$1" ) );
1841
1842 return matcher[ expando ] ?
1843 markFunction(function( seed, matches, context, xml ) {
1844 var elem,
1845 unmatched = matcher( seed, null, xml, [] ),
1846 i = seed.length;
1847
1848 // Match elements unmatched by `matcher`
1849 while ( i-- ) {
1850 if ( (elem = unmatched[i]) ) {
1851 seed[i] = !(matches[i] = elem);
1852 }
1853 }
1854 }) :
1855 function( elem, context, xml ) {
1856 input[0] = elem;
1857 matcher( input, null, xml, results );
1858 // Don't keep the element (issue #299)
1859 input[0] = null;
1860 return !results.pop();
1861 };
1862 }),
1863
1864 "has": markFunction(function( selector ) {
1865 return function( elem ) {
1866 return Sizzle( selector, elem ).length > 0;
1867 };
1868 }),
1869
1870 "contains": markFunction(function( text ) {
1871 text = text.replace( runescape, funescape );
1872 return function( elem ) {
1873 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1874 };
1875 }),
1876
1877 // "Whether an element is represented by a :lang() selector
1878 // is based solely on the element's language value
1879 // being equal to the identifier C,
1880 // or beginning with the identifier C immediately followed by "-".
1881 // The matching of C against the element's language value is performed case-insensitively.
1882 // The identifier C does not have to be a valid language name."
1883 // http://www.w3.org/TR/selectors/#lang-pseudo
1884 "lang": markFunction( function( lang ) {
1885 // lang value must be a valid identifier
1886 if ( !ridentifier.test(lang || "") ) {
1887 Sizzle.error( "unsupported lang: " + lang );
1888 }
1889 lang = lang.replace( runescape, funescape ).toLowerCase();
1890 return function( elem ) {
1891 var elemLang;
1892 do {
1893 if ( (elemLang = documentIsHTML ?
1894 elem.lang :
1895 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1896
1897 elemLang = elemLang.toLowerCase();
1898 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1899 }
1900 } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1901 return false;
1902 };
1903 }),
1904
1905 // Miscellaneous
1906 "target": function( elem ) {
1907 var hash = window.location && window.location.hash;
1908 return hash && hash.slice( 1 ) === elem.id;
1909 },
1910
1911 "root": function( elem ) {
1912 return elem === docElem;
1913 },
1914
1915 "focus": function( elem ) {
1916 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1917 },
1918
1919 // Boolean properties
1920 "enabled": function( elem ) {
1921 return elem.disabled === false;
1922 },
1923
1924 "disabled": function( elem ) {
1925 return elem.disabled === true;
1926 },
1927
1928 "checked": function( elem ) {
1929 // In CSS3, :checked should return both checked and selected elements
1930 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1931 var nodeName = elem.nodeName.toLowerCase();
1932 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1933 },
1934
1935 "selected": function( elem ) {
1936 // Accessing this property makes selected-by-default
1937 // options in Safari work properly
1938 if ( elem.parentNode ) {
1939 elem.parentNode.selectedIndex;
1940 }
1941
1942 return elem.selected === true;
1943 },
1944
1945 // Contents
1946 "empty": function( elem ) {
1947 // http://www.w3.org/TR/selectors/#empty-pseudo
1948 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1949 // but not by others (comment: 8; processing instruction: 7; etc.)
1950 // nodeType < 6 works because attributes (2) do not appear as children
1951 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1952 if ( elem.nodeType < 6 ) {
1953 return false;
1954 }
1955 }
1956 return true;
1957 },
1958
1959 "parent": function( elem ) {
1960 return !Expr.pseudos["empty"]( elem );
1961 },
1962
1963 // Element/input types
1964 "header": function( elem ) {
1965 return rheader.test( elem.nodeName );
1966 },
1967
1968 "input": function( elem ) {
1969 return rinputs.test( elem.nodeName );
1970 },
1971
1972 "button": function( elem ) {
1973 var name = elem.nodeName.toLowerCase();
1974 return name === "input" && elem.type === "button" || name === "button";
1975 },
1976
1977 "text": function( elem ) {
1978 var attr;
1979 return elem.nodeName.toLowerCase() === "input" &&
1980 elem.type === "text" &&
1981
1982 // Support: IE<8
1983 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1984 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1985 },
1986
1987 // Position-in-collection
1988 "first": createPositionalPseudo(function() {
1989 return [ 0 ];
1990 }),
1991
1992 "last": createPositionalPseudo(function( matchIndexes, length ) {
1993 return [ length - 1 ];
1994 }),
1995
1996 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1997 return [ argument < 0 ? argument + length : argument ];
1998 }),
1999
2000 "even": createPositionalPseudo(function( matchIndexes, length ) {
2001 var i = 0;
2002 for ( ; i < length; i += 2 ) {
2003 matchIndexes.push( i );
2004 }
2005 return matchIndexes;
2006 }),
2007
2008 "odd": createPositionalPseudo(function( matchIndexes, length ) {
2009 var i = 1;
2010 for ( ; i < length; i += 2 ) {
2011 matchIndexes.push( i );
2012 }
2013 return matchIndexes;
2014 }),
2015
2016 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2017 var i = argument < 0 ? argument + length : argument;
2018 for ( ; --i >= 0; ) {
2019 matchIndexes.push( i );
2020 }
2021 return matchIndexes;
2022 }),
2023
2024 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2025 var i = argument < 0 ? argument + length : argument;
2026 for ( ; ++i < length; ) {
2027 matchIndexes.push( i );
2028 }
2029 return matchIndexes;
2030 })
2031 }
2032 };
2033
2034 Expr.pseudos["nth"] = Expr.pseudos["eq"];
2035
2036 // Add button/input type pseudos
2037 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2038 Expr.pseudos[ i ] = createInputPseudo( i );
2039 }
2040 for ( i in { submit: true, reset: true } ) {
2041 Expr.pseudos[ i ] = createButtonPseudo( i );
2042 }
2043
2044 // Easy API for creating new setFilters
2045 function setFilters() {}
2046 setFilters.prototype = Expr.filters = Expr.pseudos;
2047 Expr.setFilters = new setFilters();
2048
2049 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2050 var matched, match, tokens, type,
2051 soFar, groups, preFilters,
2052 cached = tokenCache[ selector + " " ];
2053
2054 if ( cached ) {
2055 return parseOnly ? 0 : cached.slice( 0 );
2056 }
2057
2058 soFar = selector;
2059 groups = [];
2060 preFilters = Expr.preFilter;
2061
2062 while ( soFar ) {
2063
2064 // Comma and first run
2065 if ( !matched || (match = rcomma.exec( soFar )) ) {
2066 if ( match ) {
2067 // Don't consume trailing commas as valid
2068 soFar = soFar.slice( match[0].length ) || soFar;
2069 }
2070 groups.push( (tokens = []) );
2071 }
2072
2073 matched = false;
2074
2075 // Combinators
2076 if ( (match = rcombinators.exec( soFar )) ) {
2077 matched = match.shift();
2078 tokens.push({
2079 value: matched,
2080 // Cast descendant combinators to space
2081 type: match[0].replace( rtrim, " " )
2082 });
2083 soFar = soFar.slice( matched.length );
2084 }
2085
2086 // Filters
2087 for ( type in Expr.filter ) {
2088 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2089 (match = preFilters[ type ]( match ))) ) {
2090 matched = match.shift();
2091 tokens.push({
2092 value: matched,
2093 type: type,
2094 matches: match
2095 });
2096 soFar = soFar.slice( matched.length );
2097 }
2098 }
2099
2100 if ( !matched ) {
2101 break;
2102 }
2103 }
2104
2105 // Return the length of the invalid excess
2106 // if we're just parsing
2107 // Otherwise, throw an error or return tokens
2108 return parseOnly ?
2109 soFar.length :
2110 soFar ?
2111 Sizzle.error( selector ) :
2112 // Cache the tokens
2113 tokenCache( selector, groups ).slice( 0 );
2114 };
2115
2116 function toSelector( tokens ) {
2117 var i = 0,
2118 len = tokens.length,
2119 selector = "";
2120 for ( ; i < len; i++ ) {
2121 selector += tokens[i].value;
2122 }
2123 return selector;
2124 }
2125
2126 function addCombinator( matcher, combinator, base ) {
2127 var dir = combinator.dir,
2128 checkNonElements = base && dir === "parentNode",
2129 doneName = done++;
2130
2131 return combinator.first ?
2132 // Check against closest ancestor/preceding element
2133 function( elem, context, xml ) {
2134 while ( (elem = elem[ dir ]) ) {
2135 if ( elem.nodeType === 1 || checkNonElements ) {
2136 return matcher( elem, context, xml );
2137 }
2138 }
2139 } :
2140
2141 // Check against all ancestor/preceding elements
2142 function( elem, context, xml ) {
2143 var oldCache, outerCache,
2144 newCache = [ dirruns, doneName ];
2145
2146 // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2147 if ( xml ) {
2148 while ( (elem = elem[ dir ]) ) {
2149 if ( elem.nodeType === 1 || checkNonElements ) {
2150 if ( matcher( elem, context, xml ) ) {
2151 return true;
2152 }
2153 }
2154 }
2155 } else {
2156 while ( (elem = elem[ dir ]) ) {
2157 if ( elem.nodeType === 1 || checkNonElements ) {
2158 outerCache = elem[ expando ] || (elem[ expando ] = {});
2159 if ( (oldCache = outerCache[ dir ]) &&
2160 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2161
2162 // Assign to newCache so results back-propagate to previous elements
2163 return (newCache[ 2 ] = oldCache[ 2 ]);
2164 } else {
2165 // Reuse newcache so results back-propagate to previous elements
2166 outerCache[ dir ] = newCache;
2167
2168 // A match means we're done; a fail means we have to keep checking
2169 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2170 return true;
2171 }
2172 }
2173 }
2174 }
2175 }
2176 };
2177 }
2178
2179 function elementMatcher( matchers ) {
2180 return matchers.length > 1 ?
2181 function( elem, context, xml ) {
2182 var i = matchers.length;
2183 while ( i-- ) {
2184 if ( !matchers[i]( elem, context, xml ) ) {
2185 return false;
2186 }
2187 }
2188 return true;
2189 } :
2190 matchers[0];
2191 }
2192
2193 function multipleContexts( selector, contexts, results ) {
2194 var i = 0,
2195 len = contexts.length;
2196 for ( ; i < len; i++ ) {
2197 Sizzle( selector, contexts[i], results );
2198 }
2199 return results;
2200 }
2201
2202 function condense( unmatched, map, filter, context, xml ) {
2203 var elem,
2204 newUnmatched = [],
2205 i = 0,
2206 len = unmatched.length,
2207 mapped = map != null;
2208
2209 for ( ; i < len; i++ ) {
2210 if ( (elem = unmatched[i]) ) {
2211 if ( !filter || filter( elem, context, xml ) ) {
2212 newUnmatched.push( elem );
2213 if ( mapped ) {
2214 map.push( i );
2215 }
2216 }
2217 }
2218 }
2219
2220 return newUnmatched;
2221 }
2222
2223 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2224 if ( postFilter && !postFilter[ expando ] ) {
2225 postFilter = setMatcher( postFilter );
2226 }
2227 if ( postFinder && !postFinder[ expando ] ) {
2228 postFinder = setMatcher( postFinder, postSelector );
2229 }
2230 return markFunction(function( seed, results, context, xml ) {
2231 var temp, i, elem,
2232 preMap = [],
2233 postMap = [],
2234 preexisting = results.length,
2235
2236 // Get initial elements from seed or context
2237 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2238
2239 // Prefilter to get matcher input, preserving a map for seed-results synchronization
2240 matcherIn = preFilter && ( seed || !selector ) ?
2241 condense( elems, preMap, preFilter, context, xml ) :
2242 elems,
2243
2244 matcherOut = matcher ?
2245 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2246 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2247
2248 // ...intermediate processing is necessary
2249 [] :
2250
2251 // ...otherwise use results directly
2252 results :
2253 matcherIn;
2254
2255 // Find primary matches
2256 if ( matcher ) {
2257 matcher( matcherIn, matcherOut, context, xml );
2258 }
2259
2260 // Apply postFilter
2261 if ( postFilter ) {
2262 temp = condense( matcherOut, postMap );
2263 postFilter( temp, [], context, xml );
2264
2265 // Un-match failing elements by moving them back to matcherIn
2266 i = temp.length;
2267 while ( i-- ) {
2268 if ( (elem = temp[i]) ) {
2269 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2270 }
2271 }
2272 }
2273
2274 if ( seed ) {
2275 if ( postFinder || preFilter ) {
2276 if ( postFinder ) {
2277 // Get the final matcherOut by condensing this intermediate into postFinder contexts
2278 temp = [];
2279 i = matcherOut.length;
2280 while ( i-- ) {
2281 if ( (elem = matcherOut[i]) ) {
2282 // Restore matcherIn since elem is not yet a final match
2283 temp.push( (matcherIn[i] = elem) );
2284 }
2285 }
2286 postFinder( null, (matcherOut = []), temp, xml );
2287 }
2288
2289 // Move matched elements from seed to results to keep them synchronized
2290 i = matcherOut.length;
2291 while ( i-- ) {
2292 if ( (elem = matcherOut[i]) &&
2293 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2294
2295 seed[temp] = !(results[temp] = elem);
2296 }
2297 }
2298 }
2299
2300 // Add elements to results, through postFinder if defined
2301 } else {
2302 matcherOut = condense(
2303 matcherOut === results ?
2304 matcherOut.splice( preexisting, matcherOut.length ) :
2305 matcherOut
2306 );
2307 if ( postFinder ) {
2308 postFinder( null, results, matcherOut, xml );
2309 } else {
2310 push.apply( results, matcherOut );
2311 }
2312 }
2313 });
2314 }
2315
2316 function matcherFromTokens( tokens ) {
2317 var checkContext, matcher, j,
2318 len = tokens.length,
2319 leadingRelative = Expr.relative[ tokens[0].type ],
2320 implicitRelative = leadingRelative || Expr.relative[" "],
2321 i = leadingRelative ? 1 : 0,
2322
2323 // The foundational matcher ensures that elements are reachable from top-level context(s)
2324 matchContext = addCombinator( function( elem ) {
2325 return elem === checkContext;
2326 }, implicitRelative, true ),
2327 matchAnyContext = addCombinator( function( elem ) {
2328 return indexOf( checkContext, elem ) > -1;
2329 }, implicitRelative, true ),
2330 matchers = [ function( elem, context, xml ) {
2331 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2332 (checkContext = context).nodeType ?
2333 matchContext( elem, context, xml ) :
2334 matchAnyContext( elem, context, xml ) );
2335 // Avoid hanging onto element (issue #299)
2336 checkContext = null;
2337 return ret;
2338 } ];
2339
2340 for ( ; i < len; i++ ) {
2341 if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2342 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2343 } else {
2344 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2345
2346 // Return special upon seeing a positional matcher
2347 if ( matcher[ expando ] ) {
2348 // Find the next relative operator (if any) for proper handling
2349 j = ++i;
2350 for ( ; j < len; j++ ) {
2351 if ( Expr.relative[ tokens[j].type ] ) {
2352 break;
2353 }
2354 }
2355 return setMatcher(
2356 i > 1 && elementMatcher( matchers ),
2357 i > 1 && toSelector(
2358 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2359 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2360 ).replace( rtrim, "$1" ),
2361 matcher,
2362 i < j && matcherFromTokens( tokens.slice( i, j ) ),
2363 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2364 j < len && toSelector( tokens )
2365 );
2366 }
2367 matchers.push( matcher );
2368 }
2369 }
2370
2371 return elementMatcher( matchers );
2372 }
2373
2374 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2375 var bySet = setMatchers.length > 0,
2376 byElement = elementMatchers.length > 0,
2377 superMatcher = function( seed, context, xml, results, outermost ) {
2378 var elem, j, matcher,
2379 matchedCount = 0,
2380 i = "0",
2381 unmatched = seed && [],
2382 setMatched = [],
2383 contextBackup = outermostContext,
2384 // We must always have either seed elements or outermost context
2385 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2386 // Use integer dirruns iff this is the outermost matcher
2387 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2388 len = elems.length;
2389
2390 if ( outermost ) {
2391 outermostContext = context !== document && context;
2392 }
2393
2394 // Add elements passing elementMatchers directly to results
2395 // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2396 // Support: IE<9, Safari
2397 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2398 for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2399 if ( byElement && elem ) {
2400 j = 0;
2401 while ( (matcher = elementMatchers[j++]) ) {
2402 if ( matcher( elem, context, xml ) ) {
2403 results.push( elem );
2404 break;
2405 }
2406 }
2407 if ( outermost ) {
2408 dirruns = dirrunsUnique;
2409 }
2410 }
2411
2412 // Track unmatched elements for set filters
2413 if ( bySet ) {
2414 // They will have gone through all possible matchers
2415 if ( (elem = !matcher && elem) ) {
2416 matchedCount--;
2417 }
2418
2419 // Lengthen the array for every element, matched or not
2420 if ( seed ) {
2421 unmatched.push( elem );
2422 }
2423 }
2424 }
2425
2426 // Apply set filters to unmatched elements
2427 matchedCount += i;
2428 if ( bySet && i !== matchedCount ) {
2429 j = 0;
2430 while ( (matcher = setMatchers[j++]) ) {
2431 matcher( unmatched, setMatched, context, xml );
2432 }
2433
2434 if ( seed ) {
2435 // Reintegrate element matches to eliminate the need for sorting
2436 if ( matchedCount > 0 ) {
2437 while ( i-- ) {
2438 if ( !(unmatched[i] || setMatched[i]) ) {
2439 setMatched[i] = pop.call( results );
2440 }
2441 }
2442 }
2443
2444 // Discard index placeholder values to get only actual matches
2445 setMatched = condense( setMatched );
2446 }
2447
2448 // Add matches to results
2449 push.apply( results, setMatched );
2450
2451 // Seedless set matches succeeding multiple successful matchers stipulate sorting
2452 if ( outermost && !seed && setMatched.length > 0 &&
2453 ( matchedCount + setMatchers.length ) > 1 ) {
2454
2455 Sizzle.uniqueSort( results );
2456 }
2457 }
2458
2459 // Override manipulation of globals by nested matchers
2460 if ( outermost ) {
2461 dirruns = dirrunsUnique;
2462 outermostContext = contextBackup;
2463 }
2464
2465 return unmatched;
2466 };
2467
2468 return bySet ?
2469 markFunction( superMatcher ) :
2470 superMatcher;
2471 }
2472
2473 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2474 var i,
2475 setMatchers = [],
2476 elementMatchers = [],
2477 cached = compilerCache[ selector + " " ];
2478
2479 if ( !cached ) {
2480 // Generate a function of recursive functions that can be used to check each element
2481 if ( !match ) {
2482 match = tokenize( selector );
2483 }
2484 i = match.length;
2485 while ( i-- ) {
2486 cached = matcherFromTokens( match[i] );
2487 if ( cached[ expando ] ) {
2488 setMatchers.push( cached );
2489 } else {
2490 elementMatchers.push( cached );
2491 }
2492 }
2493
2494 // Cache the compiled function
2495 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2496
2497 // Save selector and tokenization
2498 cached.selector = selector;
2499 }
2500 return cached;
2501 };
2502
2503 /**
2504 * A low-level selection function that works with Sizzle's compiled
2505 * selector functions
2506 * @param {String|Function} selector A selector or a pre-compiled
2507 * selector function built with Sizzle.compile
2508 * @param {Element} context
2509 * @param {Array} [results]
2510 * @param {Array} [seed] A set of elements to match against
2511 */
2512 select = Sizzle.select = function( selector, context, results, seed ) {
2513 var i, tokens, token, type, find,
2514 compiled = typeof selector === "function" && selector,
2515 match = !seed && tokenize( (selector = compiled.selector || selector) );
2516
2517 results = results || [];
2518
2519 // Try to minimize operations if there is no seed and only one group
2520 if ( match.length === 1 ) {
2521
2522 // Take a shortcut and set the context if the root selector is an ID
2523 tokens = match[0] = match[0].slice( 0 );
2524 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2525 support.getById && context.nodeType === 9 && documentIsHTML &&
2526 Expr.relative[ tokens[1].type ] ) {
2527
2528 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2529 if ( !context ) {
2530 return results;
2531
2532 // Precompiled matchers will still verify ancestry, so step up a level
2533 } else if ( compiled ) {
2534 context = context.parentNode;
2535 }
2536
2537 selector = selector.slice( tokens.shift().value.length );
2538 }
2539
2540 // Fetch a seed set for right-to-left matching
2541 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2542 while ( i-- ) {
2543 token = tokens[i];
2544
2545 // Abort if we hit a combinator
2546 if ( Expr.relative[ (type = token.type) ] ) {
2547 break;
2548 }
2549 if ( (find = Expr.find[ type ]) ) {
2550 // Search, expanding context for leading sibling combinators
2551 if ( (seed = find(
2552 token.matches[0].replace( runescape, funescape ),
2553 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2554 )) ) {
2555
2556 // If seed is empty or no tokens remain, we can return early
2557 tokens.splice( i, 1 );
2558 selector = seed.length && toSelector( tokens );
2559 if ( !selector ) {
2560 push.apply( results, seed );
2561 return results;
2562 }
2563
2564 break;
2565 }
2566 }
2567 }
2568 }
2569
2570 // Compile and execute a filtering function if one is not provided
2571 // Provide `match` to avoid retokenization if we modified the selector above
2572 ( compiled || compile( selector, match ) )(
2573 seed,
2574 context,
2575 !documentIsHTML,
2576 results,
2577 rsibling.test( selector ) && testContext( context.parentNode ) || context
2578 );
2579 return results;
2580 };
2581
2582 // One-time assignments
2583
2584 // Sort stability
2585 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2586
2587 // Support: Chrome 14-35+
2588 // Always assume duplicates if they aren't passed to the comparison function
2589 support.detectDuplicates = !!hasDuplicate;
2590
2591 // Initialize against the default document
2592 setDocument();
2593
2594 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2595 // Detached nodes confoundingly follow *each other*
2596 support.sortDetached = assert(function( div1 ) {
2597 // Should return 1, but returns 4 (following)
2598 return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2599 });
2600
2601 // Support: IE<8
2602 // Prevent attribute/property "interpolation"
2603 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2604 if ( !assert(function( div ) {
2605 div.innerHTML = "<a href='#'></a>";
2606 return div.firstChild.getAttribute("href") === "#" ;
2607 }) ) {
2608 addHandle( "type|href|height|width", function( elem, name, isXML ) {
2609 if ( !isXML ) {
2610 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2611 }
2612 });
2613 }
2614
2615 // Support: IE<9
2616 // Use defaultValue in place of getAttribute("value")
2617 if ( !support.attributes || !assert(function( div ) {
2618 div.innerHTML = "<input/>";
2619 div.firstChild.setAttribute( "value", "" );
2620 return div.firstChild.getAttribute( "value" ) === "";
2621 }) ) {
2622 addHandle( "value", function( elem, name, isXML ) {
2623 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2624 return elem.defaultValue;
2625 }
2626 });
2627 }
2628
2629 // Support: IE<9
2630 // Use getAttributeNode to fetch booleans when getAttribute lies
2631 if ( !assert(function( div ) {
2632 return div.getAttribute("disabled") == null;
2633 }) ) {
2634 addHandle( booleans, function( elem, name, isXML ) {
2635 var val;
2636 if ( !isXML ) {
2637 return elem[ name ] === true ? name.toLowerCase() :
2638 (val = elem.getAttributeNode( name )) && val.specified ?
2639 val.value :
2640 null;
2641 }
2642 });
2643 }
2644
2645 return Sizzle;
2646
2647 })( window );
2648
2649
2650
2651 jQuery.find = Sizzle;
2652 jQuery.expr = Sizzle.selectors;
2653 jQuery.expr[":"] = jQuery.expr.pseudos;
2654 jQuery.unique = Sizzle.uniqueSort;
2655 jQuery.text = Sizzle.getText;
2656 jQuery.isXMLDoc = Sizzle.isXML;
2657 jQuery.contains = Sizzle.contains;
2658
2659
2660
2661 var rneedsContext = jQuery.expr.match.needsContext;
2662
2663 var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
2664
2665
2666
2667 var risSimple = /^.[^:#\[\.,]*$/;
2668
2669 // Implement the identical functionality for filter and not
2670 function winnow( elements, qualifier, not ) {
2671 if ( jQuery.isFunction( qualifier ) ) {
2672 return jQuery.grep( elements, function( elem, i ) {
2673 /* jshint -W018 */
2674 return !!qualifier.call( elem, i, elem ) !== not;
2675 });
2676
2677 }
2678
2679 if ( qualifier.nodeType ) {
2680 return jQuery.grep( elements, function( elem ) {
2681 return ( elem === qualifier ) !== not;
2682 });
2683
2684 }
2685
2686 if ( typeof qualifier === "string" ) {
2687 if ( risSimple.test( qualifier ) ) {
2688 return jQuery.filter( qualifier, elements, not );
2689 }
2690
2691 qualifier = jQuery.filter( qualifier, elements );
2692 }
2693
2694 return jQuery.grep( elements, function( elem ) {
2695 return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
2696 });
2697 }
2698
2699 jQuery.filter = function( expr, elems, not ) {
2700 var elem = elems[ 0 ];
2701
2702 if ( not ) {
2703 expr = ":not(" + expr + ")";
2704 }
2705
2706 return elems.length === 1 && elem.nodeType === 1 ?
2707 jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2708 jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2709 return elem.nodeType === 1;
2710 }));
2711 };
2712
2713 jQuery.fn.extend({
2714 find: function( selector ) {
2715 var i,
2716 ret = [],
2717 self = this,
2718 len = self.length;
2719
2720 if ( typeof selector !== "string" ) {
2721 return this.pushStack( jQuery( selector ).filter(function() {
2722 for ( i = 0; i < len; i++ ) {
2723 if ( jQuery.contains( self[ i ], this ) ) {
2724 return true;
2725 }
2726 }
2727 }) );
2728 }
2729
2730 for ( i = 0; i < len; i++ ) {
2731 jQuery.find( selector, self[ i ], ret );
2732 }
2733
2734 // Needed because $( selector, context ) becomes $( context ).find( selector )
2735 ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2736 ret.selector = this.selector ? this.selector + " " + selector : selector;
2737 return ret;
2738 },
2739 filter: function( selector ) {
2740 return this.pushStack( winnow(this, selector || [], false) );
2741 },
2742 not: function( selector ) {
2743 return this.pushStack( winnow(this, selector || [], true) );
2744 },
2745 is: function( selector ) {
2746 return !!winnow(
2747 this,
2748
2749 // If this is a positional/relative selector, check membership in the returned set
2750 // so $("p:first").is("p:last") won't return true for a doc with two "p".
2751 typeof selector === "string" && rneedsContext.test( selector ) ?
2752 jQuery( selector ) :
2753 selector || [],
2754 false
2755 ).length;
2756 }
2757 });
2758
2759
2760 // Initialize a jQuery object
2761
2762
2763 // A central reference to the root jQuery(document)
2764 var rootjQuery,
2765
2766 // Use the correct document accordingly with window argument (sandbox)
2767 document = window.document,
2768
2769 // A simple way to check for HTML strings
2770 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2771 // Strict HTML recognition (#11290: must start with <)
2772 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2773
2774 init = jQuery.fn.init = function( selector, context ) {
2775 var match, elem;
2776
2777 // HANDLE: $(""), $(null), $(undefined), $(false)
1022778 if ( !selector ) {
1032779 return this;
1042780 }
1052781
106 // Handle $(DOMElement)
107 if ( selector.nodeType ) {
108 this.context = this[0] = selector;
109 this.length = 1;
110 return this;
111 }
112
113 // The body element only exists once, optimize finding it
114 if ( selector === "body" && !context && document.body ) {
115 this.context = document;
116 this[0] = document.body;
117 this.selector = selector;
118 this.length = 1;
119 return this;
120 }
121
1222782 // Handle HTML strings
1232783 if ( typeof selector === "string" ) {
124 // Are we dealing with HTML string or an ID?
1252784 if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
1262785 // Assume that strings that start and end with <> are HTML and skip the regex check
1272786 match = [ null, selector, null ];
1282787
1292788 } else {
130 match = quickExpr.exec( selector );
131 }
132
133 // Verify a match, and that no context was specified for #id
2789 match = rquickExpr.exec( selector );
2790 }
2791
2792 // Match html or make sure no context is specified for #id
1342793 if ( match && (match[1] || !context) ) {
1352794
1362795 // HANDLE: $(html) -> $(array)
1372796 if ( match[1] ) {
1382797 context = context instanceof jQuery ? context[0] : context;
139 doc = ( context ? context.ownerDocument || context : document );
140
141 // If a single string is passed in and it's a single tag
142 // just do a createElement and skip the rest
143 ret = rsingleTag.exec( selector );
144
145 if ( ret ) {
146 if ( jQuery.isPlainObject( context ) ) {
147 selector = [ document.createElement( ret[1] ) ];
148 jQuery.fn.attr.call( selector, context, true );
149
150 } else {
151 selector = [ doc.createElement( ret[1] ) ];
2798
2799 // scripts is true for back-compat
2800 // Intentionally let the error be thrown if parseHTML is not present
2801 jQuery.merge( this, jQuery.parseHTML(
2802 match[1],
2803 context && context.nodeType ? context.ownerDocument || context : document,
2804 true
2805 ) );
2806
2807 // HANDLE: $(html, props)
2808 if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
2809 for ( match in context ) {
2810 // Properties of context are called as methods if possible
2811 if ( jQuery.isFunction( this[ match ] ) ) {
2812 this[ match ]( context[ match ] );
2813
2814 // ...and otherwise set as attributes
2815 } else {
2816 this.attr( match, context[ match ] );
2817 }
1522818 }
153
154 } else {
155 ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
156 selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
1572819 }
1582820
159 return jQuery.merge( this, selector );
160
161 // HANDLE: $("#id")
2821 return this;
2822
2823 // HANDLE: $(#id)
1622824 } else {
1632825 elem = document.getElementById( match[2] );
1642826
1912853 return this.constructor( context ).find( selector );
1922854 }
1932855
2856 // HANDLE: $(DOMElement)
2857 } else if ( selector.nodeType ) {
2858 this.context = this[0] = selector;
2859 this.length = 1;
2860 return this;
2861
1942862 // HANDLE: $(function)
1952863 // Shortcut for document ready
1962864 } else if ( jQuery.isFunction( selector ) ) {
197 return rootjQuery.ready( selector );
2865 return typeof rootjQuery.ready !== "undefined" ?
2866 rootjQuery.ready( selector ) :
2867 // Execute immediately if ready is not present
2868 selector( jQuery );
1982869 }
1992870
2002871 if ( selector.selector !== undefined ) {
2032874 }
2042875
2052876 return jQuery.makeArray( selector, this );
206 },
207
208 // Start with an empty selector
209 selector: "",
210
211 // The current version of jQuery being used
212 jquery: "1.7.2",
213
214 // The default length of a jQuery object is 0
215 length: 0,
216
217 // The number of elements contained in the matched element set
218 size: function() {
219 return this.length;
220 },
221
222 toArray: function() {
223 return slice.call( this, 0 );
224 },
225
226 // Get the Nth element in the matched element set OR
227 // Get the whole matched element set as a clean array
228 get: function( num ) {
229 return num == null ?
230
231 // Return a 'clean' array
232 this.toArray() :
233
234 // Return just the object
235 ( num < 0 ? this[ this.length + num ] : this[ num ] );
236 },
237
238 // Take an array of elements and push it onto the stack
239 // (returning the new matched element set)
240 pushStack: function( elems, name, selector ) {
241 // Build a new jQuery matched element set
242 var ret = this.constructor();
243
244 if ( jQuery.isArray( elems ) ) {
245 push.apply( ret, elems );
246
247 } else {
248 jQuery.merge( ret, elems );
249 }
250
251 // Add the old object onto the stack (as a reference)
252 ret.prevObject = this;
253
254 ret.context = this.context;
255
256 if ( name === "find" ) {
257 ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
258 } else if ( name ) {
259 ret.selector = this.selector + "." + name + "(" + selector + ")";
260 }
261
262 // Return the newly-formed element set
263 return ret;
264 },
265
266 // Execute a callback for every element in the matched set.
267 // (You can seed the arguments with an array of args, but this is
268 // only used internally.)
269 each: function( callback, args ) {
270 return jQuery.each( this, callback, args );
271 },
272
273 ready: function( fn ) {
274 // Attach the listeners
275 jQuery.bindReady();
276
277 // Add the callback
278 readyList.add( fn );
279
280 return this;
281 },
282
283 eq: function( i ) {
284 i = +i;
285 return i === -1 ?
286 this.slice( i ) :
287 this.slice( i, i + 1 );
288 },
289
290 first: function() {
291 return this.eq( 0 );
292 },
293
294 last: function() {
295 return this.eq( -1 );
296 },
297
298 slice: function() {
299 return this.pushStack( slice.apply( this, arguments ),
300 "slice", slice.call(arguments).join(",") );
301 },
302
303 map: function( callback ) {
304 return this.pushStack( jQuery.map(this, function( elem, i ) {
305 return callback.call( elem, i, elem );
306 }));
307 },
308
309 end: function() {
310 return this.prevObject || this.constructor(null);
311 },
312
313 // For internal use only.
314 // Behaves like an Array's method, not like a jQuery method.
315 push: push,
316 sort: [].sort,
317 splice: [].splice
318 };
2877 };
3192878
3202879 // Give the init function the jQuery prototype for later instantiation
321 jQuery.fn.init.prototype = jQuery.fn;
322
323 jQuery.extend = jQuery.fn.extend = function() {
324 var options, name, src, copy, copyIsArray, clone,
325 target = arguments[0] || {},
326 i = 1,
327 length = arguments.length,
328 deep = false;
329
330 // Handle a deep copy situation
331 if ( typeof target === "boolean" ) {
332 deep = target;
333 target = arguments[1] || {};
334 // skip the boolean and the target
335 i = 2;
336 }
337
338 // Handle case when target is a string or something (possible in deep copy)
339 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
340 target = {};
341 }
342
343 // extend jQuery itself if only one argument is passed
344 if ( length === i ) {
345 target = this;
346 --i;
347 }
348
349 for ( ; i < length; i++ ) {
350 // Only deal with non-null/undefined values
351 if ( (options = arguments[ i ]) != null ) {
352 // Extend the base object
353 for ( name in options ) {
354 src = target[ name ];
355 copy = options[ name ];
356
357 // Prevent never-ending loop
358 if ( target === copy ) {
359 continue;
360 }
361
362 // Recurse if we're merging plain objects or arrays
363 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
364 if ( copyIsArray ) {
365 copyIsArray = false;
366 clone = src && jQuery.isArray(src) ? src : [];
367
368 } else {
369 clone = src && jQuery.isPlainObject(src) ? src : {};
370 }
371
372 // Never move original objects, clone them
373 target[ name ] = jQuery.extend( deep, clone, copy );
374
375 // Don't bring in undefined values
376 } else if ( copy !== undefined ) {
377 target[ name ] = copy;
378 }
379 }
380 }
381 }
382
383 // Return the modified object
384 return target;
385 };
2880 init.prototype = jQuery.fn;
2881
2882 // Initialize central reference
2883 rootjQuery = jQuery( document );
2884
2885
2886 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2887 // methods guaranteed to produce a unique set when starting from a unique set
2888 guaranteedUnique = {
2889 children: true,
2890 contents: true,
2891 next: true,
2892 prev: true
2893 };
3862894
3872895 jQuery.extend({
388 noConflict: function( deep ) {
389 if ( window.$ === jQuery ) {
390 window.$ = _$;
391 }
392
393 if ( deep && window.jQuery === jQuery ) {
394 window.jQuery = _jQuery;
395 }
396
397 return jQuery;
398 },
399
400 // Is the DOM ready to be used? Set to true once it occurs.
401 isReady: false,
402
403 // A counter to track how many items to wait for before
404 // the ready event fires. See #6781
405 readyWait: 1,
406
407 // Hold (or release) the ready event
408 holdReady: function( hold ) {
409 if ( hold ) {
410 jQuery.readyWait++;
411 } else {
412 jQuery.ready( true );
413 }
414 },
415
416 // Handle when the DOM is ready
417 ready: function( wait ) {
418 // Either a released hold or an DOMready/load event and not yet ready
419 if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
420 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
421 if ( !document.body ) {
422 return setTimeout( jQuery.ready, 1 );
423 }
424
425 // Remember that the DOM is ready
426 jQuery.isReady = true;
427
428 // If a normal DOM Ready event fired, decrement, and wait if need be
429 if ( wait !== true && --jQuery.readyWait > 0 ) {
430 return;
431 }
432
433 // If there are functions bound, to execute
434 readyList.fireWith( document, [ jQuery ] );
435
436 // Trigger any bound ready events
437 if ( jQuery.fn.trigger ) {
438 jQuery( document ).trigger( "ready" ).off( "ready" );
439 }
440 }
441 },
442
443 bindReady: function() {
444 if ( readyList ) {
445 return;
446 }
447
448 readyList = jQuery.Callbacks( "once memory" );
449
450 // Catch cases where $(document).ready() is called after the
451 // browser event has already occurred.
452 if ( document.readyState === "complete" ) {
453 // Handle it asynchronously to allow scripts the opportunity to delay ready
454 return setTimeout( jQuery.ready, 1 );
455 }
456
457 // Mozilla, Opera and webkit nightlies currently support this event
458 if ( document.addEventListener ) {
459 // Use the handy event callback
460 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
461
462 // A fallback to window.onload, that will always work
463 window.addEventListener( "load", jQuery.ready, false );
464
465 // If IE event model is used
466 } else if ( document.attachEvent ) {
467 // ensure firing before onload,
468 // maybe late but safe also for iframes
469 document.attachEvent( "onreadystatechange", DOMContentLoaded );
470
471 // A fallback to window.onload, that will always work
472 window.attachEvent( "onload", jQuery.ready );
473
474 // If IE and not a frame
475 // continually check to see if the document is ready
476 var toplevel = false;
477
478 try {
479 toplevel = window.frameElement == null;
480 } catch(e) {}
481
482 if ( document.documentElement.doScroll && toplevel ) {
483 doScrollCheck();
484 }
485 }
486 },
487
488 // See test/unit/core.js for details concerning isFunction.
489 // Since version 1.3, DOM methods and functions like alert
490 // aren't supported. They return false on IE (#2968).
491 isFunction: function( obj ) {
492 return jQuery.type(obj) === "function";
493 },
494
495 isArray: Array.isArray || function( obj ) {
496 return jQuery.type(obj) === "array";
497 },
498
499 isWindow: function( obj ) {
500 return obj != null && obj == obj.window;
501 },
502
503 isNumeric: function( obj ) {
504 return !isNaN( parseFloat(obj) ) && isFinite( obj );
505 },
506
507 type: function( obj ) {
508 return obj == null ?
509 String( obj ) :
510 class2type[ toString.call(obj) ] || "object";
511 },
512
513 isPlainObject: function( obj ) {
514 // Must be an Object.
515 // Because of IE, we also have to check the presence of the constructor property.
516 // Make sure that DOM nodes and window objects don't pass through, as well
517 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
518 return false;
519 }
520
521 try {
522 // Not own constructor property must be Object
523 if ( obj.constructor &&
524 !hasOwn.call(obj, "constructor") &&
525 !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
526 return false;
527 }
528 } catch ( e ) {
529 // IE8,9 Will throw exceptions on certain host objects #9897
530 return false;
531 }
532
533 // Own properties are enumerated firstly, so to speed up,
534 // if last one is own, then all properties are own.
535
536 var key;
537 for ( key in obj ) {}
538
539 return key === undefined || hasOwn.call( obj, key );
540 },
541
542 isEmptyObject: function( obj ) {
543 for ( var name in obj ) {
544 return false;
545 }
546 return true;
547 },
548
549 error: function( msg ) {
550 throw new Error( msg );
551 },
552
553 parseJSON: function( data ) {
554 if ( typeof data !== "string" || !data ) {
555 return null;
556 }
557
558 // Make sure leading/trailing whitespace is removed (IE can't handle it)
559 data = jQuery.trim( data );
560
561 // Attempt to parse using the native JSON parser first
562 if ( window.JSON && window.JSON.parse ) {
563 return window.JSON.parse( data );
564 }
565
566 // Make sure the incoming data is actual JSON
567 // Logic borrowed from http://json.org/json2.js
568 if ( rvalidchars.test( data.replace( rvalidescape, "@" )
569 .replace( rvalidtokens, "]" )
570 .replace( rvalidbraces, "")) ) {
571
572 return ( new Function( "return " + data ) )();
573
574 }
575 jQuery.error( "Invalid JSON: " + data );
576 },
577
578 // Cross-browser xml parsing
579 parseXML: function( data ) {
580 if ( typeof data !== "string" || !data ) {
581 return null;
582 }
583 var xml, tmp;
584 try {
585 if ( window.DOMParser ) { // Standard
586 tmp = new DOMParser();
587 xml = tmp.parseFromString( data , "text/xml" );
588 } else { // IE
589 xml = new ActiveXObject( "Microsoft.XMLDOM" );
590 xml.async = "false";
591 xml.loadXML( data );
592 }
593 } catch( e ) {
594 xml = undefined;
595 }
596 if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
597 jQuery.error( "Invalid XML: " + data );
598 }
599 return xml;
600 },
601
602 noop: function() {},
603
604 // Evaluates a script in a global context
605 // Workarounds based on findings by Jim Driscoll
606 // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
607 globalEval: function( data ) {
608 if ( data && rnotwhite.test( data ) ) {
609 // We use execScript on Internet Explorer
610 // We use an anonymous function so that context is window
611 // rather than jQuery in Firefox
612 ( window.execScript || function( data ) {
613 window[ "eval" ].call( window, data );
614 } )( data );
615 }
616 },
617
618 // Convert dashed to camelCase; used by the css and data modules
619 // Microsoft forgot to hump their vendor prefix (#9572)
620 camelCase: function( string ) {
621 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
622 },
623
624 nodeName: function( elem, name ) {
625 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
626 },
627
628 // args is for internal usage only
629 each: function( object, callback, args ) {
630 var name, i = 0,
631 length = object.length,
632 isObj = length === undefined || jQuery.isFunction( object );
633
634 if ( args ) {
635 if ( isObj ) {
636 for ( name in object ) {
637 if ( callback.apply( object[ name ], args ) === false ) {
638 break;
639 }
640 }
641 } else {
642 for ( ; i < length; ) {
643 if ( callback.apply( object[ i++ ], args ) === false ) {
644 break;
645 }
646 }
647 }
648
649 // A special, fast, case for the most common use of each
650 } else {
651 if ( isObj ) {
652 for ( name in object ) {
653 if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
654 break;
655 }
656 }
657 } else {
658 for ( ; i < length; ) {
659 if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
660 break;
661 }
662 }
663 }
664 }
665
666 return object;
667 },
668
669 // Use native String.trim function wherever possible
670 trim: trim ?
671 function( text ) {
672 return text == null ?
673 "" :
674 trim.call( text );
675 } :
676
677 // Otherwise use our own trimming functionality
678 function( text ) {
679 return text == null ?
680 "" :
681 text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
682 },
683
684 // results is for internal usage only
685 makeArray: function( array, results ) {
686 var ret = results || [];
687
688 if ( array != null ) {
689 // The window, strings (and functions) also have 'length'
690 // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
691 var type = jQuery.type( array );
692
693 if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
694 push.call( ret, array );
695 } else {
696 jQuery.merge( ret, array );
697 }
698 }
699
700 return ret;
701 },
702
703 inArray: function( elem, array, i ) {
704 var len;
705
706 if ( array ) {
707 if ( indexOf ) {
708 return indexOf.call( array, elem, i );
709 }
710
711 len = array.length;
712 i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
713
714 for ( ; i < len; i++ ) {
715 // Skip accessing in sparse arrays
716 if ( i in array && array[ i ] === elem ) {
717 return i;
718 }
719 }
720 }
721
722 return -1;
723 },
724
725 merge: function( first, second ) {
726 var i = first.length,
727 j = 0;
728
729 if ( typeof second.length === "number" ) {
730 for ( var l = second.length; j < l; j++ ) {
731 first[ i++ ] = second[ j ];
732 }
733
734 } else {
735 while ( second[j] !== undefined ) {
736 first[ i++ ] = second[ j++ ];
737 }
738 }
739
740 first.length = i;
741
742 return first;
743 },
744
745 grep: function( elems, callback, inv ) {
746 var ret = [], retVal;
747 inv = !!inv;
748
749 // Go through the array, only saving the items
750 // that pass the validator function
751 for ( var i = 0, length = elems.length; i < length; i++ ) {
752 retVal = !!callback( elems[ i ], i );
753 if ( inv !== retVal ) {
754 ret.push( elems[ i ] );
755 }
756 }
757
758 return ret;
759 },
760
761 // arg is for internal usage only
762 map: function( elems, callback, arg ) {
763 var value, key, ret = [],
2896 dir: function( elem, dir, until ) {
2897 var matched = [],
2898 cur = elem[ dir ];
2899
2900 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
2901 if ( cur.nodeType === 1 ) {
2902 matched.push( cur );
2903 }
2904 cur = cur[dir];
2905 }
2906 return matched;
2907 },
2908
2909 sibling: function( n, elem ) {
2910 var r = [];
2911
2912 for ( ; n; n = n.nextSibling ) {
2913 if ( n.nodeType === 1 && n !== elem ) {
2914 r.push( n );
2915 }
2916 }
2917
2918 return r;
2919 }
2920 });
2921
2922 jQuery.fn.extend({
2923 has: function( target ) {
2924 var i,
2925 targets = jQuery( target, this ),
2926 len = targets.length;
2927
2928 return this.filter(function() {
2929 for ( i = 0; i < len; i++ ) {
2930 if ( jQuery.contains( this, targets[i] ) ) {
2931 return true;
2932 }
2933 }
2934 });
2935 },
2936
2937 closest: function( selectors, context ) {
2938 var cur,
7642939 i = 0,
765 length = elems.length,
766 // jquery objects are treated as arrays
767 isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
768
769 // Go through the array, translating each of the items to their
770 if ( isArray ) {
771 for ( ; i < length; i++ ) {
772 value = callback( elems[ i ], i, arg );
773
774 if ( value != null ) {
775 ret[ ret.length ] = value;
776 }
777 }
778
779 // Go through every key on the object,
780 } else {
781 for ( key in elems ) {
782 value = callback( elems[ key ], key, arg );
783
784 if ( value != null ) {
785 ret[ ret.length ] = value;
786 }
787 }
788 }
789
790 // Flatten any nested arrays
791 return ret.concat.apply( [], ret );
792 },
793
794 // A global GUID counter for objects
795 guid: 1,
796
797 // Bind a function to a context, optionally partially applying any
798 // arguments.
799 proxy: function( fn, context ) {
800 if ( typeof context === "string" ) {
801 var tmp = fn[ context ];
802 context = fn;
803 fn = tmp;
804 }
805
806 // Quick check to determine if target is callable, in the spec
807 // this throws a TypeError, but we will just return undefined.
808 if ( !jQuery.isFunction( fn ) ) {
809 return undefined;
810 }
811
812 // Simulated bind
813 var args = slice.call( arguments, 2 ),
814 proxy = function() {
815 return fn.apply( context, args.concat( slice.call( arguments ) ) );
816 };
817
818 // Set the guid of unique handler to the same of original handler, so it can be removed
819 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
820
821 return proxy;
822 },
823
824 // Mutifunctional method to get and set values to a collection
825 // The value/s can optionally be executed if it's a function
826 access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
827 var exec,
828 bulk = key == null,
829 i = 0,
830 length = elems.length;
831
832 // Sets many values
833 if ( key && typeof key === "object" ) {
834 for ( i in key ) {
835 jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
836 }
837 chainable = 1;
838
839 // Sets one value
840 } else if ( value !== undefined ) {
841 // Optionally, function values get executed if exec is true
842 exec = pass === undefined && jQuery.isFunction( value );
843
844 if ( bulk ) {
845 // Bulk operations only iterate when executing function values
846 if ( exec ) {
847 exec = fn;
848 fn = function( elem, key, value ) {
849 return exec.call( jQuery( elem ), value );
850 };
851
852 // Otherwise they run against the entire set
853 } else {
854 fn.call( elems, value );
855 fn = null;
856 }
857 }
858
859 if ( fn ) {
860 for (; i < length; i++ ) {
861 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
862 }
863 }
864
865 chainable = 1;
866 }
867
868 return chainable ?
869 elems :
870
871 // Gets
872 bulk ?
873 fn.call( elems ) :
874 length ? fn( elems[0], key ) : emptyGet;
875 },
876
877 now: function() {
878 return ( new Date() ).getTime();
879 },
880
881 // Use of jQuery.browser is frowned upon.
882 // More details: http://docs.jquery.com/Utilities/jQuery.browser
883 uaMatch: function( ua ) {
884 ua = ua.toLowerCase();
885
886 var match = rwebkit.exec( ua ) ||
887 ropera.exec( ua ) ||
888 rmsie.exec( ua ) ||
889 ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
890 [];
891
892 return { browser: match[1] || "", version: match[2] || "0" };
893 },
894
895 sub: function() {
896 function jQuerySub( selector, context ) {
897 return new jQuerySub.fn.init( selector, context );
898 }
899 jQuery.extend( true, jQuerySub, this );
900 jQuerySub.superclass = this;
901 jQuerySub.fn = jQuerySub.prototype = this();
902 jQuerySub.fn.constructor = jQuerySub;
903 jQuerySub.sub = this.sub;
904 jQuerySub.fn.init = function init( selector, context ) {
905 if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
906 context = jQuerySub( context );
907 }
908
909 return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
910 };
911 jQuerySub.fn.init.prototype = jQuerySub.fn;
912 var rootjQuerySub = jQuerySub(document);
913 return jQuerySub;
914 },
915
916 browser: {}
2940 l = this.length,
2941 matched = [],
2942 pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
2943 jQuery( selectors, context || this.context ) :
2944 0;
2945
2946 for ( ; i < l; i++ ) {
2947 for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
2948 // Always skip document fragments
2949 if ( cur.nodeType < 11 && (pos ?
2950 pos.index(cur) > -1 :
2951
2952 // Don't pass non-elements to Sizzle
2953 cur.nodeType === 1 &&
2954 jQuery.find.matchesSelector(cur, selectors)) ) {
2955
2956 matched.push( cur );
2957 break;
2958 }
2959 }
2960 }
2961
2962 return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
2963 },
2964
2965 // Determine the position of an element within
2966 // the matched set of elements
2967 index: function( elem ) {
2968
2969 // No argument, return index in parent
2970 if ( !elem ) {
2971 return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
2972 }
2973
2974 // index in selector
2975 if ( typeof elem === "string" ) {
2976 return jQuery.inArray( this[0], jQuery( elem ) );
2977 }
2978
2979 // Locate the position of the desired element
2980 return jQuery.inArray(
2981 // If it receives a jQuery object, the first element is used
2982 elem.jquery ? elem[0] : elem, this );
2983 },
2984
2985 add: function( selector, context ) {
2986 return this.pushStack(
2987 jQuery.unique(
2988 jQuery.merge( this.get(), jQuery( selector, context ) )
2989 )
2990 );
2991 },
2992
2993 addBack: function( selector ) {
2994 return this.add( selector == null ?
2995 this.prevObject : this.prevObject.filter(selector)
2996 );
2997 }
9172998 });
9182999
919 // Populate the class2type map
920 jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
921 class2type[ "[object " + name + "]" ] = name.toLowerCase();
3000 function sibling( cur, dir ) {
3001 do {
3002 cur = cur[ dir ];
3003 } while ( cur && cur.nodeType !== 1 );
3004
3005 return cur;
3006 }
3007
3008 jQuery.each({
3009 parent: function( elem ) {
3010 var parent = elem.parentNode;
3011 return parent && parent.nodeType !== 11 ? parent : null;
3012 },
3013 parents: function( elem ) {
3014 return jQuery.dir( elem, "parentNode" );
3015 },
3016 parentsUntil: function( elem, i, until ) {
3017 return jQuery.dir( elem, "parentNode", until );
3018 },
3019 next: function( elem ) {
3020 return sibling( elem, "nextSibling" );
3021 },
3022 prev: function( elem ) {
3023 return sibling( elem, "previousSibling" );
3024 },
3025 nextAll: function( elem ) {
3026 return jQuery.dir( elem, "nextSibling" );
3027 },
3028 prevAll: function( elem ) {
3029 return jQuery.dir( elem, "previousSibling" );
3030 },
3031 nextUntil: function( elem, i, until ) {
3032 return jQuery.dir( elem, "nextSibling", until );
3033 },
3034 prevUntil: function( elem, i, until ) {
3035 return jQuery.dir( elem, "previousSibling", until );
3036 },
3037 siblings: function( elem ) {
3038 return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
3039 },
3040 children: function( elem ) {
3041 return jQuery.sibling( elem.firstChild );
3042 },
3043 contents: function( elem ) {
3044 return jQuery.nodeName( elem, "iframe" ) ?
3045 elem.contentDocument || elem.contentWindow.document :
3046 jQuery.merge( [], elem.childNodes );
3047 }
3048 }, function( name, fn ) {
3049 jQuery.fn[ name ] = function( until, selector ) {
3050 var ret = jQuery.map( this, fn, until );
3051
3052 if ( name.slice( -5 ) !== "Until" ) {
3053 selector = until;
3054 }
3055
3056 if ( selector && typeof selector === "string" ) {
3057 ret = jQuery.filter( selector, ret );
3058 }
3059
3060 if ( this.length > 1 ) {
3061 // Remove duplicates
3062 if ( !guaranteedUnique[ name ] ) {
3063 ret = jQuery.unique( ret );
3064 }
3065
3066 // Reverse order for parents* and prev-derivatives
3067 if ( rparentsprev.test( name ) ) {
3068 ret = ret.reverse();
3069 }
3070 }
3071
3072 return this.pushStack( ret );
3073 };
9223074 });
923
924 browserMatch = jQuery.uaMatch( userAgent );
925 if ( browserMatch.browser ) {
926 jQuery.browser[ browserMatch.browser ] = true;
927 jQuery.browser.version = browserMatch.version;
928 }
929
930 // Deprecated, use jQuery.browser.webkit instead
931 if ( jQuery.browser.webkit ) {
932 jQuery.browser.safari = true;
933 }
934
935 // IE doesn't match non-breaking spaces with \s
936 if ( rnotwhite.test( "\xA0" ) ) {
937 trimLeft = /^[\s\xA0]+/;
938 trimRight = /[\s\xA0]+$/;
939 }
940
941 // All jQuery objects should point back to these
942 rootjQuery = jQuery(document);
943
944 // Cleanup functions for the document ready method
945 if ( document.addEventListener ) {
946 DOMContentLoaded = function() {
947 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
948 jQuery.ready();
949 };
950
951 } else if ( document.attachEvent ) {
952 DOMContentLoaded = function() {
953 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
954 if ( document.readyState === "complete" ) {
955 document.detachEvent( "onreadystatechange", DOMContentLoaded );
956 jQuery.ready();
957 }
958 };
959 }
960
961 // The DOM ready check for Internet Explorer
962 function doScrollCheck() {
963 if ( jQuery.isReady ) {
964 return;
965 }
966
967 try {
968 // If IE is used, use the trick by Diego Perini
969 // http://javascript.nwbox.com/IEContentLoaded/
970 document.documentElement.doScroll("left");
971 } catch(e) {
972 setTimeout( doScrollCheck, 1 );
973 return;
974 }
975
976 // and execute any waiting functions
977 jQuery.ready();
978 }
979
980 return jQuery;
981
982 })();
983
984
985 // String to Object flags format cache
986 var flagsCache = {};
987
988 // Convert String-formatted flags into Object-formatted ones and store in cache
989 function createFlags( flags ) {
990 var object = flagsCache[ flags ] = {},
991 i, length;
992 flags = flags.split( /\s+/ );
993 for ( i = 0, length = flags.length; i < length; i++ ) {
994 object[ flags[i] ] = true;
995 }
3075 var rnotwhite = (/\S+/g);
3076
3077
3078
3079 // String to Object options format cache
3080 var optionsCache = {};
3081
3082 // Convert String-formatted options into Object-formatted ones and store in cache
3083 function createOptions( options ) {
3084 var object = optionsCache[ options ] = {};
3085 jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
3086 object[ flag ] = true;
3087 });
9963088 return object;
9973089 }
9983090
9993091 /*
10003092 * Create a callback list using the following parameters:
10013093 *
1002 * flags: an optional list of space-separated flags that will change how
1003 * the callback list behaves
3094 * options: an optional list of space-separated options that will change how
3095 * the callback list behaves or a more traditional option object
10043096 *
10053097 * By default a callback list will act like an event callback list and can be
10063098 * "fired" multiple times.
10073099 *
1008 * Possible flags:
3100 * Possible options:
10093101 *
10103102 * once: will ensure the callback list can only be fired once (like a Deferred)
10113103 *
10183110 * stopOnFalse: interrupt callings when a callback returns false
10193111 *
10203112 */
1021 jQuery.Callbacks = function( flags ) {
1022
1023 // Convert flags from String-formatted to Object-formatted
3113 jQuery.Callbacks = function( options ) {
3114
3115 // Convert options from String-formatted to Object-formatted if needed
10243116 // (we check in cache first)
1025 flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
1026
1027 var // Actual callback list
1028 list = [],
1029 // Stack of fire calls for repeatable lists
1030 stack = [],
3117 options = typeof options === "string" ?
3118 ( optionsCache[ options ] || createOptions( options ) ) :
3119 jQuery.extend( {}, options );
3120
3121 var // Flag to know if list is currently firing
3122 firing,
10313123 // Last fire value (for non-forgettable lists)
10323124 memory,
10333125 // Flag to know if list was already fired
10343126 fired,
1035 // Flag to know if list is currently firing
1036 firing,
1037 // First callback to fire (used internally by add and fireWith)
1038 firingStart,
10393127 // End of the loop when firing
10403128 firingLength,
10413129 // Index of currently firing callback (modified by remove if needed)
10423130 firingIndex,
1043 // Add one or several callbacks to the list
1044 add = function( args ) {
1045 var i,
1046 length,
1047 elem,
1048 type,
1049 actual;
1050 for ( i = 0, length = args.length; i < length; i++ ) {
1051 elem = args[ i ];
1052 type = jQuery.type( elem );
1053 if ( type === "array" ) {
1054 // Inspect recursively
1055 add( elem );
1056 } else if ( type === "function" ) {
1057 // Add if not in unique mode and callback is not in
1058 if ( !flags.unique || !self.has( elem ) ) {
1059 list.push( elem );
1060 }
1061 }
1062 }
1063 },
3131 // First callback to fire (used internally by add and fireWith)
3132 firingStart,
3133 // Actual callback list
3134 list = [],
3135 // Stack of fire calls for repeatable lists
3136 stack = !options.once && [],
10643137 // Fire callbacks
1065 fire = function( context, args ) {
1066 args = args || [];
1067 memory = !flags.memory || [ context, args ];
3138 fire = function( data ) {
3139 memory = options.memory && data;
10683140 fired = true;
1069 firing = true;
10703141 firingIndex = firingStart || 0;
10713142 firingStart = 0;
10723143 firingLength = list.length;
3144 firing = true;
10733145 for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1074 if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1075 memory = true; // Mark as halted
3146 if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3147 memory = false; // To prevent further calls using add
10763148 break;
10773149 }
10783150 }
10793151 firing = false;
10803152 if ( list ) {
1081 if ( !flags.once ) {
1082 if ( stack && stack.length ) {
1083 memory = stack.shift();
1084 self.fireWith( memory[ 0 ], memory[ 1 ] );
3153 if ( stack ) {
3154 if ( stack.length ) {
3155 fire( stack.shift() );
10853156 }
1086 } else if ( memory === true ) {
3157 } else if ( memory ) {
3158 list = [];
3159 } else {
10873160 self.disable();
1088 } else {
1089 list = [];
10903161 }
10913162 }
10923163 },
10953166 // Add a callback or a collection of callbacks to the list
10963167 add: function() {
10973168 if ( list ) {
1098 var length = list.length;
1099 add( arguments );
3169 // First, we save the current length
3170 var start = list.length;
3171 (function add( args ) {
3172 jQuery.each( args, function( _, arg ) {
3173 var type = jQuery.type( arg );
3174 if ( type === "function" ) {
3175 if ( !options.unique || !self.has( arg ) ) {
3176 list.push( arg );
3177 }
3178 } else if ( arg && arg.length && type !== "string" ) {
3179 // Inspect recursively
3180 add( arg );
3181 }
3182 });
3183 })( arguments );
11003184 // Do we need to add the callbacks to the
11013185 // current firing batch?
11023186 if ( firing ) {
11033187 firingLength = list.length;
11043188 // With memory, if we're not firing then
1105 // we should call right away, unless previous
1106 // firing was halted (stopOnFalse)
1107 } else if ( memory && memory !== true ) {
1108 firingStart = length;
1109 fire( memory[ 0 ], memory[ 1 ] );
3189 // we should call right away
3190 } else if ( memory ) {
3191 firingStart = start;
3192 fire( memory );
11103193 }
11113194 }
11123195 return this;
11143197 // Remove a callback from the list
11153198 remove: function() {
11163199 if ( list ) {
1117 var args = arguments,
1118 argIndex = 0,
1119 argLength = args.length;
1120 for ( ; argIndex < argLength ; argIndex++ ) {
1121 for ( var i = 0; i < list.length; i++ ) {
1122 if ( args[ argIndex ] === list[ i ] ) {
1123 // Handle firingIndex and firingLength
1124 if ( firing ) {
1125 if ( i <= firingLength ) {
1126 firingLength--;
1127 if ( i <= firingIndex ) {
1128 firingIndex--;
1129 }
1130 }
3200 jQuery.each( arguments, function( _, arg ) {
3201 var index;
3202 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3203 list.splice( index, 1 );
3204 // Handle firing indexes
3205 if ( firing ) {
3206 if ( index <= firingLength ) {
3207 firingLength--;
11313208 }
1132 // Remove the element
1133 list.splice( i--, 1 );
1134 // If we have some unicity property then
1135 // we only need to do this once
1136 if ( flags.unique ) {
1137 break;
3209 if ( index <= firingIndex ) {
3210 firingIndex--;
11383211 }
11393212 }
11403213 }
1141 }
3214 });
11423215 }
11433216 return this;
11443217 },
1145 // Control if a given callback is in the list
3218 // Check if a given callback is in the list.
3219 // If no argument is given, return whether or not list has callbacks attached.
11463220 has: function( fn ) {
1147 if ( list ) {
1148 var i = 0,
1149 length = list.length;
1150 for ( ; i < length; i++ ) {
1151 if ( fn === list[ i ] ) {
1152 return true;
1153 }
1154 }
1155 }
1156 return false;
3221 return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
11573222 },
11583223 // Remove all callbacks from the list
11593224 empty: function() {
11603225 list = [];
3226 firingLength = 0;
11613227 return this;
11623228 },
11633229 // Have the list do nothing anymore
11723238 // Lock the list in its current state
11733239 lock: function() {
11743240 stack = undefined;
1175 if ( !memory || memory === true ) {
3241 if ( !memory ) {
11763242 self.disable();
11773243 }
11783244 return this;
11833249 },
11843250 // Call all callbacks with the given context and arguments
11853251 fireWith: function( context, args ) {
1186 if ( stack ) {
3252 if ( list && ( !fired || stack ) ) {
3253 args = args || [];
3254 args = [ context, args.slice ? args.slice() : args ];
11873255 if ( firing ) {
1188 if ( !flags.once ) {
1189 stack.push( [ context, args ] );
1190 }
1191 } else if ( !( flags.once && memory ) ) {
1192 fire( context, args );
3256 stack.push( args );
3257 } else {
3258 fire( args );
11933259 }
11943260 }
11953261 return this;
12093275 };
12103276
12113277
1212
1213
1214 var // Static reference to slice
1215 sliceDeferred = [].slice;
1216
12173278 jQuery.extend({
12183279
12193280 Deferred: function( func ) {
1220 var doneList = jQuery.Callbacks( "once memory" ),
1221 failList = jQuery.Callbacks( "once memory" ),
1222 progressList = jQuery.Callbacks( "memory" ),
3281 var tuples = [
3282 // action, add listener, listener list, final state
3283 [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3284 [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3285 [ "notify", "progress", jQuery.Callbacks("memory") ]
3286 ],
12233287 state = "pending",
1224 lists = {
1225 resolve: doneList,
1226 reject: failList,
1227 notify: progressList
1228 },
12293288 promise = {
1230 done: doneList.add,
1231 fail: failList.add,
1232 progress: progressList.add,
1233
12343289 state: function() {
12353290 return state;
12363291 },
1237
1238 // Deprecated
1239 isResolved: doneList.fired,
1240 isRejected: failList.fired,
1241
1242 then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1243 deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
3292 always: function() {
3293 deferred.done( arguments ).fail( arguments );
12443294 return this;
12453295 },
1246 always: function() {
1247 deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1248 return this;
1249 },
1250 pipe: function( fnDone, fnFail, fnProgress ) {
3296 then: function( /* fnDone, fnFail, fnProgress */ ) {
3297 var fns = arguments;
12513298 return jQuery.Deferred(function( newDefer ) {
1252 jQuery.each( {
1253 done: [ fnDone, "resolve" ],
1254 fail: [ fnFail, "reject" ],
1255 progress: [ fnProgress, "notify" ]
1256 }, function( handler, data ) {
1257 var fn = data[ 0 ],
1258 action = data[ 1 ],
1259 returned;
1260 if ( jQuery.isFunction( fn ) ) {
1261 deferred[ handler ](function() {
1262 returned = fn.apply( this, arguments );
1263 if ( returned && jQuery.isFunction( returned.promise ) ) {
1264 returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1265 } else {
1266 newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1267 }
1268 });
1269 } else {
1270 deferred[ handler ]( newDefer[ action ] );
1271 }
3299 jQuery.each( tuples, function( i, tuple ) {
3300 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3301 // deferred[ done | fail | progress ] for forwarding actions to newDefer
3302 deferred[ tuple[1] ](function() {
3303 var returned = fn && fn.apply( this, arguments );
3304 if ( returned && jQuery.isFunction( returned.promise ) ) {
3305 returned.promise()
3306 .done( newDefer.resolve )
3307 .fail( newDefer.reject )
3308 .progress( newDefer.notify );
3309 } else {
3310 newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3311 }
3312 });
12723313 });
3314 fns = null;
12733315 }).promise();
12743316 },
12753317 // Get a promise for this deferred
12763318 // If obj is provided, the promise aspect is added to the object
12773319 promise: function( obj ) {
1278 if ( obj == null ) {
1279 obj = promise;
1280 } else {
1281 for ( var key in promise ) {
1282 obj[ key ] = promise[ key ];
1283 }
1284 }
1285 return obj;
3320 return obj != null ? jQuery.extend( obj, promise ) : promise;
12863321 }
12873322 },
1288 deferred = promise.promise({}),
1289 key;
1290
1291 for ( key in lists ) {
1292 deferred[ key ] = lists[ key ].fire;
1293 deferred[ key + "With" ] = lists[ key ].fireWith;
1294 }
1295
1296 // Handle state
1297 deferred.done( function() {
1298 state = "resolved";
1299 }, failList.disable, progressList.lock ).fail( function() {
1300 state = "rejected";
1301 }, doneList.disable, progressList.lock );
3323 deferred = {};
3324
3325 // Keep pipe for back-compat
3326 promise.pipe = promise.then;
3327
3328 // Add list-specific methods
3329 jQuery.each( tuples, function( i, tuple ) {
3330 var list = tuple[ 2 ],
3331 stateString = tuple[ 3 ];
3332
3333 // promise[ done | fail | progress ] = list.add
3334 promise[ tuple[1] ] = list.add;
3335
3336 // Handle state
3337 if ( stateString ) {
3338 list.add(function() {
3339 // state = [ resolved | rejected ]
3340 state = stateString;
3341
3342 // [ reject_list | resolve_list ].disable; progress_list.lock
3343 }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3344 }
3345
3346 // deferred[ resolve | reject | notify ]
3347 deferred[ tuple[0] ] = function() {
3348 deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3349 return this;
3350 };
3351 deferred[ tuple[0] + "With" ] = list.fireWith;
3352 });
3353
3354 // Make the deferred a promise
3355 promise.promise( deferred );
13023356
13033357 // Call given func if any
13043358 if ( func ) {
13103364 },
13113365
13123366 // Deferred helper
1313 when: function( firstParam ) {
1314 var args = sliceDeferred.call( arguments, 0 ),
1315 i = 0,
1316 length = args.length,
1317 pValues = new Array( length ),
1318 count = length,
1319 pCount = length,
1320 deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1321 firstParam :
1322 jQuery.Deferred(),
1323 promise = deferred.promise();
1324 function resolveFunc( i ) {
1325 return function( value ) {
1326 args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1327 if ( !( --count ) ) {
1328 deferred.resolveWith( deferred, args );
1329 }
1330 };
1331 }
1332 function progressFunc( i ) {
1333 return function( value ) {
1334 pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1335 deferred.notifyWith( promise, pValues );
1336 };
1337 }
3367 when: function( subordinate /* , ..., subordinateN */ ) {
3368 var i = 0,
3369 resolveValues = slice.call( arguments ),
3370 length = resolveValues.length,
3371
3372 // the count of uncompleted subordinates
3373 remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3374
3375 // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3376 deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3377
3378 // Update function for both resolve and progress values
3379 updateFunc = function( i, contexts, values ) {
3380 return function( value ) {
3381 contexts[ i ] = this;
3382 values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3383 if ( values === progressValues ) {
3384 deferred.notifyWith( contexts, values );
3385
3386 } else if ( !(--remaining) ) {
3387 deferred.resolveWith( contexts, values );
3388 }
3389 };
3390 },
3391
3392 progressValues, progressContexts, resolveContexts;
3393
3394 // add listeners to Deferred subordinates; treat others as resolved
13383395 if ( length > 1 ) {
3396 progressValues = new Array( length );
3397 progressContexts = new Array( length );
3398 resolveContexts = new Array( length );
13393399 for ( ; i < length; i++ ) {
1340 if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1341 args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
3400 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3401 resolveValues[ i ].promise()
3402 .done( updateFunc( i, resolveContexts, resolveValues ) )
3403 .fail( deferred.reject )
3404 .progress( updateFunc( i, progressContexts, progressValues ) );
13423405 } else {
1343 --count;
1344 }
1345 }
1346 if ( !count ) {
1347 deferred.resolveWith( deferred, args );
1348 }
1349 } else if ( deferred !== firstParam ) {
1350 deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1351 }
1352 return promise;
3406 --remaining;
3407 }
3408 }
3409 }
3410
3411 // if we're not waiting on anything, resolve the master
3412 if ( !remaining ) {
3413 deferred.resolveWith( resolveContexts, resolveValues );
3414 }
3415
3416 return deferred.promise();
13533417 }
13543418 });
13553419
13563420
1357
1358
1359 jQuery.support = (function() {
1360
1361 var support,
1362 all,
1363 a,
1364 select,
1365 opt,
1366 input,
1367 fragment,
1368 tds,
1369 events,
1370 eventName,
1371 i,
1372 isSupported,
1373 div = document.createElement( "div" ),
1374 documentElement = document.documentElement;
1375
1376 // Preliminary tests
1377 div.setAttribute("className", "t");
1378 div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1379
1380 all = div.getElementsByTagName( "*" );
1381 a = div.getElementsByTagName( "a" )[ 0 ];
1382
1383 // Can't get basic test support
1384 if ( !all || !all.length || !a ) {
1385 return {};
1386 }
1387
1388 // First batch of supports tests
1389 select = document.createElement( "select" );
1390 opt = select.appendChild( document.createElement("option") );
1391 input = div.getElementsByTagName( "input" )[ 0 ];
1392
1393 support = {
1394 // IE strips leading whitespace when .innerHTML is used
1395 leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1396
1397 // Make sure that tbody elements aren't automatically inserted
1398 // IE will insert them into empty tables
1399 tbody: !div.getElementsByTagName("tbody").length,
1400
1401 // Make sure that link elements get serialized correctly by innerHTML
1402 // This requires a wrapper element in IE
1403 htmlSerialize: !!div.getElementsByTagName("link").length,
1404
1405 // Get the style information from getAttribute
1406 // (IE uses .cssText instead)
1407 style: /top/.test( a.getAttribute("style") ),
1408
1409 // Make sure that URLs aren't manipulated
1410 // (IE normalizes it by default)
1411 hrefNormalized: ( a.getAttribute("href") === "/a" ),
1412
1413 // Make sure that element opacity exists
1414 // (IE uses filter instead)
1415 // Use a regex to work around a WebKit issue. See #5145
1416 opacity: /^0.55/.test( a.style.opacity ),
1417
1418 // Verify style float existence
1419 // (IE uses styleFloat instead of cssFloat)
1420 cssFloat: !!a.style.cssFloat,
1421
1422 // Make sure that if no value is specified for a checkbox
1423 // that it defaults to "on".
1424 // (WebKit defaults to "" instead)
1425 checkOn: ( input.value === "on" ),
1426
1427 // Make sure that a selected-by-default option has a working selected property.
1428 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1429 optSelected: opt.selected,
1430
1431 // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1432 getSetAttribute: div.className !== "t",
1433
1434 // Tests for enctype support on a form(#6743)
1435 enctype: !!document.createElement("form").enctype,
1436
1437 // Makes sure cloning an html5 element does not cause problems
1438 // Where outerHTML is undefined, this still works
1439 html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1440
1441 // Will be defined later
1442 submitBubbles: true,
1443 changeBubbles: true,
1444 focusinBubbles: false,
1445 deleteExpando: true,
1446 noCloneEvent: true,
1447 inlineBlockNeedsLayout: false,
1448 shrinkWrapBlocks: false,
1449 reliableMarginRight: true,
1450 pixelMargin: true
1451 };
1452
1453 // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
1454 jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
1455
1456 // Make sure checked status is properly cloned
1457 input.checked = true;
1458 support.noCloneChecked = input.cloneNode( true ).checked;
1459
1460 // Make sure that the options inside disabled selects aren't marked as disabled
1461 // (WebKit marks them as disabled)
1462 select.disabled = true;
1463 support.optDisabled = !opt.disabled;
1464
1465 // Test to see if it's possible to delete an expando from an element
1466 // Fails in Internet Explorer
1467 try {
1468 delete div.test;
1469 } catch( e ) {
1470 support.deleteExpando = false;
1471 }
1472
1473 if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1474 div.attachEvent( "onclick", function() {
1475 // Cloning a node shouldn't copy over any
1476 // bound event handlers (IE does this)
1477 support.noCloneEvent = false;
1478 });
1479 div.cloneNode( true ).fireEvent( "onclick" );
1480 }
1481
1482 // Check if a radio maintains its value
1483 // after being appended to the DOM
1484 input = document.createElement("input");
1485 input.value = "t";
1486 input.setAttribute("type", "radio");
1487 support.radioValue = input.value === "t";
1488
1489 input.setAttribute("checked", "checked");
1490
1491 // #11217 - WebKit loses check when the name is after the checked attribute
1492 input.setAttribute( "name", "t" );
1493
1494 div.appendChild( input );
1495 fragment = document.createDocumentFragment();
1496 fragment.appendChild( div.lastChild );
1497
1498 // WebKit doesn't clone checked state correctly in fragments
1499 support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1500
1501 // Check if a disconnected checkbox will retain its checked
1502 // value of true after appended to the DOM (IE6/7)
1503 support.appendChecked = input.checked;
1504
1505 fragment.removeChild( input );
1506 fragment.appendChild( div );
1507
1508 // Technique from Juriy Zaytsev
1509 // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1510 // We only care about the case where non-standard event systems
1511 // are used, namely in IE. Short-circuiting here helps us to
1512 // avoid an eval call (in setAttribute) which can cause CSP
1513 // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1514 if ( div.attachEvent ) {
1515 for ( i in {
1516 submit: 1,
1517 change: 1,
1518 focusin: 1
1519 }) {
1520 eventName = "on" + i;
1521 isSupported = ( eventName in div );
1522 if ( !isSupported ) {
1523 div.setAttribute( eventName, "return;" );
1524 isSupported = ( typeof div[ eventName ] === "function" );
1525 }
1526 support[ i + "Bubbles" ] = isSupported;
1527 }
1528 }
1529
1530 fragment.removeChild( div );
1531
1532 // Null elements to avoid leaks in IE
1533 fragment = select = opt = div = input = null;
1534
1535 // Run tests that need a body at doc ready
1536 jQuery(function() {
1537 var container, outer, inner, table, td, offsetSupport,
1538 marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
1539 paddingMarginBorderVisibility, paddingMarginBorder,
1540 body = document.getElementsByTagName("body")[0];
1541
1542 if ( !body ) {
1543 // Return for frameset docs that don't have a body
3421 // The deferred used on DOM ready
3422 var readyList;
3423
3424 jQuery.fn.ready = function( fn ) {
3425 // Add the callback
3426 jQuery.ready.promise().done( fn );
3427
3428 return this;
3429 };
3430
3431 jQuery.extend({
3432 // Is the DOM ready to be used? Set to true once it occurs.
3433 isReady: false,
3434
3435 // A counter to track how many items to wait for before
3436 // the ready event fires. See #6781
3437 readyWait: 1,
3438
3439 // Hold (or release) the ready event
3440 holdReady: function( hold ) {
3441 if ( hold ) {
3442 jQuery.readyWait++;
3443 } else {
3444 jQuery.ready( true );
3445 }
3446 },
3447
3448 // Handle when the DOM is ready
3449 ready: function( wait ) {
3450
3451 // Abort if there are pending holds or we're already ready
3452 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
15443453 return;
15453454 }
15463455
1547 conMarginTop = 1;
1548 paddingMarginBorder = "padding:0;margin:0;border:";
1549 positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
1550 paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
1551 style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
1552 html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
1553 "<table " + style + "' cellpadding='0' cellspacing='0'>" +
1554 "<tr><td></td></tr></table>";
1555
1556 container = document.createElement("div");
1557 container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1558 body.insertBefore( container, body.firstChild );
1559
1560 // Construct the test element
1561 div = document.createElement("div");
1562 container.appendChild( div );
1563
1564 // Check if table cells still have offsetWidth/Height when they are set
1565 // to display:none and there are still other visible table cells in a
1566 // table row; if so, offsetWidth/Height are not reliable for use when
1567 // determining if an element has been hidden directly using
1568 // display:none (it is still safe to use offsets if a parent element is
1569 // hidden; don safety goggles and see bug #4512 for more information).
1570 // (only IE 8 fails this test)
1571 div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
1572 tds = div.getElementsByTagName( "td" );
1573 isSupported = ( tds[ 0 ].offsetHeight === 0 );
1574
1575 tds[ 0 ].style.display = "";
1576 tds[ 1 ].style.display = "none";
1577
1578 // Check if empty table cells still have offsetWidth/Height
1579 // (IE <= 8 fail this test)
1580 support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1581
1582 // Check if div with explicit width and no margin-right incorrectly
1583 // gets computed margin-right based on width of container. For more
1584 // info see bug #3333
1585 // Fails in WebKit before Feb 2011 nightlies
1586 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1587 if ( window.getComputedStyle ) {
1588 div.innerHTML = "";
1589 marginDiv = document.createElement( "div" );
1590 marginDiv.style.width = "0";
1591 marginDiv.style.marginRight = "0";
1592 div.style.width = "2px";
1593 div.appendChild( marginDiv );
1594 support.reliableMarginRight =
1595 ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1596 }
1597
1598 if ( typeof div.style.zoom !== "undefined" ) {
1599 // Check if natively block-level elements act like inline-block
1600 // elements when setting their display to 'inline' and giving
1601 // them layout
1602 // (IE < 8 does this)
1603 div.innerHTML = "";
1604 div.style.width = div.style.padding = "1px";
1605 div.style.border = 0;
1606 div.style.overflow = "hidden";
1607 div.style.display = "inline";
1608 div.style.zoom = 1;
1609 support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
1610
1611 // Check if elements with layout shrink-wrap their children
1612 // (IE 6 does this)
1613 div.style.display = "block";
1614 div.style.overflow = "visible";
1615 div.innerHTML = "<div style='width:5px;'></div>";
1616 support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
1617 }
1618
1619 div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
1620 div.innerHTML = html;
1621
1622 outer = div.firstChild;
1623 inner = outer.firstChild;
1624 td = outer.nextSibling.firstChild.firstChild;
1625
1626 offsetSupport = {
1627 doesNotAddBorder: ( inner.offsetTop !== 5 ),
1628 doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1629 };
1630
1631 inner.style.position = "fixed";
1632 inner.style.top = "20px";
1633
1634 // safari subtracts parent border width here which is 5px
1635 offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1636 inner.style.position = inner.style.top = "";
1637
1638 outer.style.overflow = "hidden";
1639 outer.style.position = "relative";
1640
1641 offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1642 offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1643
1644 if ( window.getComputedStyle ) {
1645 div.style.marginTop = "1%";
1646 support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
1647 }
1648
1649 if ( typeof container.style.zoom !== "undefined" ) {
1650 container.style.zoom = 1;
1651 }
1652
1653 body.removeChild( container );
1654 marginDiv = div = container = null;
1655
1656 jQuery.extend( support, offsetSupport );
1657 });
1658
1659 return support;
3456 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
3457 if ( !document.body ) {
3458 return setTimeout( jQuery.ready );
3459 }
3460
3461 // Remember that the DOM is ready
3462 jQuery.isReady = true;
3463
3464 // If a normal DOM Ready event fired, decrement, and wait if need be
3465 if ( wait !== true && --jQuery.readyWait > 0 ) {
3466 return;
3467 }
3468
3469 // If there are functions bound, to execute
3470 readyList.resolveWith( document, [ jQuery ] );
3471
3472 // Trigger any bound ready events
3473 if ( jQuery.fn.triggerHandler ) {
3474 jQuery( document ).triggerHandler( "ready" );
3475 jQuery( document ).off( "ready" );
3476 }
3477 }
3478 });
3479
3480 /**
3481 * Clean-up method for dom ready events
3482 */
3483 function detach() {
3484 if ( document.addEventListener ) {
3485 document.removeEventListener( "DOMContentLoaded", completed, false );
3486 window.removeEventListener( "load", completed, false );
3487
3488 } else {
3489 document.detachEvent( "onreadystatechange", completed );
3490 window.detachEvent( "onload", completed );
3491 }
3492 }
3493
3494 /**
3495 * The ready event handler and self cleanup method
3496 */
3497 function completed() {
3498 // readyState === "complete" is good enough for us to call the dom ready in oldIE
3499 if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
3500 detach();
3501 jQuery.ready();
3502 }
3503 }
3504
3505 jQuery.ready.promise = function( obj ) {
3506 if ( !readyList ) {
3507
3508 readyList = jQuery.Deferred();
3509
3510 // Catch cases where $(document).ready() is called after the browser event has already occurred.
3511 // we once tried to use readyState "interactive" here, but it caused issues like the one
3512 // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
3513 if ( document.readyState === "complete" ) {
3514 // Handle it asynchronously to allow scripts the opportunity to delay ready
3515 setTimeout( jQuery.ready );
3516
3517 // Standards-based browsers support DOMContentLoaded
3518 } else if ( document.addEventListener ) {
3519 // Use the handy event callback
3520 document.addEventListener( "DOMContentLoaded", completed, false );
3521
3522 // A fallback to window.onload, that will always work
3523 window.addEventListener( "load", completed, false );
3524
3525 // If IE event model is used
3526 } else {
3527 // Ensure firing before onload, maybe late but safe also for iframes
3528 document.attachEvent( "onreadystatechange", completed );
3529
3530 // A fallback to window.onload, that will always work
3531 window.attachEvent( "onload", completed );
3532
3533 // If IE and not a frame
3534 // continually check to see if the document is ready
3535 var top = false;
3536
3537 try {
3538 top = window.frameElement == null && document.documentElement;
3539 } catch(e) {}
3540
3541 if ( top && top.doScroll ) {
3542 (function doScrollCheck() {
3543 if ( !jQuery.isReady ) {
3544
3545 try {
3546 // Use the trick by Diego Perini
3547 // http://javascript.nwbox.com/IEContentLoaded/
3548 top.doScroll("left");
3549 } catch(e) {
3550 return setTimeout( doScrollCheck, 50 );
3551 }
3552
3553 // detach all dom ready events
3554 detach();
3555
3556 // and execute any waiting functions
3557 jQuery.ready();
3558 }
3559 })();
3560 }
3561 }
3562 }
3563 return readyList.promise( obj );
3564 };
3565
3566
3567 var strundefined = typeof undefined;
3568
3569
3570
3571 // Support: IE<9
3572 // Iteration over object's inherited properties before its own
3573 var i;
3574 for ( i in jQuery( support ) ) {
3575 break;
3576 }
3577 support.ownLast = i !== "0";
3578
3579 // Note: most support tests are defined in their respective modules.
3580 // false until the test is run
3581 support.inlineBlockNeedsLayout = false;
3582
3583 // Execute ASAP in case we need to set body.style.zoom
3584 jQuery(function() {
3585 // Minified: var a,b,c,d
3586 var val, div, body, container;
3587
3588 body = document.getElementsByTagName( "body" )[ 0 ];
3589 if ( !body || !body.style ) {
3590 // Return for frameset docs that don't have a body
3591 return;
3592 }
3593
3594 // Setup
3595 div = document.createElement( "div" );
3596 container = document.createElement( "div" );
3597 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3598 body.appendChild( container ).appendChild( div );
3599
3600 if ( typeof div.style.zoom !== strundefined ) {
3601 // Support: IE<8
3602 // Check if natively block-level elements act like inline-block
3603 // elements when setting their display to 'inline' and giving
3604 // them layout
3605 div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3606
3607 support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3608 if ( val ) {
3609 // Prevent IE 6 from affecting layout for positioned elements #11048
3610 // Prevent IE from shrinking the body in IE 7 mode #12869
3611 // Support: IE<8
3612 body.style.zoom = 1;
3613 }
3614 }
3615
3616 body.removeChild( container );
3617 });
3618
3619
3620
3621
3622 (function() {
3623 var div = document.createElement( "div" );
3624
3625 // Execute the test only if not already executed in another module.
3626 if (support.deleteExpando == null) {
3627 // Support: IE<9
3628 support.deleteExpando = true;
3629 try {
3630 delete div.test;
3631 } catch( e ) {
3632 support.deleteExpando = false;
3633 }
3634 }
3635
3636 // Null elements to avoid leaks in IE.
3637 div = null;
16603638 })();
16613639
16623640
1663
1664
1665 var rbrace = /^(?:\{.*\}|\[.*\])$/,
3641 /**
3642 * Determines whether an object can have data
3643 */
3644 jQuery.acceptData = function( elem ) {
3645 var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
3646 nodeType = +elem.nodeType || 1;
3647
3648 // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3649 return nodeType !== 1 && nodeType !== 9 ?
3650 false :
3651
3652 // Nodes accept data unless otherwise specified; rejection can be conditional
3653 !noData || noData !== true && elem.getAttribute("classid") === noData;
3654 };
3655
3656
3657 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
16663658 rmultiDash = /([A-Z])/g;
3659
3660 function dataAttr( elem, key, data ) {
3661 // If nothing was found internally, try to fetch any
3662 // data from the HTML5 data-* attribute
3663 if ( data === undefined && elem.nodeType === 1 ) {
3664
3665 var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3666
3667 data = elem.getAttribute( name );
3668
3669 if ( typeof data === "string" ) {
3670 try {
3671 data = data === "true" ? true :
3672 data === "false" ? false :
3673 data === "null" ? null :
3674 // Only convert to a number if it doesn't change the string
3675 +data + "" === data ? +data :
3676 rbrace.test( data ) ? jQuery.parseJSON( data ) :
3677 data;
3678 } catch( e ) {}
3679
3680 // Make sure we set the data so it isn't changed later
3681 jQuery.data( elem, key, data );
3682
3683 } else {
3684 data = undefined;
3685 }
3686 }
3687
3688 return data;
3689 }
3690
3691 // checks a cache object for emptiness
3692 function isEmptyDataObject( obj ) {
3693 var name;
3694 for ( name in obj ) {
3695
3696 // if the public data object is empty, the private is still empty
3697 if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3698 continue;
3699 }
3700 if ( name !== "toJSON" ) {
3701 return false;
3702 }
3703 }
3704
3705 return true;
3706 }
3707
3708 function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
3709 if ( !jQuery.acceptData( elem ) ) {
3710 return;
3711 }
3712
3713 var ret, thisCache,
3714 internalKey = jQuery.expando,
3715
3716 // We have to handle DOM nodes and JS objects differently because IE6-7
3717 // can't GC object references properly across the DOM-JS boundary
3718 isNode = elem.nodeType,
3719
3720 // Only DOM nodes need the global jQuery cache; JS object data is
3721 // attached directly to the object so GC can occur automatically
3722 cache = isNode ? jQuery.cache : elem,
3723
3724 // Only defining an ID for JS objects if its cache already exists allows
3725 // the code to shortcut on the same path as a DOM node with no cache
3726 id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3727
3728 // Avoid doing any more work than we need to when trying to get data on an
3729 // object that has no data at all
3730 if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
3731 return;
3732 }
3733
3734 if ( !id ) {
3735 // Only DOM nodes need a new unique ID for each element since their data
3736 // ends up in the global cache
3737 if ( isNode ) {
3738 id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
3739 } else {
3740 id = internalKey;
3741 }
3742 }
3743
3744 if ( !cache[ id ] ) {
3745 // Avoid exposing jQuery metadata on plain JS objects when the object
3746 // is serialized using JSON.stringify
3747 cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3748 }
3749
3750 // An object can be passed to jQuery.data instead of a key/value pair; this gets
3751 // shallow copied over onto the existing cache
3752 if ( typeof name === "object" || typeof name === "function" ) {
3753 if ( pvt ) {
3754 cache[ id ] = jQuery.extend( cache[ id ], name );
3755 } else {
3756 cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3757 }
3758 }
3759
3760 thisCache = cache[ id ];
3761
3762 // jQuery data() is stored in a separate object inside the object's internal data
3763 // cache in order to avoid key collisions between internal data and user-defined
3764 // data.
3765 if ( !pvt ) {
3766 if ( !thisCache.data ) {
3767 thisCache.data = {};
3768 }
3769
3770 thisCache = thisCache.data;
3771 }
3772
3773 if ( data !== undefined ) {
3774 thisCache[ jQuery.camelCase( name ) ] = data;
3775 }
3776
3777 // Check for both converted-to-camel and non-converted data property names
3778 // If a data property was specified
3779 if ( typeof name === "string" ) {
3780
3781 // First Try to find as-is property data
3782 ret = thisCache[ name ];
3783
3784 // Test for null|undefined property data
3785 if ( ret == null ) {
3786
3787 // Try to find the camelCased property
3788 ret = thisCache[ jQuery.camelCase( name ) ];
3789 }
3790 } else {
3791 ret = thisCache;
3792 }
3793
3794 return ret;
3795 }
3796
3797 function internalRemoveData( elem, name, pvt ) {
3798 if ( !jQuery.acceptData( elem ) ) {
3799 return;
3800 }
3801
3802 var thisCache, i,
3803 isNode = elem.nodeType,
3804
3805 // See jQuery.data for more information
3806 cache = isNode ? jQuery.cache : elem,
3807 id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3808
3809 // If there is already no cache entry for this object, there is no
3810 // purpose in continuing
3811 if ( !cache[ id ] ) {
3812 return;
3813 }
3814
3815 if ( name ) {
3816
3817 thisCache = pvt ? cache[ id ] : cache[ id ].data;
3818
3819 if ( thisCache ) {
3820
3821 // Support array or space separated string names for data keys
3822 if ( !jQuery.isArray( name ) ) {
3823
3824 // try the string as a key before any manipulation
3825 if ( name in thisCache ) {
3826 name = [ name ];
3827 } else {
3828
3829 // split the camel cased version by spaces unless a key with the spaces exists
3830 name = jQuery.camelCase( name );
3831 if ( name in thisCache ) {
3832 name = [ name ];
3833 } else {
3834 name = name.split(" ");
3835 }
3836 }
3837 } else {
3838 // If "name" is an array of keys...
3839 // When data is initially created, via ("key", "val") signature,
3840 // keys will be converted to camelCase.
3841 // Since there is no way to tell _how_ a key was added, remove
3842 // both plain key and camelCase key. #12786
3843 // This will only penalize the array argument path.
3844 name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3845 }
3846
3847 i = name.length;
3848 while ( i-- ) {
3849 delete thisCache[ name[i] ];
3850 }
3851
3852 // If there is no data left in the cache, we want to continue
3853 // and let the cache object itself get destroyed
3854 if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
3855 return;
3856 }
3857 }
3858 }
3859
3860 // See jQuery.data for more information
3861 if ( !pvt ) {
3862 delete cache[ id ].data;
3863
3864 // Don't destroy the parent cache unless the internal data object
3865 // had been the only thing left in it
3866 if ( !isEmptyDataObject( cache[ id ] ) ) {
3867 return;
3868 }
3869 }
3870
3871 // Destroy the cache
3872 if ( isNode ) {
3873 jQuery.cleanData( [ elem ], true );
3874
3875 // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3876 /* jshint eqeqeq: false */
3877 } else if ( support.deleteExpando || cache != cache.window ) {
3878 /* jshint eqeqeq: true */
3879 delete cache[ id ];
3880
3881 // When all else fails, null
3882 } else {
3883 cache[ id ] = null;
3884 }
3885 }
16673886
16683887 jQuery.extend({
16693888 cache: {},
16703889
1671 // Please use with caution
1672 uuid: 0,
1673
1674 // Unique for each copy of jQuery on the page
1675 // Non-digits removed to match rinlinejQuery
1676 expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1677
1678 // The following elements throw uncatchable exceptions if you
1679 // attempt to add expando properties to them.
3890 // The following elements (space-suffixed to avoid Object.prototype collisions)
3891 // throw uncatchable exceptions if you attempt to set expando properties
16803892 noData: {
1681 "embed": true,
1682 // Ban all objects except for Flash (which handle expandos)
1683 "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1684 "applet": true
3893 "applet ": true,
3894 "embed ": true,
3895 // ...but Flash objects (which have this classid) *can* handle expandos
3896 "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
16853897 },
16863898
16873899 hasData: function( elem ) {
16893901 return !!elem && !isEmptyDataObject( elem );
16903902 },
16913903
1692 data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1693 if ( !jQuery.acceptData( elem ) ) {
1694 return;
1695 }
1696
1697 var privateCache, thisCache, ret,
1698 internalKey = jQuery.expando,
1699 getByName = typeof name === "string",
1700
1701 // We have to handle DOM nodes and JS objects differently because IE6-7
1702 // can't GC object references properly across the DOM-JS boundary
1703 isNode = elem.nodeType,
1704
1705 // Only DOM nodes need the global jQuery cache; JS object data is
1706 // attached directly to the object so GC can occur automatically
1707 cache = isNode ? jQuery.cache : elem,
1708
1709 // Only defining an ID for JS objects if its cache already exists allows
1710 // the code to shortcut on the same path as a DOM node with no cache
1711 id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
1712 isEvents = name === "events";
1713
1714 // Avoid doing any more work than we need to when trying to get data on an
1715 // object that has no data at all
1716 if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1717 return;
1718 }
1719
1720 if ( !id ) {
1721 // Only DOM nodes need a new unique ID for each element since their data
1722 // ends up in the global cache
1723 if ( isNode ) {
1724 elem[ internalKey ] = id = ++jQuery.uuid;
1725 } else {
1726 id = internalKey;
1727 }
1728 }
1729
1730 if ( !cache[ id ] ) {
1731 cache[ id ] = {};
1732
1733 // Avoids exposing jQuery metadata on plain JS objects when the object
1734 // is serialized using JSON.stringify
1735 if ( !isNode ) {
1736 cache[ id ].toJSON = jQuery.noop;
1737 }
1738 }
1739
1740 // An object can be passed to jQuery.data instead of a key/value pair; this gets
1741 // shallow copied over onto the existing cache
1742 if ( typeof name === "object" || typeof name === "function" ) {
1743 if ( pvt ) {
1744 cache[ id ] = jQuery.extend( cache[ id ], name );
1745 } else {
1746 cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1747 }
1748 }
1749
1750 privateCache = thisCache = cache[ id ];
1751
1752 // jQuery data() is stored in a separate object inside the object's internal data
1753 // cache in order to avoid key collisions between internal data and user-defined
1754 // data.
1755 if ( !pvt ) {
1756 if ( !thisCache.data ) {
1757 thisCache.data = {};
1758 }
1759
1760 thisCache = thisCache.data;
1761 }
1762
1763 if ( data !== undefined ) {
1764 thisCache[ jQuery.camelCase( name ) ] = data;
1765 }
1766
1767 // Users should not attempt to inspect the internal events object using jQuery.data,
1768 // it is undocumented and subject to change. But does anyone listen? No.
1769 if ( isEvents && !thisCache[ name ] ) {
1770 return privateCache.events;
1771 }
1772
1773 // Check for both converted-to-camel and non-converted data property names
1774 // If a data property was specified
1775 if ( getByName ) {
1776
1777 // First Try to find as-is property data
1778 ret = thisCache[ name ];
1779
1780 // Test for null|undefined property data
1781 if ( ret == null ) {
1782
1783 // Try to find the camelCased property
1784 ret = thisCache[ jQuery.camelCase( name ) ];
1785 }
1786 } else {
1787 ret = thisCache;
1788 }
1789
1790 return ret;
1791 },
1792
1793 removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1794 if ( !jQuery.acceptData( elem ) ) {
1795 return;
1796 }
1797
1798 var thisCache, i, l,
1799
1800 // Reference to internal data cache key
1801 internalKey = jQuery.expando,
1802
1803 isNode = elem.nodeType,
1804
1805 // See jQuery.data for more information
1806 cache = isNode ? jQuery.cache : elem,
1807
1808 // See jQuery.data for more information
1809 id = isNode ? elem[ internalKey ] : internalKey;
1810
1811 // If there is already no cache entry for this object, there is no
1812 // purpose in continuing
1813 if ( !cache[ id ] ) {
1814 return;
1815 }
1816
1817 if ( name ) {
1818
1819 thisCache = pvt ? cache[ id ] : cache[ id ].data;
1820
1821 if ( thisCache ) {
1822
1823 // Support array or space separated string names for data keys
1824 if ( !jQuery.isArray( name ) ) {
1825
1826 // try the string as a key before any manipulation
1827 if ( name in thisCache ) {
1828 name = [ name ];
1829 } else {
1830
1831 // split the camel cased version by spaces unless a key with the spaces exists
1832 name = jQuery.camelCase( name );
1833 if ( name in thisCache ) {
1834 name = [ name ];
1835 } else {
1836 name = name.split( " " );
1837 }
1838 }
1839 }
1840
1841 for ( i = 0, l = name.length; i < l; i++ ) {
1842 delete thisCache[ name[i] ];
1843 }
1844
1845 // If there is no data left in the cache, we want to continue
1846 // and let the cache object itself get destroyed
1847 if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1848 return;
1849 }
1850 }
1851 }
1852
1853 // See jQuery.data for more information
1854 if ( !pvt ) {
1855 delete cache[ id ].data;
1856
1857 // Don't destroy the parent cache unless the internal data object
1858 // had been the only thing left in it
1859 if ( !isEmptyDataObject(cache[ id ]) ) {
1860 return;
1861 }
1862 }
1863
1864 // Browsers that fail expando deletion also refuse to delete expandos on
1865 // the window, but it will allow it on all other JS objects; other browsers
1866 // don't care
1867 // Ensure that `cache` is not a window object #10080
1868 if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1869 delete cache[ id ];
1870 } else {
1871 cache[ id ] = null;
1872 }
1873
1874 // We destroyed the cache and need to eliminate the expando on the node to avoid
1875 // false lookups in the cache for entries that no longer exist
1876 if ( isNode ) {
1877 // IE does not allow us to delete expando properties from nodes,
1878 // nor does it have a removeAttribute function on Document nodes;
1879 // we must handle all of these cases
1880 if ( jQuery.support.deleteExpando ) {
1881 delete elem[ internalKey ];
1882 } else if ( elem.removeAttribute ) {
1883 elem.removeAttribute( internalKey );
1884 } else {
1885 elem[ internalKey ] = null;
1886 }
1887 }
3904 data: function( elem, name, data ) {
3905 return internalData( elem, name, data );
3906 },
3907
3908 removeData: function( elem, name ) {
3909 return internalRemoveData( elem, name );
18883910 },
18893911
18903912 // For internal use only.
18913913 _data: function( elem, name, data ) {
1892 return jQuery.data( elem, name, data, true );
1893 },
1894
1895 // A method for determining if a DOM node can handle the data expando
1896 acceptData: function( elem ) {
1897 if ( elem.nodeName ) {
1898 var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1899
1900 if ( match ) {
1901 return !(match === true || elem.getAttribute("classid") !== match);
1902 }
1903 }
1904
1905 return true;
3914 return internalData( elem, name, data, true );
3915 },
3916
3917 _removeData: function( elem, name ) {
3918 return internalRemoveData( elem, name, true );
19063919 }
19073920 });
19083921
19093922 jQuery.fn.extend({
19103923 data: function( key, value ) {
1911 var parts, part, attr, name, l,
3924 var i, name, data,
19123925 elem = this[0],
1913 i = 0,
1914 data = null;
3926 attrs = elem && elem.attributes;
3927
3928 // Special expections of .data basically thwart jQuery.access,
3929 // so implement the relevant behavior ourselves
19153930
19163931 // Gets all values
19173932 if ( key === undefined ) {
19193934 data = jQuery.data( elem );
19203935
19213936 if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
1922 attr = elem.attributes;
1923 for ( l = attr.length; i < l; i++ ) {
1924 name = attr[i].name;
1925
1926 if ( name.indexOf( "data-" ) === 0 ) {
1927 name = jQuery.camelCase( name.substring(5) );
1928
1929 dataAttr( elem, name, data[ name ] );
3937 i = attrs.length;
3938 while ( i-- ) {
3939
3940 // Support: IE11+
3941 // The attrs elements can be null (#14894)
3942 if ( attrs[ i ] ) {
3943 name = attrs[ i ].name;
3944 if ( name.indexOf( "data-" ) === 0 ) {
3945 name = jQuery.camelCase( name.slice(5) );
3946 dataAttr( elem, name, data[ name ] );
3947 }
19303948 }
19313949 }
19323950 jQuery._data( elem, "parsedAttrs", true );
19433961 });
19443962 }
19453963
1946 parts = key.split( ".", 2 );
1947 parts[1] = parts[1] ? "." + parts[1] : "";
1948 part = parts[1] + "!";
1949
1950 return jQuery.access( this, function( value ) {
1951
1952 if ( value === undefined ) {
1953 data = this.triggerHandler( "getData" + part, [ parts[0] ] );
1954
1955 // Try to fetch any internally stored data first
1956 if ( data === undefined && elem ) {
1957 data = jQuery.data( elem, key );
1958 data = dataAttr( elem, key, data );
1959 }
1960
1961 return data === undefined && parts[1] ?
1962 this.data( parts[0] ) :
1963 data;
1964 }
1965
1966 parts[1] = value;
3964 return arguments.length > 1 ?
3965
3966 // Sets one value
19673967 this.each(function() {
1968 var self = jQuery( this );
1969
1970 self.triggerHandler( "setData" + part, parts );
19713968 jQuery.data( this, key, value );
1972 self.triggerHandler( "changeData" + part, parts );
1973 });
1974 }, null, value, arguments.length > 1, null, false );
3969 }) :
3970
3971 // Gets one value
3972 // Try to fetch any internally stored data first
3973 elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
19753974 },
19763975
19773976 removeData: function( key ) {
19813980 }
19823981 });
19833982
1984 function dataAttr( elem, key, data ) {
1985 // If nothing was found internally, try to fetch any
1986 // data from the HTML5 data-* attribute
1987 if ( data === undefined && elem.nodeType === 1 ) {
1988
1989 var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1990
1991 data = elem.getAttribute( name );
1992
1993 if ( typeof data === "string" ) {
1994 try {
1995 data = data === "true" ? true :
1996 data === "false" ? false :
1997 data === "null" ? null :
1998 jQuery.isNumeric( data ) ? +data :
1999 rbrace.test( data ) ? jQuery.parseJSON( data ) :
2000 data;
2001 } catch( e ) {}
2002
2003 // Make sure we set the data so it isn't changed later
2004 jQuery.data( elem, key, data );
2005
2006 } else {
2007 data = undefined;
2008 }
2009 }
2010
2011 return data;
2012 }
2013
2014 // checks a cache object for emptiness
2015 function isEmptyDataObject( obj ) {
2016 for ( var name in obj ) {
2017
2018 // if the public data object is empty, the private is still empty
2019 if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
2020 continue;
2021 }
2022 if ( name !== "toJSON" ) {
2023 return false;
2024 }
2025 }
2026
2027 return true;
2028 }
2029
2030
2031
2032
2033 function handleQueueMarkDefer( elem, type, src ) {
2034 var deferDataKey = type + "defer",
2035 queueDataKey = type + "queue",
2036 markDataKey = type + "mark",
2037 defer = jQuery._data( elem, deferDataKey );
2038 if ( defer &&
2039 ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
2040 ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
2041 // Give room for hard-coded callbacks to fire first
2042 // and eventually mark/queue something else on the element
2043 setTimeout( function() {
2044 if ( !jQuery._data( elem, queueDataKey ) &&
2045 !jQuery._data( elem, markDataKey ) ) {
2046 jQuery.removeData( elem, deferDataKey, true );
2047 defer.fire();
2048 }
2049 }, 0 );
2050 }
2051 }
20523983
20533984 jQuery.extend({
2054
2055 _mark: function( elem, type ) {
2056 if ( elem ) {
2057 type = ( type || "fx" ) + "mark";
2058 jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
2059 }
2060 },
2061
2062 _unmark: function( force, elem, type ) {
2063 if ( force !== true ) {
2064 type = elem;
2065 elem = force;
2066 force = false;
2067 }
2068 if ( elem ) {
2069 type = type || "fx";
2070 var key = type + "mark",
2071 count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2072 if ( count ) {
2073 jQuery._data( elem, key, count );
2074 } else {
2075 jQuery.removeData( elem, key, true );
2076 handleQueueMarkDefer( elem, type, "mark" );
2077 }
2078 }
2079 },
2080
20813985 queue: function( elem, type, data ) {
2082 var q;
3986 var queue;
3987
20833988 if ( elem ) {
20843989 type = ( type || "fx" ) + "queue";
2085 q = jQuery._data( elem, type );
3990 queue = jQuery._data( elem, type );
20863991
20873992 // Speed up dequeue by getting out quickly if this is just a lookup
20883993 if ( data ) {
2089 if ( !q || jQuery.isArray(data) ) {
2090 q = jQuery._data( elem, type, jQuery.makeArray(data) );
3994 if ( !queue || jQuery.isArray(data) ) {
3995 queue = jQuery._data( elem, type, jQuery.makeArray(data) );
20913996 } else {
2092 q.push( data );
2093 }
2094 }
2095 return q || [];
3997 queue.push( data );
3998 }
3999 }
4000 return queue || [];
20964001 }
20974002 },
20984003
21004005 type = type || "fx";
21014006
21024007 var queue = jQuery.queue( elem, type ),
4008 startLength = queue.length,
21034009 fn = queue.shift(),
2104 hooks = {};
4010 hooks = jQuery._queueHooks( elem, type ),
4011 next = function() {
4012 jQuery.dequeue( elem, type );
4013 };
21054014
21064015 // If the fx queue is dequeued, always remove the progress sentinel
21074016 if ( fn === "inprogress" ) {
21084017 fn = queue.shift();
4018 startLength--;
21094019 }
21104020
21114021 if ( fn ) {
4022
21124023 // Add a progress sentinel to prevent the fx queue from being
21134024 // automatically dequeued
21144025 if ( type === "fx" ) {
21154026 queue.unshift( "inprogress" );
21164027 }
21174028
2118 jQuery._data( elem, type + ".run", hooks );
2119 fn.call( elem, function() {
2120 jQuery.dequeue( elem, type );
2121 }, hooks );
2122 }
2123
2124 if ( !queue.length ) {
2125 jQuery.removeData( elem, type + "queue " + type + ".run", true );
2126 handleQueueMarkDefer( elem, type, "queue" );
2127 }
4029 // clear up the last queue stop function
4030 delete hooks.stop;
4031 fn.call( elem, next, hooks );
4032 }
4033
4034 if ( !startLength && hooks ) {
4035 hooks.empty.fire();
4036 }
4037 },
4038
4039 // not intended for public consumption - generates a queueHooks object, or returns the current one
4040 _queueHooks: function( elem, type ) {
4041 var key = type + "queueHooks";
4042 return jQuery._data( elem, key ) || jQuery._data( elem, key, {
4043 empty: jQuery.Callbacks("once memory").add(function() {
4044 jQuery._removeData( elem, type + "queue" );
4045 jQuery._removeData( elem, key );
4046 })
4047 });
21284048 }
21294049 });
21304050
21474067 this.each(function() {
21484068 var queue = jQuery.queue( this, type, data );
21494069
4070 // ensure a hooks for this queue
4071 jQuery._queueHooks( this, type );
4072
21504073 if ( type === "fx" && queue[0] !== "inprogress" ) {
21514074 jQuery.dequeue( this, type );
21524075 }
21574080 jQuery.dequeue( this, type );
21584081 });
21594082 },
2160 // Based off of the plugin by Clint Helfers, with permission.
2161 // http://blindsignals.com/index.php/2009/07/jquery-delay/
2162 delay: function( time, type ) {
2163 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2164 type = type || "fx";
2165
2166 return this.queue( type, function( next, hooks ) {
2167 var timeout = setTimeout( next, time );
2168 hooks.stop = function() {
2169 clearTimeout( timeout );
2170 };
2171 });
2172 },
21734083 clearQueue: function( type ) {
21744084 return this.queue( type || "fx", [] );
21754085 },
21764086 // Get a promise resolved when queues of a certain type
21774087 // are emptied (fx is the type by default)
2178 promise: function( type, object ) {
4088 promise: function( type, obj ) {
4089 var tmp,
4090 count = 1,
4091 defer = jQuery.Deferred(),
4092 elements = this,
4093 i = this.length,
4094 resolve = function() {
4095 if ( !( --count ) ) {
4096 defer.resolveWith( elements, [ elements ] );
4097 }
4098 };
4099
21794100 if ( typeof type !== "string" ) {
2180 object = type;
4101 obj = type;
21814102 type = undefined;
21824103 }
21834104 type = type || "fx";
2184 var defer = jQuery.Deferred(),
2185 elements = this,
2186 i = elements.length,
2187 count = 1,
2188 deferDataKey = type + "defer",
2189 queueDataKey = type + "queue",
2190 markDataKey = type + "mark",
2191 tmp;
2192 function resolve() {
2193 if ( !( --count ) ) {
2194 defer.resolveWith( elements, [ elements ] );
2195 }
2196 }
2197 while( i-- ) {
2198 if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2199 ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2200 jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2201 jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
4105
4106 while ( i-- ) {
4107 tmp = jQuery._data( elements[ i ], type + "queueHooks" );
4108 if ( tmp && tmp.empty ) {
22024109 count++;
2203 tmp.add( resolve );
4110 tmp.empty.add( resolve );
22044111 }
22054112 }
22064113 resolve();
2207 return defer.promise( object );
4114 return defer.promise( obj );
22084115 }
22094116 });
2210
2211
2212
2213
2214 var rclass = /[\n\t\r]/g,
2215 rspace = /\s+/,
2216 rreturn = /\r/g,
2217 rtype = /^(?:button|input)$/i,
2218 rfocusable = /^(?:button|input|object|select|textarea)$/i,
2219 rclickable = /^a(?:rea)?$/i,
2220 rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2221 getSetAttribute = jQuery.support.getSetAttribute,
2222 nodeHook, boolHook, fixSpecified;
2223
2224 jQuery.fn.extend({
2225 attr: function( name, value ) {
2226 return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
2227 },
2228
2229 removeAttr: function( name ) {
2230 return this.each(function() {
2231 jQuery.removeAttr( this, name );
4117 var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
4118
4119 var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4120
4121 var isHidden = function( elem, el ) {
4122 // isHidden might be called from jQuery#filter function;
4123 // in that case, element will be second argument
4124 elem = el || elem;
4125 return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
4126 };
4127
4128
4129
4130 // Multifunctional method to get and set values of a collection
4131 // The value/s can optionally be executed if it's a function
4132 var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4133 var i = 0,
4134 length = elems.length,
4135 bulk = key == null;
4136
4137 // Sets many values
4138 if ( jQuery.type( key ) === "object" ) {
4139 chainable = true;
4140 for ( i in key ) {
4141 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
4142 }
4143
4144 // Sets one value
4145 } else if ( value !== undefined ) {
4146 chainable = true;
4147
4148 if ( !jQuery.isFunction( value ) ) {
4149 raw = true;
4150 }
4151
4152 if ( bulk ) {
4153 // Bulk operations run against the entire set
4154 if ( raw ) {
4155 fn.call( elems, value );
4156 fn = null;
4157
4158 // ...except when executing function values
4159 } else {
4160 bulk = fn;
4161 fn = function( elem, key, value ) {
4162 return bulk.call( jQuery( elem ), value );
4163 };
4164 }
4165 }
4166
4167 if ( fn ) {
4168 for ( ; i < length; i++ ) {
4169 fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
4170 }
4171 }
4172 }
4173
4174 return chainable ?
4175 elems :
4176
4177 // Gets
4178 bulk ?
4179 fn.call( elems ) :
4180 length ? fn( elems[0], key ) : emptyGet;
4181 };
4182 var rcheckableType = (/^(?:checkbox|radio)$/i);
4183
4184
4185
4186 (function() {
4187 // Minified: var a,b,c
4188 var input = document.createElement( "input" ),
4189 div = document.createElement( "div" ),
4190 fragment = document.createDocumentFragment();
4191
4192 // Setup
4193 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4194
4195 // IE strips leading whitespace when .innerHTML is used
4196 support.leadingWhitespace = div.firstChild.nodeType === 3;
4197
4198 // Make sure that tbody elements aren't automatically inserted
4199 // IE will insert them into empty tables
4200 support.tbody = !div.getElementsByTagName( "tbody" ).length;
4201
4202 // Make sure that link elements get serialized correctly by innerHTML
4203 // This requires a wrapper element in IE
4204 support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
4205
4206 // Makes sure cloning an html5 element does not cause problems
4207 // Where outerHTML is undefined, this still works
4208 support.html5Clone =
4209 document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
4210
4211 // Check if a disconnected checkbox will retain its checked
4212 // value of true after appended to the DOM (IE6/7)
4213 input.type = "checkbox";
4214 input.checked = true;
4215 fragment.appendChild( input );
4216 support.appendChecked = input.checked;
4217
4218 // Make sure textarea (and checkbox) defaultValue is properly cloned
4219 // Support: IE6-IE11+
4220 div.innerHTML = "<textarea>x</textarea>";
4221 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4222
4223 // #11217 - WebKit loses check when the name is after the checked attribute
4224 fragment.appendChild( div );
4225 div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
4226
4227 // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4228 // old WebKit doesn't clone checked state correctly in fragments
4229 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4230
4231 // Support: IE<9
4232 // Opera does not clone events (and typeof div.attachEvent === undefined).
4233 // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
4234 support.noCloneEvent = true;
4235 if ( div.attachEvent ) {
4236 div.attachEvent( "onclick", function() {
4237 support.noCloneEvent = false;
22324238 });
2233 },
2234
2235 prop: function( name, value ) {
2236 return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
2237 },
2238
2239 removeProp: function( name ) {
2240 name = jQuery.propFix[ name ] || name;
2241 return this.each(function() {
2242 // try/catch handles cases where IE balks (such as removing a property on window)
2243 try {
2244 this[ name ] = undefined;
2245 delete this[ name ];
2246 } catch( e ) {}
2247 });
2248 },
2249
2250 addClass: function( value ) {
2251 var classNames, i, l, elem,
2252 setClass, c, cl;
2253
2254 if ( jQuery.isFunction( value ) ) {
2255 return this.each(function( j ) {
2256 jQuery( this ).addClass( value.call(this, j, this.className) );
2257 });
2258 }
2259
2260 if ( value && typeof value === "string" ) {
2261 classNames = value.split( rspace );
2262
2263 for ( i = 0, l = this.length; i < l; i++ ) {
2264 elem = this[ i ];
2265
2266 if ( elem.nodeType === 1 ) {
2267 if ( !elem.className && classNames.length === 1 ) {
2268 elem.className = value;
2269
2270 } else {
2271 setClass = " " + elem.className + " ";
2272
2273 for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2274 if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2275 setClass += classNames[ c ] + " ";
2276 }
2277 }
2278 elem.className = jQuery.trim( setClass );
2279 }
2280 }
2281 }
2282 }
2283
2284 return this;
2285 },
2286
2287 removeClass: function( value ) {
2288 var classNames, i, l, elem, className, c, cl;
2289
2290 if ( jQuery.isFunction( value ) ) {
2291 return this.each(function( j ) {
2292 jQuery( this ).removeClass( value.call(this, j, this.className) );
2293 });
2294 }
2295
2296 if ( (value && typeof value === "string") || value === undefined ) {
2297 classNames = ( value || "" ).split( rspace );
2298
2299 for ( i = 0, l = this.length; i < l; i++ ) {
2300 elem = this[ i ];
2301
2302 if ( elem.nodeType === 1 && elem.className ) {
2303 if ( value ) {
2304 className = (" " + elem.className + " ").replace( rclass, " " );
2305 for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2306 className = className.replace(" " + classNames[ c ] + " ", " ");
2307 }
2308 elem.className = jQuery.trim( className );
2309
2310 } else {
2311 elem.className = "";
2312 }
2313 }
2314 }
2315 }
2316
2317 return this;
2318 },
2319
2320 toggleClass: function( value, stateVal ) {
2321 var type = typeof value,
2322 isBool = typeof stateVal === "boolean";
2323
2324 if ( jQuery.isFunction( value ) ) {
2325 return this.each(function( i ) {
2326 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2327 });
2328 }
2329
2330 return this.each(function() {
2331 if ( type === "string" ) {
2332 // toggle individual class names
2333 var className,
2334 i = 0,
2335 self = jQuery( this ),
2336 state = stateVal,
2337 classNames = value.split( rspace );
2338
2339 while ( (className = classNames[ i++ ]) ) {
2340 // check each className given, space seperated list
2341 state = isBool ? state : !self.hasClass( className );
2342 self[ state ? "addClass" : "removeClass" ]( className );
2343 }
2344
2345 } else if ( type === "undefined" || type === "boolean" ) {
2346 if ( this.className ) {
2347 // store className if set
2348 jQuery._data( this, "__className__", this.className );
2349 }
2350
2351 // toggle whole className
2352 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2353 }
2354 });
2355 },
2356
2357 hasClass: function( selector ) {
2358 var className = " " + selector + " ",
2359 i = 0,
2360 l = this.length;
2361 for ( ; i < l; i++ ) {
2362 if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2363 return true;
2364 }
2365 }
2366
2367 return false;
2368 },
2369
2370 val: function( value ) {
2371 var hooks, ret, isFunction,
2372 elem = this[0];
2373
2374 if ( !arguments.length ) {
2375 if ( elem ) {
2376 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
2377
2378 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2379 return ret;
2380 }
2381
2382 ret = elem.value;
2383
2384 return typeof ret === "string" ?
2385 // handle most common string cases
2386 ret.replace(rreturn, "") :
2387 // handle cases where value is null/undef or number
2388 ret == null ? "" : ret;
2389 }
2390
2391 return;
2392 }
2393
2394 isFunction = jQuery.isFunction( value );
2395
2396 return this.each(function( i ) {
2397 var self = jQuery(this), val;
2398
2399 if ( this.nodeType !== 1 ) {
2400 return;
2401 }
2402
2403 if ( isFunction ) {
2404 val = value.call( this, i, self.val() );
2405 } else {
2406 val = value;
2407 }
2408
2409 // Treat null/undefined as ""; convert numbers to string
2410 if ( val == null ) {
2411 val = "";
2412 } else if ( typeof val === "number" ) {
2413 val += "";
2414 } else if ( jQuery.isArray( val ) ) {
2415 val = jQuery.map(val, function ( value ) {
2416 return value == null ? "" : value + "";
2417 });
2418 }
2419
2420 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
2421
2422 // If set returns undefined, fall back to normal setting
2423 if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2424 this.value = val;
2425 }
2426 });
2427 }
2428 });
2429
2430 jQuery.extend({
2431 valHooks: {
2432 option: {
2433 get: function( elem ) {
2434 // attributes.value is undefined in Blackberry 4.7 but
2435 // uses .value. See #6932
2436 var val = elem.attributes.value;
2437 return !val || val.specified ? elem.value : elem.text;
2438 }
2439 },
2440 select: {
2441 get: function( elem ) {
2442 var value, i, max, option,
2443 index = elem.selectedIndex,
2444 values = [],
2445 options = elem.options,
2446 one = elem.type === "select-one";
2447
2448 // Nothing was selected
2449 if ( index < 0 ) {
2450 return null;
2451 }
2452
2453 // Loop through all the selected options
2454 i = one ? index : 0;
2455 max = one ? index + 1 : options.length;
2456 for ( ; i < max; i++ ) {
2457 option = options[ i ];
2458
2459 // Don't return options that are disabled or in a disabled optgroup
2460 if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2461 (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2462
2463 // Get the specific value for the option
2464 value = jQuery( option ).val();
2465
2466 // We don't need an array for one selects
2467 if ( one ) {
2468 return value;
2469 }
2470
2471 // Multi-Selects return an array
2472 values.push( value );
2473 }
2474 }
2475
2476 // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2477 if ( one && !values.length && options.length ) {
2478 return jQuery( options[ index ] ).val();
2479 }
2480
2481 return values;
2482 },
2483
2484 set: function( elem, value ) {
2485 var values = jQuery.makeArray( value );
2486
2487 jQuery(elem).find("option").each(function() {
2488 this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2489 });
2490
2491 if ( !values.length ) {
2492 elem.selectedIndex = -1;
2493 }
2494 return values;
2495 }
2496 }
2497 },
2498
2499 attrFn: {
2500 val: true,
2501 css: true,
2502 html: true,
2503 text: true,
2504 data: true,
2505 width: true,
2506 height: true,
2507 offset: true
2508 },
2509
2510 attr: function( elem, name, value, pass ) {
2511 var ret, hooks, notxml,
2512 nType = elem.nodeType;
2513
2514 // don't get/set attributes on text, comment and attribute nodes
2515 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2516 return;
2517 }
2518
2519 if ( pass && name in jQuery.attrFn ) {
2520 return jQuery( elem )[ name ]( value );
2521 }
2522
2523 // Fallback to prop when attributes are not supported
2524 if ( typeof elem.getAttribute === "undefined" ) {
2525 return jQuery.prop( elem, name, value );
2526 }
2527
2528 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2529
2530 // All attributes are lowercase
2531 // Grab necessary hook if one is defined
2532 if ( notxml ) {
2533 name = name.toLowerCase();
2534 hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2535 }
2536
2537 if ( value !== undefined ) {
2538
2539 if ( value === null ) {
2540 jQuery.removeAttr( elem, name );
2541 return;
2542
2543 } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2544 return ret;
2545
2546 } else {
2547 elem.setAttribute( name, "" + value );
2548 return value;
2549 }
2550
2551 } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2552 return ret;
2553
2554 } else {
2555
2556 ret = elem.getAttribute( name );
2557
2558 // Non-existent attributes return null, we normalize to undefined
2559 return ret === null ?
2560 undefined :
2561 ret;
2562 }
2563 },
2564
2565 removeAttr: function( elem, value ) {
2566 var propName, attrNames, name, l, isBool,
2567 i = 0;
2568
2569 if ( value && elem.nodeType === 1 ) {
2570 attrNames = value.toLowerCase().split( rspace );
2571 l = attrNames.length;
2572
2573 for ( ; i < l; i++ ) {
2574 name = attrNames[ i ];
2575
2576 if ( name ) {
2577 propName = jQuery.propFix[ name ] || name;
2578 isBool = rboolean.test( name );
2579
2580 // See #9699 for explanation of this approach (setting first, then removal)
2581 // Do not do this for boolean attributes (see #10870)
2582 if ( !isBool ) {
2583 jQuery.attr( elem, name, "" );
2584 }
2585 elem.removeAttribute( getSetAttribute ? name : propName );
2586
2587 // Set corresponding property to false for boolean attributes
2588 if ( isBool && propName in elem ) {
2589 elem[ propName ] = false;
2590 }
2591 }
2592 }
2593 }
2594 },
2595
2596 attrHooks: {
2597 type: {
2598 set: function( elem, value ) {
2599 // We can't allow the type property to be changed (since it causes problems in IE)
2600 if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2601 jQuery.error( "type property can't be changed" );
2602 } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2603 // Setting the type on a radio button after the value resets the value in IE6-9
2604 // Reset value to it's default in case type is set after value
2605 // This is for element creation
2606 var val = elem.value;
2607 elem.setAttribute( "type", value );
2608 if ( val ) {
2609 elem.value = val;
2610 }
2611 return value;
2612 }
2613 }
2614 },
2615 // Use the value property for back compat
2616 // Use the nodeHook for button elements in IE6/7 (#1954)
2617 value: {
2618 get: function( elem, name ) {
2619 if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2620 return nodeHook.get( elem, name );
2621 }
2622 return name in elem ?
2623 elem.value :
2624 null;
2625 },
2626 set: function( elem, value, name ) {
2627 if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2628 return nodeHook.set( elem, value, name );
2629 }
2630 // Does not return so that setAttribute is also used
2631 elem.value = value;
2632 }
2633 }
2634 },
2635
2636 propFix: {
2637 tabindex: "tabIndex",
2638 readonly: "readOnly",
2639 "for": "htmlFor",
2640 "class": "className",
2641 maxlength: "maxLength",
2642 cellspacing: "cellSpacing",
2643 cellpadding: "cellPadding",
2644 rowspan: "rowSpan",
2645 colspan: "colSpan",
2646 usemap: "useMap",
2647 frameborder: "frameBorder",
2648 contenteditable: "contentEditable"
2649 },
2650
2651 prop: function( elem, name, value ) {
2652 var ret, hooks, notxml,
2653 nType = elem.nodeType;
2654
2655 // don't get/set properties on text, comment and attribute nodes
2656 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2657 return;
2658 }
2659
2660 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2661
2662 if ( notxml ) {
2663 // Fix name and attach hooks
2664 name = jQuery.propFix[ name ] || name;
2665 hooks = jQuery.propHooks[ name ];
2666 }
2667
2668 if ( value !== undefined ) {
2669 if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2670 return ret;
2671
2672 } else {
2673 return ( elem[ name ] = value );
2674 }
2675
2676 } else {
2677 if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2678 return ret;
2679
2680 } else {
2681 return elem[ name ];
2682 }
2683 }
2684 },
2685
2686 propHooks: {
2687 tabIndex: {
2688 get: function( elem ) {
2689 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2690 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2691 var attributeNode = elem.getAttributeNode("tabindex");
2692
2693 return attributeNode && attributeNode.specified ?
2694 parseInt( attributeNode.value, 10 ) :
2695 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2696 0 :
2697 undefined;
2698 }
2699 }
2700 }
2701 });
2702
2703 // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2704 jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2705
2706 // Hook for boolean attributes
2707 boolHook = {
2708 get: function( elem, name ) {
2709 // Align boolean attributes with corresponding properties
2710 // Fall back to attribute presence where some booleans are not supported
2711 var attrNode,
2712 property = jQuery.prop( elem, name );
2713 return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2714 name.toLowerCase() :
2715 undefined;
2716 },
2717 set: function( elem, value, name ) {
2718 var propName;
2719 if ( value === false ) {
2720 // Remove boolean attributes when set to false
2721 jQuery.removeAttr( elem, name );
2722 } else {
2723 // value is true since we know at this point it's type boolean and not false
2724 // Set boolean attributes to the same name and set the DOM property
2725 propName = jQuery.propFix[ name ] || name;
2726 if ( propName in elem ) {
2727 // Only set the IDL specifically if it already exists on the element
2728 elem[ propName ] = true;
2729 }
2730
2731 elem.setAttribute( name, name.toLowerCase() );
2732 }
2733 return name;
2734 }
2735 };
2736
2737 // IE6/7 do not support getting/setting some attributes with get/setAttribute
2738 if ( !getSetAttribute ) {
2739
2740 fixSpecified = {
2741 name: true,
2742 id: true,
2743 coords: true
2744 };
2745
2746 // Use this for any attribute in IE6/7
2747 // This fixes almost every IE6/7 issue
2748 nodeHook = jQuery.valHooks.button = {
2749 get: function( elem, name ) {
2750 var ret;
2751 ret = elem.getAttributeNode( name );
2752 return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2753 ret.nodeValue :
2754 undefined;
2755 },
2756 set: function( elem, value, name ) {
2757 // Set the existing or create a new attribute node
2758 var ret = elem.getAttributeNode( name );
2759 if ( !ret ) {
2760 ret = document.createAttribute( name );
2761 elem.setAttributeNode( ret );
2762 }
2763 return ( ret.nodeValue = value + "" );
2764 }
2765 };
2766
2767 // Apply the nodeHook to tabindex
2768 jQuery.attrHooks.tabindex.set = nodeHook.set;
2769
2770 // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2771 // This is for removals
2772 jQuery.each([ "width", "height" ], function( i, name ) {
2773 jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2774 set: function( elem, value ) {
2775 if ( value === "" ) {
2776 elem.setAttribute( name, "auto" );
2777 return value;
2778 }
2779 }
2780 });
2781 });
2782
2783 // Set contenteditable to false on removals(#10429)
2784 // Setting to empty string throws an error as an invalid value
2785 jQuery.attrHooks.contenteditable = {
2786 get: nodeHook.get,
2787 set: function( elem, value, name ) {
2788 if ( value === "" ) {
2789 value = "false";
2790 }
2791 nodeHook.set( elem, value, name );
2792 }
2793 };
4239
4240 div.cloneNode( true ).click();
4241 }
4242
4243 // Execute the test only if not already executed in another module.
4244 if (support.deleteExpando == null) {
4245 // Support: IE<9
4246 support.deleteExpando = true;
4247 try {
4248 delete div.test;
4249 } catch( e ) {
4250 support.deleteExpando = false;
4251 }
4252 }
4253 })();
4254
4255
4256 (function() {
4257 var i, eventName,
4258 div = document.createElement( "div" );
4259
4260 // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
4261 for ( i in { submit: true, change: true, focusin: true }) {
4262 eventName = "on" + i;
4263
4264 if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
4265 // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4266 div.setAttribute( eventName, "t" );
4267 support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
4268 }
4269 }
4270
4271 // Null elements to avoid leaks in IE.
4272 div = null;
4273 })();
4274
4275
4276 var rformElems = /^(?:input|select|textarea)$/i,
4277 rkeyEvent = /^key/,
4278 rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
4279 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4280 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4281
4282 function returnTrue() {
4283 return true;
27944284 }
27954285
2796
2797 // Some attributes require a special call on IE
2798 if ( !jQuery.support.hrefNormalized ) {
2799 jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2800 jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2801 get: function( elem ) {
2802 var ret = elem.getAttribute( name, 2 );
2803 return ret === null ? undefined : ret;
2804 }
2805 });
2806 });
4286 function returnFalse() {
4287 return false;
28074288 }
28084289
2809 if ( !jQuery.support.style ) {
2810 jQuery.attrHooks.style = {
2811 get: function( elem ) {
2812 // Return undefined in the case of empty string
2813 // Normalize to lowercase since IE uppercases css property names
2814 return elem.style.cssText.toLowerCase() || undefined;
2815 },
2816 set: function( elem, value ) {
2817 return ( elem.style.cssText = "" + value );
2818 }
2819 };
4290 function safeActiveElement() {
4291 try {
4292 return document.activeElement;
4293 } catch ( err ) { }
28204294 }
2821
2822 // Safari mis-reports the default selected property of an option
2823 // Accessing the parent's selectedIndex property fixes it
2824 if ( !jQuery.support.optSelected ) {
2825 jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2826 get: function( elem ) {
2827 var parent = elem.parentNode;
2828
2829 if ( parent ) {
2830 parent.selectedIndex;
2831
2832 // Make sure that it also works with optgroups, see #5701
2833 if ( parent.parentNode ) {
2834 parent.parentNode.selectedIndex;
2835 }
2836 }
2837 return null;
2838 }
2839 });
2840 }
2841
2842 // IE6/7 call enctype encoding
2843 if ( !jQuery.support.enctype ) {
2844 jQuery.propFix.enctype = "encoding";
2845 }
2846
2847 // Radios and checkboxes getter/setter
2848 if ( !jQuery.support.checkOn ) {
2849 jQuery.each([ "radio", "checkbox" ], function() {
2850 jQuery.valHooks[ this ] = {
2851 get: function( elem ) {
2852 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2853 return elem.getAttribute("value") === null ? "on" : elem.value;
2854 }
2855 };
2856 });
2857 }
2858 jQuery.each([ "radio", "checkbox" ], function() {
2859 jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2860 set: function( elem, value ) {
2861 if ( jQuery.isArray( value ) ) {
2862 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2863 }
2864 }
2865 });
2866 });
2867
2868
2869
2870
2871 var rformElems = /^(?:textarea|input|select)$/i,
2872 rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2873 rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
2874 rkeyEvent = /^key/,
2875 rmouseEvent = /^(?:mouse|contextmenu)|click/,
2876 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2877 rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2878 quickParse = function( selector ) {
2879 var quick = rquickIs.exec( selector );
2880 if ( quick ) {
2881 // 0 1 2 3
2882 // [ _, tag, id, class ]
2883 quick[1] = ( quick[1] || "" ).toLowerCase();
2884 quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2885 }
2886 return quick;
2887 },
2888 quickIs = function( elem, m ) {
2889 var attrs = elem.attributes || {};
2890 return (
2891 (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2892 (!m[2] || (attrs.id || {}).value === m[2]) &&
2893 (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
2894 );
2895 },
2896 hoverHack = function( events ) {
2897 return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2898 };
28994295
29004296 /*
29014297 * Helper functions for managing events -- not part of the public interface.
29034299 */
29044300 jQuery.event = {
29054301
4302 global: {},
4303
29064304 add: function( elem, types, handler, data, selector ) {
2907
2908 var elemData, eventHandle, events,
2909 t, tns, type, namespaces, handleObj,
2910 handleObjIn, quick, handlers, special;
2911
2912 // Don't attach events to noData or text/comment nodes (allow plain objects tho)
2913 if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
4305 var tmp, events, t, handleObjIn,
4306 special, eventHandle, handleObj,
4307 handlers, type, namespaces, origType,
4308 elemData = jQuery._data( elem );
4309
4310 // Don't attach events to noData or text/comment nodes (but allow plain objects)
4311 if ( !elemData ) {
29144312 return;
29154313 }
29164314
29274325 }
29284326
29294327 // Init the element's event structure and main handler, if this is the first
2930 events = elemData.events;
2931 if ( !events ) {
2932 elemData.events = events = {};
2933 }
2934 eventHandle = elemData.handle;
2935 if ( !eventHandle ) {
2936 elemData.handle = eventHandle = function( e ) {
4328 if ( !(events = elemData.events) ) {
4329 events = elemData.events = {};
4330 }
4331 if ( !(eventHandle = elemData.handle) ) {
4332 eventHandle = elemData.handle = function( e ) {
29374333 // Discard the second event of a jQuery.event.trigger() and
29384334 // when an event is called after a page has unloaded
2939 return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
4335 return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
29404336 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
29414337 undefined;
29424338 };
29454341 }
29464342
29474343 // Handle multiple events separated by a space
2948 // jQuery(...).bind("mouseover mouseout", fn);
2949 types = jQuery.trim( hoverHack(types) ).split( " " );
2950 for ( t = 0; t < types.length; t++ ) {
2951
2952 tns = rtypenamespace.exec( types[t] ) || [];
2953 type = tns[1];
2954 namespaces = ( tns[2] || "" ).split( "." ).sort();
4344 types = ( types || "" ).match( rnotwhite ) || [ "" ];
4345 t = types.length;
4346 while ( t-- ) {
4347 tmp = rtypenamespace.exec( types[t] ) || [];
4348 type = origType = tmp[1];
4349 namespaces = ( tmp[2] || "" ).split( "." ).sort();
4350
4351 // There *must* be a type, no attaching namespace-only handlers
4352 if ( !type ) {
4353 continue;
4354 }
29554355
29564356 // If event changes its type, use the special event handlers for the changed type
29574357 special = jQuery.event.special[ type ] || {};
29654365 // handleObj is passed to all event handlers
29664366 handleObj = jQuery.extend({
29674367 type: type,
2968 origType: tns[1],
4368 origType: origType,
29694369 data: data,
29704370 handler: handler,
29714371 guid: handler.guid,
29724372 selector: selector,
2973 quick: selector && quickParse( selector ),
4373 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
29744374 namespace: namespaces.join(".")
29754375 }, handleObjIn );
29764376
29774377 // Init the event handler queue if we're the first
2978 handlers = events[ type ];
2979 if ( !handlers ) {
4378 if ( !(handlers = events[ type ]) ) {
29804379 handlers = events[ type ] = [];
29814380 handlers.delegateCount = 0;
29824381
30154414 elem = null;
30164415 },
30174416
3018 global: {},
3019
30204417 // Detach an event or set of events from an element
30214418 remove: function( elem, types, handler, selector, mappedTypes ) {
3022
3023 var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
3024 t, tns, type, origType, namespaces, origCount,
3025 j, events, special, handle, eventType, handleObj;
4419 var j, handleObj, tmp,
4420 origCount, t, events,
4421 special, handlers, type,
4422 namespaces, origType,
4423 elemData = jQuery.hasData( elem ) && jQuery._data( elem );
30264424
30274425 if ( !elemData || !(events = elemData.events) ) {
30284426 return;
30294427 }
30304428
30314429 // Once for each type.namespace in types; type may be omitted
3032 types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
3033 for ( t = 0; t < types.length; t++ ) {
3034 tns = rtypenamespace.exec( types[t] ) || [];
3035 type = origType = tns[1];
3036 namespaces = tns[2];
4430 types = ( types || "" ).match( rnotwhite ) || [ "" ];
4431 t = types.length;
4432 while ( t-- ) {
4433 tmp = rtypenamespace.exec( types[t] ) || [];
4434 type = origType = tmp[1];
4435 namespaces = ( tmp[2] || "" ).split( "." ).sort();
30374436
30384437 // Unbind all events (on this namespace, if provided) for the element
30394438 if ( !type ) {
30444443 }
30454444
30464445 special = jQuery.event.special[ type ] || {};
3047 type = ( selector? special.delegateType : special.bindType ) || type;
3048 eventType = events[ type ] || [];
3049 origCount = eventType.length;
3050 namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
4446 type = ( selector ? special.delegateType : special.bindType ) || type;
4447 handlers = events[ type ] || [];
4448 tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
30514449
30524450 // Remove matching events
3053 for ( j = 0; j < eventType.length; j++ ) {
3054 handleObj = eventType[ j ];
4451 origCount = j = handlers.length;
4452 while ( j-- ) {
4453 handleObj = handlers[ j ];
30554454
30564455 if ( ( mappedTypes || origType === handleObj.origType ) &&
3057 ( !handler || handler.guid === handleObj.guid ) &&
3058 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
3059 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
3060 eventType.splice( j--, 1 );
4456 ( !handler || handler.guid === handleObj.guid ) &&
4457 ( !tmp || tmp.test( handleObj.namespace ) ) &&
4458 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4459 handlers.splice( j, 1 );
30614460
30624461 if ( handleObj.selector ) {
3063 eventType.delegateCount--;
4462 handlers.delegateCount--;
30644463 }
30654464 if ( special.remove ) {
30664465 special.remove.call( elem, handleObj );
30704469
30714470 // Remove generic event handler if we removed something and no more handlers exist
30724471 // (avoids potential for endless recursion during removal of special event handlers)
3073 if ( eventType.length === 0 && origCount !== eventType.length ) {
3074 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
4472 if ( origCount && !handlers.length ) {
4473 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
30754474 jQuery.removeEvent( elem, type, elemData.handle );
30764475 }
30774476
30814480
30824481 // Remove the expando if it's no longer used
30834482 if ( jQuery.isEmptyObject( events ) ) {
3084 handle = elemData.handle;
3085 if ( handle ) {
3086 handle.elem = null;
3087 }
4483 delete elemData.handle;
30884484
30894485 // removeData also checks for emptiness and clears the expando if empty
30904486 // so use it instead of delete
3091 jQuery.removeData( elem, [ "events", "handle" ], true );
3092 }
3093 },
3094
3095 // Events that are safe to short-circuit if no handlers are attached.
3096 // Native DOM events should not be added, they may have inline handlers.
3097 customEvent: {
3098 "getData": true,
3099 "setData": true,
3100 "changeData": true
4487 jQuery._removeData( elem, "events" );
4488 }
31014489 },
31024490
31034491 trigger: function( event, data, elem, onlyHandlers ) {
4492 var handle, ontype, cur,
4493 bubbleType, special, tmp, i,
4494 eventPath = [ elem || document ],
4495 type = hasOwn.call( event, "type" ) ? event.type : event,
4496 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4497
4498 cur = tmp = elem = elem || document;
4499
31044500 // Don't do events on text and comment nodes
3105 if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
4501 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
31064502 return;
31074503 }
3108
3109 // Event object or event type
3110 var type = event.type || event,
3111 namespaces = [],
3112 cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
31134504
31144505 // focus/blur morphs to focusin/out; ensure we're not firing them right now
31154506 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
31164507 return;
31174508 }
31184509
3119 if ( type.indexOf( "!" ) >= 0 ) {
3120 // Exclusive events trigger only for the exact event (no namespaces)
3121 type = type.slice(0, -1);
3122 exclusive = true;
3123 }
3124
3125 if ( type.indexOf( "." ) >= 0 ) {
4510 if ( type.indexOf(".") >= 0 ) {
31264511 // Namespaced trigger; create a regexp to match event type in handle()
31274512 namespaces = type.split(".");
31284513 type = namespaces.shift();
31294514 namespaces.sort();
31304515 }
3131
3132 if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3133 // No jQuery handlers for this event type, and it can't have inline handlers
3134 return;
3135 }
3136
3137 // Caller can pass in an Event, Object, or just an event type string
3138 event = typeof event === "object" ?
3139 // jQuery.Event object
3140 event[ jQuery.expando ] ? event :
3141 // Object literal
3142 new jQuery.Event( type, event ) :
3143 // Just the event type (string)
3144 new jQuery.Event( type );
3145
3146 event.type = type;
3147 event.isTrigger = true;
3148 event.exclusive = exclusive;
3149 event.namespace = namespaces.join( "." );
3150 event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3151 ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3152
3153 // Handle a global trigger
3154 if ( !elem ) {
3155
3156 // TODO: Stop taunting the data cache; remove global events and always attach to document
3157 cache = jQuery.cache;
3158 for ( i in cache ) {
3159 if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3160 jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3161 }
3162 }
3163 return;
3164 }
4516 ontype = type.indexOf(":") < 0 && "on" + type;
4517
4518 // Caller can pass in a jQuery.Event object, Object, or just an event type string
4519 event = event[ jQuery.expando ] ?
4520 event :
4521 new jQuery.Event( type, typeof event === "object" && event );
4522
4523 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4524 event.isTrigger = onlyHandlers ? 2 : 3;
4525 event.namespace = namespaces.join(".");
4526 event.namespace_re = event.namespace ?
4527 new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4528 null;
31654529
31664530 // Clean up the event in case it is being reused
31674531 event.result = undefined;
31704534 }
31714535
31724536 // Clone any incoming data and prepend the event, creating the handler arg list
3173 data = data != null ? jQuery.makeArray( data ) : [];
3174 data.unshift( event );
4537 data = data == null ?
4538 [ event ] :
4539 jQuery.makeArray( data, [ event ] );
31754540
31764541 // Allow special events to draw outside the lines
31774542 special = jQuery.event.special[ type ] || {};
3178 if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
4543 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
31794544 return;
31804545 }
31814546
31824547 // Determine event propagation path in advance, per W3C events spec (#9951)
31834548 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3184 eventPath = [[ elem, special.bindType || type ]];
31854549 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
31864550
31874551 bubbleType = special.delegateType || type;
3188 cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3189 old = null;
4552 if ( !rfocusMorph.test( bubbleType + type ) ) {
4553 cur = cur.parentNode;
4554 }
31904555 for ( ; cur; cur = cur.parentNode ) {
3191 eventPath.push([ cur, bubbleType ]);
3192 old = cur;
4556 eventPath.push( cur );
4557 tmp = cur;
31934558 }
31944559
31954560 // Only add window if we got to document (e.g., not plain obj or detached DOM)
3196 if ( old && old === elem.ownerDocument ) {
3197 eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
4561 if ( tmp === (elem.ownerDocument || document) ) {
4562 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
31984563 }
31994564 }
32004565
32014566 // Fire handlers on the event path
3202 for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
3203
3204 cur = eventPath[i][0];
3205 event.type = eventPath[i][1];
3206
4567 i = 0;
4568 while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4569
4570 event.type = i > 1 ?
4571 bubbleType :
4572 special.bindType || type;
4573
4574 // jQuery handler
32074575 handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
32084576 if ( handle ) {
32094577 handle.apply( cur, data );
32104578 }
3211 // Note that this is a bare JS function and not a jQuery handler
4579
4580 // Native handler
32124581 handle = ontype && cur[ ontype ];
3213 if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3214 event.preventDefault();
4582 if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
4583 event.result = handle.apply( cur, data );
4584 if ( event.result === false ) {
4585 event.preventDefault();
4586 }
32154587 }
32164588 }
32174589 event.type = type;
32194591 // If nobody prevented the default action, do it now
32204592 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
32214593
3222 if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3223 !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
4594 if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
4595 jQuery.acceptData( elem ) ) {
32244596
32254597 // Call a native DOM method on the target with the same name name as the event.
32264598 // Can't use an .isFunction() check here because IE6/7 fails that test.
32274599 // Don't do default actions on window, that's where global variables be (#6170)
3228 // IE<9 dies on focus/blur to hidden element (#1486)
3229 if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
4600 if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
32304601
32314602 // Don't re-trigger an onFOO event when we call its FOO() method
3232 old = elem[ ontype ];
3233
3234 if ( old ) {
4603 tmp = elem[ ontype ];
4604
4605 if ( tmp ) {
32354606 elem[ ontype ] = null;
32364607 }
32374608
32384609 // Prevent re-triggering of the same event, since we already bubbled it above
32394610 jQuery.event.triggered = type;
3240 elem[ type ]();
4611 try {
4612 elem[ type ]();
4613 } catch ( e ) {
4614 // IE<9 dies on focus/blur to hidden element (#1486,#12518)
4615 // only reproducible on winXP IE8 native, not IE9 in IE8 mode
4616 }
32414617 jQuery.event.triggered = undefined;
32424618
3243 if ( old ) {
3244 elem[ ontype ] = old;
4619 if ( tmp ) {
4620 elem[ ontype ] = tmp;
32454621 }
32464622 }
32474623 }
32534629 dispatch: function( event ) {
32544630
32554631 // Make a writable jQuery.Event from the native event object
3256 event = jQuery.event.fix( event || window.event );
3257
3258 var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3259 delegateCount = handlers.delegateCount,
3260 args = [].slice.call( arguments, 0 ),
3261 run_all = !event.exclusive && !event.namespace,
3262 special = jQuery.event.special[ event.type ] || {},
4632 event = jQuery.event.fix( event );
4633
4634 var i, ret, handleObj, matched, j,
32634635 handlerQueue = [],
3264 i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
4636 args = slice.call( arguments ),
4637 handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
4638 special = jQuery.event.special[ event.type ] || {};
32654639
32664640 // Use the fix-ed jQuery.Event rather than the (read-only) native event
32674641 args[0] = event;
32724646 return;
32734647 }
32744648
3275 // Determine handlers that should run if there are delegated events
4649 // Determine handlers
4650 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
4651
4652 // Run delegates first; they may want to stop propagation beneath us
4653 i = 0;
4654 while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
4655 event.currentTarget = matched.elem;
4656
4657 j = 0;
4658 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
4659
4660 // Triggered event must either 1) have no namespace, or
4661 // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4662 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
4663
4664 event.handleObj = handleObj;
4665 event.data = handleObj.data;
4666
4667 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4668 .apply( matched.elem, args );
4669
4670 if ( ret !== undefined ) {
4671 if ( (event.result = ret) === false ) {
4672 event.preventDefault();
4673 event.stopPropagation();
4674 }
4675 }
4676 }
4677 }
4678 }
4679
4680 // Call the postDispatch hook for the mapped type
4681 if ( special.postDispatch ) {
4682 special.postDispatch.call( this, event );
4683 }
4684
4685 return event.result;
4686 },
4687
4688 handlers: function( event, handlers ) {
4689 var sel, handleObj, matches, i,
4690 handlerQueue = [],
4691 delegateCount = handlers.delegateCount,
4692 cur = event.target;
4693
4694 // Find delegate handlers
4695 // Black-hole SVG <use> instance trees (#13180)
32764696 // Avoid non-left-click bubbling in Firefox (#3861)
3277 if ( delegateCount && !(event.button && event.type === "click") ) {
3278
3279 // Pregenerate a single jQuery object for reuse with .is()
3280 jqcur = jQuery(this);
3281 jqcur.context = this.ownerDocument || this;
3282
3283 for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3284
3285 // Don't process events on disabled elements (#6911, #8165)
3286 if ( cur.disabled !== true ) {
3287 selMatch = {};
4697 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
4698
4699 /* jshint eqeqeq: false */
4700 for ( ; cur != this; cur = cur.parentNode || this ) {
4701 /* jshint eqeqeq: true */
4702
4703 // Don't check non-elements (#13208)
4704 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
4705 if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
32884706 matches = [];
3289 jqcur[0] = cur;
32904707 for ( i = 0; i < delegateCount; i++ ) {
32914708 handleObj = handlers[ i ];
3292 sel = handleObj.selector;
3293
3294 if ( selMatch[ sel ] === undefined ) {
3295 selMatch[ sel ] = (
3296 handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
3297 );
4709
4710 // Don't conflict with Object.prototype properties (#13203)
4711 sel = handleObj.selector + " ";
4712
4713 if ( matches[ sel ] === undefined ) {
4714 matches[ sel ] = handleObj.needsContext ?
4715 jQuery( sel, this ).index( cur ) >= 0 :
4716 jQuery.find( sel, this, null, [ cur ] ).length;
32984717 }
3299 if ( selMatch[ sel ] ) {
4718 if ( matches[ sel ] ) {
33004719 matches.push( handleObj );
33014720 }
33024721 }
33034722 if ( matches.length ) {
3304 handlerQueue.push({ elem: cur, matches: matches });
4723 handlerQueue.push({ elem: cur, handlers: matches });
33054724 }
33064725 }
33074726 }
33084727 }
33094728
33104729 // Add the remaining (directly-bound) handlers
3311 if ( handlers.length > delegateCount ) {
3312 handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3313 }
3314
3315 // Run delegates first; they may want to stop propagation beneath us
3316 for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3317 matched = handlerQueue[ i ];
3318 event.currentTarget = matched.elem;
3319
3320 for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3321 handleObj = matched.matches[ j ];
3322
3323 // Triggered event must either 1) be non-exclusive and have no namespace, or
3324 // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3325 if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3326
3327 event.data = handleObj.data;
3328 event.handleObj = handleObj;
3329
3330 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3331 .apply( matched.elem, args );
3332
3333 if ( ret !== undefined ) {
3334 event.result = ret;
3335 if ( ret === false ) {
3336 event.preventDefault();
3337 event.stopPropagation();
3338 }
3339 }
3340 }
3341 }
3342 }
3343
3344 // Call the postDispatch hook for the mapped type
3345 if ( special.postDispatch ) {
3346 special.postDispatch.call( this, event );
3347 }
3348
3349 return event.result;
4730 if ( delegateCount < handlers.length ) {
4731 handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
4732 }
4733
4734 return handlerQueue;
4735 },
4736
4737 fix: function( event ) {
4738 if ( event[ jQuery.expando ] ) {
4739 return event;
4740 }
4741
4742 // Create a writable copy of the event object and normalize some properties
4743 var i, prop, copy,
4744 type = event.type,
4745 originalEvent = event,
4746 fixHook = this.fixHooks[ type ];
4747
4748 if ( !fixHook ) {
4749 this.fixHooks[ type ] = fixHook =
4750 rmouseEvent.test( type ) ? this.mouseHooks :
4751 rkeyEvent.test( type ) ? this.keyHooks :
4752 {};
4753 }
4754 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4755
4756 event = new jQuery.Event( originalEvent );
4757
4758 i = copy.length;
4759 while ( i-- ) {
4760 prop = copy[ i ];
4761 event[ prop ] = originalEvent[ prop ];
4762 }
4763
4764 // Support: IE<9
4765 // Fix target property (#1925)
4766 if ( !event.target ) {
4767 event.target = originalEvent.srcElement || document;
4768 }
4769
4770 // Support: Chrome 23+, Safari?
4771 // Target should not be a text node (#504, #13143)
4772 if ( event.target.nodeType === 3 ) {
4773 event.target = event.target.parentNode;
4774 }
4775
4776 // Support: IE<9
4777 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
4778 event.metaKey = !!event.metaKey;
4779
4780 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
33504781 },
33514782
33524783 // Includes some event props shared by KeyEvent and MouseEvent
3353 // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3354 props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4784 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
33554785
33564786 fixHooks: {},
33574787
33714801 mouseHooks: {
33724802 props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
33734803 filter: function( event, original ) {
3374 var eventDoc, doc, body,
4804 var body, eventDoc, doc,
33754805 button = original.button,
33764806 fromElement = original.fromElement;
33774807
34004830 }
34014831 },
34024832
3403 fix: function( event ) {
3404 if ( event[ jQuery.expando ] ) {
3405 return event;
3406 }
3407
3408 // Create a writable copy of the event object and normalize some properties
3409 var i, prop,
3410 originalEvent = event,
3411 fixHook = jQuery.event.fixHooks[ event.type ] || {},
3412 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3413
3414 event = jQuery.Event( originalEvent );
3415
3416 for ( i = copy.length; i; ) {
3417 prop = copy[ --i ];
3418 event[ prop ] = originalEvent[ prop ];
3419 }
3420
3421 // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3422 if ( !event.target ) {
3423 event.target = originalEvent.srcElement || document;
3424 }
3425
3426 // Target should not be a text node (#504, Safari)
3427 if ( event.target.nodeType === 3 ) {
3428 event.target = event.target.parentNode;
3429 }
3430
3431 // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3432 if ( event.metaKey === undefined ) {
3433 event.metaKey = event.ctrlKey;
3434 }
3435
3436 return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3437 },
3438
34394833 special: {
3440 ready: {
3441 // Make sure the ready event is setup
3442 setup: jQuery.bindReady
3443 },
3444
34454834 load: {
34464835 // Prevent triggered image.load events from bubbling to window.load
34474836 noBubble: true
34484837 },
3449
34504838 focus: {
4839 // Fire native event if possible so blur/focus sequence is correct
4840 trigger: function() {
4841 if ( this !== safeActiveElement() && this.focus ) {
4842 try {
4843 this.focus();
4844 return false;
4845 } catch ( e ) {
4846 // Support: IE<9
4847 // If we error on focus to hidden element (#1486, #12518),
4848 // let .trigger() run the handlers
4849 }
4850 }
4851 },
34514852 delegateType: "focusin"
34524853 },
34534854 blur: {
4855 trigger: function() {
4856 if ( this === safeActiveElement() && this.blur ) {
4857 this.blur();
4858 return false;
4859 }
4860 },
34544861 delegateType: "focusout"
34554862 },
4863 click: {
4864 // For checkbox, fire native event so checked state will be right
4865 trigger: function() {
4866 if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
4867 this.click();
4868 return false;
4869 }
4870 },
4871
4872 // For cross-browser consistency, don't fire native .click() on links
4873 _default: function( event ) {
4874 return jQuery.nodeName( event.target, "a" );
4875 }
4876 },
34564877
34574878 beforeunload: {
3458 setup: function( data, namespaces, eventHandle ) {
3459 // We only want to do this special case on windows
3460 if ( jQuery.isWindow( this ) ) {
3461 this.onbeforeunload = eventHandle;
3462 }
3463 },
3464
3465 teardown: function( namespaces, eventHandle ) {
3466 if ( this.onbeforeunload === eventHandle ) {
3467 this.onbeforeunload = null;
4879 postDispatch: function( event ) {
4880
4881 // Support: Firefox 20+
4882 // Firefox doesn't alert if the returnValue field is not set.
4883 if ( event.result !== undefined && event.originalEvent ) {
4884 event.originalEvent.returnValue = event.result;
34684885 }
34694886 }
34704887 }
34774894 var e = jQuery.extend(
34784895 new jQuery.Event(),
34794896 event,
3480 { type: type,
4897 {
4898 type: type,
34814899 isSimulated: true,
34824900 originalEvent: {}
34834901 }
34934911 }
34944912 };
34954913
3496 // Some plugins are using, but it's undocumented/deprecated and will be removed.
3497 // The 1.7 special event interface should provide all the hooks needed now.
3498 jQuery.event.handle = jQuery.event.dispatch;
3499
35004914 jQuery.removeEvent = document.removeEventListener ?
35014915 function( elem, type, handle ) {
35024916 if ( elem.removeEventListener ) {
35044918 }
35054919 } :
35064920 function( elem, type, handle ) {
4921 var name = "on" + type;
4922
35074923 if ( elem.detachEvent ) {
3508 elem.detachEvent( "on" + type, handle );
4924
4925 // #8545, #7054, preventing memory leaks for custom events in IE6-8
4926 // detachEvent needed property on element, by name of that event, to properly expose it to GC
4927 if ( typeof elem[ name ] === strundefined ) {
4928 elem[ name ] = null;
4929 }
4930
4931 elem.detachEvent( name, handle );
35094932 }
35104933 };
35114934
35224945
35234946 // Events bubbling up the document may have been marked as prevented
35244947 // by a handler lower down the tree; reflect the correct value.
3525 this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3526 src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
4948 this.isDefaultPrevented = src.defaultPrevented ||
4949 src.defaultPrevented === undefined &&
4950 // Support: IE < 9, Android < 4.0
4951 src.returnValue === false ?
4952 returnTrue :
4953 returnFalse;
35274954
35284955 // Event type
35294956 } else {
35424969 this[ jQuery.expando ] = true;
35434970 };
35444971
3545 function returnFalse() {
3546 return false;
3547 }
3548 function returnTrue() {
3549 return true;
3550 }
3551
35524972 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
35534973 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
35544974 jQuery.Event.prototype = {
4975 isDefaultPrevented: returnFalse,
4976 isPropagationStopped: returnFalse,
4977 isImmediatePropagationStopped: returnFalse,
4978
35554979 preventDefault: function() {
4980 var e = this.originalEvent;
4981
35564982 this.isDefaultPrevented = returnTrue;
3557
3558 var e = this.originalEvent;
35594983 if ( !e ) {
35604984 return;
35614985 }
35624986
3563 // if preventDefault exists run it on the original event
4987 // If preventDefault exists, run it on the original event
35644988 if ( e.preventDefault ) {
35654989 e.preventDefault();
35664990
3567 // otherwise set the returnValue property of the original event to false (IE)
4991 // Support: IE
4992 // Otherwise set the returnValue property of the original event to false
35684993 } else {
35694994 e.returnValue = false;
35704995 }
35714996 },
35724997 stopPropagation: function() {
4998 var e = this.originalEvent;
4999
35735000 this.isPropagationStopped = returnTrue;
3574
3575 var e = this.originalEvent;
35765001 if ( !e ) {
35775002 return;
35785003 }
3579 // if stopPropagation exists run it on the original event
5004 // If stopPropagation exists, run it on the original event
35805005 if ( e.stopPropagation ) {
35815006 e.stopPropagation();
35825007 }
3583 // otherwise set the cancelBubble property of the original event to true (IE)
5008
5009 // Support: IE
5010 // Set the cancelBubble property of the original event to true
35845011 e.cancelBubble = true;
35855012 },
35865013 stopImmediatePropagation: function() {
5014 var e = this.originalEvent;
5015
35875016 this.isImmediatePropagationStopped = returnTrue;
5017
5018 if ( e && e.stopImmediatePropagation ) {
5019 e.stopImmediatePropagation();
5020 }
5021
35885022 this.stopPropagation();
3589 },
3590 isDefaultPrevented: returnFalse,
3591 isPropagationStopped: returnFalse,
3592 isImmediatePropagationStopped: returnFalse
5023 }
35935024 };
35945025
35955026 // Create mouseenter/leave events using mouseover/out and event-time checks
35965027 jQuery.each({
35975028 mouseenter: "mouseover",
3598 mouseleave: "mouseout"
5029 mouseleave: "mouseout",
5030 pointerenter: "pointerover",
5031 pointerleave: "pointerout"
35995032 }, function( orig, fix ) {
36005033 jQuery.event.special[ orig ] = {
36015034 delegateType: fix,
36025035 bindType: fix,
36035036
36045037 handle: function( event ) {
3605 var target = this,
5038 var ret,
5039 target = this,
36065040 related = event.relatedTarget,
3607 handleObj = event.handleObj,
3608 selector = handleObj.selector,
3609 ret;
5041 handleObj = event.handleObj;
36105042
36115043 // For mousenter/leave call the handler if related is outside the target.
36125044 // NB: No relatedTarget if the mouse left/entered the browser window
36215053 });
36225054
36235055 // IE submit delegation
3624 if ( !jQuery.support.submitBubbles ) {
5056 if ( !support.submitBubbles ) {
36255057
36265058 jQuery.event.special.submit = {
36275059 setup: function() {
36355067 // Node name check avoids a VML-related crash in IE (#9807)
36365068 var elem = e.target,
36375069 form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3638 if ( form && !form._submit_attached ) {
5070 if ( form && !jQuery._data( form, "submitBubbles" ) ) {
36395071 jQuery.event.add( form, "submit._submit", function( event ) {
36405072 event._submit_bubble = true;
36415073 });
3642 form._submit_attached = true;
5074 jQuery._data( form, "submitBubbles", true );
36435075 }
36445076 });
36455077 // return undefined since we don't need an event listener
36465078 },
3647
5079
36485080 postDispatch: function( event ) {
36495081 // If form was submitted by the user, bubble the event up the tree
36505082 if ( event._submit_bubble ) {
36685100 }
36695101
36705102 // IE change delegation and checkbox/radio fix
3671 if ( !jQuery.support.changeBubbles ) {
5103 if ( !support.changeBubbles ) {
36725104
36735105 jQuery.event.special.change = {
36745106
36875119 jQuery.event.add( this, "click._change", function( event ) {
36885120 if ( this._just_changed && !event.isTrigger ) {
36895121 this._just_changed = false;
3690 jQuery.event.simulate( "change", this, event, true );
36915122 }
5123 // Allow triggered, simulated change events (#11500)
5124 jQuery.event.simulate( "change", this, event, true );
36925125 });
36935126 }
36945127 return false;
36975130 jQuery.event.add( this, "beforeactivate._change", function( e ) {
36985131 var elem = e.target;
36995132
3700 if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
5133 if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
37015134 jQuery.event.add( elem, "change._change", function( event ) {
37025135 if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
37035136 jQuery.event.simulate( "change", this.parentNode, event, true );
37045137 }
37055138 });
3706 elem._change_attached = true;
5139 jQuery._data( elem, "changeBubbles", true );
37075140 }
37085141 });
37095142 },
37205153 teardown: function() {
37215154 jQuery.event.remove( this, "._change" );
37225155
3723 return rformElems.test( this.nodeName );
5156 return !rformElems.test( this.nodeName );
37245157 }
37255158 };
37265159 }
37275160
37285161 // Create "bubbling" focus and blur events
3729 if ( !jQuery.support.focusinBubbles ) {
5162 if ( !support.focusinBubbles ) {
37305163 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
37315164
3732 // Attach a single capturing handler while someone wants focusin/focusout
3733 var attaches = 0,
3734 handler = function( event ) {
5165 // Attach a single capturing handler on the document while someone wants focusin/focusout
5166 var handler = function( event ) {
37355167 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
37365168 };
37375169
37385170 jQuery.event.special[ fix ] = {
37395171 setup: function() {
3740 if ( attaches++ === 0 ) {
3741 document.addEventListener( orig, handler, true );
3742 }
5172 var doc = this.ownerDocument || this,
5173 attaches = jQuery._data( doc, fix );
5174
5175 if ( !attaches ) {
5176 doc.addEventListener( orig, handler, true );
5177 }
5178 jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
37435179 },
37445180 teardown: function() {
3745 if ( --attaches === 0 ) {
3746 document.removeEventListener( orig, handler, true );
5181 var doc = this.ownerDocument || this,
5182 attaches = jQuery._data( doc, fix ) - 1;
5183
5184 if ( !attaches ) {
5185 doc.removeEventListener( orig, handler, true );
5186 jQuery._removeData( doc, fix );
5187 } else {
5188 jQuery._data( doc, fix, attaches );
37475189 }
37485190 }
37495191 };
37535195 jQuery.fn.extend({
37545196
37555197 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3756 var origFn, type;
5198 var type, origFn;
37575199
37585200 // Types can be a map of types/handlers
37595201 if ( typeof types === "object" ) {
37605202 // ( types-Object, selector, data )
3761 if ( typeof selector !== "string" ) { // && selector != null
5203 if ( typeof selector !== "string" ) {
37625204 // ( types-Object, data )
37635205 data = data || selector;
37645206 selector = undefined;
38095251 return this.on( types, selector, data, fn, 1 );
38105252 },
38115253 off: function( types, selector, fn ) {
5254 var handleObj, type;
38125255 if ( types && types.preventDefault && types.handleObj ) {
38135256 // ( event ) dispatched jQuery.Event
3814 var handleObj = types.handleObj;
5257 handleObj = types.handleObj;
38155258 jQuery( types.delegateTarget ).off(
38165259 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
38175260 handleObj.selector,
38215264 }
38225265 if ( typeof types === "object" ) {
38235266 // ( types-object [, selector] )
3824 for ( var type in types ) {
5267 for ( type in types ) {
38255268 this.off( type, selector, types[ type ] );
38265269 }
38275270 return this;
38395282 });
38405283 },
38415284
3842 bind: function( types, data, fn ) {
3843 return this.on( types, null, data, fn );
3844 },
3845 unbind: function( types, fn ) {
3846 return this.off( types, null, fn );
3847 },
3848
3849 live: function( types, data, fn ) {
3850 jQuery( this.context ).on( types, this.selector, data, fn );
3851 return this;
3852 },
3853 die: function( types, fn ) {
3854 jQuery( this.context ).off( types, this.selector || "**", fn );
3855 return this;
3856 },
3857
3858 delegate: function( selector, types, data, fn ) {
3859 return this.on( types, selector, data, fn );
3860 },
3861 undelegate: function( selector, types, fn ) {
3862 // ( namespace ) or ( selector, types [, fn] )
3863 return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3864 },
3865
38665285 trigger: function( type, data ) {
38675286 return this.each(function() {
38685287 jQuery.event.trigger( type, data, this );
38695288 });
38705289 },
38715290 triggerHandler: function( type, data ) {
3872 if ( this[0] ) {
3873 return jQuery.event.trigger( type, data, this[0], true );
3874 }
3875 },
3876
3877 toggle: function( fn ) {
3878 // Save reference to arguments for access in closure
3879 var args = arguments,
3880 guid = fn.guid || jQuery.guid++,
3881 i = 0,
3882 toggler = function( event ) {
3883 // Figure out which function to execute
3884 var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3885 jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3886
3887 // Make sure that clicks stop
3888 event.preventDefault();
3889
3890 // and execute the function
3891 return args[ lastToggle ].apply( this, arguments ) || false;
3892 };
3893
3894 // link all the functions, so any of them can unbind this click handler
3895 toggler.guid = guid;
3896 while ( i < args.length ) {
3897 args[ i++ ].guid = guid;
3898 }
3899
3900 return this.click( toggler );
3901 },
3902
3903 hover: function( fnOver, fnOut ) {
3904 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
5291 var elem = this[0];
5292 if ( elem ) {
5293 return jQuery.event.trigger( type, data, elem, true );
5294 }
39055295 }
39065296 });
3907
3908 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3909 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3910 "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3911
3912 // Handle event binding
3913 jQuery.fn[ name ] = function( data, fn ) {
3914 if ( fn == null ) {
3915 fn = data;
3916 data = null;
3917 }
3918
3919 return arguments.length > 0 ?
3920 this.on( name, null, data, fn ) :
3921 this.trigger( name );
3922 };
3923
3924 if ( jQuery.attrFn ) {
3925 jQuery.attrFn[ name ] = true;
3926 }
3927
3928 if ( rkeyEvent.test( name ) ) {
3929 jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3930 }
3931
3932 if ( rmouseEvent.test( name ) ) {
3933 jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3934 }
3935 });
3936
3937
3938
3939 /*!
3940 * Sizzle CSS Selector Engine
3941 * Copyright 2011, The Dojo Foundation
3942 * Released under the MIT, BSD, and GPL Licenses.
3943 * More information: http://sizzlejs.com/
3944 */
3945 (function(){
3946
3947 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3948 expando = "sizcache" + (Math.random() + '').replace('.', ''),
3949 done = 0,
3950 toString = Object.prototype.toString,
3951 hasDuplicate = false,
3952 baseHasDuplicate = true,
3953 rBackslash = /\\/g,
3954 rReturn = /\r\n/g,
3955 rNonWord = /\W/;
3956
3957 // Here we check if the JavaScript engine is using some sort of
3958 // optimization where it does not always call our comparision
3959 // function. If that is the case, discard the hasDuplicate value.
3960 // Thus far that includes Google Chrome.
3961 [0, 0].sort(function() {
3962 baseHasDuplicate = false;
3963 return 0;
3964 });
3965
3966 var Sizzle = function( selector, context, results, seed ) {
3967 results = results || [];
3968 context = context || document;
3969
3970 var origContext = context;
3971
3972 if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3973 return [];
3974 }
3975
3976 if ( !selector || typeof selector !== "string" ) {
3977 return results;
3978 }
3979
3980 var m, set, checkSet, extra, ret, cur, pop, i,
3981 prune = true,
3982 contextXML = Sizzle.isXML( context ),
3983 parts = [],
3984 soFar = selector;
3985
3986 // Reset the position of the chunker regexp (start from head)
3987 do {
3988 chunker.exec( "" );
3989 m = chunker.exec( soFar );
3990
3991 if ( m ) {
3992 soFar = m[3];
3993
3994 parts.push( m[1] );
3995
3996 if ( m[2] ) {
3997 extra = m[3];
3998 break;
3999 }
4000 }
4001 } while ( m );
4002
4003 if ( parts.length > 1 && origPOS.exec( selector ) ) {
4004
4005 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
4006 set = posProcess( parts[0] + parts[1], context, seed );
4007
4008 } else {
4009 set = Expr.relative[ parts[0] ] ?
4010 [ context ] :
4011 Sizzle( parts.shift(), context );
4012
4013 while ( parts.length ) {
4014 selector = parts.shift();
4015
4016 if ( Expr.relative[ selector ] ) {
4017 selector += parts.shift();
4018 }
4019
4020 set = posProcess( selector, set, seed );
4021 }
4022 }
4023
4024 } else {
4025 // Take a shortcut and set the context if the root selector is an ID
4026 // (but not if it'll be faster if the inner selector is an ID)
4027 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
4028 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
4029
4030 ret = Sizzle.find( parts.shift(), context, contextXML );
4031 context = ret.expr ?
4032 Sizzle.filter( ret.expr, ret.set )[0] :
4033 ret.set[0];
4034 }
4035
4036 if ( context ) {
4037 ret = seed ?
4038 { expr: parts.pop(), set: makeArray(seed) } :
4039 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
4040
4041 set = ret.expr ?
4042 Sizzle.filter( ret.expr, ret.set ) :
4043 ret.set;
4044
4045 if ( parts.length > 0 ) {
4046 checkSet = makeArray( set );
4047
4048 } else {
4049 prune = false;
4050 }
4051
4052 while ( parts.length ) {
4053 cur = parts.pop();
4054 pop = cur;
4055
4056 if ( !Expr.relative[ cur ] ) {
4057 cur = "";
4058 } else {
4059 pop = parts.pop();
4060 }
4061
4062 if ( pop == null ) {
4063 pop = context;
4064 }
4065
4066 Expr.relative[ cur ]( checkSet, pop, contextXML );
4067 }
4068
4069 } else {
4070 checkSet = parts = [];
4071 }
4072 }
4073
4074 if ( !checkSet ) {
4075 checkSet = set;
4076 }
4077
4078 if ( !checkSet ) {
4079 Sizzle.error( cur || selector );
4080 }
4081
4082 if ( toString.call(checkSet) === "[object Array]" ) {
4083 if ( !prune ) {
4084 results.push.apply( results, checkSet );
4085
4086 } else if ( context && context.nodeType === 1 ) {
4087 for ( i = 0; checkSet[i] != null; i++ ) {
4088 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
4089 results.push( set[i] );
4090 }
4091 }
4092
4093 } else {
4094 for ( i = 0; checkSet[i] != null; i++ ) {
4095 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4096 results.push( set[i] );
4097 }
4098 }
4099 }
4100
4101 } else {
4102 makeArray( checkSet, results );
4103 }
4104
4105 if ( extra ) {
4106 Sizzle( extra, origContext, results, seed );
4107 Sizzle.uniqueSort( results );
4108 }
4109
4110 return results;
4111 };
4112
4113 Sizzle.uniqueSort = function( results ) {
4114 if ( sortOrder ) {
4115 hasDuplicate = baseHasDuplicate;
4116 results.sort( sortOrder );
4117
4118 if ( hasDuplicate ) {
4119 for ( var i = 1; i < results.length; i++ ) {
4120 if ( results[i] === results[ i - 1 ] ) {
4121 results.splice( i--, 1 );
4122 }
4123 }
4124 }
4125 }
4126
4127 return results;
4128 };
4129
4130 Sizzle.matches = function( expr, set ) {
4131 return Sizzle( expr, null, null, set );
4132 };
4133
4134 Sizzle.matchesSelector = function( node, expr ) {
4135 return Sizzle( expr, null, null, [node] ).length > 0;
4136 };
4137
4138 Sizzle.find = function( expr, context, isXML ) {
4139 var set, i, len, match, type, left;
4140
4141 if ( !expr ) {
4142 return [];
4143 }
4144
4145 for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4146 type = Expr.order[i];
4147
4148 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4149 left = match[1];
4150 match.splice( 1, 1 );
4151
4152 if ( left.substr( left.length - 1 ) !== "\\" ) {
4153 match[1] = (match[1] || "").replace( rBackslash, "" );
4154 set = Expr.find[ type ]( match, context, isXML );
4155
4156 if ( set != null ) {
4157 expr = expr.replace( Expr.match[ type ], "" );
4158 break;
4159 }
4160 }
4161 }
4162 }
4163
4164 if ( !set ) {
4165 set = typeof context.getElementsByTagName !== "undefined" ?
4166 context.getElementsByTagName( "*" ) :
4167 [];
4168 }
4169
4170 return { set: set, expr: expr };
4171 };
4172
4173 Sizzle.filter = function( expr, set, inplace, not ) {
4174 var match, anyFound,
4175 type, found, item, filter, left,
4176 i, pass,
4177 old = expr,
4178 result = [],
4179 curLoop = set,
4180 isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4181
4182 while ( expr && set.length ) {
4183 for ( type in Expr.filter ) {
4184 if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4185 filter = Expr.filter[ type ];
4186 left = match[1];
4187
4188 anyFound = false;
4189
4190 match.splice(1,1);
4191
4192 if ( left.substr( left.length - 1 ) === "\\" ) {
4193 continue;
4194 }
4195
4196 if ( curLoop === result ) {
4197 result = [];
4198 }
4199
4200 if ( Expr.preFilter[ type ] ) {
4201 match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4202
4203 if ( !match ) {
4204 anyFound = found = true;
4205
4206 } else if ( match === true ) {
4207 continue;
4208 }
4209 }
4210
4211 if ( match ) {
4212 for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4213 if ( item ) {
4214 found = filter( item, match, i, curLoop );
4215 pass = not ^ found;
4216
4217 if ( inplace && found != null ) {
4218 if ( pass ) {
4219 anyFound = true;
4220
4221 } else {
4222 curLoop[i] = false;
4223 }
4224
4225 } else if ( pass ) {
4226 result.push( item );
4227 anyFound = true;
4228 }
4229 }
4230 }
4231 }
4232
4233 if ( found !== undefined ) {
4234 if ( !inplace ) {
4235 curLoop = result;
4236 }
4237
4238 expr = expr.replace( Expr.match[ type ], "" );
4239
4240 if ( !anyFound ) {
4241 return [];
4242 }
4243
4244 break;
4245 }
4246 }
4247 }
4248
4249 // Improper expression
4250 if ( expr === old ) {
4251 if ( anyFound == null ) {
4252 Sizzle.error( expr );
4253
4254 } else {
4255 break;
4256 }
4257 }
4258
4259 old = expr;
4260 }
4261
4262 return curLoop;
4263 };
4264
4265 Sizzle.error = function( msg ) {
4266 throw new Error( "Syntax error, unrecognized expression: " + msg );
4267 };
4268
4269 /**
4270 * Utility function for retreiving the text value of an array of DOM nodes
4271 * @param {Array|Element} elem
4272 */
4273 var getText = Sizzle.getText = function( elem ) {
4274 var i, node,
4275 nodeType = elem.nodeType,
4276 ret = "";
4277
4278 if ( nodeType ) {
4279 if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
4280 // Use textContent || innerText for elements
4281 if ( typeof elem.textContent === 'string' ) {
4282 return elem.textContent;
4283 } else if ( typeof elem.innerText === 'string' ) {
4284 // Replace IE's carriage returns
4285 return elem.innerText.replace( rReturn, '' );
4286 } else {
4287 // Traverse it's children
4288 for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4289 ret += getText( elem );
4290 }
4291 }
4292 } else if ( nodeType === 3 || nodeType === 4 ) {
4293 return elem.nodeValue;
4294 }
4295 } else {
4296
4297 // If no nodeType, this is expected to be an array
4298 for ( i = 0; (node = elem[i]); i++ ) {
4299 // Do not traverse comment nodes
4300 if ( node.nodeType !== 8 ) {
4301 ret += getText( node );
4302 }
4303 }
4304 }
4305 return ret;
4306 };
4307
4308 var Expr = Sizzle.selectors = {
4309 order: [ "ID", "NAME", "TAG" ],
4310
4311 match: {
4312 ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4313 CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4314 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4315 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4316 TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4317 CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4318 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4319 PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4320 },
4321
4322 leftMatch: {},
4323
4324 attrMap: {
4325 "class": "className",
4326 "for": "htmlFor"
4327 },
4328
4329 attrHandle: {
4330 href: function( elem ) {
4331 return elem.getAttribute( "href" );
4332 },
4333 type: function( elem ) {
4334 return elem.getAttribute( "type" );
4335 }
4336 },
4337
4338 relative: {
4339 "+": function(checkSet, part){
4340 var isPartStr = typeof part === "string",
4341 isTag = isPartStr && !rNonWord.test( part ),
4342 isPartStrNotTag = isPartStr && !isTag;
4343
4344 if ( isTag ) {
4345 part = part.toLowerCase();
4346 }
4347
4348 for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4349 if ( (elem = checkSet[i]) ) {
4350 while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4351
4352 checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4353 elem || false :
4354 elem === part;
4355 }
4356 }
4357
4358 if ( isPartStrNotTag ) {
4359 Sizzle.filter( part, checkSet, true );
4360 }
4361 },
4362
4363 ">": function( checkSet, part ) {
4364 var elem,
4365 isPartStr = typeof part === "string",
4366 i = 0,
4367 l = checkSet.length;
4368
4369 if ( isPartStr && !rNonWord.test( part ) ) {
4370 part = part.toLowerCase();
4371
4372 for ( ; i < l; i++ ) {
4373 elem = checkSet[i];
4374
4375 if ( elem ) {
4376 var parent = elem.parentNode;
4377 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4378 }
4379 }
4380
4381 } else {
4382 for ( ; i < l; i++ ) {
4383 elem = checkSet[i];
4384
4385 if ( elem ) {
4386 checkSet[i] = isPartStr ?
4387 elem.parentNode :
4388 elem.parentNode === part;
4389 }
4390 }
4391
4392 if ( isPartStr ) {
4393 Sizzle.filter( part, checkSet, true );
4394 }
4395 }
4396 },
4397
4398 "": function(checkSet, part, isXML){
4399 var nodeCheck,
4400 doneName = done++,
4401 checkFn = dirCheck;
4402
4403 if ( typeof part === "string" && !rNonWord.test( part ) ) {
4404 part = part.toLowerCase();
4405 nodeCheck = part;
4406 checkFn = dirNodeCheck;
4407 }
4408
4409 checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4410 },
4411
4412 "~": function( checkSet, part, isXML ) {
4413 var nodeCheck,
4414 doneName = done++,
4415 checkFn = dirCheck;
4416
4417 if ( typeof part === "string" && !rNonWord.test( part ) ) {
4418 part = part.toLowerCase();
4419 nodeCheck = part;
4420 checkFn = dirNodeCheck;
4421 }
4422
4423 checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4424 }
4425 },
4426
4427 find: {
4428 ID: function( match, context, isXML ) {
4429 if ( typeof context.getElementById !== "undefined" && !isXML ) {
4430 var m = context.getElementById(match[1]);
4431 // Check parentNode to catch when Blackberry 4.6 returns
4432 // nodes that are no longer in the document #6963
4433 return m && m.parentNode ? [m] : [];
4434 }
4435 },
4436
4437 NAME: function( match, context ) {
4438 if ( typeof context.getElementsByName !== "undefined" ) {
4439 var ret = [],
4440 results = context.getElementsByName( match[1] );
4441
4442 for ( var i = 0, l = results.length; i < l; i++ ) {
4443 if ( results[i].getAttribute("name") === match[1] ) {
4444 ret.push( results[i] );
4445 }
4446 }
4447
4448 return ret.length === 0 ? null : ret;
4449 }
4450 },
4451
4452 TAG: function( match, context ) {
4453 if ( typeof context.getElementsByTagName !== "undefined" ) {
4454 return context.getElementsByTagName( match[1] );
4455 }
4456 }
4457 },
4458 preFilter: {
4459 CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4460 match = " " + match[1].replace( rBackslash, "" ) + " ";
4461
4462 if ( isXML ) {
4463 return match;
4464 }
4465
4466 for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4467 if ( elem ) {
4468 if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4469 if ( !inplace ) {
4470 result.push( elem );
4471 }
4472
4473 } else if ( inplace ) {
4474 curLoop[i] = false;
4475 }
4476 }
4477 }
4478
4479 return false;
4480 },
4481
4482 ID: function( match ) {
4483 return match[1].replace( rBackslash, "" );
4484 },
4485
4486 TAG: function( match, curLoop ) {
4487 return match[1].replace( rBackslash, "" ).toLowerCase();
4488 },
4489
4490 CHILD: function( match ) {
4491 if ( match[1] === "nth" ) {
4492 if ( !match[2] ) {
4493 Sizzle.error( match[0] );
4494 }
4495
4496 match[2] = match[2].replace(/^\+|\s*/g, '');
4497
4498 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4499 var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4500 match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4501 !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4502
4503 // calculate the numbers (first)n+(last) including if they are negative
4504 match[2] = (test[1] + (test[2] || 1)) - 0;
4505 match[3] = test[3] - 0;
4506 }
4507 else if ( match[2] ) {
4508 Sizzle.error( match[0] );
4509 }
4510
4511 // TODO: Move to normal caching system
4512 match[0] = done++;
4513
4514 return match;
4515 },
4516
4517 ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4518 var name = match[1] = match[1].replace( rBackslash, "" );
4519
4520 if ( !isXML && Expr.attrMap[name] ) {
4521 match[1] = Expr.attrMap[name];
4522 }
4523
4524 // Handle if an un-quoted value was used
4525 match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4526
4527 if ( match[2] === "~=" ) {
4528 match[4] = " " + match[4] + " ";
4529 }
4530
4531 return match;
4532 },
4533
4534 PSEUDO: function( match, curLoop, inplace, result, not ) {
4535 if ( match[1] === "not" ) {
4536 // If we're dealing with a complex expression, or a simple one
4537 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4538 match[3] = Sizzle(match[3], null, null, curLoop);
4539
4540 } else {
4541 var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4542
4543 if ( !inplace ) {
4544 result.push.apply( result, ret );
4545 }
4546
4547 return false;
4548 }
4549
4550 } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4551 return true;
4552 }
4553
4554 return match;
4555 },
4556
4557 POS: function( match ) {
4558 match.unshift( true );
4559
4560 return match;
4561 }
4562 },
4563
4564 filters: {
4565 enabled: function( elem ) {
4566 return elem.disabled === false && elem.type !== "hidden";
4567 },
4568
4569 disabled: function( elem ) {
4570 return elem.disabled === true;
4571 },
4572
4573 checked: function( elem ) {
4574 return elem.checked === true;
4575 },
4576
4577 selected: function( elem ) {
4578 // Accessing this property makes selected-by-default
4579 // options in Safari work properly
4580 if ( elem.parentNode ) {
4581 elem.parentNode.selectedIndex;
4582 }
4583
4584 return elem.selected === true;
4585 },
4586
4587 parent: function( elem ) {
4588 return !!elem.firstChild;
4589 },
4590
4591 empty: function( elem ) {
4592 return !elem.firstChild;
4593 },
4594
4595 has: function( elem, i, match ) {
4596 return !!Sizzle( match[3], elem ).length;
4597 },
4598
4599 header: function( elem ) {
4600 return (/h\d/i).test( elem.nodeName );
4601 },
4602
4603 text: function( elem ) {
4604 var attr = elem.getAttribute( "type" ), type = elem.type;
4605 // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4606 // use getAttribute instead to test this case
4607 return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4608 },
4609
4610 radio: function( elem ) {
4611 return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4612 },
4613
4614 checkbox: function( elem ) {
4615 return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4616 },
4617
4618 file: function( elem ) {
4619 return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4620 },
4621
4622 password: function( elem ) {
4623 return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4624 },
4625
4626 submit: function( elem ) {
4627 var name = elem.nodeName.toLowerCase();
4628 return (name === "input" || name === "button") && "submit" === elem.type;
4629 },
4630
4631 image: function( elem ) {
4632 return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4633 },
4634
4635 reset: function( elem ) {
4636 var name = elem.nodeName.toLowerCase();
4637 return (name === "input" || name === "button") && "reset" === elem.type;
4638 },
4639
4640 button: function( elem ) {
4641 var name = elem.nodeName.toLowerCase();
4642 return name === "input" && "button" === elem.type || name === "button";
4643 },
4644
4645 input: function( elem ) {
4646 return (/input|select|textarea|button/i).test( elem.nodeName );
4647 },
4648
4649 focus: function( elem ) {
4650 return elem === elem.ownerDocument.activeElement;
4651 }
4652 },
4653 setFilters: {
4654 first: function( elem, i ) {
4655 return i === 0;
4656 },
4657
4658 last: function( elem, i, match, array ) {
4659 return i === array.length - 1;
4660 },
4661
4662 even: function( elem, i ) {
4663 return i % 2 === 0;
4664 },
4665
4666 odd: function( elem, i ) {
4667 return i % 2 === 1;
4668 },
4669
4670 lt: function( elem, i, match ) {
4671 return i < match[3] - 0;
4672 },
4673
4674 gt: function( elem, i, match ) {
4675 return i > match[3] - 0;
4676 },
4677
4678 nth: function( elem, i, match ) {
4679 return match[3] - 0 === i;
4680 },
4681
4682 eq: function( elem, i, match ) {
4683 return match[3] - 0 === i;
4684 }
4685 },
4686 filter: {
4687 PSEUDO: function( elem, match, i, array ) {
4688 var name = match[1],
4689 filter = Expr.filters[ name ];
4690
4691 if ( filter ) {
4692 return filter( elem, i, match, array );
4693
4694 } else if ( name === "contains" ) {
4695 return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4696
4697 } else if ( name === "not" ) {
4698 var not = match[3];
4699
4700 for ( var j = 0, l = not.length; j < l; j++ ) {
4701 if ( not[j] === elem ) {
4702 return false;
4703 }
4704 }
4705
4706 return true;
4707
4708 } else {
4709 Sizzle.error( name );
4710 }
4711 },
4712
4713 CHILD: function( elem, match ) {
4714 var first, last,
4715 doneName, parent, cache,
4716 count, diff,
4717 type = match[1],
4718 node = elem;
4719
4720 switch ( type ) {
4721 case "only":
4722 case "first":
4723 while ( (node = node.previousSibling) ) {
4724 if ( node.nodeType === 1 ) {
4725 return false;
4726 }
4727 }
4728
4729 if ( type === "first" ) {
4730 return true;
4731 }
4732
4733 node = elem;
4734
4735 /* falls through */
4736 case "last":
4737 while ( (node = node.nextSibling) ) {
4738 if ( node.nodeType === 1 ) {
4739 return false;
4740 }
4741 }
4742
4743 return true;
4744
4745 case "nth":
4746 first = match[2];
4747 last = match[3];
4748
4749 if ( first === 1 && last === 0 ) {
4750 return true;
4751 }
4752
4753 doneName = match[0];
4754 parent = elem.parentNode;
4755
4756 if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4757 count = 0;
4758
4759 for ( node = parent.firstChild; node; node = node.nextSibling ) {
4760 if ( node.nodeType === 1 ) {
4761 node.nodeIndex = ++count;
4762 }
4763 }
4764
4765 parent[ expando ] = doneName;
4766 }
4767
4768 diff = elem.nodeIndex - last;
4769
4770 if ( first === 0 ) {
4771 return diff === 0;
4772
4773 } else {
4774 return ( diff % first === 0 && diff / first >= 0 );
4775 }
4776 }
4777 },
4778
4779 ID: function( elem, match ) {
4780 return elem.nodeType === 1 && elem.getAttribute("id") === match;
4781 },
4782
4783 TAG: function( elem, match ) {
4784 return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4785 },
4786
4787 CLASS: function( elem, match ) {
4788 return (" " + (elem.className || elem.getAttribute("class")) + " ")
4789 .indexOf( match ) > -1;
4790 },
4791
4792 ATTR: function( elem, match ) {
4793 var name = match[1],
4794 result = Sizzle.attr ?
4795 Sizzle.attr( elem, name ) :
4796 Expr.attrHandle[ name ] ?
4797 Expr.attrHandle[ name ]( elem ) :
4798 elem[ name ] != null ?
4799 elem[ name ] :
4800 elem.getAttribute( name ),
4801 value = result + "",
4802 type = match[2],
4803 check = match[4];
4804
4805 return result == null ?
4806 type === "!=" :
4807 !type && Sizzle.attr ?
4808 result != null :
4809 type === "=" ?
4810 value === check :
4811 type === "*=" ?
4812 value.indexOf(check) >= 0 :
4813 type === "~=" ?
4814 (" " + value + " ").indexOf(check) >= 0 :
4815 !check ?
4816 value && result !== false :
4817 type === "!=" ?
4818 value !== check :
4819 type === "^=" ?
4820 value.indexOf(check) === 0 :
4821 type === "$=" ?
4822 value.substr(value.length - check.length) === check :
4823 type === "|=" ?
4824 value === check || value.substr(0, check.length + 1) === check + "-" :
4825 false;
4826 },
4827
4828 POS: function( elem, match, i, array ) {
4829 var name = match[2],
4830 filter = Expr.setFilters[ name ];
4831
4832 if ( filter ) {
4833 return filter( elem, i, match, array );
4834 }
4835 }
4836 }
4837 };
4838
4839 var origPOS = Expr.match.POS,
4840 fescape = function(all, num){
4841 return "\\" + (num - 0 + 1);
4842 };
4843
4844 for ( var type in Expr.match ) {
4845 Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4846 Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4847 }
4848 // Expose origPOS
4849 // "global" as in regardless of relation to brackets/parens
4850 Expr.match.globalPOS = origPOS;
4851
4852 var makeArray = function( array, results ) {
4853 array = Array.prototype.slice.call( array, 0 );
4854
4855 if ( results ) {
4856 results.push.apply( results, array );
4857 return results;
4858 }
4859
4860 return array;
4861 };
4862
4863 // Perform a simple check to determine if the browser is capable of
4864 // converting a NodeList to an array using builtin methods.
4865 // Also verifies that the returned array holds DOM nodes
4866 // (which is not the case in the Blackberry browser)
4867 try {
4868 Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4869
4870 // Provide a fallback method if it does not work
4871 } catch( e ) {
4872 makeArray = function( array, results ) {
4873 var i = 0,
4874 ret = results || [];
4875
4876 if ( toString.call(array) === "[object Array]" ) {
4877 Array.prototype.push.apply( ret, array );
4878
4879 } else {
4880 if ( typeof array.length === "number" ) {
4881 for ( var l = array.length; i < l; i++ ) {
4882 ret.push( array[i] );
4883 }
4884
4885 } else {
4886 for ( ; array[i]; i++ ) {
4887 ret.push( array[i] );
4888 }
4889 }
4890 }
4891
4892 return ret;
4893 };
4894 }
4895
4896 var sortOrder, siblingCheck;
4897
4898 if ( document.documentElement.compareDocumentPosition ) {
4899 sortOrder = function( a, b ) {
4900 if ( a === b ) {
4901 hasDuplicate = true;
4902 return 0;
4903 }
4904
4905 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4906 return a.compareDocumentPosition ? -1 : 1;
4907 }
4908
4909 return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4910 };
4911
4912 } else {
4913 sortOrder = function( a, b ) {
4914 // The nodes are identical, we can exit early
4915 if ( a === b ) {
4916 hasDuplicate = true;
4917 return 0;
4918
4919 // Fallback to using sourceIndex (in IE) if it's available on both nodes
4920 } else if ( a.sourceIndex && b.sourceIndex ) {
4921 return a.sourceIndex - b.sourceIndex;
4922 }
4923
4924 var al, bl,
4925 ap = [],
4926 bp = [],
4927 aup = a.parentNode,
4928 bup = b.parentNode,
4929 cur = aup;
4930
4931 // If the nodes are siblings (or identical) we can do a quick check
4932 if ( aup === bup ) {
4933 return siblingCheck( a, b );
4934
4935 // If no parents were found then the nodes are disconnected
4936 } else if ( !aup ) {
4937 return -1;
4938
4939 } else if ( !bup ) {
4940 return 1;
4941 }
4942
4943 // Otherwise they're somewhere else in the tree so we need
4944 // to build up a full list of the parentNodes for comparison
4945 while ( cur ) {
4946 ap.unshift( cur );
4947 cur = cur.parentNode;
4948 }
4949
4950 cur = bup;
4951
4952 while ( cur ) {
4953 bp.unshift( cur );
4954 cur = cur.parentNode;
4955 }
4956
4957 al = ap.length;
4958 bl = bp.length;
4959
4960 // Start walking down the tree looking for a discrepancy
4961 for ( var i = 0; i < al && i < bl; i++ ) {
4962 if ( ap[i] !== bp[i] ) {
4963 return siblingCheck( ap[i], bp[i] );
4964 }
4965 }
4966
4967 // We ended someplace up the tree so do a sibling check
4968 return i === al ?
4969 siblingCheck( a, bp[i], -1 ) :
4970 siblingCheck( ap[i], b, 1 );
4971 };
4972
4973 siblingCheck = function( a, b, ret ) {
4974 if ( a === b ) {
4975 return ret;
4976 }
4977
4978 var cur = a.nextSibling;
4979
4980 while ( cur ) {
4981 if ( cur === b ) {
4982 return -1;
4983 }
4984
4985 cur = cur.nextSibling;
4986 }
4987
4988 return 1;
4989 };
4990 }
4991
4992 // Check to see if the browser returns elements by name when
4993 // querying by getElementById (and provide a workaround)
4994 (function(){
4995 // We're going to inject a fake input element with a specified name
4996 var form = document.createElement("div"),
4997 id = "script" + (new Date()).getTime(),
4998 root = document.documentElement;
4999
5000 form.innerHTML = "<a name='" + id + "'/>";
5001
5002 // Inject it into the root element, check its status, and remove it quickly
5003 root.insertBefore( form, root.firstChild );
5004
5005 // The workaround has to do additional checks after a getElementById
5006 // Which slows things down for other browsers (hence the branching)
5007 if ( document.getElementById( id ) ) {
5008 Expr.find.ID = function( match, context, isXML ) {
5009 if ( typeof context.getElementById !== "undefined" && !isXML ) {
5010 var m = context.getElementById(match[1]);
5011
5012 return m ?
5013 m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
5014 [m] :
5015 undefined :
5016 [];
5017 }
5018 };
5019
5020 Expr.filter.ID = function( elem, match ) {
5021 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
5022
5023 return elem.nodeType === 1 && node && node.nodeValue === match;
5024 };
5025 }
5026
5027 root.removeChild( form );
5028
5029 // release memory in IE
5030 root = form = null;
5031 })();
5032
5033 (function(){
5034 // Check to see if the browser returns only elements
5035 // when doing getElementsByTagName("*")
5036
5037 // Create a fake element
5038 var div = document.createElement("div");
5039 div.appendChild( document.createComment("") );
5040
5041 // Make sure no comments are found
5042 if ( div.getElementsByTagName("*").length > 0 ) {
5043 Expr.find.TAG = function( match, context ) {
5044 var results = context.getElementsByTagName( match[1] );
5045
5046 // Filter out possible comments
5047 if ( match[1] === "*" ) {
5048 var tmp = [];
5049
5050 for ( var i = 0; results[i]; i++ ) {
5051 if ( results[i].nodeType === 1 ) {
5052 tmp.push( results[i] );
5053 }
5054 }
5055
5056 results = tmp;
5057 }
5058
5059 return results;
5060 };
5061 }
5062
5063 // Check to see if an attribute returns normalized href attributes
5064 div.innerHTML = "<a href='#'></a>";
5065
5066 if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
5067 div.firstChild.getAttribute("href") !== "#" ) {
5068
5069 Expr.attrHandle.href = function( elem ) {
5070 return elem.getAttribute( "href", 2 );
5071 };
5072 }
5073
5074 // release memory in IE
5075 div = null;
5076 })();
5077
5078 if ( document.querySelectorAll ) {
5079 (function(){
5080 var oldSizzle = Sizzle,
5081 div = document.createElement("div"),
5082 id = "__sizzle__";
5083
5084 div.innerHTML = "<p class='TEST'></p>";
5085
5086 // Safari can't handle uppercase or unicode characters when
5087 // in quirks mode.
5088 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
5089 return;
5090 }
5091
5092 Sizzle = function( query, context, extra, seed ) {
5093 context = context || document;
5094
5095 // Only use querySelectorAll on non-XML documents
5096 // (ID selectors don't work in non-HTML documents)
5097 if ( !seed && !Sizzle.isXML(context) ) {
5098 // See if we find a selector to speed up
5099 var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
5100
5101 if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
5102 // Speed-up: Sizzle("TAG")
5103 if ( match[1] ) {
5104 return makeArray( context.getElementsByTagName( query ), extra );
5105
5106 // Speed-up: Sizzle(".CLASS")
5107 } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
5108 return makeArray( context.getElementsByClassName( match[2] ), extra );
5109 }
5110 }
5111
5112 if ( context.nodeType === 9 ) {
5113 // Speed-up: Sizzle("body")
5114 // The body element only exists once, optimize finding it
5115 if ( query === "body" && context.body ) {
5116 return makeArray( [ context.body ], extra );
5117
5118 // Speed-up: Sizzle("#ID")
5119 } else if ( match && match[3] ) {
5120 var elem = context.getElementById( match[3] );
5121
5122 // Check parentNode to catch when Blackberry 4.6 returns
5123 // nodes that are no longer in the document #6963
5124 if ( elem && elem.parentNode ) {
5125 // Handle the case where IE and Opera return items
5126 // by name instead of ID
5127 if ( elem.id === match[3] ) {
5128 return makeArray( [ elem ], extra );
5129 }
5130
5131 } else {
5132 return makeArray( [], extra );
5133 }
5134 }
5135
5136 try {
5137 return makeArray( context.querySelectorAll(query), extra );
5138 } catch(qsaError) {}
5139
5140 // qSA works strangely on Element-rooted queries
5141 // We can work around this by specifying an extra ID on the root
5142 // and working up from there (Thanks to Andrew Dupont for the technique)
5143 // IE 8 doesn't work on object elements
5144 } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
5145 var oldContext = context,
5146 old = context.getAttribute( "id" ),
5147 nid = old || id,
5148 hasParent = context.parentNode,
5149 relativeHierarchySelector = /^\s*[+~]/.test( query );
5150
5151 if ( !old ) {
5152 context.setAttribute( "id", nid );
5153 } else {
5154 nid = nid.replace( /'/g, "\\$&" );
5155 }
5156 if ( relativeHierarchySelector && hasParent ) {
5157 context = context.parentNode;
5158 }
5159
5160 try {
5161 if ( !relativeHierarchySelector || hasParent ) {
5162 return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
5163 }
5164
5165 } catch(pseudoError) {
5166 } finally {
5167 if ( !old ) {
5168 oldContext.removeAttribute( "id" );
5169 }
5170 }
5171 }
5172 }
5173
5174 return oldSizzle(query, context, extra, seed);
5175 };
5176
5177 for ( var prop in oldSizzle ) {
5178 Sizzle[ prop ] = oldSizzle[ prop ];
5179 }
5180
5181 // release memory in IE
5182 div = null;
5183 })();
5184 }
5185
5186 (function(){
5187 var html = document.documentElement,
5188 matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
5189
5190 if ( matches ) {
5191 // Check to see if it's possible to do matchesSelector
5192 // on a disconnected node (IE 9 fails this)
5193 var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
5194 pseudoWorks = false;
5195
5196 try {
5197 // This should fail with an exception
5198 // Gecko does not error, returns false instead
5199 matches.call( document.documentElement, "[test!='']:sizzle" );
5200
5201 } catch( pseudoError ) {
5202 pseudoWorks = true;
5203 }
5204
5205 Sizzle.matchesSelector = function( node, expr ) {
5206 // Make sure that attribute selectors are quoted
5207 expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
5208
5209 if ( !Sizzle.isXML( node ) ) {
5210 try {
5211 if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
5212 var ret = matches.call( node, expr );
5213
5214 // IE 9's matchesSelector returns false on disconnected nodes
5215 if ( ret || !disconnectedMatch ||
5216 // As well, disconnected nodes are said to be in a document
5217 // fragment in IE 9, so check for that
5218 node.document && node.document.nodeType !== 11 ) {
5219 return ret;
5220 }
5221 }
5222 } catch(e) {}
5223 }
5224
5225 return Sizzle(expr, null, null, [node]).length > 0;
5226 };
5227 }
5228 })();
5229
5230 (function(){
5231 var div = document.createElement("div");
5232
5233 div.innerHTML = "<div class='test e'></div><div class='test'></div>";
5234
5235 // Opera can't find a second classname (in 9.6)
5236 // Also, make sure that getElementsByClassName actually exists
5237 if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
5238 return;
5239 }
5240
5241 // Safari caches class attributes, doesn't catch changes (in 3.2)
5242 div.lastChild.className = "e";
5243
5244 if ( div.getElementsByClassName("e").length === 1 ) {
5245 return;
5246 }
5247
5248 Expr.order.splice(1, 0, "CLASS");
5249 Expr.find.CLASS = function( match, context, isXML ) {
5250 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5251 return context.getElementsByClassName(match[1]);
5252 }
5253 };
5254
5255 // release memory in IE
5256 div = null;
5257 })();
5258
5259 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5260 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5261 var elem = checkSet[i];
5262
5263 if ( elem ) {
5264 var match = false;
5265
5266 elem = elem[dir];
5267
5268 while ( elem ) {
5269 if ( elem[ expando ] === doneName ) {
5270 match = checkSet[elem.sizset];
5271 break;
5272 }
5273
5274 if ( elem.nodeType === 1 && !isXML ){
5275 elem[ expando ] = doneName;
5276 elem.sizset = i;
5277 }
5278
5279 if ( elem.nodeName.toLowerCase() === cur ) {
5280 match = elem;
5281 break;
5282 }
5283
5284 elem = elem[dir];
5285 }
5286
5287 checkSet[i] = match;
5288 }
5289 }
5290 }
5291
5292 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5293 for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5294 var elem = checkSet[i];
5295
5296 if ( elem ) {
5297 var match = false;
5298
5299 elem = elem[dir];
5300
5301 while ( elem ) {
5302 if ( elem[ expando ] === doneName ) {
5303 match = checkSet[elem.sizset];
5304 break;
5305 }
5306
5307 if ( elem.nodeType === 1 ) {
5308 if ( !isXML ) {
5309 elem[ expando ] = doneName;
5310 elem.sizset = i;
5311 }
5312
5313 if ( typeof cur !== "string" ) {
5314 if ( elem === cur ) {
5315 match = true;
5316 break;
5317 }
5318
5319 } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5320 match = elem;
5321 break;
5322 }
5323 }
5324
5325 elem = elem[dir];
5326 }
5327
5328 checkSet[i] = match;
5329 }
5330 }
5331 }
5332
5333 if ( document.documentElement.contains ) {
5334 Sizzle.contains = function( a, b ) {
5335 return a !== b && (a.contains ? a.contains(b) : true);
5336 };
5337
5338 } else if ( document.documentElement.compareDocumentPosition ) {
5339 Sizzle.contains = function( a, b ) {
5340 return !!(a.compareDocumentPosition(b) & 16);
5341 };
5342
5343 } else {
5344 Sizzle.contains = function() {
5345 return false;
5346 };
5347 }
5348
5349 Sizzle.isXML = function( elem ) {
5350 // documentElement is verified for cases where it doesn't yet exist
5351 // (such as loading iframes in IE - #4833)
5352 var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5353
5354 return documentElement ? documentElement.nodeName !== "HTML" : false;
5355 };
5356
5357 var posProcess = function( selector, context, seed ) {
5358 var match,
5359 tmpSet = [],
5360 later = "",
5361 root = context.nodeType ? [context] : context;
5362
5363 // Position selectors must be done after the filter
5364 // And so must :not(positional) so we move all PSEUDOs to the end
5365 while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5366 later += match[0];
5367 selector = selector.replace( Expr.match.PSEUDO, "" );
5368 }
5369
5370 selector = Expr.relative[selector] ? selector + "*" : selector;
5371
5372 for ( var i = 0, l = root.length; i < l; i++ ) {
5373 Sizzle( selector, root[i], tmpSet, seed );
5374 }
5375
5376 return Sizzle.filter( later, tmpSet );
5377 };
5378
5379 // EXPOSE
5380 // Override sizzle attribute retrieval
5381 Sizzle.attr = jQuery.attr;
5382 Sizzle.selectors.attrMap = {};
5383 jQuery.find = Sizzle;
5384 jQuery.expr = Sizzle.selectors;
5385 jQuery.expr[":"] = jQuery.expr.filters;
5386 jQuery.unique = Sizzle.uniqueSort;
5387 jQuery.text = Sizzle.getText;
5388 jQuery.isXMLDoc = Sizzle.isXML;
5389 jQuery.contains = Sizzle.contains;
5390
5391
5392 })();
5393
5394
5395 var runtil = /Until$/,
5396 rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5397 // Note: This RegExp should be improved, or likely pulled from Sizzle
5398 rmultiselector = /,/,
5399 isSimple = /^.[^:#\[\.,]*$/,
5400 slice = Array.prototype.slice,
5401 POS = jQuery.expr.match.globalPOS,
5402 // methods guaranteed to produce a unique set when starting from a unique set
5403 guaranteedUnique = {
5404 children: true,
5405 contents: true,
5406 next: true,
5407 prev: true
5408 };
5409
5410 jQuery.fn.extend({
5411 find: function( selector ) {
5412 var self = this,
5413 i, l;
5414
5415 if ( typeof selector !== "string" ) {
5416 return jQuery( selector ).filter(function() {
5417 for ( i = 0, l = self.length; i < l; i++ ) {
5418 if ( jQuery.contains( self[ i ], this ) ) {
5419 return true;
5420 }
5421 }
5422 });
5423 }
5424
5425 var ret = this.pushStack( "", "find", selector ),
5426 length, n, r;
5427
5428 for ( i = 0, l = this.length; i < l; i++ ) {
5429 length = ret.length;
5430 jQuery.find( selector, this[i], ret );
5431
5432 if ( i > 0 ) {
5433 // Make sure that the results are unique
5434 for ( n = length; n < ret.length; n++ ) {
5435 for ( r = 0; r < length; r++ ) {
5436 if ( ret[r] === ret[n] ) {
5437 ret.splice(n--, 1);
5438 break;
5439 }
5440 }
5441 }
5442 }
5443 }
5444
5445 return ret;
5446 },
5447
5448 has: function( target ) {
5449 var targets = jQuery( target );
5450 return this.filter(function() {
5451 for ( var i = 0, l = targets.length; i < l; i++ ) {
5452 if ( jQuery.contains( this, targets[i] ) ) {
5453 return true;
5454 }
5455 }
5456 });
5457 },
5458
5459 not: function( selector ) {
5460 return this.pushStack( winnow(this, selector, false), "not", selector);
5461 },
5462
5463 filter: function( selector ) {
5464 return this.pushStack( winnow(this, selector, true), "filter", selector );
5465 },
5466
5467 is: function( selector ) {
5468 return !!selector && (
5469 typeof selector === "string" ?
5470 // If this is a positional selector, check membership in the returned set
5471 // so $("p:first").is("p:last") won't return true for a doc with two "p".
5472 POS.test( selector ) ?
5473 jQuery( selector, this.context ).index( this[0] ) >= 0 :
5474 jQuery.filter( selector, this ).length > 0 :
5475 this.filter( selector ).length > 0 );
5476 },
5477
5478 closest: function( selectors, context ) {
5479 var ret = [], i, l, cur = this[0];
5480
5481 // Array (deprecated as of jQuery 1.7)
5482 if ( jQuery.isArray( selectors ) ) {
5483 var level = 1;
5484
5485 while ( cur && cur.ownerDocument && cur !== context ) {
5486 for ( i = 0; i < selectors.length; i++ ) {
5487
5488 if ( jQuery( cur ).is( selectors[ i ] ) ) {
5489 ret.push({ selector: selectors[ i ], elem: cur, level: level });
5490 }
5491 }
5492
5493 cur = cur.parentNode;
5494 level++;
5495 }
5496
5497 return ret;
5498 }
5499
5500 // String
5501 var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5502 jQuery( selectors, context || this.context ) :
5503 0;
5504
5505 for ( i = 0, l = this.length; i < l; i++ ) {
5506 cur = this[i];
5507
5508 while ( cur ) {
5509 if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5510 ret.push( cur );
5511 break;
5512
5513 } else {
5514 cur = cur.parentNode;
5515 if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5516 break;
5517 }
5518 }
5519 }
5520 }
5521
5522 ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5523
5524 return this.pushStack( ret, "closest", selectors );
5525 },
5526
5527 // Determine the position of an element within
5528 // the matched set of elements
5529 index: function( elem ) {
5530
5531 // No argument, return index in parent
5532 if ( !elem ) {
5533 return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
5534 }
5535
5536 // index in selector
5537 if ( typeof elem === "string" ) {
5538 return jQuery.inArray( this[0], jQuery( elem ) );
5539 }
5540
5541 // Locate the position of the desired element
5542 return jQuery.inArray(
5543 // If it receives a jQuery object, the first element is used
5544 elem.jquery ? elem[0] : elem, this );
5545 },
5546
5547 add: function( selector, context ) {
5548 var set = typeof selector === "string" ?
5549 jQuery( selector, context ) :
5550 jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5551 all = jQuery.merge( this.get(), set );
5552
5553 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5554 all :
5555 jQuery.unique( all ) );
5556 },
5557
5558 andSelf: function() {
5559 return this.add( this.prevObject );
5560 }
5561 });
5562
5563 // A painfully simple check to see if an element is disconnected
5564 // from a document (should be improved, where feasible).
5565 function isDisconnected( node ) {
5566 return !node || !node.parentNode || node.parentNode.nodeType === 11;
5567 }
5568
5569 jQuery.each({
5570 parent: function( elem ) {
5571 var parent = elem.parentNode;
5572 return parent && parent.nodeType !== 11 ? parent : null;
5573 },
5574 parents: function( elem ) {
5575 return jQuery.dir( elem, "parentNode" );
5576 },
5577 parentsUntil: function( elem, i, until ) {
5578 return jQuery.dir( elem, "parentNode", until );
5579 },
5580 next: function( elem ) {
5581 return jQuery.nth( elem, 2, "nextSibling" );
5582 },
5583 prev: function( elem ) {
5584 return jQuery.nth( elem, 2, "previousSibling" );
5585 },
5586 nextAll: function( elem ) {
5587 return jQuery.dir( elem, "nextSibling" );
5588 },
5589 prevAll: function( elem ) {
5590 return jQuery.dir( elem, "previousSibling" );
5591 },
5592 nextUntil: function( elem, i, until ) {
5593 return jQuery.dir( elem, "nextSibling", until );
5594 },
5595 prevUntil: function( elem, i, until ) {
5596 return jQuery.dir( elem, "previousSibling", until );
5597 },
5598 siblings: function( elem ) {
5599 return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
5600 },
5601 children: function( elem ) {
5602 return jQuery.sibling( elem.firstChild );
5603 },
5604 contents: function( elem ) {
5605 return jQuery.nodeName( elem, "iframe" ) ?
5606 elem.contentDocument || elem.contentWindow.document :
5607 jQuery.makeArray( elem.childNodes );
5608 }
5609 }, function( name, fn ) {
5610 jQuery.fn[ name ] = function( until, selector ) {
5611 var ret = jQuery.map( this, fn, until );
5612
5613 if ( !runtil.test( name ) ) {
5614 selector = until;
5615 }
5616
5617 if ( selector && typeof selector === "string" ) {
5618 ret = jQuery.filter( selector, ret );
5619 }
5620
5621 ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5622
5623 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5624 ret = ret.reverse();
5625 }
5626
5627 return this.pushStack( ret, name, slice.call( arguments ).join(",") );
5628 };
5629 });
5630
5631 jQuery.extend({
5632 filter: function( expr, elems, not ) {
5633 if ( not ) {
5634 expr = ":not(" + expr + ")";
5635 }
5636
5637 return elems.length === 1 ?
5638 jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5639 jQuery.find.matches(expr, elems);
5640 },
5641
5642 dir: function( elem, dir, until ) {
5643 var matched = [],
5644 cur = elem[ dir ];
5645
5646 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5647 if ( cur.nodeType === 1 ) {
5648 matched.push( cur );
5649 }
5650 cur = cur[dir];
5651 }
5652 return matched;
5653 },
5654
5655 nth: function( cur, result, dir, elem ) {
5656 result = result || 1;
5657 var num = 0;
5658
5659 for ( ; cur; cur = cur[dir] ) {
5660 if ( cur.nodeType === 1 && ++num === result ) {
5661 break;
5662 }
5663 }
5664
5665 return cur;
5666 },
5667
5668 sibling: function( n, elem ) {
5669 var r = [];
5670
5671 for ( ; n; n = n.nextSibling ) {
5672 if ( n.nodeType === 1 && n !== elem ) {
5673 r.push( n );
5674 }
5675 }
5676
5677 return r;
5678 }
5679 });
5680
5681 // Implement the identical functionality for filter and not
5682 function winnow( elements, qualifier, keep ) {
5683
5684 // Can't pass null or undefined to indexOf in Firefox 4
5685 // Set to 0 to skip string check
5686 qualifier = qualifier || 0;
5687
5688 if ( jQuery.isFunction( qualifier ) ) {
5689 return jQuery.grep(elements, function( elem, i ) {
5690 var retVal = !!qualifier.call( elem, i, elem );
5691 return retVal === keep;
5692 });
5693
5694 } else if ( qualifier.nodeType ) {
5695 return jQuery.grep(elements, function( elem, i ) {
5696 return ( elem === qualifier ) === keep;
5697 });
5698
5699 } else if ( typeof qualifier === "string" ) {
5700 var filtered = jQuery.grep(elements, function( elem ) {
5701 return elem.nodeType === 1;
5702 });
5703
5704 if ( isSimple.test( qualifier ) ) {
5705 return jQuery.filter(qualifier, filtered, !keep);
5706 } else {
5707 qualifier = jQuery.filter( qualifier, filtered );
5708 }
5709 }
5710
5711 return jQuery.grep(elements, function( elem, i ) {
5712 return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5713 });
5714 }
5715
5716
57175297
57185298
57195299 function createSafeFragment( document ) {
57205300 var list = nodeNames.split( "|" ),
5721 safeFrag = document.createDocumentFragment();
5301 safeFrag = document.createDocumentFragment();
57225302
57235303 if ( safeFrag.createElement ) {
57245304 while ( list.length ) {
57325312
57335313 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
57345314 "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5735 rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5315 rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5316 rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
57365317 rleadingWhitespace = /^\s+/,
5737 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5318 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
57385319 rtagName = /<([\w:]+)/,
57395320 rtbody = /<tbody/i,
57405321 rhtml = /<|&#?\w+;/,
5741 rnoInnerhtml = /<(?:script|style)/i,
5742 rnocache = /<(?:script|object|embed|option|style)/i,
5743 rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5322 rnoInnerhtml = /<(?:script|style|link)/i,
57445323 // checked="checked" or checked
57455324 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5746 rscriptType = /\/(java|ecma)script/i,
5747 rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5325 rscriptType = /^$|\/(?:java|ecma)script/i,
5326 rscriptTypeMasked = /^true\/(.*)/,
5327 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5328
5329 // We have to close these tags to support XHTML (#13200)
57485330 wrapMap = {
57495331 option: [ 1, "<select multiple='multiple'>", "</select>" ],
57505332 legend: [ 1, "<fieldset>", "</fieldset>" ],
5333 area: [ 1, "<map>", "</map>" ],
5334 param: [ 1, "<object>", "</object>" ],
57515335 thead: [ 1, "<table>", "</table>" ],
57525336 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5337 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
57535338 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5754 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5755 area: [ 1, "<map>", "</map>" ],
5756 _default: [ 0, "", "" ]
5757 },
5758 safeFragment = createSafeFragment( document );
5339
5340 // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
5341 // unless wrapped in a div with non-breaking characters in front of it.
5342 _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
5343 },
5344 safeFragment = createSafeFragment( document ),
5345 fragmentDiv = safeFragment.appendChild( document.createElement("div") );
57595346
57605347 wrapMap.optgroup = wrapMap.option;
57615348 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
57625349 wrapMap.th = wrapMap.td;
57635350
5764 // IE can't serialize <link> and <script> tags normally
5765 if ( !jQuery.support.htmlSerialize ) {
5766 wrapMap._default = [ 1, "div<div>", "</div>" ];
5351 function getAll( context, tag ) {
5352 var elems, elem,
5353 i = 0,
5354 found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
5355 typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
5356 undefined;
5357
5358 if ( !found ) {
5359 for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
5360 if ( !tag || jQuery.nodeName( elem, tag ) ) {
5361 found.push( elem );
5362 } else {
5363 jQuery.merge( found, getAll( elem, tag ) );
5364 }
5365 }
5366 }
5367
5368 return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
5369 jQuery.merge( [ context ], found ) :
5370 found;
57675371 }
5372
5373 // Used in buildFragment, fixes the defaultChecked property
5374 function fixDefaultChecked( elem ) {
5375 if ( rcheckableType.test( elem.type ) ) {
5376 elem.defaultChecked = elem.checked;
5377 }
5378 }
5379
5380 // Support: IE<8
5381 // Manipulating tables requires a tbody
5382 function manipulationTarget( elem, content ) {
5383 return jQuery.nodeName( elem, "table" ) &&
5384 jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
5385
5386 elem.getElementsByTagName("tbody")[0] ||
5387 elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
5388 elem;
5389 }
5390
5391 // Replace/restore the type attribute of script elements for safe DOM manipulation
5392 function disableScript( elem ) {
5393 elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
5394 return elem;
5395 }
5396 function restoreScript( elem ) {
5397 var match = rscriptTypeMasked.exec( elem.type );
5398 if ( match ) {
5399 elem.type = match[1];
5400 } else {
5401 elem.removeAttribute("type");
5402 }
5403 return elem;
5404 }
5405
5406 // Mark scripts as having already been evaluated
5407 function setGlobalEval( elems, refElements ) {
5408 var elem,
5409 i = 0;
5410 for ( ; (elem = elems[i]) != null; i++ ) {
5411 jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
5412 }
5413 }
5414
5415 function cloneCopyEvent( src, dest ) {
5416
5417 if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5418 return;
5419 }
5420
5421 var type, i, l,
5422 oldData = jQuery._data( src ),
5423 curData = jQuery._data( dest, oldData ),
5424 events = oldData.events;
5425
5426 if ( events ) {
5427 delete curData.handle;
5428 curData.events = {};
5429
5430 for ( type in events ) {
5431 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5432 jQuery.event.add( dest, type, events[ type ][ i ] );
5433 }
5434 }
5435 }
5436
5437 // make the cloned public data object a copy from the original
5438 if ( curData.data ) {
5439 curData.data = jQuery.extend( {}, curData.data );
5440 }
5441 }
5442
5443 function fixCloneNodeIssues( src, dest ) {
5444 var nodeName, e, data;
5445
5446 // We do not need to do anything for non-Elements
5447 if ( dest.nodeType !== 1 ) {
5448 return;
5449 }
5450
5451 nodeName = dest.nodeName.toLowerCase();
5452
5453 // IE6-8 copies events bound via attachEvent when using cloneNode.
5454 if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
5455 data = jQuery._data( dest );
5456
5457 for ( e in data.events ) {
5458 jQuery.removeEvent( dest, e, data.handle );
5459 }
5460
5461 // Event data gets referenced instead of copied if the expando gets copied too
5462 dest.removeAttribute( jQuery.expando );
5463 }
5464
5465 // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5466 if ( nodeName === "script" && dest.text !== src.text ) {
5467 disableScript( dest ).text = src.text;
5468 restoreScript( dest );
5469
5470 // IE6-10 improperly clones children of object elements using classid.
5471 // IE10 throws NoModificationAllowedError if parent is null, #12132.
5472 } else if ( nodeName === "object" ) {
5473 if ( dest.parentNode ) {
5474 dest.outerHTML = src.outerHTML;
5475 }
5476
5477 // This path appears unavoidable for IE9. When cloning an object
5478 // element in IE9, the outerHTML strategy above is not sufficient.
5479 // If the src has innerHTML and the destination does not,
5480 // copy the src.innerHTML into the dest.innerHTML. #10324
5481 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
5482 dest.innerHTML = src.innerHTML;
5483 }
5484
5485 } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5486 // IE6-8 fails to persist the checked state of a cloned checkbox
5487 // or radio button. Worse, IE6-7 fail to give the cloned element
5488 // a checked appearance if the defaultChecked value isn't also set
5489
5490 dest.defaultChecked = dest.checked = src.checked;
5491
5492 // IE6-7 get confused and end up setting the value of a cloned
5493 // checkbox/radio button to an empty string instead of "on"
5494 if ( dest.value !== src.value ) {
5495 dest.value = src.value;
5496 }
5497
5498 // IE6-8 fails to return the selected option to the default selected
5499 // state when cloning options
5500 } else if ( nodeName === "option" ) {
5501 dest.defaultSelected = dest.selected = src.defaultSelected;
5502
5503 // IE6-8 fails to set the defaultValue to the correct value when
5504 // cloning other types of input fields
5505 } else if ( nodeName === "input" || nodeName === "textarea" ) {
5506 dest.defaultValue = src.defaultValue;
5507 }
5508 }
5509
5510 jQuery.extend({
5511 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5512 var destElements, node, clone, i, srcElements,
5513 inPage = jQuery.contains( elem.ownerDocument, elem );
5514
5515 if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
5516 clone = elem.cloneNode( true );
5517
5518 // IE<=8 does not properly clone detached, unknown element nodes
5519 } else {
5520 fragmentDiv.innerHTML = elem.outerHTML;
5521 fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
5522 }
5523
5524 if ( (!support.noCloneEvent || !support.noCloneChecked) &&
5525 (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5526
5527 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5528 destElements = getAll( clone );
5529 srcElements = getAll( elem );
5530
5531 // Fix all IE cloning issues
5532 for ( i = 0; (node = srcElements[i]) != null; ++i ) {
5533 // Ensure that the destination node is not null; Fixes #9587
5534 if ( destElements[i] ) {
5535 fixCloneNodeIssues( node, destElements[i] );
5536 }
5537 }
5538 }
5539
5540 // Copy the events from the original to the clone
5541 if ( dataAndEvents ) {
5542 if ( deepDataAndEvents ) {
5543 srcElements = srcElements || getAll( elem );
5544 destElements = destElements || getAll( clone );
5545
5546 for ( i = 0; (node = srcElements[i]) != null; i++ ) {
5547 cloneCopyEvent( node, destElements[i] );
5548 }
5549 } else {
5550 cloneCopyEvent( elem, clone );
5551 }
5552 }
5553
5554 // Preserve script evaluation history
5555 destElements = getAll( clone, "script" );
5556 if ( destElements.length > 0 ) {
5557 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5558 }
5559
5560 destElements = srcElements = node = null;
5561
5562 // Return the cloned set
5563 return clone;
5564 },
5565
5566 buildFragment: function( elems, context, scripts, selection ) {
5567 var j, elem, contains,
5568 tmp, tag, tbody, wrap,
5569 l = elems.length,
5570
5571 // Ensure a safe fragment
5572 safe = createSafeFragment( context ),
5573
5574 nodes = [],
5575 i = 0;
5576
5577 for ( ; i < l; i++ ) {
5578 elem = elems[ i ];
5579
5580 if ( elem || elem === 0 ) {
5581
5582 // Add nodes directly
5583 if ( jQuery.type( elem ) === "object" ) {
5584 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5585
5586 // Convert non-html into a text node
5587 } else if ( !rhtml.test( elem ) ) {
5588 nodes.push( context.createTextNode( elem ) );
5589
5590 // Convert html into DOM nodes
5591 } else {
5592 tmp = tmp || safe.appendChild( context.createElement("div") );
5593
5594 // Deserialize a standard representation
5595 tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
5596 wrap = wrapMap[ tag ] || wrapMap._default;
5597
5598 tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
5599
5600 // Descend through wrappers to the right content
5601 j = wrap[0];
5602 while ( j-- ) {
5603 tmp = tmp.lastChild;
5604 }
5605
5606 // Manually add leading whitespace removed by IE
5607 if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5608 nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
5609 }
5610
5611 // Remove IE's autoinserted <tbody> from table fragments
5612 if ( !support.tbody ) {
5613
5614 // String was a <table>, *may* have spurious <tbody>
5615 elem = tag === "table" && !rtbody.test( elem ) ?
5616 tmp.firstChild :
5617
5618 // String was a bare <thead> or <tfoot>
5619 wrap[1] === "<table>" && !rtbody.test( elem ) ?
5620 tmp :
5621 0;
5622
5623 j = elem && elem.childNodes.length;
5624 while ( j-- ) {
5625 if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
5626 elem.removeChild( tbody );
5627 }
5628 }
5629 }
5630
5631 jQuery.merge( nodes, tmp.childNodes );
5632
5633 // Fix #12392 for WebKit and IE > 9
5634 tmp.textContent = "";
5635
5636 // Fix #12392 for oldIE
5637 while ( tmp.firstChild ) {
5638 tmp.removeChild( tmp.firstChild );
5639 }
5640
5641 // Remember the top-level container for proper cleanup
5642 tmp = safe.lastChild;
5643 }
5644 }
5645 }
5646
5647 // Fix #11356: Clear elements from fragment
5648 if ( tmp ) {
5649 safe.removeChild( tmp );
5650 }
5651
5652 // Reset defaultChecked for any radios and checkboxes
5653 // about to be appended to the DOM in IE 6/7 (#8060)
5654 if ( !support.appendChecked ) {
5655 jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
5656 }
5657
5658 i = 0;
5659 while ( (elem = nodes[ i++ ]) ) {
5660
5661 // #4087 - If origin and destination elements are the same, and this is
5662 // that element, do not do anything
5663 if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
5664 continue;
5665 }
5666
5667 contains = jQuery.contains( elem.ownerDocument, elem );
5668
5669 // Append to fragment
5670 tmp = getAll( safe.appendChild( elem ), "script" );
5671
5672 // Preserve script evaluation history
5673 if ( contains ) {
5674 setGlobalEval( tmp );
5675 }
5676
5677 // Capture executables
5678 if ( scripts ) {
5679 j = 0;
5680 while ( (elem = tmp[ j++ ]) ) {
5681 if ( rscriptType.test( elem.type || "" ) ) {
5682 scripts.push( elem );
5683 }
5684 }
5685 }
5686 }
5687
5688 tmp = null;
5689
5690 return safe;
5691 },
5692
5693 cleanData: function( elems, /* internal */ acceptData ) {
5694 var elem, type, id, data,
5695 i = 0,
5696 internalKey = jQuery.expando,
5697 cache = jQuery.cache,
5698 deleteExpando = support.deleteExpando,
5699 special = jQuery.event.special;
5700
5701 for ( ; (elem = elems[i]) != null; i++ ) {
5702 if ( acceptData || jQuery.acceptData( elem ) ) {
5703
5704 id = elem[ internalKey ];
5705 data = id && cache[ id ];
5706
5707 if ( data ) {
5708 if ( data.events ) {
5709 for ( type in data.events ) {
5710 if ( special[ type ] ) {
5711 jQuery.event.remove( elem, type );
5712
5713 // This is a shortcut to avoid jQuery.event.remove's overhead
5714 } else {
5715 jQuery.removeEvent( elem, type, data.handle );
5716 }
5717 }
5718 }
5719
5720 // Remove cache only if it was not already removed by jQuery.event.remove
5721 if ( cache[ id ] ) {
5722
5723 delete cache[ id ];
5724
5725 // IE does not allow us to delete expando properties from nodes,
5726 // nor does it have a removeAttribute function on Document nodes;
5727 // we must handle all of these cases
5728 if ( deleteExpando ) {
5729 delete elem[ internalKey ];
5730
5731 } else if ( typeof elem.removeAttribute !== strundefined ) {
5732 elem.removeAttribute( internalKey );
5733
5734 } else {
5735 elem[ internalKey ] = null;
5736 }
5737
5738 deletedIds.push( id );
5739 }
5740 }
5741 }
5742 }
5743 }
5744 });
57685745
57695746 jQuery.fn.extend({
57705747 text: function( value ) {
5771 return jQuery.access( this, function( value ) {
5748 return access( this, function( value ) {
57725749 return value === undefined ?
57735750 jQuery.text( this ) :
57745751 this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
57755752 }, null, value, arguments.length );
57765753 },
57775754
5778 wrapAll: function( html ) {
5779 if ( jQuery.isFunction( html ) ) {
5780 return this.each(function(i) {
5781 jQuery(this).wrapAll( html.call(this, i) );
5782 });
5783 }
5784
5785 if ( this[0] ) {
5786 // The elements to wrap the target around
5787 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5788
5789 if ( this[0].parentNode ) {
5790 wrap.insertBefore( this[0] );
5791 }
5792
5793 wrap.map(function() {
5794 var elem = this;
5795
5796 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5797 elem = elem.firstChild;
5798 }
5799
5800 return elem;
5801 }).append( this );
5755 append: function() {
5756 return this.domManip( arguments, function( elem ) {
5757 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5758 var target = manipulationTarget( this, elem );
5759 target.appendChild( elem );
5760 }
5761 });
5762 },
5763
5764 prepend: function() {
5765 return this.domManip( arguments, function( elem ) {
5766 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5767 var target = manipulationTarget( this, elem );
5768 target.insertBefore( elem, target.firstChild );
5769 }
5770 });
5771 },
5772
5773 before: function() {
5774 return this.domManip( arguments, function( elem ) {
5775 if ( this.parentNode ) {
5776 this.parentNode.insertBefore( elem, this );
5777 }
5778 });
5779 },
5780
5781 after: function() {
5782 return this.domManip( arguments, function( elem ) {
5783 if ( this.parentNode ) {
5784 this.parentNode.insertBefore( elem, this.nextSibling );
5785 }
5786 });
5787 },
5788
5789 remove: function( selector, keepData /* Internal Use Only */ ) {
5790 var elem,
5791 elems = selector ? jQuery.filter( selector, this ) : this,
5792 i = 0;
5793
5794 for ( ; (elem = elems[i]) != null; i++ ) {
5795
5796 if ( !keepData && elem.nodeType === 1 ) {
5797 jQuery.cleanData( getAll( elem ) );
5798 }
5799
5800 if ( elem.parentNode ) {
5801 if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5802 setGlobalEval( getAll( elem, "script" ) );
5803 }
5804 elem.parentNode.removeChild( elem );
5805 }
58025806 }
58035807
58045808 return this;
58055809 },
58065810
5807 wrapInner: function( html ) {
5808 if ( jQuery.isFunction( html ) ) {
5809 return this.each(function(i) {
5810 jQuery(this).wrapInner( html.call(this, i) );
5811 });
5812 }
5813
5814 return this.each(function() {
5815 var self = jQuery( this ),
5816 contents = self.contents();
5817
5818 if ( contents.length ) {
5819 contents.wrapAll( html );
5820
5821 } else {
5822 self.append( html );
5823 }
5824 });
5825 },
5826
5827 wrap: function( html ) {
5828 var isFunction = jQuery.isFunction( html );
5829
5830 return this.each(function(i) {
5831 jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5832 });
5833 },
5834
5835 unwrap: function() {
5836 return this.parent().each(function() {
5837 if ( !jQuery.nodeName( this, "body" ) ) {
5838 jQuery( this ).replaceWith( this.childNodes );
5839 }
5840 }).end();
5841 },
5842
5843 append: function() {
5844 return this.domManip(arguments, true, function( elem ) {
5845 if ( this.nodeType === 1 ) {
5846 this.appendChild( elem );
5847 }
5848 });
5849 },
5850
5851 prepend: function() {
5852 return this.domManip(arguments, true, function( elem ) {
5853 if ( this.nodeType === 1 ) {
5854 this.insertBefore( elem, this.firstChild );
5855 }
5856 });
5857 },
5858
5859 before: function() {
5860 if ( this[0] && this[0].parentNode ) {
5861 return this.domManip(arguments, false, function( elem ) {
5862 this.parentNode.insertBefore( elem, this );
5863 });
5864 } else if ( arguments.length ) {
5865 var set = jQuery.clean( arguments );
5866 set.push.apply( set, this.toArray() );
5867 return this.pushStack( set, "before", arguments );
5868 }
5869 },
5870
5871 after: function() {
5872 if ( this[0] && this[0].parentNode ) {
5873 return this.domManip(arguments, false, function( elem ) {
5874 this.parentNode.insertBefore( elem, this.nextSibling );
5875 });
5876 } else if ( arguments.length ) {
5877 var set = this.pushStack( this, "after", arguments );
5878 set.push.apply( set, jQuery.clean(arguments) );
5879 return set;
5880 }
5881 },
5882
5883 // keepData is for internal use only--do not document
5884 remove: function( selector, keepData ) {
5885 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5886 if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5887 if ( !keepData && elem.nodeType === 1 ) {
5888 jQuery.cleanData( elem.getElementsByTagName("*") );
5889 jQuery.cleanData( [ elem ] );
5890 }
5891
5892 if ( elem.parentNode ) {
5893 elem.parentNode.removeChild( elem );
5894 }
5895 }
5896 }
5897
5898 return this;
5899 },
5900
59015811 empty: function() {
5902 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5812 var elem,
5813 i = 0;
5814
5815 for ( ; (elem = this[i]) != null; i++ ) {
59035816 // Remove element nodes and prevent memory leaks
59045817 if ( elem.nodeType === 1 ) {
5905 jQuery.cleanData( elem.getElementsByTagName("*") );
5818 jQuery.cleanData( getAll( elem, false ) );
59065819 }
59075820
59085821 // Remove any remaining nodes
59095822 while ( elem.firstChild ) {
59105823 elem.removeChild( elem.firstChild );
59115824 }
5825
5826 // If this is a select, ensure that it displays empty (#12336)
5827 // Support: IE<9
5828 if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
5829 elem.options.length = 0;
5830 }
59125831 }
59135832
59145833 return this;
59185837 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
59195838 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
59205839
5921 return this.map( function () {
5840 return this.map(function() {
59225841 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
59235842 });
59245843 },
59255844
59265845 html: function( value ) {
5927 return jQuery.access( this, function( value ) {
5928 var elem = this[0] || {},
5846 return access( this, function( value ) {
5847 var elem = this[ 0 ] || {},
59295848 i = 0,
59305849 l = this.length;
59315850
59325851 if ( value === undefined ) {
59335852 return elem.nodeType === 1 ?
59345853 elem.innerHTML.replace( rinlinejQuery, "" ) :
5935 null;
5936 }
5937
5938
5854 undefined;
5855 }
5856
5857 // See if we can take a shortcut and just use innerHTML
59395858 if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5940 ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
5941 !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
5859 ( support.htmlSerialize || !rnoshimcache.test( value ) ) &&
5860 ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
5861 !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
59425862
59435863 value = value.replace( rxhtmlTag, "<$1></$2>" );
59445864
59475867 // Remove element nodes and prevent memory leaks
59485868 elem = this[i] || {};
59495869 if ( elem.nodeType === 1 ) {
5950 jQuery.cleanData( elem.getElementsByTagName( "*" ) );
5870 jQuery.cleanData( getAll( elem, false ) );
59515871 elem.innerHTML = value;
59525872 }
59535873 }
59645884 }, null, value, arguments.length );
59655885 },
59665886
5967 replaceWith: function( value ) {
5968 if ( this[0] && this[0].parentNode ) {
5969 // Make sure that the elements are removed from the DOM before they are inserted
5970 // this can help fix replacing a parent with child elements
5971 if ( jQuery.isFunction( value ) ) {
5972 return this.each(function(i) {
5973 var self = jQuery(this), old = self.html();
5974 self.replaceWith( value.call( this, i, old ) );
5975 });
5976 }
5977
5978 if ( typeof value !== "string" ) {
5979 value = jQuery( value ).detach();
5980 }
5981
5982 return this.each(function() {
5983 var next = this.nextSibling,
5984 parent = this.parentNode;
5985
5986 jQuery( this ).remove();
5987
5988 if ( next ) {
5989 jQuery(next).before( value );
5990 } else {
5991 jQuery(parent).append( value );
5992 }
5993 });
5994 } else {
5995 return this.length ?
5996 this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5997 this;
5998 }
5887 replaceWith: function() {
5888 var arg = arguments[ 0 ];
5889
5890 // Make the changes, replacing each context element with the new content
5891 this.domManip( arguments, function( elem ) {
5892 arg = this.parentNode;
5893
5894 jQuery.cleanData( getAll( this ) );
5895
5896 if ( arg ) {
5897 arg.replaceChild( elem, this );
5898 }
5899 });
5900
5901 // Force removal if there was no new content (e.g., from empty arguments)
5902 return arg && (arg.length || arg.nodeType) ? this : this.remove();
59995903 },
60005904
60015905 detach: function( selector ) {
60025906 return this.remove( selector, true );
60035907 },
60045908
6005 domManip: function( args, table, callback ) {
6006 var results, first, fragment, parent,
5909 domManip: function( args, callback ) {
5910
5911 // Flatten any nested arrays
5912 args = concat.apply( [], args );
5913
5914 var first, node, hasScripts,
5915 scripts, doc, fragment,
5916 i = 0,
5917 l = this.length,
5918 set = this,
5919 iNoClone = l - 1,
60075920 value = args[0],
6008 scripts = [];
5921 isFunction = jQuery.isFunction( value );
60095922
60105923 // We can't cloneNode fragments that contain checked, in WebKit
6011 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
6012 return this.each(function() {
6013 jQuery(this).domManip( args, table, callback, true );
5924 if ( isFunction ||
5925 ( l > 1 && typeof value === "string" &&
5926 !support.checkClone && rchecked.test( value ) ) ) {
5927 return this.each(function( index ) {
5928 var self = set.eq( index );
5929 if ( isFunction ) {
5930 args[0] = value.call( this, index, self.html() );
5931 }
5932 self.domManip( args, callback );
60145933 });
60155934 }
60165935
6017 if ( jQuery.isFunction(value) ) {
6018 return this.each(function(i) {
6019 var self = jQuery(this);
6020 args[0] = value.call(this, i, table ? self.html() : undefined);
6021 self.domManip( args, table, callback );
6022 });
6023 }
6024
6025 if ( this[0] ) {
6026 parent = value && value.parentNode;
6027
6028 // If we're in a fragment, just use that instead of building a new one
6029 if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
6030 results = { fragment: parent };
6031
6032 } else {
6033 results = jQuery.buildFragment( args, this, scripts );
6034 }
6035
6036 fragment = results.fragment;
5936 if ( l ) {
5937 fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
5938 first = fragment.firstChild;
60375939
60385940 if ( fragment.childNodes.length === 1 ) {
6039 first = fragment = fragment.firstChild;
6040 } else {
6041 first = fragment.firstChild;
5941 fragment = first;
60425942 }
60435943
60445944 if ( first ) {
6045 table = table && jQuery.nodeName( first, "tr" );
6046
6047 for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
6048 callback.call(
6049 table ?
6050 root(this[i], first) :
6051 this[i],
6052 // Make sure that we do not leak memory by inadvertently discarding
6053 // the original fragment (which might have attached data) instead of
6054 // using it; in addition, use the original fragment object for the last
6055 // item instead of first because it can end up being emptied incorrectly
6056 // in certain situations (Bug #8070).
6057 // Fragments from the fragment cache must always be cloned and never used
6058 // in place.
6059 results.cacheable || ( l > 1 && i < lastIndex ) ?
6060 jQuery.clone( fragment, true, true ) :
6061 fragment
6062 );
6063 }
6064 }
6065
6066 if ( scripts.length ) {
6067 jQuery.each( scripts, function( i, elem ) {
6068 if ( elem.src ) {
6069 jQuery.ajax({
6070 type: "GET",
6071 global: false,
6072 url: elem.src,
6073 async: false,
6074 dataType: "script"
6075 });
6076 } else {
6077 jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
5945 scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5946 hasScripts = scripts.length;
5947
5948 // Use the original fragment for the last item instead of the first because it can end up
5949 // being emptied incorrectly in certain situations (#8070).
5950 for ( ; i < l; i++ ) {
5951 node = fragment;
5952
5953 if ( i !== iNoClone ) {
5954 node = jQuery.clone( node, true, true );
5955
5956 // Keep references to cloned scripts for later restoration
5957 if ( hasScripts ) {
5958 jQuery.merge( scripts, getAll( node, "script" ) );
5959 }
60785960 }
60795961
6080 if ( elem.parentNode ) {
6081 elem.parentNode.removeChild( elem );
5962 callback.call( this[i], node, i );
5963 }
5964
5965 if ( hasScripts ) {
5966 doc = scripts[ scripts.length - 1 ].ownerDocument;
5967
5968 // Reenable scripts
5969 jQuery.map( scripts, restoreScript );
5970
5971 // Evaluate executable scripts on first document insertion
5972 for ( i = 0; i < hasScripts; i++ ) {
5973 node = scripts[ i ];
5974 if ( rscriptType.test( node.type || "" ) &&
5975 !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
5976
5977 if ( node.src ) {
5978 // Optional AJAX dependency, but won't run scripts if not present
5979 if ( jQuery._evalUrl ) {
5980 jQuery._evalUrl( node.src );
5981 }
5982 } else {
5983 jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
5984 }
5985 }
60825986 }
6083 });
5987 }
5988
5989 // Fix #11809: Avoid leaking memory
5990 fragment = first = null;
60845991 }
60855992 }
60865993
60875994 return this;
60885995 }
60895996 });
6090
6091 function root( elem, cur ) {
6092 return jQuery.nodeName(elem, "table") ?
6093 (elem.getElementsByTagName("tbody")[0] ||
6094 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
6095 elem;
6096 }
6097
6098 function cloneCopyEvent( src, dest ) {
6099
6100 if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6101 return;
6102 }
6103
6104 var type, i, l,
6105 oldData = jQuery._data( src ),
6106 curData = jQuery._data( dest, oldData ),
6107 events = oldData.events;
6108
6109 if ( events ) {
6110 delete curData.handle;
6111 curData.events = {};
6112
6113 for ( type in events ) {
6114 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6115 jQuery.event.add( dest, type, events[ type ][ i ] );
6116 }
6117 }
6118 }
6119
6120 // make the cloned public data object a copy from the original
6121 if ( curData.data ) {
6122 curData.data = jQuery.extend( {}, curData.data );
6123 }
6124 }
6125
6126 function cloneFixAttributes( src, dest ) {
6127 var nodeName;
6128
6129 // We do not need to do anything for non-Elements
6130 if ( dest.nodeType !== 1 ) {
6131 return;
6132 }
6133
6134 // clearAttributes removes the attributes, which we don't want,
6135 // but also removes the attachEvent events, which we *do* want
6136 if ( dest.clearAttributes ) {
6137 dest.clearAttributes();
6138 }
6139
6140 // mergeAttributes, in contrast, only merges back on the
6141 // original attributes, not the events
6142 if ( dest.mergeAttributes ) {
6143 dest.mergeAttributes( src );
6144 }
6145
6146 nodeName = dest.nodeName.toLowerCase();
6147
6148 // IE6-8 fail to clone children inside object elements that use
6149 // the proprietary classid attribute value (rather than the type
6150 // attribute) to identify the type of content to display
6151 if ( nodeName === "object" ) {
6152 dest.outerHTML = src.outerHTML;
6153
6154 } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
6155 // IE6-8 fails to persist the checked state of a cloned checkbox
6156 // or radio button. Worse, IE6-7 fail to give the cloned element
6157 // a checked appearance if the defaultChecked value isn't also set
6158 if ( src.checked ) {
6159 dest.defaultChecked = dest.checked = src.checked;
6160 }
6161
6162 // IE6-7 get confused and end up setting the value of a cloned
6163 // checkbox/radio button to an empty string instead of "on"
6164 if ( dest.value !== src.value ) {
6165 dest.value = src.value;
6166 }
6167
6168 // IE6-8 fails to return the selected option to the default selected
6169 // state when cloning options
6170 } else if ( nodeName === "option" ) {
6171 dest.selected = src.defaultSelected;
6172
6173 // IE6-8 fails to set the defaultValue to the correct value when
6174 // cloning other types of input fields
6175 } else if ( nodeName === "input" || nodeName === "textarea" ) {
6176 dest.defaultValue = src.defaultValue;
6177
6178 // IE blanks contents when cloning scripts
6179 } else if ( nodeName === "script" && dest.text !== src.text ) {
6180 dest.text = src.text;
6181 }
6182
6183 // Event data gets referenced instead of copied if the expando
6184 // gets copied too
6185 dest.removeAttribute( jQuery.expando );
6186
6187 // Clear flags for bubbling special change/submit events, they must
6188 // be reattached when the newly cloned events are first activated
6189 dest.removeAttribute( "_submit_attached" );
6190 dest.removeAttribute( "_change_attached" );
6191 }
6192
6193 jQuery.buildFragment = function( args, nodes, scripts ) {
6194 var fragment, cacheable, cacheresults, doc,
6195 first = args[ 0 ];
6196
6197 // nodes may contain either an explicit document object,
6198 // a jQuery collection or context object.
6199 // If nodes[0] contains a valid object to assign to doc
6200 if ( nodes && nodes[0] ) {
6201 doc = nodes[0].ownerDocument || nodes[0];
6202 }
6203
6204 // Ensure that an attr object doesn't incorrectly stand in as a document object
6205 // Chrome and Firefox seem to allow this to occur and will throw exception
6206 // Fixes #8950
6207 if ( !doc.createDocumentFragment ) {
6208 doc = document;
6209 }
6210
6211 // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6212 // Cloning options loses the selected state, so don't cache them
6213 // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6214 // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6215 // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
6216 if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
6217 first.charAt(0) === "<" && !rnocache.test( first ) &&
6218 (jQuery.support.checkClone || !rchecked.test( first )) &&
6219 (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
6220
6221 cacheable = true;
6222
6223 cacheresults = jQuery.fragments[ first ];
6224 if ( cacheresults && cacheresults !== 1 ) {
6225 fragment = cacheresults;
6226 }
6227 }
6228
6229 if ( !fragment ) {
6230 fragment = doc.createDocumentFragment();
6231 jQuery.clean( args, doc, fragment, scripts );
6232 }
6233
6234 if ( cacheable ) {
6235 jQuery.fragments[ first ] = cacheresults ? fragment : 1;
6236 }
6237
6238 return { fragment: fragment, cacheable: cacheable };
6239 };
6240
6241 jQuery.fragments = {};
62425997
62435998 jQuery.each({
62445999 appendTo: "append",
62486003 replaceAll: "replaceWith"
62496004 }, function( name, original ) {
62506005 jQuery.fn[ name ] = function( selector ) {
6251 var ret = [],
6006 var elems,
6007 i = 0,
6008 ret = [],
62526009 insert = jQuery( selector ),
6253 parent = this.length === 1 && this[0].parentNode;
6254
6255 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
6256 insert[ original ]( this[0] );
6257 return this;
6258
6259 } else {
6260 for ( var i = 0, l = insert.length; i < l; i++ ) {
6261 var elems = ( i > 0 ? this.clone(true) : this ).get();
6262 jQuery( insert[i] )[ original ]( elems );
6263 ret = ret.concat( elems );
6264 }
6265
6266 return this.pushStack( ret, name, insert.selector );
6267 }
6010 last = insert.length - 1;
6011
6012 for ( ; i <= last; i++ ) {
6013 elems = i === last ? this : this.clone(true);
6014 jQuery( insert[i] )[ original ]( elems );
6015
6016 // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6017 push.apply( ret, elems.get() );
6018 }
6019
6020 return this.pushStack( ret );
62686021 };
62696022 });
62706023
6271 function getAll( elem ) {
6272 if ( typeof elem.getElementsByTagName !== "undefined" ) {
6273 return elem.getElementsByTagName( "*" );
6274
6275 } else if ( typeof elem.querySelectorAll !== "undefined" ) {
6276 return elem.querySelectorAll( "*" );
6277
6278 } else {
6279 return [];
6280 }
6024
6025 var iframe,
6026 elemdisplay = {};
6027
6028 /**
6029 * Retrieve the actual display of a element
6030 * @param {String} name nodeName of the element
6031 * @param {Object} doc Document object
6032 */
6033 // Called only from within defaultDisplay
6034 function actualDisplay( name, doc ) {
6035 var style,
6036 elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
6037
6038 // getDefaultComputedStyle might be reliably used only on attached element
6039 display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
6040
6041 // Use of this method is a temporary fix (more like optmization) until something better comes along,
6042 // since it was removed from specification and supported only in FF
6043 style.display : jQuery.css( elem[ 0 ], "display" );
6044
6045 // We don't have any data stored on the element,
6046 // so use "detach" method as fast way to get rid of the element
6047 elem.detach();
6048
6049 return display;
62816050 }
62826051
6283 // Used in clean, fixes the defaultChecked property
6284 function fixDefaultChecked( elem ) {
6285 if ( elem.type === "checkbox" || elem.type === "radio" ) {
6286 elem.defaultChecked = elem.checked;
6287 }
6052 /**
6053 * Try to determine the default display value of an element
6054 * @param {String} nodeName
6055 */
6056 function defaultDisplay( nodeName ) {
6057 var doc = document,
6058 display = elemdisplay[ nodeName ];
6059
6060 if ( !display ) {
6061 display = actualDisplay( nodeName, doc );
6062
6063 // If the simple way fails, read from inside an iframe
6064 if ( display === "none" || !display ) {
6065
6066 // Use the already-created iframe if possible
6067 iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
6068
6069 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6070 doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
6071
6072 // Support: IE
6073 doc.write();
6074 doc.close();
6075
6076 display = actualDisplay( nodeName, doc );
6077 iframe.detach();
6078 }
6079
6080 // Store the correct default display
6081 elemdisplay[ nodeName ] = display;
6082 }
6083
6084 return display;
62886085 }
6289 // Finds all inputs and passes them to fixDefaultChecked
6290 function findInputs( elem ) {
6291 var nodeName = ( elem.nodeName || "" ).toLowerCase();
6292 if ( nodeName === "input" ) {
6293 fixDefaultChecked( elem );
6294 // Skip scripts, get other children
6295 } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
6296 jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6297 }
6086
6087
6088 (function() {
6089 var shrinkWrapBlocksVal;
6090
6091 support.shrinkWrapBlocks = function() {
6092 if ( shrinkWrapBlocksVal != null ) {
6093 return shrinkWrapBlocksVal;
6094 }
6095
6096 // Will be changed later if needed.
6097 shrinkWrapBlocksVal = false;
6098
6099 // Minified: var b,c,d
6100 var div, body, container;
6101
6102 body = document.getElementsByTagName( "body" )[ 0 ];
6103 if ( !body || !body.style ) {
6104 // Test fired too early or in an unsupported environment, exit.
6105 return;
6106 }
6107
6108 // Setup
6109 div = document.createElement( "div" );
6110 container = document.createElement( "div" );
6111 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6112 body.appendChild( container ).appendChild( div );
6113
6114 // Support: IE6
6115 // Check if elements with layout shrink-wrap their children
6116 if ( typeof div.style.zoom !== strundefined ) {
6117 // Reset CSS: box-sizing; display; margin; border
6118 div.style.cssText =
6119 // Support: Firefox<29, Android 2.3
6120 // Vendor-prefix box-sizing
6121 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6122 "box-sizing:content-box;display:block;margin:0;border:0;" +
6123 "padding:1px;width:1px;zoom:1";
6124 div.appendChild( document.createElement( "div" ) ).style.width = "5px";
6125 shrinkWrapBlocksVal = div.offsetWidth !== 3;
6126 }
6127
6128 body.removeChild( container );
6129
6130 return shrinkWrapBlocksVal;
6131 };
6132
6133 })();
6134 var rmargin = (/^margin/);
6135
6136 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6137
6138
6139
6140 var getStyles, curCSS,
6141 rposition = /^(top|right|bottom|left)$/;
6142
6143 if ( window.getComputedStyle ) {
6144 getStyles = function( elem ) {
6145 // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
6146 // IE throws on elements created in popups
6147 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6148 if ( elem.ownerDocument.defaultView.opener ) {
6149 return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
6150 }
6151
6152 return window.getComputedStyle( elem, null );
6153 };
6154
6155 curCSS = function( elem, name, computed ) {
6156 var width, minWidth, maxWidth, ret,
6157 style = elem.style;
6158
6159 computed = computed || getStyles( elem );
6160
6161 // getPropertyValue is only needed for .css('filter') in IE9, see #12537
6162 ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
6163
6164 if ( computed ) {
6165
6166 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6167 ret = jQuery.style( elem, name );
6168 }
6169
6170 // A tribute to the "awesome hack by Dean Edwards"
6171 // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
6172 // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
6173 // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6174 if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6175
6176 // Remember the original values
6177 width = style.width;
6178 minWidth = style.minWidth;
6179 maxWidth = style.maxWidth;
6180
6181 // Put in the new values to get a computed value out
6182 style.minWidth = style.maxWidth = style.width = ret;
6183 ret = computed.width;
6184
6185 // Revert the changed values
6186 style.width = width;
6187 style.minWidth = minWidth;
6188 style.maxWidth = maxWidth;
6189 }
6190 }
6191
6192 // Support: IE
6193 // IE returns zIndex value as an integer.
6194 return ret === undefined ?
6195 ret :
6196 ret + "";
6197 };
6198 } else if ( document.documentElement.currentStyle ) {
6199 getStyles = function( elem ) {
6200 return elem.currentStyle;
6201 };
6202
6203 curCSS = function( elem, name, computed ) {
6204 var left, rs, rsLeft, ret,
6205 style = elem.style;
6206
6207 computed = computed || getStyles( elem );
6208 ret = computed ? computed[ name ] : undefined;
6209
6210 // Avoid setting ret to empty string here
6211 // so we don't default to auto
6212 if ( ret == null && style && style[ name ] ) {
6213 ret = style[ name ];
6214 }
6215
6216 // From the awesome hack by Dean Edwards
6217 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6218
6219 // If we're not dealing with a regular pixel number
6220 // but a number that has a weird ending, we need to convert it to pixels
6221 // but not position css attributes, as those are proportional to the parent element instead
6222 // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
6223 if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6224
6225 // Remember the original values
6226 left = style.left;
6227 rs = elem.runtimeStyle;
6228 rsLeft = rs && rs.left;
6229
6230 // Put in the new values to get a computed value out
6231 if ( rsLeft ) {
6232 rs.left = elem.currentStyle.left;
6233 }
6234 style.left = name === "fontSize" ? "1em" : ret;
6235 ret = style.pixelLeft + "px";
6236
6237 // Revert the changed values
6238 style.left = left;
6239 if ( rsLeft ) {
6240 rs.left = rsLeft;
6241 }
6242 }
6243
6244 // Support: IE
6245 // IE returns zIndex value as an integer.
6246 return ret === undefined ?
6247 ret :
6248 ret + "" || "auto";
6249 };
62986250 }
62996251
6300 // Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
6301 function shimCloneNode( elem ) {
6302 var div = document.createElement( "div" );
6303 safeFragment.appendChild( div );
6304
6305 div.innerHTML = elem.outerHTML;
6306 return div.firstChild;
6252
6253
6254
6255 function addGetHookIf( conditionFn, hookFn ) {
6256 // Define the hook, we'll check on the first run if it's really needed.
6257 return {
6258 get: function() {
6259 var condition = conditionFn();
6260
6261 if ( condition == null ) {
6262 // The test was not ready at this point; screw the hook this time
6263 // but check again when needed next time.
6264 return;
6265 }
6266
6267 if ( condition ) {
6268 // Hook not needed (or it's not possible to use it due to missing dependency),
6269 // remove it.
6270 // Since there are no other hooks for marginRight, remove the whole object.
6271 delete this.get;
6272 return;
6273 }
6274
6275 // Hook needed; redefine it so that the support test is not executed again.
6276
6277 return (this.get = hookFn).apply( this, arguments );
6278 }
6279 };
63076280 }
63086281
6309 jQuery.extend({
6310 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6311 var srcElements,
6312 destElements,
6313 i,
6314 // IE<=8 does not properly clone detached, unknown element nodes
6315 clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
6316 elem.cloneNode( true ) :
6317 shimCloneNode( elem );
6318
6319 if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6320 (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6321 // IE copies events bound via attachEvent when using cloneNode.
6322 // Calling detachEvent on the clone will also remove the events
6323 // from the original. In order to get around this, we use some
6324 // proprietary methods to clear the events. Thanks to MooTools
6325 // guys for this hotness.
6326
6327 cloneFixAttributes( elem, clone );
6328
6329 // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
6330 srcElements = getAll( elem );
6331 destElements = getAll( clone );
6332
6333 // Weird iteration because IE will replace the length property
6334 // with an element if you are cloning the body and one of the
6335 // elements on the page has a name or id of "length"
6336 for ( i = 0; srcElements[i]; ++i ) {
6337 // Ensure that the destination node is not null; Fixes #9587
6338 if ( destElements[i] ) {
6339 cloneFixAttributes( srcElements[i], destElements[i] );
6340 }
6341 }
6342 }
6343
6344 // Copy the events from the original to the clone
6345 if ( dataAndEvents ) {
6346 cloneCopyEvent( elem, clone );
6347
6348 if ( deepDataAndEvents ) {
6349 srcElements = getAll( elem );
6350 destElements = getAll( clone );
6351
6352 for ( i = 0; srcElements[i]; ++i ) {
6353 cloneCopyEvent( srcElements[i], destElements[i] );
6354 }
6355 }
6356 }
6357
6358 srcElements = destElements = null;
6359
6360 // Return the cloned set
6361 return clone;
6362 },
6363
6364 clean: function( elems, context, fragment, scripts ) {
6365 var checkScriptType, script, j,
6366 ret = [];
6367
6368 context = context || document;
6369
6370 // !context.createElement fails in IE with an error but returns typeof 'object'
6371 if ( typeof context.createElement === "undefined" ) {
6372 context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6373 }
6374
6375 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6376 if ( typeof elem === "number" ) {
6377 elem += "";
6378 }
6379
6380 if ( !elem ) {
6381 continue;
6382 }
6383
6384 // Convert html string into DOM nodes
6385 if ( typeof elem === "string" ) {
6386 if ( !rhtml.test( elem ) ) {
6387 elem = context.createTextNode( elem );
6388 } else {
6389 // Fix "XHTML"-style tags in all browsers
6390 elem = elem.replace(rxhtmlTag, "<$1></$2>");
6391
6392 // Trim whitespace, otherwise indexOf won't work as expected
6393 var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
6394 wrap = wrapMap[ tag ] || wrapMap._default,
6395 depth = wrap[0],
6396 div = context.createElement("div"),
6397 safeChildNodes = safeFragment.childNodes,
6398 remove;
6399
6400 // Append wrapper element to unknown element safe doc fragment
6401 if ( context === document ) {
6402 // Use the fragment we've already created for this document
6403 safeFragment.appendChild( div );
6404 } else {
6405 // Use a fragment created with the owner document
6406 createSafeFragment( context ).appendChild( div );
6407 }
6408
6409 // Go to html and back, then peel off extra wrappers
6410 div.innerHTML = wrap[1] + elem + wrap[2];
6411
6412 // Move to the right depth
6413 while ( depth-- ) {
6414 div = div.lastChild;
6415 }
6416
6417 // Remove IE's autoinserted <tbody> from table fragments
6418 if ( !jQuery.support.tbody ) {
6419
6420 // String was a <table>, *may* have spurious <tbody>
6421 var hasBody = rtbody.test(elem),
6422 tbody = tag === "table" && !hasBody ?
6423 div.firstChild && div.firstChild.childNodes :
6424
6425 // String was a bare <thead> or <tfoot>
6426 wrap[1] === "<table>" && !hasBody ?
6427 div.childNodes :
6428 [];
6429
6430 for ( j = tbody.length - 1; j >= 0 ; --j ) {
6431 if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6432 tbody[ j ].parentNode.removeChild( tbody[ j ] );
6433 }
6434 }
6435 }
6436
6437 // IE completely kills leading whitespace when innerHTML is used
6438 if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6439 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6440 }
6441
6442 elem = div.childNodes;
6443
6444 // Clear elements from DocumentFragment (safeFragment or otherwise)
6445 // to avoid hoarding elements. Fixes #11356
6446 if ( div ) {
6447 div.parentNode.removeChild( div );
6448
6449 // Guard against -1 index exceptions in FF3.6
6450 if ( safeChildNodes.length > 0 ) {
6451 remove = safeChildNodes[ safeChildNodes.length - 1 ];
6452
6453 if ( remove && remove.parentNode ) {
6454 remove.parentNode.removeChild( remove );
6455 }
6456 }
6457 }
6458 }
6459 }
6460
6461 // Resets defaultChecked for any radios and checkboxes
6462 // about to be appended to the DOM in IE 6/7 (#8060)
6463 var len;
6464 if ( !jQuery.support.appendChecked ) {
6465 if ( elem[0] && typeof (len = elem.length) === "number" ) {
6466 for ( j = 0; j < len; j++ ) {
6467 findInputs( elem[j] );
6468 }
6469 } else {
6470 findInputs( elem );
6471 }
6472 }
6473
6474 if ( elem.nodeType ) {
6475 ret.push( elem );
6476 } else {
6477 ret = jQuery.merge( ret, elem );
6478 }
6479 }
6480
6481 if ( fragment ) {
6482 checkScriptType = function( elem ) {
6483 return !elem.type || rscriptType.test( elem.type );
6484 };
6485 for ( i = 0; ret[i]; i++ ) {
6486 script = ret[i];
6487 if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
6488 scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
6489
6490 } else {
6491 if ( script.nodeType === 1 ) {
6492 var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
6493
6494 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6495 }
6496 fragment.appendChild( script );
6497 }
6498 }
6499 }
6500
6501 return ret;
6502 },
6503
6504 cleanData: function( elems ) {
6505 var data, id,
6506 cache = jQuery.cache,
6507 special = jQuery.event.special,
6508 deleteExpando = jQuery.support.deleteExpando;
6509
6510 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6511 if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6512 continue;
6513 }
6514
6515 id = elem[ jQuery.expando ];
6516
6517 if ( id ) {
6518 data = cache[ id ];
6519
6520 if ( data && data.events ) {
6521 for ( var type in data.events ) {
6522 if ( special[ type ] ) {
6523 jQuery.event.remove( elem, type );
6524
6525 // This is a shortcut to avoid jQuery.event.remove's overhead
6526 } else {
6527 jQuery.removeEvent( elem, type, data.handle );
6528 }
6529 }
6530
6531 // Null the DOM reference to avoid IE6/7/8 leak (#7054)
6532 if ( data.handle ) {
6533 data.handle.elem = null;
6534 }
6535 }
6536
6537 if ( deleteExpando ) {
6538 delete elem[ jQuery.expando ];
6539
6540 } else if ( elem.removeAttribute ) {
6541 elem.removeAttribute( jQuery.expando );
6542 }
6543
6544 delete cache[ id ];
6545 }
6546 }
6547 }
6548 });
6549
6550
6551
6552
6553 var ralpha = /alpha\([^)]*\)/i,
6554 ropacity = /opacity=([^)]*)/,
6555 // fixed for IE9, see #8346
6556 rupper = /([A-Z]|^ms)/g,
6557 rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
6558 rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
6559 rrelNum = /^([\-+])=([\-+.\de]+)/,
6560 rmargin = /^margin/,
6282
6283 (function() {
6284 // Minified: var b,c,d,e,f,g, h,i
6285 var div, style, a, pixelPositionVal, boxSizingReliableVal,
6286 reliableHiddenOffsetsVal, reliableMarginRightVal;
6287
6288 // Setup
6289 div = document.createElement( "div" );
6290 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
6291 a = div.getElementsByTagName( "a" )[ 0 ];
6292 style = a && a.style;
6293
6294 // Finish early in limited (non-browser) environments
6295 if ( !style ) {
6296 return;
6297 }
6298
6299 style.cssText = "float:left;opacity:.5";
6300
6301 // Support: IE<9
6302 // Make sure that element opacity exists (as opposed to filter)
6303 support.opacity = style.opacity === "0.5";
6304
6305 // Verify style float existence
6306 // (IE uses styleFloat instead of cssFloat)
6307 support.cssFloat = !!style.cssFloat;
6308
6309 div.style.backgroundClip = "content-box";
6310 div.cloneNode( true ).style.backgroundClip = "";
6311 support.clearCloneStyle = div.style.backgroundClip === "content-box";
6312
6313 // Support: Firefox<29, Android 2.3
6314 // Vendor-prefix box-sizing
6315 support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
6316 style.WebkitBoxSizing === "";
6317
6318 jQuery.extend(support, {
6319 reliableHiddenOffsets: function() {
6320 if ( reliableHiddenOffsetsVal == null ) {
6321 computeStyleTests();
6322 }
6323 return reliableHiddenOffsetsVal;
6324 },
6325
6326 boxSizingReliable: function() {
6327 if ( boxSizingReliableVal == null ) {
6328 computeStyleTests();
6329 }
6330 return boxSizingReliableVal;
6331 },
6332
6333 pixelPosition: function() {
6334 if ( pixelPositionVal == null ) {
6335 computeStyleTests();
6336 }
6337 return pixelPositionVal;
6338 },
6339
6340 // Support: Android 2.3
6341 reliableMarginRight: function() {
6342 if ( reliableMarginRightVal == null ) {
6343 computeStyleTests();
6344 }
6345 return reliableMarginRightVal;
6346 }
6347 });
6348
6349 function computeStyleTests() {
6350 // Minified: var b,c,d,j
6351 var div, body, container, contents;
6352
6353 body = document.getElementsByTagName( "body" )[ 0 ];
6354 if ( !body || !body.style ) {
6355 // Test fired too early or in an unsupported environment, exit.
6356 return;
6357 }
6358
6359 // Setup
6360 div = document.createElement( "div" );
6361 container = document.createElement( "div" );
6362 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6363 body.appendChild( container ).appendChild( div );
6364
6365 div.style.cssText =
6366 // Support: Firefox<29, Android 2.3
6367 // Vendor-prefix box-sizing
6368 "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
6369 "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
6370 "border:1px;padding:1px;width:4px;position:absolute";
6371
6372 // Support: IE<9
6373 // Assume reasonable values in the absence of getComputedStyle
6374 pixelPositionVal = boxSizingReliableVal = false;
6375 reliableMarginRightVal = true;
6376
6377 // Check for getComputedStyle so that this code is not run in IE<9.
6378 if ( window.getComputedStyle ) {
6379 pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
6380 boxSizingReliableVal =
6381 ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
6382
6383 // Support: Android 2.3
6384 // Div with explicit width and no margin-right incorrectly
6385 // gets computed margin-right based on width of container (#3333)
6386 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6387 contents = div.appendChild( document.createElement( "div" ) );
6388
6389 // Reset CSS: box-sizing; display; margin; border; padding
6390 contents.style.cssText = div.style.cssText =
6391 // Support: Firefox<29, Android 2.3
6392 // Vendor-prefix box-sizing
6393 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6394 "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6395 contents.style.marginRight = contents.style.width = "0";
6396 div.style.width = "1px";
6397
6398 reliableMarginRightVal =
6399 !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
6400
6401 div.removeChild( contents );
6402 }
6403
6404 // Support: IE8
6405 // Check if table cells still have offsetWidth/Height when they are set
6406 // to display:none and there are still other visible table cells in a
6407 // table row; if so, offsetWidth/Height are not reliable for use when
6408 // determining if an element has been hidden directly using
6409 // display:none (it is still safe to use offsets if a parent element is
6410 // hidden; don safety goggles and see bug #4512 for more information).
6411 div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6412 contents = div.getElementsByTagName( "td" );
6413 contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
6414 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6415 if ( reliableHiddenOffsetsVal ) {
6416 contents[ 0 ].style.display = "";
6417 contents[ 1 ].style.display = "none";
6418 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6419 }
6420
6421 body.removeChild( container );
6422 }
6423
6424 })();
6425
6426
6427 // A method for quickly swapping in/out CSS properties to get correct calculations.
6428 jQuery.swap = function( elem, options, callback, args ) {
6429 var ret, name,
6430 old = {};
6431
6432 // Remember the old values, and insert the new ones
6433 for ( name in options ) {
6434 old[ name ] = elem.style[ name ];
6435 elem.style[ name ] = options[ name ];
6436 }
6437
6438 ret = callback.apply( elem, args || [] );
6439
6440 // Revert the old values
6441 for ( name in options ) {
6442 elem.style[ name ] = old[ name ];
6443 }
6444
6445 return ret;
6446 };
6447
6448
6449 var
6450 ralpha = /alpha\([^)]*\)/i,
6451 ropacity = /opacity\s*=\s*([^)]*)/,
6452
6453 // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6454 // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6455 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6456 rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
6457 rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
65616458
65626459 cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6563
6564 // order is important!
6565 cssExpand = [ "Top", "Right", "Bottom", "Left" ],
6566
6567 curCSS,
6568
6569 getComputedStyle,
6570 currentStyle;
6571
6572 jQuery.fn.css = function( name, value ) {
6573 return jQuery.access( this, function( elem, name, value ) {
6574 return value !== undefined ?
6575 jQuery.style( elem, name, value ) :
6576 jQuery.css( elem, name );
6577 }, name, value, arguments.length > 1 );
6578 };
6460 cssNormalTransform = {
6461 letterSpacing: "0",
6462 fontWeight: "400"
6463 },
6464
6465 cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6466
6467
6468 // return a css property mapped to a potentially vendor prefixed property
6469 function vendorPropName( style, name ) {
6470
6471 // shortcut for names that are not vendor prefixed
6472 if ( name in style ) {
6473 return name;
6474 }
6475
6476 // check for vendor prefixed names
6477 var capName = name.charAt(0).toUpperCase() + name.slice(1),
6478 origName = name,
6479 i = cssPrefixes.length;
6480
6481 while ( i-- ) {
6482 name = cssPrefixes[ i ] + capName;
6483 if ( name in style ) {
6484 return name;
6485 }
6486 }
6487
6488 return origName;
6489 }
6490
6491 function showHide( elements, show ) {
6492 var display, elem, hidden,
6493 values = [],
6494 index = 0,
6495 length = elements.length;
6496
6497 for ( ; index < length; index++ ) {
6498 elem = elements[ index ];
6499 if ( !elem.style ) {
6500 continue;
6501 }
6502
6503 values[ index ] = jQuery._data( elem, "olddisplay" );
6504 display = elem.style.display;
6505 if ( show ) {
6506 // Reset the inline display of this element to learn if it is
6507 // being hidden by cascaded rules or not
6508 if ( !values[ index ] && display === "none" ) {
6509 elem.style.display = "";
6510 }
6511
6512 // Set elements which have been overridden with display: none
6513 // in a stylesheet to whatever the default browser style is
6514 // for such an element
6515 if ( elem.style.display === "" && isHidden( elem ) ) {
6516 values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
6517 }
6518 } else {
6519 hidden = isHidden( elem );
6520
6521 if ( display && display !== "none" || !hidden ) {
6522 jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6523 }
6524 }
6525 }
6526
6527 // Set the display of most of the elements in a second loop
6528 // to avoid the constant reflow
6529 for ( index = 0; index < length; index++ ) {
6530 elem = elements[ index ];
6531 if ( !elem.style ) {
6532 continue;
6533 }
6534 if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6535 elem.style.display = show ? values[ index ] || "" : "none";
6536 }
6537 }
6538
6539 return elements;
6540 }
6541
6542 function setPositiveNumber( elem, value, subtract ) {
6543 var matches = rnumsplit.exec( value );
6544 return matches ?
6545 // Guard against undefined "subtract", e.g., when used as in cssHooks
6546 Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
6547 value;
6548 }
6549
6550 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6551 var i = extra === ( isBorderBox ? "border" : "content" ) ?
6552 // If we already have the right measurement, avoid augmentation
6553 4 :
6554 // Otherwise initialize for horizontal or vertical properties
6555 name === "width" ? 1 : 0,
6556
6557 val = 0;
6558
6559 for ( ; i < 4; i += 2 ) {
6560 // both box models exclude margin, so add it if we want it
6561 if ( extra === "margin" ) {
6562 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6563 }
6564
6565 if ( isBorderBox ) {
6566 // border-box includes padding, so remove it if we want content
6567 if ( extra === "content" ) {
6568 val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6569 }
6570
6571 // at this point, extra isn't border nor margin, so remove border
6572 if ( extra !== "margin" ) {
6573 val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6574 }
6575 } else {
6576 // at this point, extra isn't content, so add padding
6577 val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6578
6579 // at this point, extra isn't content nor padding, so add border
6580 if ( extra !== "padding" ) {
6581 val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6582 }
6583 }
6584 }
6585
6586 return val;
6587 }
6588
6589 function getWidthOrHeight( elem, name, extra ) {
6590
6591 // Start with offset property, which is equivalent to the border-box value
6592 var valueIsBorderBox = true,
6593 val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6594 styles = getStyles( elem ),
6595 isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6596
6597 // some non-html elements return undefined for offsetWidth, so check for null/undefined
6598 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
6599 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
6600 if ( val <= 0 || val == null ) {
6601 // Fall back to computed then uncomputed css if necessary
6602 val = curCSS( elem, name, styles );
6603 if ( val < 0 || val == null ) {
6604 val = elem.style[ name ];
6605 }
6606
6607 // Computed unit is not pixels. Stop here and return.
6608 if ( rnumnonpx.test(val) ) {
6609 return val;
6610 }
6611
6612 // we need the check for style in case a browser which returns unreliable values
6613 // for getComputedStyle silently falls back to the reliable elem.style
6614 valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
6615
6616 // Normalize "", auto, and prepare for extra
6617 val = parseFloat( val ) || 0;
6618 }
6619
6620 // use the active box-sizing model to add/subtract irrelevant styles
6621 return ( val +
6622 augmentWidthOrHeight(
6623 elem,
6624 name,
6625 extra || ( isBorderBox ? "border" : "content" ),
6626 valueIsBorderBox,
6627 styles
6628 )
6629 ) + "px";
6630 }
65796631
65806632 jQuery.extend({
65816633 // Add in style property hooks for overriding the default
65876639 // We should always get a number back from opacity
65886640 var ret = curCSS( elem, "opacity" );
65896641 return ret === "" ? "1" : ret;
6590
6591 } else {
6592 return elem.style.opacity;
6593 }
6594 }
6595 }
6596 },
6597
6598 // Exclude the following css properties to add px
6642 }
6643 }
6644 }
6645 },
6646
6647 // Don't automatically add "px" to these possibly-unitless properties
65996648 cssNumber: {
6649 "columnCount": true,
66006650 "fillOpacity": true,
6651 "flexGrow": true,
6652 "flexShrink": true,
66016653 "fontWeight": true,
66026654 "lineHeight": true,
66036655 "opacity": true,
6656 "order": true,
66046657 "orphans": true,
66056658 "widows": true,
66066659 "zIndex": true,
66116664 // setting or getting the value
66126665 cssProps: {
66136666 // normalize float css property
6614 "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6667 "float": support.cssFloat ? "cssFloat" : "styleFloat"
66156668 },
66166669
66176670 // Get and set the style property on a DOM Node
66226675 }
66236676
66246677 // Make sure that we're working with the right name
6625 var ret, type, origName = jQuery.camelCase( name ),
6626 style = elem.style, hooks = jQuery.cssHooks[ origName ];
6627
6628 name = jQuery.cssProps[ origName ] || origName;
6678 var ret, type, hooks,
6679 origName = jQuery.camelCase( name ),
6680 style = elem.style;
6681
6682 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6683
6684 // gets hook for the prefixed version
6685 // followed by the unprefixed version
6686 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
66296687
66306688 // Check if we're setting a value
66316689 if ( value !== undefined ) {
66336691
66346692 // convert relative number strings (+= or -=) to relative numbers. #7345
66356693 if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6636 value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
6694 value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
66376695 // Fixes bug #9237
66386696 type = "number";
66396697 }
66406698
6641 // Make sure that NaN and null values aren't set. See: #7116
6642 if ( value == null || type === "number" && isNaN( value ) ) {
6699 // Make sure that null and NaN values aren't set. See: #7116
6700 if ( value == null || value !== value ) {
66436701 return;
66446702 }
66456703
66486706 value += "px";
66496707 }
66506708
6709 // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6710 // but it would mean to define eight (for every problematic property) identical functions
6711 if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
6712 style[ name ] = "inherit";
6713 }
6714
66516715 // If a hook was provided, use that value, otherwise just set the specified value
6652 if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6653 // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6654 // Fixes bug #5509
6716 if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
6717
6718 // Support: IE
6719 // Swallow errors from 'invalid' CSS values (#5509)
66556720 try {
66566721 style[ name ] = value;
66576722 } catch(e) {}
66686733 }
66696734 },
66706735
6671 css: function( elem, name, extra ) {
6672 var ret, hooks;
6736 css: function( elem, name, extra, styles ) {
6737 var num, val, hooks,
6738 origName = jQuery.camelCase( name );
66736739
66746740 // Make sure that we're working with the right name
6675 name = jQuery.camelCase( name );
6676 hooks = jQuery.cssHooks[ name ];
6677 name = jQuery.cssProps[ name ] || name;
6678
6679 // cssFloat needs a special treatment
6680 if ( name === "cssFloat" ) {
6681 name = "float";
6682 }
6741 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6742
6743 // gets hook for the prefixed version
6744 // followed by the unprefixed version
6745 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
66836746
66846747 // If a hook was provided get the computed value from there
6685 if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6686 return ret;
6748 if ( hooks && "get" in hooks ) {
6749 val = hooks.get( elem, true, extra );
6750 }
66876751
66886752 // Otherwise, if a way to get the computed value exists, use that
6689 } else if ( curCSS ) {
6690 return curCSS( elem, name );
6691 }
6692 },
6693
6694 // A method for quickly swapping in/out CSS properties to get correct calculations
6695 swap: function( elem, options, callback ) {
6696 var old = {},
6697 ret, name;
6698
6699 // Remember the old values, and insert the new ones
6700 for ( name in options ) {
6701 old[ name ] = elem.style[ name ];
6702 elem.style[ name ] = options[ name ];
6703 }
6704
6705 ret = callback.call( elem );
6706
6707 // Revert the old values
6708 for ( name in options ) {
6709 elem.style[ name ] = old[ name ];
6710 }
6711
6712 return ret;
6753 if ( val === undefined ) {
6754 val = curCSS( elem, name, styles );
6755 }
6756
6757 //convert "normal" to computed value
6758 if ( val === "normal" && name in cssNormalTransform ) {
6759 val = cssNormalTransform[ name ];
6760 }
6761
6762 // Return, converting to number if forced or a qualifier was provided and val looks numeric
6763 if ( extra === "" || extra ) {
6764 num = parseFloat( val );
6765 return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6766 }
6767 return val;
67136768 }
67146769 });
6715
6716 // DEPRECATED in 1.3, Use jQuery.css() instead
6717 jQuery.curCSS = jQuery.css;
6718
6719 if ( document.defaultView && document.defaultView.getComputedStyle ) {
6720 getComputedStyle = function( elem, name ) {
6721 var ret, defaultView, computedStyle, width,
6722 style = elem.style;
6723
6724 name = name.replace( rupper, "-$1" ).toLowerCase();
6725
6726 if ( (defaultView = elem.ownerDocument.defaultView) &&
6727 (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6728
6729 ret = computedStyle.getPropertyValue( name );
6730 if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6731 ret = jQuery.style( elem, name );
6732 }
6733 }
6734
6735 // A tribute to the "awesome hack by Dean Edwards"
6736 // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
6737 // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6738 if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
6739 width = style.width;
6740 style.width = ret;
6741 ret = computedStyle.width;
6742 style.width = width;
6743 }
6744
6745 return ret;
6746 };
6747 }
6748
6749 if ( document.documentElement.currentStyle ) {
6750 currentStyle = function( elem, name ) {
6751 var left, rsLeft, uncomputed,
6752 ret = elem.currentStyle && elem.currentStyle[ name ],
6753 style = elem.style;
6754
6755 // Avoid setting ret to empty string here
6756 // so we don't default to auto
6757 if ( ret == null && style && (uncomputed = style[ name ]) ) {
6758 ret = uncomputed;
6759 }
6760
6761 // From the awesome hack by Dean Edwards
6762 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6763
6764 // If we're not dealing with a regular pixel number
6765 // but a number that has a weird ending, we need to convert it to pixels
6766 if ( rnumnonpx.test( ret ) ) {
6767
6768 // Remember the original values
6769 left = style.left;
6770 rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
6771
6772 // Put in the new values to get a computed value out
6773 if ( rsLeft ) {
6774 elem.runtimeStyle.left = elem.currentStyle.left;
6775 }
6776 style.left = name === "fontSize" ? "1em" : ret;
6777 ret = style.pixelLeft + "px";
6778
6779 // Revert the changed values
6780 style.left = left;
6781 if ( rsLeft ) {
6782 elem.runtimeStyle.left = rsLeft;
6783 }
6784 }
6785
6786 return ret === "" ? "auto" : ret;
6787 };
6788 }
6789
6790 curCSS = getComputedStyle || currentStyle;
6791
6792 function getWidthOrHeight( elem, name, extra ) {
6793
6794 // Start with offset property
6795 var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6796 i = name === "width" ? 1 : 0,
6797 len = 4;
6798
6799 if ( val > 0 ) {
6800 if ( extra !== "border" ) {
6801 for ( ; i < len; i += 2 ) {
6802 if ( !extra ) {
6803 val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
6804 }
6805 if ( extra === "margin" ) {
6806 val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
6807 } else {
6808 val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
6809 }
6810 }
6811 }
6812
6813 return val + "px";
6814 }
6815
6816 // Fall back to computed then uncomputed css if necessary
6817 val = curCSS( elem, name );
6818 if ( val < 0 || val == null ) {
6819 val = elem.style[ name ];
6820 }
6821
6822 // Computed unit is not pixels. Stop here and return.
6823 if ( rnumnonpx.test(val) ) {
6824 return val;
6825 }
6826
6827 // Normalize "", auto, and prepare for extra
6828 val = parseFloat( val ) || 0;
6829
6830 // Add padding, border, margin
6831 if ( extra ) {
6832 for ( ; i < len; i += 2 ) {
6833 val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
6834 if ( extra !== "padding" ) {
6835 val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
6836 }
6837 if ( extra === "margin" ) {
6838 val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
6839 }
6840 }
6841 }
6842
6843 return val + "px";
6844 }
68456770
68466771 jQuery.each([ "height", "width" ], function( i, name ) {
68476772 jQuery.cssHooks[ name ] = {
68486773 get: function( elem, computed, extra ) {
68496774 if ( computed ) {
6850 if ( elem.offsetWidth !== 0 ) {
6851 return getWidthOrHeight( elem, name, extra );
6852 } else {
6853 return jQuery.swap( elem, cssShow, function() {
6775 // certain elements can have dimension info if we invisibly show them
6776 // however, it must have a current display style that would benefit from this
6777 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
6778 jQuery.swap( elem, cssShow, function() {
68546779 return getWidthOrHeight( elem, name, extra );
6855 });
6856 }
6780 }) :
6781 getWidthOrHeight( elem, name, extra );
68576782 }
68586783 },
68596784
6860 set: function( elem, value ) {
6861 return rnum.test( value ) ?
6862 value + "px" :
6863 value;
6785 set: function( elem, value, extra ) {
6786 var styles = extra && getStyles( elem );
6787 return setPositiveNumber( elem, value, extra ?
6788 augmentWidthOrHeight(
6789 elem,
6790 name,
6791 extra,
6792 support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6793 styles
6794 ) : 0
6795 );
68646796 }
68656797 };
68666798 });
68676799
6868 if ( !jQuery.support.opacity ) {
6800 if ( !support.opacity ) {
68696801 jQuery.cssHooks.opacity = {
68706802 get: function( elem, computed ) {
68716803 // IE uses filters for opacity
68726804 return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6873 ( parseFloat( RegExp.$1 ) / 100 ) + "" :
6805 ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
68746806 computed ? "1" : "";
68756807 },
68766808
68856817 style.zoom = 1;
68866818
68876819 // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6888 if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
6820 // if value === "", then remove inline opacity #12685
6821 if ( ( value >= 1 || value === "" ) &&
6822 jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
6823 style.removeAttribute ) {
68896824
68906825 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
68916826 // if "filter:" is present at all, clearType is disabled, we want to avoid this
68926827 // style.removeAttribute is IE Only, but so apparently is this code path...
68936828 style.removeAttribute( "filter" );
68946829
6895 // if there there is no filter style applied in a css rule, we are done
6896 if ( currentStyle && !currentStyle.filter ) {
6830 // if there is no filter style applied in a css rule or unset inline opacity, we are done
6831 if ( value === "" || currentStyle && !currentStyle.filter ) {
68976832 return;
68986833 }
68996834 }
69066841 };
69076842 }
69086843
6909 jQuery(function() {
6910 // This hook cannot be added until DOM ready because the support test
6911 // for it is not run until after DOM ready
6912 if ( !jQuery.support.reliableMarginRight ) {
6913 jQuery.cssHooks.marginRight = {
6914 get: function( elem, computed ) {
6915 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6916 // Work around by temporarily setting element display to inline-block
6917 return jQuery.swap( elem, { "display": "inline-block" }, function() {
6918 if ( computed ) {
6919 return curCSS( elem, "margin-right" );
6920 } else {
6921 return elem.style.marginRight;
6922 }
6923 });
6924 }
6925 };
6926 }
6927 });
6928
6929 if ( jQuery.expr && jQuery.expr.filters ) {
6930 jQuery.expr.filters.hidden = function( elem ) {
6931 var width = elem.offsetWidth,
6932 height = elem.offsetHeight;
6933
6934 return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
6935 };
6936
6937 jQuery.expr.filters.visible = function( elem ) {
6938 return !jQuery.expr.filters.hidden( elem );
6939 };
6940 }
6844 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
6845 function( elem, computed ) {
6846 if ( computed ) {
6847 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6848 // Work around by temporarily setting element display to inline-block
6849 return jQuery.swap( elem, { "display": "inline-block" },
6850 curCSS, [ elem, "marginRight" ] );
6851 }
6852 }
6853 );
69416854
69426855 // These hooks are used by animate to expand properties
69436856 jQuery.each({
69456858 padding: "",
69466859 border: "Width"
69476860 }, function( prefix, suffix ) {
6948
69496861 jQuery.cssHooks[ prefix + suffix ] = {
69506862 expand: function( value ) {
6951 var i,
6863 var i = 0,
6864 expanded = {},
69526865
69536866 // assumes a single number if not a string
6954 parts = typeof value === "string" ? value.split(" ") : [ value ],
6955 expanded = {};
6956
6957 for ( i = 0; i < 4; i++ ) {
6867 parts = typeof value === "string" ? value.split(" ") : [ value ];
6868
6869 for ( ; i < 4; i++ ) {
69586870 expanded[ prefix + cssExpand[ i ] + suffix ] =
69596871 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
69606872 }
69626874 return expanded;
69636875 }
69646876 };
6877
6878 if ( !rmargin.test( prefix ) ) {
6879 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6880 }
69656881 });
69666882
6967
6968
6969
6970 var r20 = /%20/g,
6971 rbracket = /\[\]$/,
6972 rCRLF = /\r?\n/g,
6883 jQuery.fn.extend({
6884 css: function( name, value ) {
6885 return access( this, function( elem, name, value ) {
6886 var styles, len,
6887 map = {},
6888 i = 0;
6889
6890 if ( jQuery.isArray( name ) ) {
6891 styles = getStyles( elem );
6892 len = name.length;
6893
6894 for ( ; i < len; i++ ) {
6895 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6896 }
6897
6898 return map;
6899 }
6900
6901 return value !== undefined ?
6902 jQuery.style( elem, name, value ) :
6903 jQuery.css( elem, name );
6904 }, name, value, arguments.length > 1 );
6905 },
6906 show: function() {
6907 return showHide( this, true );
6908 },
6909 hide: function() {
6910 return showHide( this );
6911 },
6912 toggle: function( state ) {
6913 if ( typeof state === "boolean" ) {
6914 return state ? this.show() : this.hide();
6915 }
6916
6917 return this.each(function() {
6918 if ( isHidden( this ) ) {
6919 jQuery( this ).show();
6920 } else {
6921 jQuery( this ).hide();
6922 }
6923 });
6924 }
6925 });
6926
6927
6928 function Tween( elem, options, prop, end, easing ) {
6929 return new Tween.prototype.init( elem, options, prop, end, easing );
6930 }
6931 jQuery.Tween = Tween;
6932
6933 Tween.prototype = {
6934 constructor: Tween,
6935 init: function( elem, options, prop, end, easing, unit ) {
6936 this.elem = elem;
6937 this.prop = prop;
6938 this.easing = easing || "swing";
6939 this.options = options;
6940 this.start = this.now = this.cur();
6941 this.end = end;
6942 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6943 },
6944 cur: function() {
6945 var hooks = Tween.propHooks[ this.prop ];
6946
6947 return hooks && hooks.get ?
6948 hooks.get( this ) :
6949 Tween.propHooks._default.get( this );
6950 },
6951 run: function( percent ) {
6952 var eased,
6953 hooks = Tween.propHooks[ this.prop ];
6954
6955 if ( this.options.duration ) {
6956 this.pos = eased = jQuery.easing[ this.easing ](
6957 percent, this.options.duration * percent, 0, 1, this.options.duration
6958 );
6959 } else {
6960 this.pos = eased = percent;
6961 }
6962 this.now = ( this.end - this.start ) * eased + this.start;
6963
6964 if ( this.options.step ) {
6965 this.options.step.call( this.elem, this.now, this );
6966 }
6967
6968 if ( hooks && hooks.set ) {
6969 hooks.set( this );
6970 } else {
6971 Tween.propHooks._default.set( this );
6972 }
6973 return this;
6974 }
6975 };
6976
6977 Tween.prototype.init.prototype = Tween.prototype;
6978
6979 Tween.propHooks = {
6980 _default: {
6981 get: function( tween ) {
6982 var result;
6983
6984 if ( tween.elem[ tween.prop ] != null &&
6985 (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
6986 return tween.elem[ tween.prop ];
6987 }
6988
6989 // passing an empty string as a 3rd parameter to .css will automatically
6990 // attempt a parseFloat and fallback to a string if the parse fails
6991 // so, simple values such as "10px" are parsed to Float.
6992 // complex values such as "rotate(1rad)" are returned as is.
6993 result = jQuery.css( tween.elem, tween.prop, "" );
6994 // Empty strings, null, undefined and "auto" are converted to 0.
6995 return !result || result === "auto" ? 0 : result;
6996 },
6997 set: function( tween ) {
6998 // use step hook for back compat - use cssHook if its there - use .style if its
6999 // available and use plain properties where available
7000 if ( jQuery.fx.step[ tween.prop ] ) {
7001 jQuery.fx.step[ tween.prop ]( tween );
7002 } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
7003 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7004 } else {
7005 tween.elem[ tween.prop ] = tween.now;
7006 }
7007 }
7008 }
7009 };
7010
7011 // Support: IE <=9
7012 // Panic based approach to setting things on disconnected nodes
7013
7014 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7015 set: function( tween ) {
7016 if ( tween.elem.nodeType && tween.elem.parentNode ) {
7017 tween.elem[ tween.prop ] = tween.now;
7018 }
7019 }
7020 };
7021
7022 jQuery.easing = {
7023 linear: function( p ) {
7024 return p;
7025 },
7026 swing: function( p ) {
7027 return 0.5 - Math.cos( p * Math.PI ) / 2;
7028 }
7029 };
7030
7031 jQuery.fx = Tween.prototype.init;
7032
7033 // Back Compat <1.8 extension point
7034 jQuery.fx.step = {};
7035
7036
7037
7038
7039 var
7040 fxNow, timerId,
7041 rfxtypes = /^(?:toggle|show|hide)$/,
7042 rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
7043 rrun = /queueHooks$/,
7044 animationPrefilters = [ defaultPrefilter ],
7045 tweeners = {
7046 "*": [ function( prop, value ) {
7047 var tween = this.createTween( prop, value ),
7048 target = tween.cur(),
7049 parts = rfxnum.exec( value ),
7050 unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
7051
7052 // Starting value computation is required for potential unit mismatches
7053 start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
7054 rfxnum.exec( jQuery.css( tween.elem, prop ) ),
7055 scale = 1,
7056 maxIterations = 20;
7057
7058 if ( start && start[ 3 ] !== unit ) {
7059 // Trust units reported by jQuery.css
7060 unit = unit || start[ 3 ];
7061
7062 // Make sure we update the tween properties later on
7063 parts = parts || [];
7064
7065 // Iteratively approximate from a nonzero starting point
7066 start = +target || 1;
7067
7068 do {
7069 // If previous iteration zeroed out, double until we get *something*
7070 // Use a string for doubling factor so we don't accidentally see scale as unchanged below
7071 scale = scale || ".5";
7072
7073 // Adjust and apply
7074 start = start / scale;
7075 jQuery.style( tween.elem, prop, start + unit );
7076
7077 // Update scale, tolerating zero or NaN from tween.cur()
7078 // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
7079 } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
7080 }
7081
7082 // Update tween properties
7083 if ( parts ) {
7084 start = tween.start = +start || +target || 0;
7085 tween.unit = unit;
7086 // If a +=/-= token was provided, we're doing a relative animation
7087 tween.end = parts[ 1 ] ?
7088 start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
7089 +parts[ 2 ];
7090 }
7091
7092 return tween;
7093 } ]
7094 };
7095
7096 // Animations created synchronously will run synchronously
7097 function createFxNow() {
7098 setTimeout(function() {
7099 fxNow = undefined;
7100 });
7101 return ( fxNow = jQuery.now() );
7102 }
7103
7104 // Generate parameters to create a standard animation
7105 function genFx( type, includeWidth ) {
7106 var which,
7107 attrs = { height: type },
7108 i = 0;
7109
7110 // if we include width, step value is 1 to do all cssExpand values,
7111 // if we don't include width, step value is 2 to skip over Left and Right
7112 includeWidth = includeWidth ? 1 : 0;
7113 for ( ; i < 4 ; i += 2 - includeWidth ) {
7114 which = cssExpand[ i ];
7115 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7116 }
7117
7118 if ( includeWidth ) {
7119 attrs.opacity = attrs.width = type;
7120 }
7121
7122 return attrs;
7123 }
7124
7125 function createTween( value, prop, animation ) {
7126 var tween,
7127 collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
7128 index = 0,
7129 length = collection.length;
7130 for ( ; index < length; index++ ) {
7131 if ( (tween = collection[ index ].call( animation, prop, value )) ) {
7132
7133 // we're done with this property
7134 return tween;
7135 }
7136 }
7137 }
7138
7139 function defaultPrefilter( elem, props, opts ) {
7140 /* jshint validthis: true */
7141 var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
7142 anim = this,
7143 orig = {},
7144 style = elem.style,
7145 hidden = elem.nodeType && isHidden( elem ),
7146 dataShow = jQuery._data( elem, "fxshow" );
7147
7148 // handle queue: false promises
7149 if ( !opts.queue ) {
7150 hooks = jQuery._queueHooks( elem, "fx" );
7151 if ( hooks.unqueued == null ) {
7152 hooks.unqueued = 0;
7153 oldfire = hooks.empty.fire;
7154 hooks.empty.fire = function() {
7155 if ( !hooks.unqueued ) {
7156 oldfire();
7157 }
7158 };
7159 }
7160 hooks.unqueued++;
7161
7162 anim.always(function() {
7163 // doing this makes sure that the complete handler will be called
7164 // before this completes
7165 anim.always(function() {
7166 hooks.unqueued--;
7167 if ( !jQuery.queue( elem, "fx" ).length ) {
7168 hooks.empty.fire();
7169 }
7170 });
7171 });
7172 }
7173
7174 // height/width overflow pass
7175 if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
7176 // Make sure that nothing sneaks out
7177 // Record all 3 overflow attributes because IE does not
7178 // change the overflow attribute when overflowX and
7179 // overflowY are set to the same value
7180 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7181
7182 // Set display property to inline-block for height/width
7183 // animations on inline elements that are having width/height animated
7184 display = jQuery.css( elem, "display" );
7185
7186 // Test default display if display is currently "none"
7187 checkDisplay = display === "none" ?
7188 jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
7189
7190 if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
7191
7192 // inline-level elements accept inline-block;
7193 // block-level elements need to be inline with layout
7194 if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
7195 style.display = "inline-block";
7196 } else {
7197 style.zoom = 1;
7198 }
7199 }
7200 }
7201
7202 if ( opts.overflow ) {
7203 style.overflow = "hidden";
7204 if ( !support.shrinkWrapBlocks() ) {
7205 anim.always(function() {
7206 style.overflow = opts.overflow[ 0 ];
7207 style.overflowX = opts.overflow[ 1 ];
7208 style.overflowY = opts.overflow[ 2 ];
7209 });
7210 }
7211 }
7212
7213 // show/hide pass
7214 for ( prop in props ) {
7215 value = props[ prop ];
7216 if ( rfxtypes.exec( value ) ) {
7217 delete props[ prop ];
7218 toggle = toggle || value === "toggle";
7219 if ( value === ( hidden ? "hide" : "show" ) ) {
7220
7221 // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
7222 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7223 hidden = true;
7224 } else {
7225 continue;
7226 }
7227 }
7228 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7229
7230 // Any non-fx value stops us from restoring the original display value
7231 } else {
7232 display = undefined;
7233 }
7234 }
7235
7236 if ( !jQuery.isEmptyObject( orig ) ) {
7237 if ( dataShow ) {
7238 if ( "hidden" in dataShow ) {
7239 hidden = dataShow.hidden;
7240 }
7241 } else {
7242 dataShow = jQuery._data( elem, "fxshow", {} );
7243 }
7244
7245 // store state if its toggle - enables .stop().toggle() to "reverse"
7246 if ( toggle ) {
7247 dataShow.hidden = !hidden;
7248 }
7249 if ( hidden ) {
7250 jQuery( elem ).show();
7251 } else {
7252 anim.done(function() {
7253 jQuery( elem ).hide();
7254 });
7255 }
7256 anim.done(function() {
7257 var prop;
7258 jQuery._removeData( elem, "fxshow" );
7259 for ( prop in orig ) {
7260 jQuery.style( elem, prop, orig[ prop ] );
7261 }
7262 });
7263 for ( prop in orig ) {
7264 tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7265
7266 if ( !( prop in dataShow ) ) {
7267 dataShow[ prop ] = tween.start;
7268 if ( hidden ) {
7269 tween.end = tween.start;
7270 tween.start = prop === "width" || prop === "height" ? 1 : 0;
7271 }
7272 }
7273 }
7274
7275 // If this is a noop like .hide().hide(), restore an overwritten display value
7276 } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
7277 style.display = display;
7278 }
7279 }
7280
7281 function propFilter( props, specialEasing ) {
7282 var index, name, easing, value, hooks;
7283
7284 // camelCase, specialEasing and expand cssHook pass
7285 for ( index in props ) {
7286 name = jQuery.camelCase( index );
7287 easing = specialEasing[ name ];
7288 value = props[ index ];
7289 if ( jQuery.isArray( value ) ) {
7290 easing = value[ 1 ];
7291 value = props[ index ] = value[ 0 ];
7292 }
7293
7294 if ( index !== name ) {
7295 props[ name ] = value;
7296 delete props[ index ];
7297 }
7298
7299 hooks = jQuery.cssHooks[ name ];
7300 if ( hooks && "expand" in hooks ) {
7301 value = hooks.expand( value );
7302 delete props[ name ];
7303
7304 // not quite $.extend, this wont overwrite keys already present.
7305 // also - reusing 'index' from above because we have the correct "name"
7306 for ( index in value ) {
7307 if ( !( index in props ) ) {
7308 props[ index ] = value[ index ];
7309 specialEasing[ index ] = easing;
7310 }
7311 }
7312 } else {
7313 specialEasing[ name ] = easing;
7314 }
7315 }
7316 }
7317
7318 function Animation( elem, properties, options ) {
7319 var result,
7320 stopped,
7321 index = 0,
7322 length = animationPrefilters.length,
7323 deferred = jQuery.Deferred().always( function() {
7324 // don't match elem in the :animated selector
7325 delete tick.elem;
7326 }),
7327 tick = function() {
7328 if ( stopped ) {
7329 return false;
7330 }
7331 var currentTime = fxNow || createFxNow(),
7332 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7333 // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
7334 temp = remaining / animation.duration || 0,
7335 percent = 1 - temp,
7336 index = 0,
7337 length = animation.tweens.length;
7338
7339 for ( ; index < length ; index++ ) {
7340 animation.tweens[ index ].run( percent );
7341 }
7342
7343 deferred.notifyWith( elem, [ animation, percent, remaining ]);
7344
7345 if ( percent < 1 && length ) {
7346 return remaining;
7347 } else {
7348 deferred.resolveWith( elem, [ animation ] );
7349 return false;
7350 }
7351 },
7352 animation = deferred.promise({
7353 elem: elem,
7354 props: jQuery.extend( {}, properties ),
7355 opts: jQuery.extend( true, { specialEasing: {} }, options ),
7356 originalProperties: properties,
7357 originalOptions: options,
7358 startTime: fxNow || createFxNow(),
7359 duration: options.duration,
7360 tweens: [],
7361 createTween: function( prop, end ) {
7362 var tween = jQuery.Tween( elem, animation.opts, prop, end,
7363 animation.opts.specialEasing[ prop ] || animation.opts.easing );
7364 animation.tweens.push( tween );
7365 return tween;
7366 },
7367 stop: function( gotoEnd ) {
7368 var index = 0,
7369 // if we are going to the end, we want to run all the tweens
7370 // otherwise we skip this part
7371 length = gotoEnd ? animation.tweens.length : 0;
7372 if ( stopped ) {
7373 return this;
7374 }
7375 stopped = true;
7376 for ( ; index < length ; index++ ) {
7377 animation.tweens[ index ].run( 1 );
7378 }
7379
7380 // resolve when we played the last frame
7381 // otherwise, reject
7382 if ( gotoEnd ) {
7383 deferred.resolveWith( elem, [ animation, gotoEnd ] );
7384 } else {
7385 deferred.rejectWith( elem, [ animation, gotoEnd ] );
7386 }
7387 return this;
7388 }
7389 }),
7390 props = animation.props;
7391
7392 propFilter( props, animation.opts.specialEasing );
7393
7394 for ( ; index < length ; index++ ) {
7395 result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
7396 if ( result ) {
7397 return result;
7398 }
7399 }
7400
7401 jQuery.map( props, createTween, animation );
7402
7403 if ( jQuery.isFunction( animation.opts.start ) ) {
7404 animation.opts.start.call( elem, animation );
7405 }
7406
7407 jQuery.fx.timer(
7408 jQuery.extend( tick, {
7409 elem: elem,
7410 anim: animation,
7411 queue: animation.opts.queue
7412 })
7413 );
7414
7415 // attach callbacks from options
7416 return animation.progress( animation.opts.progress )
7417 .done( animation.opts.done, animation.opts.complete )
7418 .fail( animation.opts.fail )
7419 .always( animation.opts.always );
7420 }
7421
7422 jQuery.Animation = jQuery.extend( Animation, {
7423 tweener: function( props, callback ) {
7424 if ( jQuery.isFunction( props ) ) {
7425 callback = props;
7426 props = [ "*" ];
7427 } else {
7428 props = props.split(" ");
7429 }
7430
7431 var prop,
7432 index = 0,
7433 length = props.length;
7434
7435 for ( ; index < length ; index++ ) {
7436 prop = props[ index ];
7437 tweeners[ prop ] = tweeners[ prop ] || [];
7438 tweeners[ prop ].unshift( callback );
7439 }
7440 },
7441
7442 prefilter: function( callback, prepend ) {
7443 if ( prepend ) {
7444 animationPrefilters.unshift( callback );
7445 } else {
7446 animationPrefilters.push( callback );
7447 }
7448 }
7449 });
7450
7451 jQuery.speed = function( speed, easing, fn ) {
7452 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7453 complete: fn || !fn && easing ||
7454 jQuery.isFunction( speed ) && speed,
7455 duration: speed,
7456 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7457 };
7458
7459 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7460 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
7461
7462 // normalize opt.queue - true/undefined/null -> "fx"
7463 if ( opt.queue == null || opt.queue === true ) {
7464 opt.queue = "fx";
7465 }
7466
7467 // Queueing
7468 opt.old = opt.complete;
7469
7470 opt.complete = function() {
7471 if ( jQuery.isFunction( opt.old ) ) {
7472 opt.old.call( this );
7473 }
7474
7475 if ( opt.queue ) {
7476 jQuery.dequeue( this, opt.queue );
7477 }
7478 };
7479
7480 return opt;
7481 };
7482
7483 jQuery.fn.extend({
7484 fadeTo: function( speed, to, easing, callback ) {
7485
7486 // show any hidden elements after setting opacity to 0
7487 return this.filter( isHidden ).css( "opacity", 0 ).show()
7488
7489 // animate to the value specified
7490 .end().animate({ opacity: to }, speed, easing, callback );
7491 },
7492 animate: function( prop, speed, easing, callback ) {
7493 var empty = jQuery.isEmptyObject( prop ),
7494 optall = jQuery.speed( speed, easing, callback ),
7495 doAnimation = function() {
7496 // Operate on a copy of prop so per-property easing won't be lost
7497 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7498
7499 // Empty animations, or finishing resolves immediately
7500 if ( empty || jQuery._data( this, "finish" ) ) {
7501 anim.stop( true );
7502 }
7503 };
7504 doAnimation.finish = doAnimation;
7505
7506 return empty || optall.queue === false ?
7507 this.each( doAnimation ) :
7508 this.queue( optall.queue, doAnimation );
7509 },
7510 stop: function( type, clearQueue, gotoEnd ) {
7511 var stopQueue = function( hooks ) {
7512 var stop = hooks.stop;
7513 delete hooks.stop;
7514 stop( gotoEnd );
7515 };
7516
7517 if ( typeof type !== "string" ) {
7518 gotoEnd = clearQueue;
7519 clearQueue = type;
7520 type = undefined;
7521 }
7522 if ( clearQueue && type !== false ) {
7523 this.queue( type || "fx", [] );
7524 }
7525
7526 return this.each(function() {
7527 var dequeue = true,
7528 index = type != null && type + "queueHooks",
7529 timers = jQuery.timers,
7530 data = jQuery._data( this );
7531
7532 if ( index ) {
7533 if ( data[ index ] && data[ index ].stop ) {
7534 stopQueue( data[ index ] );
7535 }
7536 } else {
7537 for ( index in data ) {
7538 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7539 stopQueue( data[ index ] );
7540 }
7541 }
7542 }
7543
7544 for ( index = timers.length; index--; ) {
7545 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
7546 timers[ index ].anim.stop( gotoEnd );
7547 dequeue = false;
7548 timers.splice( index, 1 );
7549 }
7550 }
7551
7552 // start the next in the queue if the last step wasn't forced
7553 // timers currently will call their complete callbacks, which will dequeue
7554 // but only if they were gotoEnd
7555 if ( dequeue || !gotoEnd ) {
7556 jQuery.dequeue( this, type );
7557 }
7558 });
7559 },
7560 finish: function( type ) {
7561 if ( type !== false ) {
7562 type = type || "fx";
7563 }
7564 return this.each(function() {
7565 var index,
7566 data = jQuery._data( this ),
7567 queue = data[ type + "queue" ],
7568 hooks = data[ type + "queueHooks" ],
7569 timers = jQuery.timers,
7570 length = queue ? queue.length : 0;
7571
7572 // enable finishing flag on private data
7573 data.finish = true;
7574
7575 // empty the queue first
7576 jQuery.queue( this, type, [] );
7577
7578 if ( hooks && hooks.stop ) {
7579 hooks.stop.call( this, true );
7580 }
7581
7582 // look for any active animations, and finish them
7583 for ( index = timers.length; index--; ) {
7584 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7585 timers[ index ].anim.stop( true );
7586 timers.splice( index, 1 );
7587 }
7588 }
7589
7590 // look for any animations in the old queue and finish them
7591 for ( index = 0; index < length; index++ ) {
7592 if ( queue[ index ] && queue[ index ].finish ) {
7593 queue[ index ].finish.call( this );
7594 }
7595 }
7596
7597 // turn off finishing flag
7598 delete data.finish;
7599 });
7600 }
7601 });
7602
7603 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
7604 var cssFn = jQuery.fn[ name ];
7605 jQuery.fn[ name ] = function( speed, easing, callback ) {
7606 return speed == null || typeof speed === "boolean" ?
7607 cssFn.apply( this, arguments ) :
7608 this.animate( genFx( name, true ), speed, easing, callback );
7609 };
7610 });
7611
7612 // Generate shortcuts for custom animations
7613 jQuery.each({
7614 slideDown: genFx("show"),
7615 slideUp: genFx("hide"),
7616 slideToggle: genFx("toggle"),
7617 fadeIn: { opacity: "show" },
7618 fadeOut: { opacity: "hide" },
7619 fadeToggle: { opacity: "toggle" }
7620 }, function( name, props ) {
7621 jQuery.fn[ name ] = function( speed, easing, callback ) {
7622 return this.animate( props, speed, easing, callback );
7623 };
7624 });
7625
7626 jQuery.timers = [];
7627 jQuery.fx.tick = function() {
7628 var timer,
7629 timers = jQuery.timers,
7630 i = 0;
7631
7632 fxNow = jQuery.now();
7633
7634 for ( ; i < timers.length; i++ ) {
7635 timer = timers[ i ];
7636 // Checks the timer has not already been removed
7637 if ( !timer() && timers[ i ] === timer ) {
7638 timers.splice( i--, 1 );
7639 }
7640 }
7641
7642 if ( !timers.length ) {
7643 jQuery.fx.stop();
7644 }
7645 fxNow = undefined;
7646 };
7647
7648 jQuery.fx.timer = function( timer ) {
7649 jQuery.timers.push( timer );
7650 if ( timer() ) {
7651 jQuery.fx.start();
7652 } else {
7653 jQuery.timers.pop();
7654 }
7655 };
7656
7657 jQuery.fx.interval = 13;
7658
7659 jQuery.fx.start = function() {
7660 if ( !timerId ) {
7661 timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
7662 }
7663 };
7664
7665 jQuery.fx.stop = function() {
7666 clearInterval( timerId );
7667 timerId = null;
7668 };
7669
7670 jQuery.fx.speeds = {
7671 slow: 600,
7672 fast: 200,
7673 // Default speed
7674 _default: 400
7675 };
7676
7677
7678 // Based off of the plugin by Clint Helfers, with permission.
7679 // http://blindsignals.com/index.php/2009/07/jquery-delay/
7680 jQuery.fn.delay = function( time, type ) {
7681 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7682 type = type || "fx";
7683
7684 return this.queue( type, function( next, hooks ) {
7685 var timeout = setTimeout( next, time );
7686 hooks.stop = function() {
7687 clearTimeout( timeout );
7688 };
7689 });
7690 };
7691
7692
7693 (function() {
7694 // Minified: var a,b,c,d,e
7695 var input, div, select, a, opt;
7696
7697 // Setup
7698 div = document.createElement( "div" );
7699 div.setAttribute( "className", "t" );
7700 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
7701 a = div.getElementsByTagName("a")[ 0 ];
7702
7703 // First batch of tests.
7704 select = document.createElement("select");
7705 opt = select.appendChild( document.createElement("option") );
7706 input = div.getElementsByTagName("input")[ 0 ];
7707
7708 a.style.cssText = "top:1px";
7709
7710 // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
7711 support.getSetAttribute = div.className !== "t";
7712
7713 // Get the style information from getAttribute
7714 // (IE uses .cssText instead)
7715 support.style = /top/.test( a.getAttribute("style") );
7716
7717 // Make sure that URLs aren't manipulated
7718 // (IE normalizes it by default)
7719 support.hrefNormalized = a.getAttribute("href") === "/a";
7720
7721 // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
7722 support.checkOn = !!input.value;
7723
7724 // Make sure that a selected-by-default option has a working selected property.
7725 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
7726 support.optSelected = opt.selected;
7727
7728 // Tests for enctype support on a form (#6743)
7729 support.enctype = !!document.createElement("form").enctype;
7730
7731 // Make sure that the options inside disabled selects aren't marked as disabled
7732 // (WebKit marks them as disabled)
7733 select.disabled = true;
7734 support.optDisabled = !opt.disabled;
7735
7736 // Support: IE8 only
7737 // Check if we can trust getAttribute("value")
7738 input = document.createElement( "input" );
7739 input.setAttribute( "value", "" );
7740 support.input = input.getAttribute( "value" ) === "";
7741
7742 // Check if an input maintains its value after becoming a radio
7743 input.value = "t";
7744 input.setAttribute( "type", "radio" );
7745 support.radioValue = input.value === "t";
7746 })();
7747
7748
7749 var rreturn = /\r/g;
7750
7751 jQuery.fn.extend({
7752 val: function( value ) {
7753 var hooks, ret, isFunction,
7754 elem = this[0];
7755
7756 if ( !arguments.length ) {
7757 if ( elem ) {
7758 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7759
7760 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
7761 return ret;
7762 }
7763
7764 ret = elem.value;
7765
7766 return typeof ret === "string" ?
7767 // handle most common string cases
7768 ret.replace(rreturn, "") :
7769 // handle cases where value is null/undef or number
7770 ret == null ? "" : ret;
7771 }
7772
7773 return;
7774 }
7775
7776 isFunction = jQuery.isFunction( value );
7777
7778 return this.each(function( i ) {
7779 var val;
7780
7781 if ( this.nodeType !== 1 ) {
7782 return;
7783 }
7784
7785 if ( isFunction ) {
7786 val = value.call( this, i, jQuery( this ).val() );
7787 } else {
7788 val = value;
7789 }
7790
7791 // Treat null/undefined as ""; convert numbers to string
7792 if ( val == null ) {
7793 val = "";
7794 } else if ( typeof val === "number" ) {
7795 val += "";
7796 } else if ( jQuery.isArray( val ) ) {
7797 val = jQuery.map( val, function( value ) {
7798 return value == null ? "" : value + "";
7799 });
7800 }
7801
7802 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7803
7804 // If set returns undefined, fall back to normal setting
7805 if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
7806 this.value = val;
7807 }
7808 });
7809 }
7810 });
7811
7812 jQuery.extend({
7813 valHooks: {
7814 option: {
7815 get: function( elem ) {
7816 var val = jQuery.find.attr( elem, "value" );
7817 return val != null ?
7818 val :
7819 // Support: IE10-11+
7820 // option.text throws exceptions (#14686, #14858)
7821 jQuery.trim( jQuery.text( elem ) );
7822 }
7823 },
7824 select: {
7825 get: function( elem ) {
7826 var value, option,
7827 options = elem.options,
7828 index = elem.selectedIndex,
7829 one = elem.type === "select-one" || index < 0,
7830 values = one ? null : [],
7831 max = one ? index + 1 : options.length,
7832 i = index < 0 ?
7833 max :
7834 one ? index : 0;
7835
7836 // Loop through all the selected options
7837 for ( ; i < max; i++ ) {
7838 option = options[ i ];
7839
7840 // oldIE doesn't update selected after form reset (#2551)
7841 if ( ( option.selected || i === index ) &&
7842 // Don't return options that are disabled or in a disabled optgroup
7843 ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
7844 ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
7845
7846 // Get the specific value for the option
7847 value = jQuery( option ).val();
7848
7849 // We don't need an array for one selects
7850 if ( one ) {
7851 return value;
7852 }
7853
7854 // Multi-Selects return an array
7855 values.push( value );
7856 }
7857 }
7858
7859 return values;
7860 },
7861
7862 set: function( elem, value ) {
7863 var optionSet, option,
7864 options = elem.options,
7865 values = jQuery.makeArray( value ),
7866 i = options.length;
7867
7868 while ( i-- ) {
7869 option = options[ i ];
7870
7871 if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
7872
7873 // Support: IE6
7874 // When new option element is added to select box we need to
7875 // force reflow of newly added node in order to workaround delay
7876 // of initialization properties
7877 try {
7878 option.selected = optionSet = true;
7879
7880 } catch ( _ ) {
7881
7882 // Will be executed only in IE6
7883 option.scrollHeight;
7884 }
7885
7886 } else {
7887 option.selected = false;
7888 }
7889 }
7890
7891 // Force browsers to behave consistently when non-matching value is set
7892 if ( !optionSet ) {
7893 elem.selectedIndex = -1;
7894 }
7895
7896 return options;
7897 }
7898 }
7899 }
7900 });
7901
7902 // Radios and checkboxes getter/setter
7903 jQuery.each([ "radio", "checkbox" ], function() {
7904 jQuery.valHooks[ this ] = {
7905 set: function( elem, value ) {
7906 if ( jQuery.isArray( value ) ) {
7907 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
7908 }
7909 }
7910 };
7911 if ( !support.checkOn ) {
7912 jQuery.valHooks[ this ].get = function( elem ) {
7913 // Support: Webkit
7914 // "" is returned instead of "on" if a value isn't specified
7915 return elem.getAttribute("value") === null ? "on" : elem.value;
7916 };
7917 }
7918 });
7919
7920
7921
7922
7923 var nodeHook, boolHook,
7924 attrHandle = jQuery.expr.attrHandle,
7925 ruseDefault = /^(?:checked|selected)$/i,
7926 getSetAttribute = support.getSetAttribute,
7927 getSetInput = support.input;
7928
7929 jQuery.fn.extend({
7930 attr: function( name, value ) {
7931 return access( this, jQuery.attr, name, value, arguments.length > 1 );
7932 },
7933
7934 removeAttr: function( name ) {
7935 return this.each(function() {
7936 jQuery.removeAttr( this, name );
7937 });
7938 }
7939 });
7940
7941 jQuery.extend({
7942 attr: function( elem, name, value ) {
7943 var hooks, ret,
7944 nType = elem.nodeType;
7945
7946 // don't get/set attributes on text, comment and attribute nodes
7947 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
7948 return;
7949 }
7950
7951 // Fallback to prop when attributes are not supported
7952 if ( typeof elem.getAttribute === strundefined ) {
7953 return jQuery.prop( elem, name, value );
7954 }
7955
7956 // All attributes are lowercase
7957 // Grab necessary hook if one is defined
7958 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7959 name = name.toLowerCase();
7960 hooks = jQuery.attrHooks[ name ] ||
7961 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
7962 }
7963
7964 if ( value !== undefined ) {
7965
7966 if ( value === null ) {
7967 jQuery.removeAttr( elem, name );
7968
7969 } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
7970 return ret;
7971
7972 } else {
7973 elem.setAttribute( name, value + "" );
7974 return value;
7975 }
7976
7977 } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
7978 return ret;
7979
7980 } else {
7981 ret = jQuery.find.attr( elem, name );
7982
7983 // Non-existent attributes return null, we normalize to undefined
7984 return ret == null ?
7985 undefined :
7986 ret;
7987 }
7988 },
7989
7990 removeAttr: function( elem, value ) {
7991 var name, propName,
7992 i = 0,
7993 attrNames = value && value.match( rnotwhite );
7994
7995 if ( attrNames && elem.nodeType === 1 ) {
7996 while ( (name = attrNames[i++]) ) {
7997 propName = jQuery.propFix[ name ] || name;
7998
7999 // Boolean attributes get special treatment (#10870)
8000 if ( jQuery.expr.match.bool.test( name ) ) {
8001 // Set corresponding property to false
8002 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8003 elem[ propName ] = false;
8004 // Support: IE<9
8005 // Also clear defaultChecked/defaultSelected (if appropriate)
8006 } else {
8007 elem[ jQuery.camelCase( "default-" + name ) ] =
8008 elem[ propName ] = false;
8009 }
8010
8011 // See #9699 for explanation of this approach (setting first, then removal)
8012 } else {
8013 jQuery.attr( elem, name, "" );
8014 }
8015
8016 elem.removeAttribute( getSetAttribute ? name : propName );
8017 }
8018 }
8019 },
8020
8021 attrHooks: {
8022 type: {
8023 set: function( elem, value ) {
8024 if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
8025 // Setting the type on a radio button after the value resets the value in IE6-9
8026 // Reset value to default in case type is set after value during creation
8027 var val = elem.value;
8028 elem.setAttribute( "type", value );
8029 if ( val ) {
8030 elem.value = val;
8031 }
8032 return value;
8033 }
8034 }
8035 }
8036 }
8037 });
8038
8039 // Hook for boolean attributes
8040 boolHook = {
8041 set: function( elem, value, name ) {
8042 if ( value === false ) {
8043 // Remove boolean attributes when set to false
8044 jQuery.removeAttr( elem, name );
8045 } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8046 // IE<8 needs the *property* name
8047 elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
8048
8049 // Use defaultChecked and defaultSelected for oldIE
8050 } else {
8051 elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
8052 }
8053
8054 return name;
8055 }
8056 };
8057
8058 // Retrieve booleans specially
8059 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8060
8061 var getter = attrHandle[ name ] || jQuery.find.attr;
8062
8063 attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
8064 function( elem, name, isXML ) {
8065 var ret, handle;
8066 if ( !isXML ) {
8067 // Avoid an infinite loop by temporarily removing this function from the getter
8068 handle = attrHandle[ name ];
8069 attrHandle[ name ] = ret;
8070 ret = getter( elem, name, isXML ) != null ?
8071 name.toLowerCase() :
8072 null;
8073 attrHandle[ name ] = handle;
8074 }
8075 return ret;
8076 } :
8077 function( elem, name, isXML ) {
8078 if ( !isXML ) {
8079 return elem[ jQuery.camelCase( "default-" + name ) ] ?
8080 name.toLowerCase() :
8081 null;
8082 }
8083 };
8084 });
8085
8086 // fix oldIE attroperties
8087 if ( !getSetInput || !getSetAttribute ) {
8088 jQuery.attrHooks.value = {
8089 set: function( elem, value, name ) {
8090 if ( jQuery.nodeName( elem, "input" ) ) {
8091 // Does not return so that setAttribute is also used
8092 elem.defaultValue = value;
8093 } else {
8094 // Use nodeHook if defined (#1954); otherwise setAttribute is fine
8095 return nodeHook && nodeHook.set( elem, value, name );
8096 }
8097 }
8098 };
8099 }
8100
8101 // IE6/7 do not support getting/setting some attributes with get/setAttribute
8102 if ( !getSetAttribute ) {
8103
8104 // Use this for any attribute in IE6/7
8105 // This fixes almost every IE6/7 issue
8106 nodeHook = {
8107 set: function( elem, value, name ) {
8108 // Set the existing or create a new attribute node
8109 var ret = elem.getAttributeNode( name );
8110 if ( !ret ) {
8111 elem.setAttributeNode(
8112 (ret = elem.ownerDocument.createAttribute( name ))
8113 );
8114 }
8115
8116 ret.value = value += "";
8117
8118 // Break association with cloned elements by also using setAttribute (#9646)
8119 if ( name === "value" || value === elem.getAttribute( name ) ) {
8120 return value;
8121 }
8122 }
8123 };
8124
8125 // Some attributes are constructed with empty-string values when not defined
8126 attrHandle.id = attrHandle.name = attrHandle.coords =
8127 function( elem, name, isXML ) {
8128 var ret;
8129 if ( !isXML ) {
8130 return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
8131 ret.value :
8132 null;
8133 }
8134 };
8135
8136 // Fixing value retrieval on a button requires this module
8137 jQuery.valHooks.button = {
8138 get: function( elem, name ) {
8139 var ret = elem.getAttributeNode( name );
8140 if ( ret && ret.specified ) {
8141 return ret.value;
8142 }
8143 },
8144 set: nodeHook.set
8145 };
8146
8147 // Set contenteditable to false on removals(#10429)
8148 // Setting to empty string throws an error as an invalid value
8149 jQuery.attrHooks.contenteditable = {
8150 set: function( elem, value, name ) {
8151 nodeHook.set( elem, value === "" ? false : value, name );
8152 }
8153 };
8154
8155 // Set width and height to auto instead of 0 on empty string( Bug #8150 )
8156 // This is for removals
8157 jQuery.each([ "width", "height" ], function( i, name ) {
8158 jQuery.attrHooks[ name ] = {
8159 set: function( elem, value ) {
8160 if ( value === "" ) {
8161 elem.setAttribute( name, "auto" );
8162 return value;
8163 }
8164 }
8165 };
8166 });
8167 }
8168
8169 if ( !support.style ) {
8170 jQuery.attrHooks.style = {
8171 get: function( elem ) {
8172 // Return undefined in the case of empty string
8173 // Note: IE uppercases css property names, but if we were to .toLowerCase()
8174 // .cssText, that would destroy case senstitivity in URL's, like in "background"
8175 return elem.style.cssText || undefined;
8176 },
8177 set: function( elem, value ) {
8178 return ( elem.style.cssText = value + "" );
8179 }
8180 };
8181 }
8182
8183
8184
8185
8186 var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8187 rclickable = /^(?:a|area)$/i;
8188
8189 jQuery.fn.extend({
8190 prop: function( name, value ) {
8191 return access( this, jQuery.prop, name, value, arguments.length > 1 );
8192 },
8193
8194 removeProp: function( name ) {
8195 name = jQuery.propFix[ name ] || name;
8196 return this.each(function() {
8197 // try/catch handles cases where IE balks (such as removing a property on window)
8198 try {
8199 this[ name ] = undefined;
8200 delete this[ name ];
8201 } catch( e ) {}
8202 });
8203 }
8204 });
8205
8206 jQuery.extend({
8207 propFix: {
8208 "for": "htmlFor",
8209 "class": "className"
8210 },
8211
8212 prop: function( elem, name, value ) {
8213 var ret, hooks, notxml,
8214 nType = elem.nodeType;
8215
8216 // don't get/set properties on text, comment and attribute nodes
8217 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
8218 return;
8219 }
8220
8221 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
8222
8223 if ( notxml ) {
8224 // Fix name and attach hooks
8225 name = jQuery.propFix[ name ] || name;
8226 hooks = jQuery.propHooks[ name ];
8227 }
8228
8229 if ( value !== undefined ) {
8230 return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
8231 ret :
8232 ( elem[ name ] = value );
8233
8234 } else {
8235 return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
8236 ret :
8237 elem[ name ];
8238 }
8239 },
8240
8241 propHooks: {
8242 tabIndex: {
8243 get: function( elem ) {
8244 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
8245 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8246 // Use proper attribute retrieval(#12072)
8247 var tabindex = jQuery.find.attr( elem, "tabindex" );
8248
8249 return tabindex ?
8250 parseInt( tabindex, 10 ) :
8251 rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
8252 0 :
8253 -1;
8254 }
8255 }
8256 }
8257 });
8258
8259 // Some attributes require a special call on IE
8260 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8261 if ( !support.hrefNormalized ) {
8262 // href/src property should get the full normalized URL (#10299/#12915)
8263 jQuery.each([ "href", "src" ], function( i, name ) {
8264 jQuery.propHooks[ name ] = {
8265 get: function( elem ) {
8266 return elem.getAttribute( name, 4 );
8267 }
8268 };
8269 });
8270 }
8271
8272 // Support: Safari, IE9+
8273 // mis-reports the default selected property of an option
8274 // Accessing the parent's selectedIndex property fixes it
8275 if ( !support.optSelected ) {
8276 jQuery.propHooks.selected = {
8277 get: function( elem ) {
8278 var parent = elem.parentNode;
8279
8280 if ( parent ) {
8281 parent.selectedIndex;
8282
8283 // Make sure that it also works with optgroups, see #5701
8284 if ( parent.parentNode ) {
8285 parent.parentNode.selectedIndex;
8286 }
8287 }
8288 return null;
8289 }
8290 };
8291 }
8292
8293 jQuery.each([
8294 "tabIndex",
8295 "readOnly",
8296 "maxLength",
8297 "cellSpacing",
8298 "cellPadding",
8299 "rowSpan",
8300 "colSpan",
8301 "useMap",
8302 "frameBorder",
8303 "contentEditable"
8304 ], function() {
8305 jQuery.propFix[ this.toLowerCase() ] = this;
8306 });
8307
8308 // IE6/7 call enctype encoding
8309 if ( !support.enctype ) {
8310 jQuery.propFix.enctype = "encoding";
8311 }
8312
8313
8314
8315
8316 var rclass = /[\t\r\n\f]/g;
8317
8318 jQuery.fn.extend({
8319 addClass: function( value ) {
8320 var classes, elem, cur, clazz, j, finalValue,
8321 i = 0,
8322 len = this.length,
8323 proceed = typeof value === "string" && value;
8324
8325 if ( jQuery.isFunction( value ) ) {
8326 return this.each(function( j ) {
8327 jQuery( this ).addClass( value.call( this, j, this.className ) );
8328 });
8329 }
8330
8331 if ( proceed ) {
8332 // The disjunction here is for better compressibility (see removeClass)
8333 classes = ( value || "" ).match( rnotwhite ) || [];
8334
8335 for ( ; i < len; i++ ) {
8336 elem = this[ i ];
8337 cur = elem.nodeType === 1 && ( elem.className ?
8338 ( " " + elem.className + " " ).replace( rclass, " " ) :
8339 " "
8340 );
8341
8342 if ( cur ) {
8343 j = 0;
8344 while ( (clazz = classes[j++]) ) {
8345 if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8346 cur += clazz + " ";
8347 }
8348 }
8349
8350 // only assign if different to avoid unneeded rendering.
8351 finalValue = jQuery.trim( cur );
8352 if ( elem.className !== finalValue ) {
8353 elem.className = finalValue;
8354 }
8355 }
8356 }
8357 }
8358
8359 return this;
8360 },
8361
8362 removeClass: function( value ) {
8363 var classes, elem, cur, clazz, j, finalValue,
8364 i = 0,
8365 len = this.length,
8366 proceed = arguments.length === 0 || typeof value === "string" && value;
8367
8368 if ( jQuery.isFunction( value ) ) {
8369 return this.each(function( j ) {
8370 jQuery( this ).removeClass( value.call( this, j, this.className ) );
8371 });
8372 }
8373 if ( proceed ) {
8374 classes = ( value || "" ).match( rnotwhite ) || [];
8375
8376 for ( ; i < len; i++ ) {
8377 elem = this[ i ];
8378 // This expression is here for better compressibility (see addClass)
8379 cur = elem.nodeType === 1 && ( elem.className ?
8380 ( " " + elem.className + " " ).replace( rclass, " " ) :
8381 ""
8382 );
8383
8384 if ( cur ) {
8385 j = 0;
8386 while ( (clazz = classes[j++]) ) {
8387 // Remove *all* instances
8388 while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
8389 cur = cur.replace( " " + clazz + " ", " " );
8390 }
8391 }
8392
8393 // only assign if different to avoid unneeded rendering.
8394 finalValue = value ? jQuery.trim( cur ) : "";
8395 if ( elem.className !== finalValue ) {
8396 elem.className = finalValue;
8397 }
8398 }
8399 }
8400 }
8401
8402 return this;
8403 },
8404
8405 toggleClass: function( value, stateVal ) {
8406 var type = typeof value;
8407
8408 if ( typeof stateVal === "boolean" && type === "string" ) {
8409 return stateVal ? this.addClass( value ) : this.removeClass( value );
8410 }
8411
8412 if ( jQuery.isFunction( value ) ) {
8413 return this.each(function( i ) {
8414 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
8415 });
8416 }
8417
8418 return this.each(function() {
8419 if ( type === "string" ) {
8420 // toggle individual class names
8421 var className,
8422 i = 0,
8423 self = jQuery( this ),
8424 classNames = value.match( rnotwhite ) || [];
8425
8426 while ( (className = classNames[ i++ ]) ) {
8427 // check each className given, space separated list
8428 if ( self.hasClass( className ) ) {
8429 self.removeClass( className );
8430 } else {
8431 self.addClass( className );
8432 }
8433 }
8434
8435 // Toggle whole class name
8436 } else if ( type === strundefined || type === "boolean" ) {
8437 if ( this.className ) {
8438 // store className if set
8439 jQuery._data( this, "__className__", this.className );
8440 }
8441
8442 // If the element has a class name or if we're passed "false",
8443 // then remove the whole classname (if there was one, the above saved it).
8444 // Otherwise bring back whatever was previously saved (if anything),
8445 // falling back to the empty string if nothing was stored.
8446 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
8447 }
8448 });
8449 },
8450
8451 hasClass: function( selector ) {
8452 var className = " " + selector + " ",
8453 i = 0,
8454 l = this.length;
8455 for ( ; i < l; i++ ) {
8456 if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
8457 return true;
8458 }
8459 }
8460
8461 return false;
8462 }
8463 });
8464
8465
8466
8467
8468 // Return jQuery for attributes-only inclusion
8469
8470
8471 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
8472 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8473 "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
8474
8475 // Handle event binding
8476 jQuery.fn[ name ] = function( data, fn ) {
8477 return arguments.length > 0 ?
8478 this.on( name, null, data, fn ) :
8479 this.trigger( name );
8480 };
8481 });
8482
8483 jQuery.fn.extend({
8484 hover: function( fnOver, fnOut ) {
8485 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8486 },
8487
8488 bind: function( types, data, fn ) {
8489 return this.on( types, null, data, fn );
8490 },
8491 unbind: function( types, fn ) {
8492 return this.off( types, null, fn );
8493 },
8494
8495 delegate: function( selector, types, data, fn ) {
8496 return this.on( types, selector, data, fn );
8497 },
8498 undelegate: function( selector, types, fn ) {
8499 // ( namespace ) or ( selector, types [, fn] )
8500 return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
8501 }
8502 });
8503
8504
8505 var nonce = jQuery.now();
8506
8507 var rquery = (/\?/);
8508
8509
8510
8511 var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
8512
8513 jQuery.parseJSON = function( data ) {
8514 // Attempt to parse using the native JSON parser first
8515 if ( window.JSON && window.JSON.parse ) {
8516 // Support: Android 2.3
8517 // Workaround failure to string-cast null input
8518 return window.JSON.parse( data + "" );
8519 }
8520
8521 var requireNonComma,
8522 depth = null,
8523 str = jQuery.trim( data + "" );
8524
8525 // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
8526 // after removing valid tokens
8527 return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
8528
8529 // Force termination if we see a misplaced comma
8530 if ( requireNonComma && comma ) {
8531 depth = 0;
8532 }
8533
8534 // Perform no more replacements after returning to outermost depth
8535 if ( depth === 0 ) {
8536 return token;
8537 }
8538
8539 // Commas must not follow "[", "{", or ","
8540 requireNonComma = open || comma;
8541
8542 // Determine new depth
8543 // array/object open ("[" or "{"): depth += true - false (increment)
8544 // array/object close ("]" or "}"): depth += false - true (decrement)
8545 // other cases ("," or primitive): depth += true - true (numeric cast)
8546 depth += !close - !open;
8547
8548 // Remove this token
8549 return "";
8550 }) ) ?
8551 ( Function( "return " + str ) )() :
8552 jQuery.error( "Invalid JSON: " + data );
8553 };
8554
8555
8556 // Cross-browser xml parsing
8557 jQuery.parseXML = function( data ) {
8558 var xml, tmp;
8559 if ( !data || typeof data !== "string" ) {
8560 return null;
8561 }
8562 try {
8563 if ( window.DOMParser ) { // Standard
8564 tmp = new DOMParser();
8565 xml = tmp.parseFromString( data, "text/xml" );
8566 } else { // IE
8567 xml = new ActiveXObject( "Microsoft.XMLDOM" );
8568 xml.async = "false";
8569 xml.loadXML( data );
8570 }
8571 } catch( e ) {
8572 xml = undefined;
8573 }
8574 if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
8575 jQuery.error( "Invalid XML: " + data );
8576 }
8577 return xml;
8578 };
8579
8580
8581 var
8582 // Document location
8583 ajaxLocParts,
8584 ajaxLocation,
8585
69738586 rhash = /#.*$/,
8587 rts = /([?&])_=[^&]*/,
69748588 rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6975 rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
69768589 // #7653, #8125, #8152: local protocol detection
6977 rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
8590 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
69788591 rnoContent = /^(?:GET|HEAD)$/,
69798592 rprotocol = /^\/\//,
6980 rquery = /\?/,
6981 rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6982 rselectTextarea = /^(?:select|textarea)/i,
6983 rspacesAjax = /\s+/,
6984 rts = /([?&])_=[^&]*/,
6985 rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6986
6987 // Keep a copy of the old load method
6988 _load = jQuery.fn.load,
8593 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
69898594
69908595 /* Prefilters
69918596 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
70058610 */
70068611 transports = {},
70078612
7008 // Document location
7009 ajaxLocation,
7010
7011 // Document location segments
7012 ajaxLocParts,
7013
70148613 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7015 allTypes = ["*/"] + ["*"];
8614 allTypes = "*/".concat("*");
70168615
70178616 // #8138, IE may throw an exception when accessing
70188617 // a field from window.location if document.domain has been set
70408639 dataTypeExpression = "*";
70418640 }
70428641
8642 var dataType,
8643 i = 0,
8644 dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
8645
70438646 if ( jQuery.isFunction( func ) ) {
7044 var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
7045 i = 0,
7046 length = dataTypes.length,
7047 dataType,
7048 list,
7049 placeBefore;
7050
70518647 // For each dataType in the dataTypeExpression
7052 for ( ; i < length; i++ ) {
7053 dataType = dataTypes[ i ];
7054 // We control if we're asked to add before
7055 // any existing element
7056 placeBefore = /^\+/.test( dataType );
7057 if ( placeBefore ) {
7058 dataType = dataType.substr( 1 ) || "*";
7059 }
7060 list = structure[ dataType ] = structure[ dataType ] || [];
7061 // then we add to the structure accordingly
7062 list[ placeBefore ? "unshift" : "push" ]( func );
8648 while ( (dataType = dataTypes[i++]) ) {
8649 // Prepend if requested
8650 if ( dataType.charAt( 0 ) === "+" ) {
8651 dataType = dataType.slice( 1 ) || "*";
8652 (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
8653
8654 // Otherwise append
8655 } else {
8656 (structure[ dataType ] = structure[ dataType ] || []).push( func );
8657 }
70638658 }
70648659 }
70658660 };
70668661 }
70678662
70688663 // Base inspection function for prefilters and transports
7069 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
7070 dataType /* internal */, inspected /* internal */ ) {
7071
7072 dataType = dataType || options.dataTypes[ 0 ];
7073 inspected = inspected || {};
7074
7075 inspected[ dataType ] = true;
7076
7077 var list = structure[ dataType ],
7078 i = 0,
7079 length = list ? list.length : 0,
7080 executeOnly = ( structure === prefilters ),
7081 selection;
7082
7083 for ( ; i < length && ( executeOnly || !selection ); i++ ) {
7084 selection = list[ i ]( options, originalOptions, jqXHR );
7085 // If we got redirected to another dataType
7086 // we try there if executing only and not done already
7087 if ( typeof selection === "string" ) {
7088 if ( !executeOnly || inspected[ selection ] ) {
7089 selection = undefined;
7090 } else {
7091 options.dataTypes.unshift( selection );
7092 selection = inspectPrefiltersOrTransports(
7093 structure, options, originalOptions, jqXHR, selection, inspected );
7094 }
7095 }
7096 }
7097 // If we're only executing or nothing was selected
7098 // we try the catchall dataType if not done already
7099 if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
7100 selection = inspectPrefiltersOrTransports(
7101 structure, options, originalOptions, jqXHR, "*", inspected );
7102 }
7103 // unnecessary when only executing (prefilters)
7104 // but it'll be ignored by the caller in that case
7105 return selection;
8664 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8665
8666 var inspected = {},
8667 seekingTransport = ( structure === transports );
8668
8669 function inspect( dataType ) {
8670 var selected;
8671 inspected[ dataType ] = true;
8672 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8673 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8674 if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8675 options.dataTypes.unshift( dataTypeOrTransport );
8676 inspect( dataTypeOrTransport );
8677 return false;
8678 } else if ( seekingTransport ) {
8679 return !( selected = dataTypeOrTransport );
8680 }
8681 });
8682 return selected;
8683 }
8684
8685 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
71068686 }
71078687
71088688 // A special extend for ajax options
71098689 // that takes "flat" options (not to be deep extended)
71108690 // Fixes #9887
71118691 function ajaxExtend( target, src ) {
7112 var key, deep,
8692 var deep, key,
71138693 flatOptions = jQuery.ajaxSettings.flatOptions || {};
8694
71148695 for ( key in src ) {
71158696 if ( src[ key ] !== undefined ) {
7116 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8697 ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
71178698 }
71188699 }
71198700 if ( deep ) {
71208701 jQuery.extend( true, target, deep );
71218702 }
8703
8704 return target;
71228705 }
71238706
7124 jQuery.fn.extend({
7125 load: function( url, params, callback ) {
7126 if ( typeof url !== "string" && _load ) {
7127 return _load.apply( this, arguments );
7128
7129 // Don't do a request if no elements are being requested
7130 } else if ( !this.length ) {
7131 return this;
7132 }
7133
7134 var off = url.indexOf( " " );
7135 if ( off >= 0 ) {
7136 var selector = url.slice( off, url.length );
7137 url = url.slice( 0, off );
7138 }
7139
7140 // Default to a GET request
7141 var type = "GET";
7142
7143 // If the second parameter was provided
7144 if ( params ) {
7145 // If it's a function
7146 if ( jQuery.isFunction( params ) ) {
7147 // We assume that it's the callback
7148 callback = params;
7149 params = undefined;
7150
7151 // Otherwise, build a param string
7152 } else if ( typeof params === "object" ) {
7153 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
7154 type = "POST";
7155 }
7156 }
7157
7158 var self = this;
7159
7160 // Request the remote document
7161 jQuery.ajax({
7162 url: url,
7163 type: type,
7164 dataType: "html",
7165 data: params,
7166 // Complete callback (responseText is used internally)
7167 complete: function( jqXHR, status, responseText ) {
7168 // Store the response as specified by the jqXHR object
7169 responseText = jqXHR.responseText;
7170 // If successful, inject the HTML into all the matched elements
7171 if ( jqXHR.isResolved() ) {
7172 // #4825: Get the actual response in case
7173 // a dataFilter is present in ajaxSettings
7174 jqXHR.done(function( r ) {
7175 responseText = r;
7176 });
7177 // See if a selector was specified
7178 self.html( selector ?
7179 // Create a dummy div to hold the results
7180 jQuery("<div>")
7181 // inject the contents of the document in, removing the scripts
7182 // to avoid any 'Permission Denied' errors in IE
7183 .append(responseText.replace(rscript, ""))
7184
7185 // Locate the specified elements
7186 .find(selector) :
7187
7188 // If not, just inject the full result
7189 responseText );
7190 }
7191
7192 if ( callback ) {
7193 self.each( callback, [ responseText, status, jqXHR ] );
7194 }
7195 }
7196 });
7197
7198 return this;
7199 },
7200
7201 serialize: function() {
7202 return jQuery.param( this.serializeArray() );
7203 },
7204
7205 serializeArray: function() {
7206 return this.map(function(){
7207 return this.elements ? jQuery.makeArray( this.elements ) : this;
7208 })
7209 .filter(function(){
7210 return this.name && !this.disabled &&
7211 ( this.checked || rselectTextarea.test( this.nodeName ) ||
7212 rinput.test( this.type ) );
7213 })
7214 .map(function( i, elem ){
7215 var val = jQuery( this ).val();
7216
7217 return val == null ?
7218 null :
7219 jQuery.isArray( val ) ?
7220 jQuery.map( val, function( val, i ){
7221 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7222 }) :
7223 { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7224 }).get();
7225 }
7226 });
7227
7228 // Attach a bunch of functions for handling common AJAX events
7229 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7230 jQuery.fn[ o ] = function( f ){
7231 return this.on( o, f );
7232 };
7233 });
7234
7235 jQuery.each( [ "get", "post" ], function( i, method ) {
7236 jQuery[ method ] = function( url, data, callback, type ) {
7237 // shift arguments if data argument was omitted
7238 if ( jQuery.isFunction( data ) ) {
7239 type = type || callback;
7240 callback = data;
7241 data = undefined;
7242 }
7243
7244 return jQuery.ajax({
7245 type: method,
7246 url: url,
7247 data: data,
7248 success: callback,
7249 dataType: type
7250 });
7251 };
7252 });
7253
7254 jQuery.extend({
7255
7256 getScript: function( url, callback ) {
7257 return jQuery.get( url, undefined, callback, "script" );
7258 },
7259
7260 getJSON: function( url, data, callback ) {
7261 return jQuery.get( url, data, callback, "json" );
7262 },
7263
7264 // Creates a full fledged settings object into target
7265 // with both ajaxSettings and settings fields.
7266 // If target is omitted, writes into ajaxSettings.
7267 ajaxSetup: function( target, settings ) {
7268 if ( settings ) {
7269 // Building a settings object
7270 ajaxExtend( target, jQuery.ajaxSettings );
7271 } else {
7272 // Extending ajaxSettings
7273 settings = target;
7274 target = jQuery.ajaxSettings;
7275 }
7276 ajaxExtend( target, settings );
7277 return target;
7278 },
7279
7280 ajaxSettings: {
7281 url: ajaxLocation,
7282 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7283 global: true,
7284 type: "GET",
7285 contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7286 processData: true,
7287 async: true,
7288 /*
7289 timeout: 0,
7290 data: null,
7291 dataType: null,
7292 username: null,
7293 password: null,
7294 cache: null,
7295 traditional: false,
7296 headers: {},
7297 */
7298
7299 accepts: {
7300 xml: "application/xml, text/xml",
7301 html: "text/html",
7302 text: "text/plain",
7303 json: "application/json, text/javascript",
7304 "*": allTypes
7305 },
7306
7307 contents: {
7308 xml: /xml/,
7309 html: /html/,
7310 json: /json/
7311 },
7312
7313 responseFields: {
7314 xml: "responseXML",
7315 text: "responseText"
7316 },
7317
7318 // List of data converters
7319 // 1) key format is "source_type destination_type" (a single space in-between)
7320 // 2) the catchall symbol "*" can be used for source_type
7321 converters: {
7322
7323 // Convert anything to text
7324 "* text": window.String,
7325
7326 // Text to html (true = no transformation)
7327 "text html": true,
7328
7329 // Evaluate text as a json expression
7330 "text json": jQuery.parseJSON,
7331
7332 // Parse text as xml
7333 "text xml": jQuery.parseXML
7334 },
7335
7336 // For options that shouldn't be deep extended:
7337 // you can add your own custom options here if
7338 // and when you create one that shouldn't be
7339 // deep extended (see ajaxExtend)
7340 flatOptions: {
7341 context: true,
7342 url: true
7343 }
7344 },
7345
7346 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7347 ajaxTransport: addToPrefiltersOrTransports( transports ),
7348
7349 // Main method
7350 ajax: function( url, options ) {
7351
7352 // If url is an object, simulate pre-1.5 signature
7353 if ( typeof url === "object" ) {
7354 options = url;
7355 url = undefined;
7356 }
7357
7358 // Force options to be an object
7359 options = options || {};
7360
7361 var // Create the final options object
7362 s = jQuery.ajaxSetup( {}, options ),
7363 // Callbacks context
7364 callbackContext = s.context || s,
7365 // Context for global events
7366 // It's the callbackContext if one was provided in the options
7367 // and if it's a DOM node or a jQuery collection
7368 globalEventContext = callbackContext !== s &&
7369 ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7370 jQuery( callbackContext ) : jQuery.event,
7371 // Deferreds
7372 deferred = jQuery.Deferred(),
7373 completeDeferred = jQuery.Callbacks( "once memory" ),
7374 // Status-dependent callbacks
7375 statusCode = s.statusCode || {},
7376 // ifModified key
7377 ifModifiedKey,
7378 // Headers (they are sent all at once)
7379 requestHeaders = {},
7380 requestHeadersNames = {},
7381 // Response headers
7382 responseHeadersString,
7383 responseHeaders,
7384 // transport
7385 transport,
7386 // timeout handle
7387 timeoutTimer,
7388 // Cross-domain detection vars
7389 parts,
7390 // The jqXHR state
7391 state = 0,
7392 // To know if global events are to be dispatched
7393 fireGlobals,
7394 // Loop variable
7395 i,
7396 // Fake xhr
7397 jqXHR = {
7398
7399 readyState: 0,
7400
7401 // Caches the header
7402 setRequestHeader: function( name, value ) {
7403 if ( !state ) {
7404 var lname = name.toLowerCase();
7405 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7406 requestHeaders[ name ] = value;
7407 }
7408 return this;
7409 },
7410
7411 // Raw string
7412 getAllResponseHeaders: function() {
7413 return state === 2 ? responseHeadersString : null;
7414 },
7415
7416 // Builds headers hashtable if needed
7417 getResponseHeader: function( key ) {
7418 var match;
7419 if ( state === 2 ) {
7420 if ( !responseHeaders ) {
7421 responseHeaders = {};
7422 while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7423 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7424 }
7425 }
7426 match = responseHeaders[ key.toLowerCase() ];
7427 }
7428 return match === undefined ? null : match;
7429 },
7430
7431 // Overrides response content-type header
7432 overrideMimeType: function( type ) {
7433 if ( !state ) {
7434 s.mimeType = type;
7435 }
7436 return this;
7437 },
7438
7439 // Cancel the request
7440 abort: function( statusText ) {
7441 statusText = statusText || "abort";
7442 if ( transport ) {
7443 transport.abort( statusText );
7444 }
7445 done( 0, statusText );
7446 return this;
7447 }
7448 };
7449
7450 // Callback for when everything is done
7451 // It is defined here because jslint complains if it is declared
7452 // at the end of the function (which would be more logical and readable)
7453 function done( status, nativeStatusText, responses, headers ) {
7454
7455 // Called once
7456 if ( state === 2 ) {
7457 return;
7458 }
7459
7460 // State is "done" now
7461 state = 2;
7462
7463 // Clear timeout if it exists
7464 if ( timeoutTimer ) {
7465 clearTimeout( timeoutTimer );
7466 }
7467
7468 // Dereference transport for early garbage collection
7469 // (no matter how long the jqXHR object will be used)
7470 transport = undefined;
7471
7472 // Cache response headers
7473 responseHeadersString = headers || "";
7474
7475 // Set readyState
7476 jqXHR.readyState = status > 0 ? 4 : 0;
7477
7478 var isSuccess,
7479 success,
7480 error,
7481 statusText = nativeStatusText,
7482 response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7483 lastModified,
7484 etag;
7485
7486 // If successful, handle type chaining
7487 if ( status >= 200 && status < 300 || status === 304 ) {
7488
7489 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7490 if ( s.ifModified ) {
7491
7492 if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7493 jQuery.lastModified[ ifModifiedKey ] = lastModified;
7494 }
7495 if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7496 jQuery.etag[ ifModifiedKey ] = etag;
7497 }
7498 }
7499
7500 // If not modified
7501 if ( status === 304 ) {
7502
7503 statusText = "notmodified";
7504 isSuccess = true;
7505
7506 // If we have data
7507 } else {
7508
7509 try {
7510 success = ajaxConvert( s, response );
7511 statusText = "success";
7512 isSuccess = true;
7513 } catch(e) {
7514 // We have a parsererror
7515 statusText = "parsererror";
7516 error = e;
7517 }
7518 }
7519 } else {
7520 // We extract error from statusText
7521 // then normalize statusText and status for non-aborts
7522 error = statusText;
7523 if ( !statusText || status ) {
7524 statusText = "error";
7525 if ( status < 0 ) {
7526 status = 0;
7527 }
7528 }
7529 }
7530
7531 // Set data for the fake xhr object
7532 jqXHR.status = status;
7533 jqXHR.statusText = "" + ( nativeStatusText || statusText );
7534
7535 // Success/Error
7536 if ( isSuccess ) {
7537 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7538 } else {
7539 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7540 }
7541
7542 // Status-dependent callbacks
7543 jqXHR.statusCode( statusCode );
7544 statusCode = undefined;
7545
7546 if ( fireGlobals ) {
7547 globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7548 [ jqXHR, s, isSuccess ? success : error ] );
7549 }
7550
7551 // Complete
7552 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
7553
7554 if ( fireGlobals ) {
7555 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
7556 // Handle the global AJAX counter
7557 if ( !( --jQuery.active ) ) {
7558 jQuery.event.trigger( "ajaxStop" );
7559 }
7560 }
7561 }
7562
7563 // Attach deferreds
7564 deferred.promise( jqXHR );
7565 jqXHR.success = jqXHR.done;
7566 jqXHR.error = jqXHR.fail;
7567 jqXHR.complete = completeDeferred.add;
7568
7569 // Status-dependent callbacks
7570 jqXHR.statusCode = function( map ) {
7571 if ( map ) {
7572 var tmp;
7573 if ( state < 2 ) {
7574 for ( tmp in map ) {
7575 statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7576 }
7577 } else {
7578 tmp = map[ jqXHR.status ];
7579 jqXHR.then( tmp, tmp );
7580 }
7581 }
7582 return this;
7583 };
7584
7585 // Remove hash character (#7531: and string promotion)
7586 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7587 // We also use the url parameter if available
7588 s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7589
7590 // Extract dataTypes list
7591 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7592
7593 // Determine if a cross-domain request is in order
7594 if ( s.crossDomain == null ) {
7595 parts = rurl.exec( s.url.toLowerCase() );
7596 s.crossDomain = !!( parts &&
7597 ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7598 ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7599 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7600 );
7601 }
7602
7603 // Convert data if not already a string
7604 if ( s.data && s.processData && typeof s.data !== "string" ) {
7605 s.data = jQuery.param( s.data, s.traditional );
7606 }
7607
7608 // Apply prefilters
7609 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7610
7611 // If request was aborted inside a prefilter, stop there
7612 if ( state === 2 ) {
7613 return false;
7614 }
7615
7616 // We can fire global events as of now if asked to
7617 fireGlobals = s.global;
7618
7619 // Uppercase the type
7620 s.type = s.type.toUpperCase();
7621
7622 // Determine if request has content
7623 s.hasContent = !rnoContent.test( s.type );
7624
7625 // Watch for a new set of requests
7626 if ( fireGlobals && jQuery.active++ === 0 ) {
7627 jQuery.event.trigger( "ajaxStart" );
7628 }
7629
7630 // More options handling for requests with no content
7631 if ( !s.hasContent ) {
7632
7633 // If data is available, append data to url
7634 if ( s.data ) {
7635 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7636 // #9682: remove data so that it's not used in an eventual retry
7637 delete s.data;
7638 }
7639
7640 // Get ifModifiedKey before adding the anti-cache parameter
7641 ifModifiedKey = s.url;
7642
7643 // Add anti-cache in url if needed
7644 if ( s.cache === false ) {
7645
7646 var ts = jQuery.now(),
7647 // try replacing _= if it is there
7648 ret = s.url.replace( rts, "$1_=" + ts );
7649
7650 // if nothing was replaced, add timestamp to the end
7651 s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7652 }
7653 }
7654
7655 // Set the correct header, if data is being sent
7656 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7657 jqXHR.setRequestHeader( "Content-Type", s.contentType );
7658 }
7659
7660 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7661 if ( s.ifModified ) {
7662 ifModifiedKey = ifModifiedKey || s.url;
7663 if ( jQuery.lastModified[ ifModifiedKey ] ) {
7664 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7665 }
7666 if ( jQuery.etag[ ifModifiedKey ] ) {
7667 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7668 }
7669 }
7670
7671 // Set the Accepts header for the server, depending on the dataType
7672 jqXHR.setRequestHeader(
7673 "Accept",
7674 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7675 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7676 s.accepts[ "*" ]
7677 );
7678
7679 // Check for headers option
7680 for ( i in s.headers ) {
7681 jqXHR.setRequestHeader( i, s.headers[ i ] );
7682 }
7683
7684 // Allow custom headers/mimetypes and early abort
7685 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7686 // Abort if not done already
7687 jqXHR.abort();
7688 return false;
7689
7690 }
7691
7692 // Install callbacks on deferreds
7693 for ( i in { success: 1, error: 1, complete: 1 } ) {
7694 jqXHR[ i ]( s[ i ] );
7695 }
7696
7697 // Get transport
7698 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7699
7700 // If no transport, we auto-abort
7701 if ( !transport ) {
7702 done( -1, "No Transport" );
7703 } else {
7704 jqXHR.readyState = 1;
7705 // Send global event
7706 if ( fireGlobals ) {
7707 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7708 }
7709 // Timeout
7710 if ( s.async && s.timeout > 0 ) {
7711 timeoutTimer = setTimeout( function(){
7712 jqXHR.abort( "timeout" );
7713 }, s.timeout );
7714 }
7715
7716 try {
7717 state = 1;
7718 transport.send( requestHeaders, done );
7719 } catch (e) {
7720 // Propagate exception as error if not done
7721 if ( state < 2 ) {
7722 done( -1, e );
7723 // Simply rethrow otherwise
7724 } else {
7725 throw e;
7726 }
7727 }
7728 }
7729
7730 return jqXHR;
7731 },
7732
7733 // Serialize an array of form elements or a set of
7734 // key/values into a query string
7735 param: function( a, traditional ) {
7736 var s = [],
7737 add = function( key, value ) {
7738 // If value is a function, invoke it and return its value
7739 value = jQuery.isFunction( value ) ? value() : value;
7740 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7741 };
7742
7743 // Set traditional to true for jQuery <= 1.3.2 behavior.
7744 if ( traditional === undefined ) {
7745 traditional = jQuery.ajaxSettings.traditional;
7746 }
7747
7748 // If an array was passed in, assume that it is an array of form elements.
7749 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7750 // Serialize the form elements
7751 jQuery.each( a, function() {
7752 add( this.name, this.value );
7753 });
7754
7755 } else {
7756 // If traditional, encode the "old" way (the way 1.3.2 or older
7757 // did it), otherwise encode params recursively.
7758 for ( var prefix in a ) {
7759 buildParams( prefix, a[ prefix ], traditional, add );
7760 }
7761 }
7762
7763 // Return the resulting serialization
7764 return s.join( "&" ).replace( r20, "+" );
7765 }
7766 });
7767
7768 function buildParams( prefix, obj, traditional, add ) {
7769 if ( jQuery.isArray( obj ) ) {
7770 // Serialize array item.
7771 jQuery.each( obj, function( i, v ) {
7772 if ( traditional || rbracket.test( prefix ) ) {
7773 // Treat each array item as a scalar.
7774 add( prefix, v );
7775
7776 } else {
7777 // If array item is non-scalar (array or object), encode its
7778 // numeric index to resolve deserialization ambiguity issues.
7779 // Note that rack (as of 1.0.0) can't currently deserialize
7780 // nested arrays properly, and attempting to do so may cause
7781 // a server error. Possible fixes are to modify rack's
7782 // deserialization algorithm or to provide an option or flag
7783 // to force array serialization to be shallow.
7784 buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
7785 }
7786 });
7787
7788 } else if ( !traditional && jQuery.type( obj ) === "object" ) {
7789 // Serialize object item.
7790 for ( var name in obj ) {
7791 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7792 }
7793
7794 } else {
7795 // Serialize scalar item.
7796 add( prefix, obj );
7797 }
7798 }
7799
7800 // This is still on the jQuery object... for now
7801 // Want to move this to jQuery.ajax some day
7802 jQuery.extend({
7803
7804 // Counter for holding the number of active queries
7805 active: 0,
7806
7807 // Last-Modified header cache for next request
7808 lastModified: {},
7809 etag: {}
7810
7811 });
7812
78138707 /* Handles responses to an ajax request:
7814 * - sets all responseXXX fields accordingly
78158708 * - finds the right dataType (mediates between content-type and expected dataType)
78168709 * - returns the corresponding response
78178710 */
78188711 function ajaxHandleResponses( s, jqXHR, responses ) {
7819
7820 var contents = s.contents,
7821 dataTypes = s.dataTypes,
7822 responseFields = s.responseFields,
7823 ct,
7824 type,
7825 finalDataType,
7826 firstDataType;
7827
7828 // Fill responseXXX fields
7829 for ( type in responseFields ) {
7830 if ( type in responses ) {
7831 jqXHR[ responseFields[type] ] = responses[ type ];
7832 }
7833 }
8712 var firstDataType, ct, finalDataType, type,
8713 contents = s.contents,
8714 dataTypes = s.dataTypes;
78348715
78358716 // Remove auto dataType and get content-type in the process
7836 while( dataTypes[ 0 ] === "*" ) {
8717 while ( dataTypes[ 0 ] === "*" ) {
78378718 dataTypes.shift();
78388719 if ( ct === undefined ) {
7839 ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
8720 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
78408721 }
78418722 }
78428723
78798760 }
78808761 }
78818762
7882 // Chain conversions given the request and the original response
7883 function ajaxConvert( s, response ) {
7884
7885 // Apply the dataFilter if provided
7886 if ( s.dataFilter ) {
7887 response = s.dataFilter( response, s.dataType );
7888 }
7889
7890 var dataTypes = s.dataTypes,
8763 /* Chain conversions given the request and the original response
8764 * Also sets the responseXXX fields on the jqXHR instance
8765 */
8766 function ajaxConvert( s, response, jqXHR, isSuccess ) {
8767 var conv2, current, conv, tmp, prev,
78918768 converters = {},
7892 i,
7893 key,
7894 length = dataTypes.length,
7895 tmp,
7896 // Current and previous dataTypes
7897 current = dataTypes[ 0 ],
7898 prev,
7899 // Conversion expression
7900 conversion,
7901 // Conversion function
7902 conv,
7903 // Conversion functions (transitive conversion)
7904 conv1,
7905 conv2;
7906
7907 // For each dataType in the chain
7908 for ( i = 1; i < length; i++ ) {
7909
7910 // Create converters map
7911 // with lowercased keys
7912 if ( i === 1 ) {
7913 for ( key in s.converters ) {
7914 if ( typeof key === "string" ) {
7915 converters[ key.toLowerCase() ] = s.converters[ key ];
7916 }
7917 }
7918 }
7919
7920 // Get the dataTypes
8769 // Work with a copy of dataTypes in case we need to modify it for conversion
8770 dataTypes = s.dataTypes.slice();
8771
8772 // Create converters map with lowercased keys
8773 if ( dataTypes[ 1 ] ) {
8774 for ( conv in s.converters ) {
8775 converters[ conv.toLowerCase() ] = s.converters[ conv ];
8776 }
8777 }
8778
8779 current = dataTypes.shift();
8780
8781 // Convert to each sequential dataType
8782 while ( current ) {
8783
8784 if ( s.responseFields[ current ] ) {
8785 jqXHR[ s.responseFields[ current ] ] = response;
8786 }
8787
8788 // Apply the dataFilter if provided
8789 if ( !prev && isSuccess && s.dataFilter ) {
8790 response = s.dataFilter( response, s.dataType );
8791 }
8792
79218793 prev = current;
7922 current = dataTypes[ i ];
7923
7924 // If current is auto dataType, update it to prev
7925 if ( current === "*" ) {
7926 current = prev;
7927 // If no auto and dataTypes are actually different
7928 } else if ( prev !== "*" && prev !== current ) {
7929
7930 // Get the converter
7931 conversion = prev + " " + current;
7932 conv = converters[ conversion ] || converters[ "* " + current ];
7933
7934 // If there is no direct converter, search transitively
7935 if ( !conv ) {
7936 conv2 = undefined;
7937 for ( conv1 in converters ) {
7938 tmp = conv1.split( " " );
7939 if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7940 conv2 = converters[ tmp[1] + " " + current ];
7941 if ( conv2 ) {
7942 conv1 = converters[ conv1 ];
7943 if ( conv1 === true ) {
7944 conv = conv2;
7945 } else if ( conv2 === true ) {
7946 conv = conv1;
8794 current = dataTypes.shift();
8795
8796 if ( current ) {
8797
8798 // There's only work to do if current dataType is non-auto
8799 if ( current === "*" ) {
8800
8801 current = prev;
8802
8803 // Convert response if prev dataType is non-auto and differs from current
8804 } else if ( prev !== "*" && prev !== current ) {
8805
8806 // Seek a direct converter
8807 conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8808
8809 // If none found, seek a pair
8810 if ( !conv ) {
8811 for ( conv2 in converters ) {
8812
8813 // If conv2 outputs current
8814 tmp = conv2.split( " " );
8815 if ( tmp[ 1 ] === current ) {
8816
8817 // If prev can be converted to accepted input
8818 conv = converters[ prev + " " + tmp[ 0 ] ] ||
8819 converters[ "* " + tmp[ 0 ] ];
8820 if ( conv ) {
8821 // Condense equivalence converters
8822 if ( conv === true ) {
8823 conv = converters[ conv2 ];
8824
8825 // Otherwise, insert the intermediate dataType
8826 } else if ( converters[ conv2 ] !== true ) {
8827 current = tmp[ 0 ];
8828 dataTypes.unshift( tmp[ 1 ] );
8829 }
8830 break;
79478831 }
7948 break;
79498832 }
79508833 }
79518834 }
7952 }
7953 // If we found no converter, dispatch an error
7954 if ( !( conv || conv2 ) ) {
7955 jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7956 }
7957 // If found converter is not an equivalence
7958 if ( conv !== true ) {
7959 // Convert with 1 or 2 converters accordingly
7960 response = conv ? conv( response ) : conv2( conv1(response) );
7961 }
7962 }
7963 }
7964 return response;
8835
8836 // Apply converter (if not an equivalence)
8837 if ( conv !== true ) {
8838
8839 // Unless errors are allowed to bubble, catch and return them
8840 if ( conv && s[ "throws" ] ) {
8841 response = conv( response );
8842 } else {
8843 try {
8844 response = conv( response );
8845 } catch ( e ) {
8846 return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8847 }
8848 }
8849 }
8850 }
8851 }
8852 }
8853
8854 return { state: "success", data: response };
79658855 }
79668856
7967
7968
7969
7970 var jsc = jQuery.now(),
7971 jsre = /(\=)\?(&|$)|\?\?/i;
7972
7973 // Default jsonp settings
7974 jQuery.ajaxSetup({
7975 jsonp: "callback",
7976 jsonpCallback: function() {
7977 return jQuery.expando + "_" + ( jsc++ );
8857 jQuery.extend({
8858
8859 // Counter for holding the number of active queries
8860 active: 0,
8861
8862 // Last-Modified header cache for next request
8863 lastModified: {},
8864 etag: {},
8865
8866 ajaxSettings: {
8867 url: ajaxLocation,
8868 type: "GET",
8869 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
8870 global: true,
8871 processData: true,
8872 async: true,
8873 contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8874 /*
8875 timeout: 0,
8876 data: null,
8877 dataType: null,
8878 username: null,
8879 password: null,
8880 cache: null,
8881 throws: false,
8882 traditional: false,
8883 headers: {},
8884 */
8885
8886 accepts: {
8887 "*": allTypes,
8888 text: "text/plain",
8889 html: "text/html",
8890 xml: "application/xml, text/xml",
8891 json: "application/json, text/javascript"
8892 },
8893
8894 contents: {
8895 xml: /xml/,
8896 html: /html/,
8897 json: /json/
8898 },
8899
8900 responseFields: {
8901 xml: "responseXML",
8902 text: "responseText",
8903 json: "responseJSON"
8904 },
8905
8906 // Data converters
8907 // Keys separate source (or catchall "*") and destination types with a single space
8908 converters: {
8909
8910 // Convert anything to text
8911 "* text": String,
8912
8913 // Text to html (true = no transformation)
8914 "text html": true,
8915
8916 // Evaluate text as a json expression
8917 "text json": jQuery.parseJSON,
8918
8919 // Parse text as xml
8920 "text xml": jQuery.parseXML
8921 },
8922
8923 // For options that shouldn't be deep extended:
8924 // you can add your own custom options here if
8925 // and when you create one that shouldn't be
8926 // deep extended (see ajaxExtend)
8927 flatOptions: {
8928 url: true,
8929 context: true
8930 }
8931 },
8932
8933 // Creates a full fledged settings object into target
8934 // with both ajaxSettings and settings fields.
8935 // If target is omitted, writes into ajaxSettings.
8936 ajaxSetup: function( target, settings ) {
8937 return settings ?
8938
8939 // Building a settings object
8940 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8941
8942 // Extending ajaxSettings
8943 ajaxExtend( jQuery.ajaxSettings, target );
8944 },
8945
8946 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8947 ajaxTransport: addToPrefiltersOrTransports( transports ),
8948
8949 // Main method
8950 ajax: function( url, options ) {
8951
8952 // If url is an object, simulate pre-1.5 signature
8953 if ( typeof url === "object" ) {
8954 options = url;
8955 url = undefined;
8956 }
8957
8958 // Force options to be an object
8959 options = options || {};
8960
8961 var // Cross-domain detection vars
8962 parts,
8963 // Loop variable
8964 i,
8965 // URL without anti-cache param
8966 cacheURL,
8967 // Response headers as string
8968 responseHeadersString,
8969 // timeout handle
8970 timeoutTimer,
8971
8972 // To know if global events are to be dispatched
8973 fireGlobals,
8974
8975 transport,
8976 // Response headers
8977 responseHeaders,
8978 // Create the final options object
8979 s = jQuery.ajaxSetup( {}, options ),
8980 // Callbacks context
8981 callbackContext = s.context || s,
8982 // Context for global events is callbackContext if it is a DOM node or jQuery collection
8983 globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
8984 jQuery( callbackContext ) :
8985 jQuery.event,
8986 // Deferreds
8987 deferred = jQuery.Deferred(),
8988 completeDeferred = jQuery.Callbacks("once memory"),
8989 // Status-dependent callbacks
8990 statusCode = s.statusCode || {},
8991 // Headers (they are sent all at once)
8992 requestHeaders = {},
8993 requestHeadersNames = {},
8994 // The jqXHR state
8995 state = 0,
8996 // Default abort message
8997 strAbort = "canceled",
8998 // Fake xhr
8999 jqXHR = {
9000 readyState: 0,
9001
9002 // Builds headers hashtable if needed
9003 getResponseHeader: function( key ) {
9004 var match;
9005 if ( state === 2 ) {
9006 if ( !responseHeaders ) {
9007 responseHeaders = {};
9008 while ( (match = rheaders.exec( responseHeadersString )) ) {
9009 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
9010 }
9011 }
9012 match = responseHeaders[ key.toLowerCase() ];
9013 }
9014 return match == null ? null : match;
9015 },
9016
9017 // Raw string
9018 getAllResponseHeaders: function() {
9019 return state === 2 ? responseHeadersString : null;
9020 },
9021
9022 // Caches the header
9023 setRequestHeader: function( name, value ) {
9024 var lname = name.toLowerCase();
9025 if ( !state ) {
9026 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
9027 requestHeaders[ name ] = value;
9028 }
9029 return this;
9030 },
9031
9032 // Overrides response content-type header
9033 overrideMimeType: function( type ) {
9034 if ( !state ) {
9035 s.mimeType = type;
9036 }
9037 return this;
9038 },
9039
9040 // Status-dependent callbacks
9041 statusCode: function( map ) {
9042 var code;
9043 if ( map ) {
9044 if ( state < 2 ) {
9045 for ( code in map ) {
9046 // Lazy-add the new callback in a way that preserves old ones
9047 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9048 }
9049 } else {
9050 // Execute the appropriate callbacks
9051 jqXHR.always( map[ jqXHR.status ] );
9052 }
9053 }
9054 return this;
9055 },
9056
9057 // Cancel the request
9058 abort: function( statusText ) {
9059 var finalText = statusText || strAbort;
9060 if ( transport ) {
9061 transport.abort( finalText );
9062 }
9063 done( 0, finalText );
9064 return this;
9065 }
9066 };
9067
9068 // Attach deferreds
9069 deferred.promise( jqXHR ).complete = completeDeferred.add;
9070 jqXHR.success = jqXHR.done;
9071 jqXHR.error = jqXHR.fail;
9072
9073 // Remove hash character (#7531: and string promotion)
9074 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9075 // Handle falsy url in the settings object (#10093: consistency with old signature)
9076 // We also use the url parameter if available
9077 s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
9078
9079 // Alias method option to type as per ticket #12004
9080 s.type = options.method || options.type || s.method || s.type;
9081
9082 // Extract dataTypes list
9083 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
9084
9085 // A cross-domain request is in order when we have a protocol:host:port mismatch
9086 if ( s.crossDomain == null ) {
9087 parts = rurl.exec( s.url.toLowerCase() );
9088 s.crossDomain = !!( parts &&
9089 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
9090 ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
9091 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
9092 );
9093 }
9094
9095 // Convert data if not already a string
9096 if ( s.data && s.processData && typeof s.data !== "string" ) {
9097 s.data = jQuery.param( s.data, s.traditional );
9098 }
9099
9100 // Apply prefilters
9101 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9102
9103 // If request was aborted inside a prefilter, stop there
9104 if ( state === 2 ) {
9105 return jqXHR;
9106 }
9107
9108 // We can fire global events as of now if asked to
9109 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9110 fireGlobals = jQuery.event && s.global;
9111
9112 // Watch for a new set of requests
9113 if ( fireGlobals && jQuery.active++ === 0 ) {
9114 jQuery.event.trigger("ajaxStart");
9115 }
9116
9117 // Uppercase the type
9118 s.type = s.type.toUpperCase();
9119
9120 // Determine if request has content
9121 s.hasContent = !rnoContent.test( s.type );
9122
9123 // Save the URL in case we're toying with the If-Modified-Since
9124 // and/or If-None-Match header later on
9125 cacheURL = s.url;
9126
9127 // More options handling for requests with no content
9128 if ( !s.hasContent ) {
9129
9130 // If data is available, append data to url
9131 if ( s.data ) {
9132 cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
9133 // #9682: remove data so that it's not used in an eventual retry
9134 delete s.data;
9135 }
9136
9137 // Add anti-cache in url if needed
9138 if ( s.cache === false ) {
9139 s.url = rts.test( cacheURL ) ?
9140
9141 // If there is already a '_' parameter, set its value
9142 cacheURL.replace( rts, "$1_=" + nonce++ ) :
9143
9144 // Otherwise add one to the end
9145 cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
9146 }
9147 }
9148
9149 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9150 if ( s.ifModified ) {
9151 if ( jQuery.lastModified[ cacheURL ] ) {
9152 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9153 }
9154 if ( jQuery.etag[ cacheURL ] ) {
9155 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9156 }
9157 }
9158
9159 // Set the correct header, if data is being sent
9160 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9161 jqXHR.setRequestHeader( "Content-Type", s.contentType );
9162 }
9163
9164 // Set the Accepts header for the server, depending on the dataType
9165 jqXHR.setRequestHeader(
9166 "Accept",
9167 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
9168 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9169 s.accepts[ "*" ]
9170 );
9171
9172 // Check for headers option
9173 for ( i in s.headers ) {
9174 jqXHR.setRequestHeader( i, s.headers[ i ] );
9175 }
9176
9177 // Allow custom headers/mimetypes and early abort
9178 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
9179 // Abort if not done already and return
9180 return jqXHR.abort();
9181 }
9182
9183 // aborting is no longer a cancellation
9184 strAbort = "abort";
9185
9186 // Install callbacks on deferreds
9187 for ( i in { success: 1, error: 1, complete: 1 } ) {
9188 jqXHR[ i ]( s[ i ] );
9189 }
9190
9191 // Get transport
9192 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9193
9194 // If no transport, we auto-abort
9195 if ( !transport ) {
9196 done( -1, "No Transport" );
9197 } else {
9198 jqXHR.readyState = 1;
9199
9200 // Send global event
9201 if ( fireGlobals ) {
9202 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9203 }
9204 // Timeout
9205 if ( s.async && s.timeout > 0 ) {
9206 timeoutTimer = setTimeout(function() {
9207 jqXHR.abort("timeout");
9208 }, s.timeout );
9209 }
9210
9211 try {
9212 state = 1;
9213 transport.send( requestHeaders, done );
9214 } catch ( e ) {
9215 // Propagate exception as error if not done
9216 if ( state < 2 ) {
9217 done( -1, e );
9218 // Simply rethrow otherwise
9219 } else {
9220 throw e;
9221 }
9222 }
9223 }
9224
9225 // Callback for when everything is done
9226 function done( status, nativeStatusText, responses, headers ) {
9227 var isSuccess, success, error, response, modified,
9228 statusText = nativeStatusText;
9229
9230 // Called once
9231 if ( state === 2 ) {
9232 return;
9233 }
9234
9235 // State is "done" now
9236 state = 2;
9237
9238 // Clear timeout if it exists
9239 if ( timeoutTimer ) {
9240 clearTimeout( timeoutTimer );
9241 }
9242
9243 // Dereference transport for early garbage collection
9244 // (no matter how long the jqXHR object will be used)
9245 transport = undefined;
9246
9247 // Cache response headers
9248 responseHeadersString = headers || "";
9249
9250 // Set readyState
9251 jqXHR.readyState = status > 0 ? 4 : 0;
9252
9253 // Determine if successful
9254 isSuccess = status >= 200 && status < 300 || status === 304;
9255
9256 // Get response data
9257 if ( responses ) {
9258 response = ajaxHandleResponses( s, jqXHR, responses );
9259 }
9260
9261 // Convert no matter what (that way responseXXX fields are always set)
9262 response = ajaxConvert( s, response, jqXHR, isSuccess );
9263
9264 // If successful, handle type chaining
9265 if ( isSuccess ) {
9266
9267 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9268 if ( s.ifModified ) {
9269 modified = jqXHR.getResponseHeader("Last-Modified");
9270 if ( modified ) {
9271 jQuery.lastModified[ cacheURL ] = modified;
9272 }
9273 modified = jqXHR.getResponseHeader("etag");
9274 if ( modified ) {
9275 jQuery.etag[ cacheURL ] = modified;
9276 }
9277 }
9278
9279 // if no content
9280 if ( status === 204 || s.type === "HEAD" ) {
9281 statusText = "nocontent";
9282
9283 // if not modified
9284 } else if ( status === 304 ) {
9285 statusText = "notmodified";
9286
9287 // If we have data, let's convert it
9288 } else {
9289 statusText = response.state;
9290 success = response.data;
9291 error = response.error;
9292 isSuccess = !error;
9293 }
9294 } else {
9295 // We extract error from statusText
9296 // then normalize statusText and status for non-aborts
9297 error = statusText;
9298 if ( status || !statusText ) {
9299 statusText = "error";
9300 if ( status < 0 ) {
9301 status = 0;
9302 }
9303 }
9304 }
9305
9306 // Set data for the fake xhr object
9307 jqXHR.status = status;
9308 jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9309
9310 // Success/Error
9311 if ( isSuccess ) {
9312 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9313 } else {
9314 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9315 }
9316
9317 // Status-dependent callbacks
9318 jqXHR.statusCode( statusCode );
9319 statusCode = undefined;
9320
9321 if ( fireGlobals ) {
9322 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9323 [ jqXHR, s, isSuccess ? success : error ] );
9324 }
9325
9326 // Complete
9327 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9328
9329 if ( fireGlobals ) {
9330 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9331 // Handle the global AJAX counter
9332 if ( !( --jQuery.active ) ) {
9333 jQuery.event.trigger("ajaxStop");
9334 }
9335 }
9336 }
9337
9338 return jqXHR;
9339 },
9340
9341 getJSON: function( url, data, callback ) {
9342 return jQuery.get( url, data, callback, "json" );
9343 },
9344
9345 getScript: function( url, callback ) {
9346 return jQuery.get( url, undefined, callback, "script" );
79789347 }
79799348 });
79809349
7981 // Detect, normalize options and install callbacks for jsonp requests
7982 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7983
7984 var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
7985
7986 if ( s.dataTypes[ 0 ] === "jsonp" ||
7987 s.jsonp !== false && ( jsre.test( s.url ) ||
7988 inspectData && jsre.test( s.data ) ) ) {
7989
7990 var responseContainer,
7991 jsonpCallback = s.jsonpCallback =
7992 jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7993 previous = window[ jsonpCallback ],
7994 url = s.url,
7995 data = s.data,
7996 replace = "$1" + jsonpCallback + "$2";
7997
7998 if ( s.jsonp !== false ) {
7999 url = url.replace( jsre, replace );
8000 if ( s.url === url ) {
8001 if ( inspectData ) {
8002 data = data.replace( jsre, replace );
8003 }
8004 if ( s.data === data ) {
8005 // Add callback manually
8006 url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
8007 }
8008 }
8009 }
8010
8011 s.url = url;
8012 s.data = data;
8013
8014 // Install callback
8015 window[ jsonpCallback ] = function( response ) {
8016 responseContainer = [ response ];
9350 jQuery.each( [ "get", "post" ], function( i, method ) {
9351 jQuery[ method ] = function( url, data, callback, type ) {
9352 // shift arguments if data argument was omitted
9353 if ( jQuery.isFunction( data ) ) {
9354 type = type || callback;
9355 callback = data;
9356 data = undefined;
9357 }
9358
9359 return jQuery.ajax({
9360 url: url,
9361 type: method,
9362 dataType: type,
9363 data: data,
9364 success: callback
9365 });
9366 };
9367 });
9368
9369
9370 jQuery._evalUrl = function( url ) {
9371 return jQuery.ajax({
9372 url: url,
9373 type: "GET",
9374 dataType: "script",
9375 async: false,
9376 global: false,
9377 "throws": true
9378 });
9379 };
9380
9381
9382 jQuery.fn.extend({
9383 wrapAll: function( html ) {
9384 if ( jQuery.isFunction( html ) ) {
9385 return this.each(function(i) {
9386 jQuery(this).wrapAll( html.call(this, i) );
9387 });
9388 }
9389
9390 if ( this[0] ) {
9391 // The elements to wrap the target around
9392 var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
9393
9394 if ( this[0].parentNode ) {
9395 wrap.insertBefore( this[0] );
9396 }
9397
9398 wrap.map(function() {
9399 var elem = this;
9400
9401 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
9402 elem = elem.firstChild;
9403 }
9404
9405 return elem;
9406 }).append( this );
9407 }
9408
9409 return this;
9410 },
9411
9412 wrapInner: function( html ) {
9413 if ( jQuery.isFunction( html ) ) {
9414 return this.each(function(i) {
9415 jQuery(this).wrapInner( html.call(this, i) );
9416 });
9417 }
9418
9419 return this.each(function() {
9420 var self = jQuery( this ),
9421 contents = self.contents();
9422
9423 if ( contents.length ) {
9424 contents.wrapAll( html );
9425
9426 } else {
9427 self.append( html );
9428 }
9429 });
9430 },
9431
9432 wrap: function( html ) {
9433 var isFunction = jQuery.isFunction( html );
9434
9435 return this.each(function(i) {
9436 jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
9437 });
9438 },
9439
9440 unwrap: function() {
9441 return this.parent().each(function() {
9442 if ( !jQuery.nodeName( this, "body" ) ) {
9443 jQuery( this ).replaceWith( this.childNodes );
9444 }
9445 }).end();
9446 }
9447 });
9448
9449
9450 jQuery.expr.filters.hidden = function( elem ) {
9451 // Support: Opera <= 12.12
9452 // Opera reports offsetWidths and offsetHeights less than zero on some elements
9453 return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
9454 (!support.reliableHiddenOffsets() &&
9455 ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
9456 };
9457
9458 jQuery.expr.filters.visible = function( elem ) {
9459 return !jQuery.expr.filters.hidden( elem );
9460 };
9461
9462
9463
9464
9465 var r20 = /%20/g,
9466 rbracket = /\[\]$/,
9467 rCRLF = /\r?\n/g,
9468 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
9469 rsubmittable = /^(?:input|select|textarea|keygen)/i;
9470
9471 function buildParams( prefix, obj, traditional, add ) {
9472 var name;
9473
9474 if ( jQuery.isArray( obj ) ) {
9475 // Serialize array item.
9476 jQuery.each( obj, function( i, v ) {
9477 if ( traditional || rbracket.test( prefix ) ) {
9478 // Treat each array item as a scalar.
9479 add( prefix, v );
9480
9481 } else {
9482 // Item is non-scalar (array or object), encode its numeric index.
9483 buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
9484 }
9485 });
9486
9487 } else if ( !traditional && jQuery.type( obj ) === "object" ) {
9488 // Serialize object item.
9489 for ( name in obj ) {
9490 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
9491 }
9492
9493 } else {
9494 // Serialize scalar item.
9495 add( prefix, obj );
9496 }
9497 }
9498
9499 // Serialize an array of form elements or a set of
9500 // key/values into a query string
9501 jQuery.param = function( a, traditional ) {
9502 var prefix,
9503 s = [],
9504 add = function( key, value ) {
9505 // If value is a function, invoke it and return its value
9506 value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
9507 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
80179508 };
80189509
8019 // Clean-up function
8020 jqXHR.always(function() {
8021 // Set callback back to previous value
8022 window[ jsonpCallback ] = previous;
8023 // Call if it was a function and we have a response
8024 if ( responseContainer && jQuery.isFunction( previous ) ) {
8025 window[ jsonpCallback ]( responseContainer[ 0 ] );
8026 }
9510 // Set traditional to true for jQuery <= 1.3.2 behavior.
9511 if ( traditional === undefined ) {
9512 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
9513 }
9514
9515 // If an array was passed in, assume that it is an array of form elements.
9516 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
9517 // Serialize the form elements
9518 jQuery.each( a, function() {
9519 add( this.name, this.value );
80279520 });
80289521
8029 // Use data converter to retrieve json after script execution
8030 s.converters["script json"] = function() {
8031 if ( !responseContainer ) {
8032 jQuery.error( jsonpCallback + " was not called" );
8033 }
8034 return responseContainer[ 0 ];
8035 };
8036
8037 // force json dataType
8038 s.dataTypes[ 0 ] = "json";
8039
8040 // Delegate to script
8041 return "script";
9522 } else {
9523 // If traditional, encode the "old" way (the way 1.3.2 or older
9524 // did it), otherwise encode params recursively.
9525 for ( prefix in a ) {
9526 buildParams( prefix, a[ prefix ], traditional, add );
9527 }
9528 }
9529
9530 // Return the resulting serialization
9531 return s.join( "&" ).replace( r20, "+" );
9532 };
9533
9534 jQuery.fn.extend({
9535 serialize: function() {
9536 return jQuery.param( this.serializeArray() );
9537 },
9538 serializeArray: function() {
9539 return this.map(function() {
9540 // Can add propHook for "elements" to filter or add form elements
9541 var elements = jQuery.prop( this, "elements" );
9542 return elements ? jQuery.makeArray( elements ) : this;
9543 })
9544 .filter(function() {
9545 var type = this.type;
9546 // Use .is(":disabled") so that fieldset[disabled] works
9547 return this.name && !jQuery( this ).is( ":disabled" ) &&
9548 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
9549 ( this.checked || !rcheckableType.test( type ) );
9550 })
9551 .map(function( i, elem ) {
9552 var val = jQuery( this ).val();
9553
9554 return val == null ?
9555 null :
9556 jQuery.isArray( val ) ?
9557 jQuery.map( val, function( val ) {
9558 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9559 }) :
9560 { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9561 }).get();
80429562 }
80439563 });
9564
9565
9566 // Create the request object
9567 // (This is still attached to ajaxSettings for backward compatibility)
9568 jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
9569 // Support: IE6+
9570 function() {
9571
9572 // XHR cannot access local files, always use ActiveX for that case
9573 return !this.isLocal &&
9574
9575 // Support: IE7-8
9576 // oldIE XHR does not support non-RFC2616 methods (#13240)
9577 // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
9578 // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
9579 // Although this check for six methods instead of eight
9580 // since IE also does not support "trace" and "connect"
9581 /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
9582
9583 createStandardXHR() || createActiveXHR();
9584 } :
9585 // For all other browsers, use the standard XMLHttpRequest object
9586 createStandardXHR;
9587
9588 var xhrId = 0,
9589 xhrCallbacks = {},
9590 xhrSupported = jQuery.ajaxSettings.xhr();
9591
9592 // Support: IE<10
9593 // Open requests must be manually aborted on unload (#5280)
9594 // See https://support.microsoft.com/kb/2856746 for more info
9595 if ( window.attachEvent ) {
9596 window.attachEvent( "onunload", function() {
9597 for ( var key in xhrCallbacks ) {
9598 xhrCallbacks[ key ]( undefined, true );
9599 }
9600 });
9601 }
9602
9603 // Determine support properties
9604 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9605 xhrSupported = support.ajax = !!xhrSupported;
9606
9607 // Create transport if the browser can provide an xhr
9608 if ( xhrSupported ) {
9609
9610 jQuery.ajaxTransport(function( options ) {
9611 // Cross domain only allowed if supported through XMLHttpRequest
9612 if ( !options.crossDomain || support.cors ) {
9613
9614 var callback;
9615
9616 return {
9617 send: function( headers, complete ) {
9618 var i,
9619 xhr = options.xhr(),
9620 id = ++xhrId;
9621
9622 // Open the socket
9623 xhr.open( options.type, options.url, options.async, options.username, options.password );
9624
9625 // Apply custom fields if provided
9626 if ( options.xhrFields ) {
9627 for ( i in options.xhrFields ) {
9628 xhr[ i ] = options.xhrFields[ i ];
9629 }
9630 }
9631
9632 // Override mime type if needed
9633 if ( options.mimeType && xhr.overrideMimeType ) {
9634 xhr.overrideMimeType( options.mimeType );
9635 }
9636
9637 // X-Requested-With header
9638 // For cross-domain requests, seeing as conditions for a preflight are
9639 // akin to a jigsaw puzzle, we simply never set it to be sure.
9640 // (it can always be set on a per-request basis or even using ajaxSetup)
9641 // For same-domain requests, won't change header if already provided.
9642 if ( !options.crossDomain && !headers["X-Requested-With"] ) {
9643 headers["X-Requested-With"] = "XMLHttpRequest";
9644 }
9645
9646 // Set headers
9647 for ( i in headers ) {
9648 // Support: IE<9
9649 // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
9650 // request header to a null-value.
9651 //
9652 // To keep consistent with other XHR implementations, cast the value
9653 // to string and ignore `undefined`.
9654 if ( headers[ i ] !== undefined ) {
9655 xhr.setRequestHeader( i, headers[ i ] + "" );
9656 }
9657 }
9658
9659 // Do send the request
9660 // This may raise an exception which is actually
9661 // handled in jQuery.ajax (so no try/catch here)
9662 xhr.send( ( options.hasContent && options.data ) || null );
9663
9664 // Listener
9665 callback = function( _, isAbort ) {
9666 var status, statusText, responses;
9667
9668 // Was never called and is aborted or complete
9669 if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
9670 // Clean up
9671 delete xhrCallbacks[ id ];
9672 callback = undefined;
9673 xhr.onreadystatechange = jQuery.noop;
9674
9675 // Abort manually if needed
9676 if ( isAbort ) {
9677 if ( xhr.readyState !== 4 ) {
9678 xhr.abort();
9679 }
9680 } else {
9681 responses = {};
9682 status = xhr.status;
9683
9684 // Support: IE<10
9685 // Accessing binary-data responseText throws an exception
9686 // (#11426)
9687 if ( typeof xhr.responseText === "string" ) {
9688 responses.text = xhr.responseText;
9689 }
9690
9691 // Firefox throws an exception when accessing
9692 // statusText for faulty cross-domain requests
9693 try {
9694 statusText = xhr.statusText;
9695 } catch( e ) {
9696 // We normalize with Webkit giving an empty statusText
9697 statusText = "";
9698 }
9699
9700 // Filter status for non standard behaviors
9701
9702 // If the request is local and we have data: assume a success
9703 // (success with no data won't get notified, that's the best we
9704 // can do given current implementations)
9705 if ( !status && options.isLocal && !options.crossDomain ) {
9706 status = responses.text ? 200 : 404;
9707 // IE - #1450: sometimes returns 1223 when it should be 204
9708 } else if ( status === 1223 ) {
9709 status = 204;
9710 }
9711 }
9712 }
9713
9714 // Call complete if needed
9715 if ( responses ) {
9716 complete( status, statusText, responses, xhr.getAllResponseHeaders() );
9717 }
9718 };
9719
9720 if ( !options.async ) {
9721 // if we're in sync mode we fire the callback
9722 callback();
9723 } else if ( xhr.readyState === 4 ) {
9724 // (IE6 & IE7) if it's in cache and has been
9725 // retrieved directly we need to fire the callback
9726 setTimeout( callback );
9727 } else {
9728 // Add to the list of active xhr callbacks
9729 xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
9730 }
9731 },
9732
9733 abort: function() {
9734 if ( callback ) {
9735 callback( undefined, true );
9736 }
9737 }
9738 };
9739 }
9740 });
9741 }
9742
9743 // Functions to create xhrs
9744 function createStandardXHR() {
9745 try {
9746 return new window.XMLHttpRequest();
9747 } catch( e ) {}
9748 }
9749
9750 function createActiveXHR() {
9751 try {
9752 return new window.ActiveXObject( "Microsoft.XMLHTTP" );
9753 } catch( e ) {}
9754 }
80449755
80459756
80469757
80519762 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
80529763 },
80539764 contents: {
8054 script: /javascript|ecmascript/
9765 script: /(?:java|ecma)script/
80559766 },
80569767 converters: {
80579768 "text script": function( text ) {
80799790 if ( s.crossDomain ) {
80809791
80819792 var script,
8082 head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
9793 head = document.head || jQuery("head")[0] || document.documentElement;
80839794
80849795 return {
80859796
80869797 send: function( _, callback ) {
80879798
8088 script = document.createElement( "script" );
8089
8090 script.async = "async";
9799 script = document.createElement("script");
9800
9801 script.async = true;
80919802
80929803 if ( s.scriptCharset ) {
80939804 script.charset = s.scriptCharset;
81049815 script.onload = script.onreadystatechange = null;
81059816
81069817 // Remove the script
8107 if ( head && script.parentNode ) {
8108 head.removeChild( script );
9818 if ( script.parentNode ) {
9819 script.parentNode.removeChild( script );
81099820 }
81109821
81119822 // Dereference the script
8112 script = undefined;
9823 script = null;
81139824
81149825 // Callback if not abort
81159826 if ( !isAbort ) {
81179828 }
81189829 }
81199830 };
8120 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
8121 // This arises when a base node is used (#2709 and #4378).
9831
9832 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
9833 // Use native DOM manipulation to avoid our domManip AJAX trickery
81229834 head.insertBefore( script, head.firstChild );
81239835 },
81249836
81259837 abort: function() {
81269838 if ( script ) {
8127 script.onload( 0, 1 );
9839 script.onload( undefined, true );
81289840 }
81299841 }
81309842 };
81349846
81359847
81369848
8137 var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8138 xhrOnUnloadAbort = window.ActiveXObject ? function() {
8139 // Abort all pending requests
8140 for ( var key in xhrCallbacks ) {
8141 xhrCallbacks[ key ]( 0, 1 );
8142 }
8143 } : false,
8144 xhrId = 0,
8145 xhrCallbacks;
8146
8147 // Functions to create xhrs
8148 function createStandardXHR() {
8149 try {
8150 return new window.XMLHttpRequest();
8151 } catch( e ) {}
8152 }
8153
8154 function createActiveXHR() {
8155 try {
8156 return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8157 } catch( e ) {}
8158 }
8159
8160 // Create the request object
8161 // (This is still attached to ajaxSettings for backward compatibility)
8162 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8163 /* Microsoft failed to properly
8164 * implement the XMLHttpRequest in IE7 (can't request local files),
8165 * so we use the ActiveXObject when it is available
8166 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8167 * we need a fallback.
8168 */
8169 function() {
8170 return !this.isLocal && createStandardXHR() || createActiveXHR();
8171 } :
8172 // For all other browsers, use the standard XMLHttpRequest object
8173 createStandardXHR;
8174
8175 // Determine support properties
8176 (function( xhr ) {
8177 jQuery.extend( jQuery.support, {
8178 ajax: !!xhr,
8179 cors: !!xhr && ( "withCredentials" in xhr )
8180 });
8181 })( jQuery.ajaxSettings.xhr() );
8182
8183 // Create transport if the browser can provide an xhr
8184 if ( jQuery.support.ajax ) {
8185
8186 jQuery.ajaxTransport(function( s ) {
8187 // Cross domain only allowed if supported through XMLHttpRequest
8188 if ( !s.crossDomain || jQuery.support.cors ) {
8189
8190 var callback;
8191
8192 return {
8193 send: function( headers, complete ) {
8194
8195 // Get a new xhr
8196 var xhr = s.xhr(),
8197 handle,
8198 i;
8199
8200 // Open the socket
8201 // Passing null username, generates a login popup on Opera (#2865)
8202 if ( s.username ) {
8203 xhr.open( s.type, s.url, s.async, s.username, s.password );
8204 } else {
8205 xhr.open( s.type, s.url, s.async );
8206 }
8207
8208 // Apply custom fields if provided
8209 if ( s.xhrFields ) {
8210 for ( i in s.xhrFields ) {
8211 xhr[ i ] = s.xhrFields[ i ];
8212 }
8213 }
8214
8215 // Override mime type if needed
8216 if ( s.mimeType && xhr.overrideMimeType ) {
8217 xhr.overrideMimeType( s.mimeType );
8218 }
8219
8220 // X-Requested-With header
8221 // For cross-domain requests, seeing as conditions for a preflight are
8222 // akin to a jigsaw puzzle, we simply never set it to be sure.
8223 // (it can always be set on a per-request basis or even using ajaxSetup)
8224 // For same-domain requests, won't change header if already provided.
8225 if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8226 headers[ "X-Requested-With" ] = "XMLHttpRequest";
8227 }
8228
8229 // Need an extra try/catch for cross domain requests in Firefox 3
8230 try {
8231 for ( i in headers ) {
8232 xhr.setRequestHeader( i, headers[ i ] );
8233 }
8234 } catch( _ ) {}
8235
8236 // Do send the request
8237 // This may raise an exception which is actually
8238 // handled in jQuery.ajax (so no try/catch here)
8239 xhr.send( ( s.hasContent && s.data ) || null );
8240
8241 // Listener
8242 callback = function( _, isAbort ) {
8243
8244 var status,
8245 statusText,
8246 responseHeaders,
8247 responses,
8248 xml;
8249
8250 // Firefox throws exceptions when accessing properties
8251 // of an xhr when a network error occured
8252 // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8253 try {
8254
8255 // Was never called and is aborted or complete
8256 if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8257
8258 // Only called once
8259 callback = undefined;
8260
8261 // Do not keep as active anymore
8262 if ( handle ) {
8263 xhr.onreadystatechange = jQuery.noop;
8264 if ( xhrOnUnloadAbort ) {
8265 delete xhrCallbacks[ handle ];
8266 }
8267 }
8268
8269 // If it's an abort
8270 if ( isAbort ) {
8271 // Abort it manually if needed
8272 if ( xhr.readyState !== 4 ) {
8273 xhr.abort();
8274 }
8275 } else {
8276 status = xhr.status;
8277 responseHeaders = xhr.getAllResponseHeaders();
8278 responses = {};
8279 xml = xhr.responseXML;
8280
8281 // Construct response list
8282 if ( xml && xml.documentElement /* #4958 */ ) {
8283 responses.xml = xml;
8284 }
8285
8286 // When requesting binary data, IE6-9 will throw an exception
8287 // on any attempt to access responseText (#11426)
8288 try {
8289 responses.text = xhr.responseText;
8290 } catch( _ ) {
8291 }
8292
8293 // Firefox throws an exception when accessing
8294 // statusText for faulty cross-domain requests
8295 try {
8296 statusText = xhr.statusText;
8297 } catch( e ) {
8298 // We normalize with Webkit giving an empty statusText
8299 statusText = "";
8300 }
8301
8302 // Filter status for non standard behaviors
8303
8304 // If the request is local and we have data: assume a success
8305 // (success with no data won't get notified, that's the best we
8306 // can do given current implementations)
8307 if ( !status && s.isLocal && !s.crossDomain ) {
8308 status = responses.text ? 200 : 404;
8309 // IE - #1450: sometimes returns 1223 when it should be 204
8310 } else if ( status === 1223 ) {
8311 status = 204;
8312 }
8313 }
8314 }
8315 } catch( firefoxAccessException ) {
8316 if ( !isAbort ) {
8317 complete( -1, firefoxAccessException );
8318 }
8319 }
8320
8321 // Call complete if needed
8322 if ( responses ) {
8323 complete( status, statusText, responses, responseHeaders );
8324 }
8325 };
8326
8327 // if we're in sync mode or it's in cache
8328 // and has been retrieved directly (IE6 & IE7)
8329 // we need to manually fire the callback
8330 if ( !s.async || xhr.readyState === 4 ) {
8331 callback();
8332 } else {
8333 handle = ++xhrId;
8334 if ( xhrOnUnloadAbort ) {
8335 // Create the active xhrs callbacks list if needed
8336 // and attach the unload handler
8337 if ( !xhrCallbacks ) {
8338 xhrCallbacks = {};
8339 jQuery( window ).unload( xhrOnUnloadAbort );
8340 }
8341 // Add to list of active xhrs callbacks
8342 xhrCallbacks[ handle ] = callback;
8343 }
8344 xhr.onreadystatechange = callback;
8345 }
8346 },
8347
8348 abort: function() {
8349 if ( callback ) {
8350 callback(0,1);
8351 }
8352 }
8353 };
8354 }
8355 });
8356 }
8357
8358
8359
8360
8361 var elemdisplay = {},
8362 iframe, iframeDoc,
8363 rfxtypes = /^(?:toggle|show|hide)$/,
8364 rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
8365 timerId,
8366 fxAttrs = [
8367 // height animations
8368 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
8369 // width animations
8370 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
8371 // opacity animations
8372 [ "opacity" ]
8373 ],
8374 fxNow;
8375
8376 jQuery.fn.extend({
8377 show: function( speed, easing, callback ) {
8378 var elem, display;
8379
8380 if ( speed || speed === 0 ) {
8381 return this.animate( genFx("show", 3), speed, easing, callback );
8382
8383 } else {
8384 for ( var i = 0, j = this.length; i < j; i++ ) {
8385 elem = this[ i ];
8386
8387 if ( elem.style ) {
8388 display = elem.style.display;
8389
8390 // Reset the inline display of this element to learn if it is
8391 // being hidden by cascaded rules or not
8392 if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8393 display = elem.style.display = "";
8394 }
8395
8396 // Set elements which have been overridden with display: none
8397 // in a stylesheet to whatever the default browser style is
8398 // for such an element
8399 if ( (display === "" && jQuery.css(elem, "display") === "none") ||
8400 !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
8401 jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
8402 }
8403 }
8404 }
8405
8406 // Set the display of most of the elements in a second loop
8407 // to avoid the constant reflow
8408 for ( i = 0; i < j; i++ ) {
8409 elem = this[ i ];
8410
8411 if ( elem.style ) {
8412 display = elem.style.display;
8413
8414 if ( display === "" || display === "none" ) {
8415 elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
8416 }
8417 }
8418 }
8419
8420 return this;
8421 }
8422 },
8423
8424 hide: function( speed, easing, callback ) {
8425 if ( speed || speed === 0 ) {
8426 return this.animate( genFx("hide", 3), speed, easing, callback);
8427
8428 } else {
8429 var elem, display,
8430 i = 0,
8431 j = this.length;
8432
8433 for ( ; i < j; i++ ) {
8434 elem = this[i];
8435 if ( elem.style ) {
8436 display = jQuery.css( elem, "display" );
8437
8438 if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
8439 jQuery._data( elem, "olddisplay", display );
8440 }
8441 }
8442 }
8443
8444 // Set the display of the elements in a second loop
8445 // to avoid the constant reflow
8446 for ( i = 0; i < j; i++ ) {
8447 if ( this[i].style ) {
8448 this[i].style.display = "none";
8449 }
8450 }
8451
8452 return this;
8453 }
8454 },
8455
8456 // Save the old toggle function
8457 _toggle: jQuery.fn.toggle,
8458
8459 toggle: function( fn, fn2, callback ) {
8460 var bool = typeof fn === "boolean";
8461
8462 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8463 this._toggle.apply( this, arguments );
8464
8465 } else if ( fn == null || bool ) {
8466 this.each(function() {
8467 var state = bool ? fn : jQuery(this).is(":hidden");
8468 jQuery(this)[ state ? "show" : "hide" ]();
8469 });
8470
8471 } else {
8472 this.animate(genFx("toggle", 3), fn, fn2, callback);
8473 }
8474
8475 return this;
8476 },
8477
8478 fadeTo: function( speed, to, easing, callback ) {
8479 return this.filter(":hidden").css("opacity", 0).show().end()
8480 .animate({opacity: to}, speed, easing, callback);
8481 },
8482
8483 animate: function( prop, speed, easing, callback ) {
8484 var optall = jQuery.speed( speed, easing, callback );
8485
8486 if ( jQuery.isEmptyObject( prop ) ) {
8487 return this.each( optall.complete, [ false ] );
8488 }
8489
8490 // Do not change referenced properties as per-property easing will be lost
8491 prop = jQuery.extend( {}, prop );
8492
8493 function doAnimation() {
8494 // XXX 'this' does not always have a nodeName when running the
8495 // test suite
8496
8497 if ( optall.queue === false ) {
8498 jQuery._mark( this );
8499 }
8500
8501 var opt = jQuery.extend( {}, optall ),
8502 isElement = this.nodeType === 1,
8503 hidden = isElement && jQuery(this).is(":hidden"),
8504 name, val, p, e, hooks, replace,
8505 parts, start, end, unit,
8506 method;
8507
8508 // will store per property easing and be used to determine when an animation is complete
8509 opt.animatedProperties = {};
8510
8511 // first pass over propertys to expand / normalize
8512 for ( p in prop ) {
8513 name = jQuery.camelCase( p );
8514 if ( p !== name ) {
8515 prop[ name ] = prop[ p ];
8516 delete prop[ p ];
8517 }
8518
8519 if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
8520 replace = hooks.expand( prop[ name ] );
8521 delete prop[ name ];
8522
8523 // not quite $.extend, this wont overwrite keys already present.
8524 // also - reusing 'p' from above because we have the correct "name"
8525 for ( p in replace ) {
8526 if ( ! ( p in prop ) ) {
8527 prop[ p ] = replace[ p ];
8528 }
8529 }
8530 }
8531 }
8532
8533 for ( name in prop ) {
8534 val = prop[ name ];
8535 // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8536 if ( jQuery.isArray( val ) ) {
8537 opt.animatedProperties[ name ] = val[ 1 ];
8538 val = prop[ name ] = val[ 0 ];
8539 } else {
8540 opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8541 }
8542
8543 if ( val === "hide" && hidden || val === "show" && !hidden ) {
8544 return opt.complete.call( this );
8545 }
8546
8547 if ( isElement && ( name === "height" || name === "width" ) ) {
8548 // Make sure that nothing sneaks out
8549 // Record all 3 overflow attributes because IE does not
8550 // change the overflow attribute when overflowX and
8551 // overflowY are set to the same value
8552 opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8553
8554 // Set display property to inline-block for height/width
8555 // animations on inline elements that are having width/height animated
8556 if ( jQuery.css( this, "display" ) === "inline" &&
8557 jQuery.css( this, "float" ) === "none" ) {
8558
8559 // inline-level elements accept inline-block;
8560 // block-level elements need to be inline with layout
8561 if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
8562 this.style.display = "inline-block";
8563
8564 } else {
8565 this.style.zoom = 1;
8566 }
8567 }
8568 }
8569 }
8570
8571 if ( opt.overflow != null ) {
8572 this.style.overflow = "hidden";
8573 }
8574
8575 for ( p in prop ) {
8576 e = new jQuery.fx( this, opt, p );
8577 val = prop[ p ];
8578
8579 if ( rfxtypes.test( val ) ) {
8580
8581 // Tracks whether to show or hide based on private
8582 // data attached to the element
8583 method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
8584 if ( method ) {
8585 jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
8586 e[ method ]();
8587 } else {
8588 e[ val ]();
8589 }
8590
8591 } else {
8592 parts = rfxnum.exec( val );
8593 start = e.cur();
8594
8595 if ( parts ) {
8596 end = parseFloat( parts[2] );
8597 unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8598
8599 // We need to compute starting value
8600 if ( unit !== "px" ) {
8601 jQuery.style( this, p, (end || 1) + unit);
8602 start = ( (end || 1) / e.cur() ) * start;
8603 jQuery.style( this, p, start + unit);
8604 }
8605
8606 // If a +=/-= token was provided, we're doing a relative animation
8607 if ( parts[1] ) {
8608 end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8609 }
8610
8611 e.custom( start, end, unit );
8612
8613 } else {
8614 e.custom( start, val, "" );
8615 }
8616 }
8617 }
8618
8619 // For JS strict compliance
8620 return true;
8621 }
8622
8623 return optall.queue === false ?
8624 this.each( doAnimation ) :
8625 this.queue( optall.queue, doAnimation );
8626 },
8627
8628 stop: function( type, clearQueue, gotoEnd ) {
8629 if ( typeof type !== "string" ) {
8630 gotoEnd = clearQueue;
8631 clearQueue = type;
8632 type = undefined;
8633 }
8634 if ( clearQueue && type !== false ) {
8635 this.queue( type || "fx", [] );
8636 }
8637
8638 return this.each(function() {
8639 var index,
8640 hadTimers = false,
8641 timers = jQuery.timers,
8642 data = jQuery._data( this );
8643
8644 // clear marker counters if we know they won't be
8645 if ( !gotoEnd ) {
8646 jQuery._unmark( true, this );
8647 }
8648
8649 function stopQueue( elem, data, index ) {
8650 var hooks = data[ index ];
8651 jQuery.removeData( elem, index, true );
8652 hooks.stop( gotoEnd );
8653 }
8654
8655 if ( type == null ) {
8656 for ( index in data ) {
8657 if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
8658 stopQueue( this, data, index );
8659 }
8660 }
8661 } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
8662 stopQueue( this, data, index );
8663 }
8664
8665 for ( index = timers.length; index--; ) {
8666 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
8667 if ( gotoEnd ) {
8668
8669 // force the next step to be the last
8670 timers[ index ]( true );
8671 } else {
8672 timers[ index ].saveState();
8673 }
8674 hadTimers = true;
8675 timers.splice( index, 1 );
8676 }
8677 }
8678
8679 // start the next in the queue if the last step wasn't forced
8680 // timers currently will call their complete callbacks, which will dequeue
8681 // but only if they were gotoEnd
8682 if ( !( gotoEnd && hadTimers ) ) {
8683 jQuery.dequeue( this, type );
8684 }
9849 var oldCallbacks = [],
9850 rjsonp = /(=)\?(?=&|$)|\?\?/;
9851
9852 // Default jsonp settings
9853 jQuery.ajaxSetup({
9854 jsonp: "callback",
9855 jsonpCallback: function() {
9856 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9857 this[ callback ] = true;
9858 return callback;
9859 }
9860 });
9861
9862 // Detect, normalize options and install callbacks for jsonp requests
9863 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9864
9865 var callbackName, overwritten, responseContainer,
9866 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9867 "url" :
9868 typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
9869 );
9870
9871 // Handle iff the expected data type is "jsonp" or we have a parameter to set
9872 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9873
9874 // Get callback name, remembering preexisting value associated with it
9875 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9876 s.jsonpCallback() :
9877 s.jsonpCallback;
9878
9879 // Insert callback into url or form data
9880 if ( jsonProp ) {
9881 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9882 } else if ( s.jsonp !== false ) {
9883 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9884 }
9885
9886 // Use data converter to retrieve json after script execution
9887 s.converters["script json"] = function() {
9888 if ( !responseContainer ) {
9889 jQuery.error( callbackName + " was not called" );
9890 }
9891 return responseContainer[ 0 ];
9892 };
9893
9894 // force json dataType
9895 s.dataTypes[ 0 ] = "json";
9896
9897 // Install callback
9898 overwritten = window[ callbackName ];
9899 window[ callbackName ] = function() {
9900 responseContainer = arguments;
9901 };
9902
9903 // Clean-up function (fires after converters)
9904 jqXHR.always(function() {
9905 // Restore preexisting value
9906 window[ callbackName ] = overwritten;
9907
9908 // Save back as free
9909 if ( s[ callbackName ] ) {
9910 // make sure that re-using the options doesn't screw things around
9911 s.jsonpCallback = originalSettings.jsonpCallback;
9912
9913 // save the callback name for future use
9914 oldCallbacks.push( callbackName );
9915 }
9916
9917 // Call if it was a function and we have a response
9918 if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9919 overwritten( responseContainer[ 0 ] );
9920 }
9921
9922 responseContainer = overwritten = undefined;
86859923 });
8686 }
8687
9924
9925 // Delegate to script
9926 return "script";
9927 }
86889928 });
86899929
8690 // Animations created synchronously will run synchronously
8691 function createFxNow() {
8692 setTimeout( clearFxNow, 0 );
8693 return ( fxNow = jQuery.now() );
8694 }
8695
8696 function clearFxNow() {
8697 fxNow = undefined;
8698 }
8699
8700 // Generate parameters to create a standard animation
8701 function genFx( type, num ) {
8702 var obj = {};
8703
8704 jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
8705 obj[ this ] = type;
8706 });
8707
8708 return obj;
8709 }
8710
8711 // Generate shortcuts for custom animations
8712 jQuery.each({
8713 slideDown: genFx( "show", 1 ),
8714 slideUp: genFx( "hide", 1 ),
8715 slideToggle: genFx( "toggle", 1 ),
8716 fadeIn: { opacity: "show" },
8717 fadeOut: { opacity: "hide" },
8718 fadeToggle: { opacity: "toggle" }
8719 }, function( name, props ) {
8720 jQuery.fn[ name ] = function( speed, easing, callback ) {
8721 return this.animate( props, speed, easing, callback );
9930
9931
9932
9933 // data: string of html
9934 // context (optional): If specified, the fragment will be created in this context, defaults to document
9935 // keepScripts (optional): If true, will include scripts passed in the html string
9936 jQuery.parseHTML = function( data, context, keepScripts ) {
9937 if ( !data || typeof data !== "string" ) {
9938 return null;
9939 }
9940 if ( typeof context === "boolean" ) {
9941 keepScripts = context;
9942 context = false;
9943 }
9944 context = context || document;
9945
9946 var parsed = rsingleTag.exec( data ),
9947 scripts = !keepScripts && [];
9948
9949 // Single tag
9950 if ( parsed ) {
9951 return [ context.createElement( parsed[1] ) ];
9952 }
9953
9954 parsed = jQuery.buildFragment( [ data ], context, scripts );
9955
9956 if ( scripts && scripts.length ) {
9957 jQuery( scripts ).remove();
9958 }
9959
9960 return jQuery.merge( [], parsed.childNodes );
9961 };
9962
9963
9964 // Keep a copy of the old load method
9965 var _load = jQuery.fn.load;
9966
9967 /**
9968 * Load a url into a page
9969 */
9970 jQuery.fn.load = function( url, params, callback ) {
9971 if ( typeof url !== "string" && _load ) {
9972 return _load.apply( this, arguments );
9973 }
9974
9975 var selector, response, type,
9976 self = this,
9977 off = url.indexOf(" ");
9978
9979 if ( off >= 0 ) {
9980 selector = jQuery.trim( url.slice( off, url.length ) );
9981 url = url.slice( 0, off );
9982 }
9983
9984 // If it's a function
9985 if ( jQuery.isFunction( params ) ) {
9986
9987 // We assume that it's the callback
9988 callback = params;
9989 params = undefined;
9990
9991 // Otherwise, build a param string
9992 } else if ( params && typeof params === "object" ) {
9993 type = "POST";
9994 }
9995
9996 // If we have elements to modify, make the request
9997 if ( self.length > 0 ) {
9998 jQuery.ajax({
9999 url: url,
10000
10001 // if "type" variable is undefined, then "GET" method will be used
10002 type: type,
10003 dataType: "html",
10004 data: params
10005 }).done(function( responseText ) {
10006
10007 // Save response for use in complete callback
10008 response = arguments;
10009
10010 self.html( selector ?
10011
10012 // If a selector was specified, locate the right elements in a dummy div
10013 // Exclude scripts to avoid IE 'Permission Denied' errors
10014 jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
10015
10016 // Otherwise use the full result
10017 responseText );
10018
10019 }).complete( callback && function( jqXHR, status ) {
10020 self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
10021 });
10022 }
10023
10024 return this;
10025 };
10026
10027
10028
10029
10030 // Attach a bunch of functions for handling common AJAX events
10031 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
10032 jQuery.fn[ type ] = function( fn ) {
10033 return this.on( type, fn );
872210034 };
872310035 });
872410036
8725 jQuery.extend({
8726 speed: function( speed, easing, fn ) {
8727 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
8728 complete: fn || !fn && easing ||
8729 jQuery.isFunction( speed ) && speed,
8730 duration: speed,
8731 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
8732 };
8733
8734 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8735 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
8736
8737 // normalize opt.queue - true/undefined/null -> "fx"
8738 if ( opt.queue == null || opt.queue === true ) {
8739 opt.queue = "fx";
8740 }
8741
8742 // Queueing
8743 opt.old = opt.complete;
8744
8745 opt.complete = function( noUnmark ) {
8746 if ( jQuery.isFunction( opt.old ) ) {
8747 opt.old.call( this );
8748 }
8749
8750 if ( opt.queue ) {
8751 jQuery.dequeue( this, opt.queue );
8752 } else if ( noUnmark !== false ) {
8753 jQuery._unmark( this );
8754 }
8755 };
8756
8757 return opt;
8758 },
8759
8760 easing: {
8761 linear: function( p ) {
8762 return p;
8763 },
8764 swing: function( p ) {
8765 return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
8766 }
8767 },
8768
8769 timers: [],
8770
8771 fx: function( elem, options, prop ) {
8772 this.options = options;
8773 this.elem = elem;
8774 this.prop = prop;
8775
8776 options.orig = options.orig || {};
8777 }
8778
8779 });
8780
8781 jQuery.fx.prototype = {
8782 // Simple function for setting a style value
8783 update: function() {
8784 if ( this.options.step ) {
8785 this.options.step.call( this.elem, this.now, this );
8786 }
8787
8788 ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
8789 },
8790
8791 // Get the current size
8792 cur: function() {
8793 if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
8794 return this.elem[ this.prop ];
8795 }
8796
8797 var parsed,
8798 r = jQuery.css( this.elem, this.prop );
8799 // Empty strings, null, undefined and "auto" are converted to 0,
8800 // complex values such as "rotate(1rad)" are returned as is,
8801 // simple values such as "10px" are parsed to Float.
8802 return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8803 },
8804
8805 // Start an animation from one number to another
8806 custom: function( from, to, unit ) {
8807 var self = this,
8808 fx = jQuery.fx;
8809
8810 this.startTime = fxNow || createFxNow();
8811 this.end = to;
8812 this.now = this.start = from;
8813 this.pos = this.state = 0;
8814 this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8815
8816 function t( gotoEnd ) {
8817 return self.step( gotoEnd );
8818 }
8819
8820 t.queue = this.options.queue;
8821 t.elem = this.elem;
8822 t.saveState = function() {
8823 if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
8824 if ( self.options.hide ) {
8825 jQuery._data( self.elem, "fxshow" + self.prop, self.start );
8826 } else if ( self.options.show ) {
8827 jQuery._data( self.elem, "fxshow" + self.prop, self.end );
8828 }
8829 }
8830 };
8831
8832 if ( t() && jQuery.timers.push(t) && !timerId ) {
8833 timerId = setInterval( fx.tick, fx.interval );
8834 }
8835 },
8836
8837 // Simple 'show' function
8838 show: function() {
8839 var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
8840
8841 // Remember where we started, so that we can go back to it later
8842 this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
8843 this.options.show = true;
8844
8845 // Begin the animation
8846 // Make sure that we start at a small width/height to avoid any flash of content
8847 if ( dataShow !== undefined ) {
8848 // This show is picking up where a previous hide or show left off
8849 this.custom( this.cur(), dataShow );
8850 } else {
8851 this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
8852 }
8853
8854 // Start by showing the element
8855 jQuery( this.elem ).show();
8856 },
8857
8858 // Simple 'hide' function
8859 hide: function() {
8860 // Remember where we started, so that we can go back to it later
8861 this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
8862 this.options.hide = true;
8863
8864 // Begin the animation
8865 this.custom( this.cur(), 0 );
8866 },
8867
8868 // Each step of an animation
8869 step: function( gotoEnd ) {
8870 var p, n, complete,
8871 t = fxNow || createFxNow(),
8872 done = true,
8873 elem = this.elem,
8874 options = this.options;
8875
8876 if ( gotoEnd || t >= options.duration + this.startTime ) {
8877 this.now = this.end;
8878 this.pos = this.state = 1;
8879 this.update();
8880
8881 options.animatedProperties[ this.prop ] = true;
8882
8883 for ( p in options.animatedProperties ) {
8884 if ( options.animatedProperties[ p ] !== true ) {
8885 done = false;
8886 }
8887 }
8888
8889 if ( done ) {
8890 // Reset the overflow
8891 if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8892
8893 jQuery.each( [ "", "X", "Y" ], function( index, value ) {
8894 elem.style[ "overflow" + value ] = options.overflow[ index ];
8895 });
8896 }
8897
8898 // Hide the element if the "hide" operation was done
8899 if ( options.hide ) {
8900 jQuery( elem ).hide();
8901 }
8902
8903 // Reset the properties, if the item has been hidden or shown
8904 if ( options.hide || options.show ) {
8905 for ( p in options.animatedProperties ) {
8906 jQuery.style( elem, p, options.orig[ p ] );
8907 jQuery.removeData( elem, "fxshow" + p, true );
8908 // Toggle data is no longer needed
8909 jQuery.removeData( elem, "toggle" + p, true );
8910 }
8911 }
8912
8913 // Execute the complete function
8914 // in the event that the complete function throws an exception
8915 // we must ensure it won't be called twice. #5684
8916
8917 complete = options.complete;
8918 if ( complete ) {
8919
8920 options.complete = false;
8921 complete.call( elem );
8922 }
8923 }
8924
8925 return false;
8926
8927 } else {
8928 // classical easing cannot be used with an Infinity duration
8929 if ( options.duration == Infinity ) {
8930 this.now = t;
8931 } else {
8932 n = t - this.startTime;
8933 this.state = n / options.duration;
8934
8935 // Perform the easing function, defaults to swing
8936 this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
8937 this.now = this.start + ( (this.end - this.start) * this.pos );
8938 }
8939 // Perform the next step of the animation
8940 this.update();
8941 }
8942
8943 return true;
8944 }
10037
10038
10039
10040 jQuery.expr.filters.animated = function( elem ) {
10041 return jQuery.grep(jQuery.timers, function( fn ) {
10042 return elem === fn.elem;
10043 }).length;
894510044 };
894610045
8947 jQuery.extend( jQuery.fx, {
8948 tick: function() {
8949 var timer,
8950 timers = jQuery.timers,
8951 i = 0;
8952
8953 for ( ; i < timers.length; i++ ) {
8954 timer = timers[ i ];
8955 // Checks the timer has not already been removed
8956 if ( !timer() && timers[ i ] === timer ) {
8957 timers.splice( i--, 1 );
8958 }
8959 }
8960
8961 if ( !timers.length ) {
8962 jQuery.fx.stop();
8963 }
8964 },
8965
8966 interval: 13,
8967
8968 stop: function() {
8969 clearInterval( timerId );
8970 timerId = null;
8971 },
8972
8973 speeds: {
8974 slow: 600,
8975 fast: 200,
8976 // Default speed
8977 _default: 400
8978 },
8979
8980 step: {
8981 opacity: function( fx ) {
8982 jQuery.style( fx.elem, "opacity", fx.now );
8983 },
8984
8985 _default: function( fx ) {
8986 if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8987 fx.elem.style[ fx.prop ] = fx.now + fx.unit;
8988 } else {
8989 fx.elem[ fx.prop ] = fx.now;
8990 }
8991 }
8992 }
8993 });
8994
8995 // Ensure props that can't be negative don't go there on undershoot easing
8996 jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
8997 // exclude marginTop, marginLeft, marginBottom and marginRight from this list
8998 if ( prop.indexOf( "margin" ) ) {
8999 jQuery.fx.step[ prop ] = function( fx ) {
9000 jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
9001 };
9002 }
9003 });
9004
9005 if ( jQuery.expr && jQuery.expr.filters ) {
9006 jQuery.expr.filters.animated = function( elem ) {
9007 return jQuery.grep(jQuery.timers, function( fn ) {
9008 return elem === fn.elem;
9009 }).length;
9010 };
10046
10047
10048
10049
10050 var docElem = window.document.documentElement;
10051
10052 /**
10053 * Gets a window from an element
10054 */
10055 function getWindow( elem ) {
10056 return jQuery.isWindow( elem ) ?
10057 elem :
10058 elem.nodeType === 9 ?
10059 elem.defaultView || elem.parentWindow :
10060 false;
901110061 }
901210062
9013 // Try to restore the default display value of an element
9014 function defaultDisplay( nodeName ) {
9015
9016 if ( !elemdisplay[ nodeName ] ) {
9017
9018 var body = document.body,
9019 elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
9020 display = elem.css( "display" );
9021 elem.remove();
9022
9023 // If the simple way fails,
9024 // get element's real default display by attaching it to a temp iframe
9025 if ( display === "none" || display === "" ) {
9026 // No iframe to use yet, so create it
9027 if ( !iframe ) {
9028 iframe = document.createElement( "iframe" );
9029 iframe.frameBorder = iframe.width = iframe.height = 0;
9030 }
9031
9032 body.appendChild( iframe );
9033
9034 // Create a cacheable copy of the iframe document on first call.
9035 // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
9036 // document to it; WebKit & Firefox won't allow reusing the iframe document.
9037 if ( !iframeDoc || !iframe.createElement ) {
9038 iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
9039 iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
9040 iframeDoc.close();
9041 }
9042
9043 elem = iframeDoc.createElement( nodeName );
9044
9045 iframeDoc.body.appendChild( elem );
9046
9047 display = jQuery.css( elem, "display" );
9048 body.removeChild( iframe );
9049 }
9050
9051 // Store the correct default display
9052 elemdisplay[ nodeName ] = display;
9053 }
9054
9055 return elemdisplay[ nodeName ];
9056 }
9057
9058
9059
9060
9061 var getOffset,
9062 rtable = /^t(?:able|d|h)$/i,
9063 rroot = /^(?:body|html)$/i;
9064
9065 if ( "getBoundingClientRect" in document.documentElement ) {
9066 getOffset = function( elem, doc, docElem, box ) {
9067 try {
9068 box = elem.getBoundingClientRect();
9069 } catch(e) {}
9070
9071 // Make sure we're not dealing with a disconnected DOM node
9072 if ( !box || !jQuery.contains( docElem, elem ) ) {
9073 return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
9074 }
9075
9076 var body = doc.body,
9077 win = getWindow( doc ),
9078 clientTop = docElem.clientTop || body.clientTop || 0,
9079 clientLeft = docElem.clientLeft || body.clientLeft || 0,
9080 scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
9081 scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
9082 top = box.top + scrollTop - clientTop,
9083 left = box.left + scrollLeft - clientLeft;
9084
9085 return { top: top, left: left };
9086 };
9087
9088 } else {
9089 getOffset = function( elem, doc, docElem ) {
9090 var computedStyle,
9091 offsetParent = elem.offsetParent,
9092 prevOffsetParent = elem,
9093 body = doc.body,
9094 defaultView = doc.defaultView,
9095 prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
9096 top = elem.offsetTop,
9097 left = elem.offsetLeft;
9098
9099 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
9100 if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9101 break;
9102 }
9103
9104 computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
9105 top -= elem.scrollTop;
9106 left -= elem.scrollLeft;
9107
9108 if ( elem === offsetParent ) {
9109 top += elem.offsetTop;
9110 left += elem.offsetLeft;
9111
9112 if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
9113 top += parseFloat( computedStyle.borderTopWidth ) || 0;
9114 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9115 }
9116
9117 prevOffsetParent = offsetParent;
9118 offsetParent = elem.offsetParent;
9119 }
9120
9121 if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
9122 top += parseFloat( computedStyle.borderTopWidth ) || 0;
9123 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9124 }
9125
9126 prevComputedStyle = computedStyle;
9127 }
9128
9129 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
9130 top += body.offsetTop;
9131 left += body.offsetLeft;
9132 }
9133
9134 if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9135 top += Math.max( docElem.scrollTop, body.scrollTop );
9136 left += Math.max( docElem.scrollLeft, body.scrollLeft );
9137 }
9138
9139 return { top: top, left: left };
9140 };
9141 }
9142
9143 jQuery.fn.offset = function( options ) {
9144 if ( arguments.length ) {
9145 return options === undefined ?
9146 this :
9147 this.each(function( i ) {
9148 jQuery.offset.setOffset( this, options, i );
9149 });
9150 }
9151
9152 var elem = this[0],
9153 doc = elem && elem.ownerDocument;
9154
9155 if ( !doc ) {
9156 return null;
9157 }
9158
9159 if ( elem === doc.body ) {
9160 return jQuery.offset.bodyOffset( elem );
9161 }
9162
9163 return getOffset( elem, doc, doc.documentElement );
9164 };
9165
916610063 jQuery.offset = {
9167
9168 bodyOffset: function( body ) {
9169 var top = body.offsetTop,
9170 left = body.offsetLeft;
9171
9172 if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
9173 top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9174 left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9175 }
9176
9177 return { top: top, left: left };
9178 },
9179
918010064 setOffset: function( elem, options, i ) {
9181 var position = jQuery.css( elem, "position" );
10065 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10066 position = jQuery.css( elem, "position" ),
10067 curElem = jQuery( elem ),
10068 props = {};
918210069
918310070 // set position first, in-case top/left are set even on static elem
918410071 if ( position === "static" ) {
918510072 elem.style.position = "relative";
918610073 }
918710074
9188 var curElem = jQuery( elem ),
9189 curOffset = curElem.offset(),
9190 curCSSTop = jQuery.css( elem, "top" ),
9191 curCSSLeft = jQuery.css( elem, "left" ),
9192 calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9193 props = {}, curPosition = {}, curTop, curLeft;
10075 curOffset = curElem.offset();
10076 curCSSTop = jQuery.css( elem, "top" );
10077 curCSSLeft = jQuery.css( elem, "left" );
10078 calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10079 jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
919410080
919510081 // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
919610082 if ( calculatePosition ) {
922110107 }
922210108 };
922310109
9224
922510110 jQuery.fn.extend({
10111 offset: function( options ) {
10112 if ( arguments.length ) {
10113 return options === undefined ?
10114 this :
10115 this.each(function( i ) {
10116 jQuery.offset.setOffset( this, options, i );
10117 });
10118 }
10119
10120 var docElem, win,
10121 box = { top: 0, left: 0 },
10122 elem = this[ 0 ],
10123 doc = elem && elem.ownerDocument;
10124
10125 if ( !doc ) {
10126 return;
10127 }
10128
10129 docElem = doc.documentElement;
10130
10131 // Make sure it's not a disconnected DOM node
10132 if ( !jQuery.contains( docElem, elem ) ) {
10133 return box;
10134 }
10135
10136 // If we don't have gBCR, just use 0,0 rather than error
10137 // BlackBerry 5, iOS 3 (original iPhone)
10138 if ( typeof elem.getBoundingClientRect !== strundefined ) {
10139 box = elem.getBoundingClientRect();
10140 }
10141 win = getWindow( doc );
10142 return {
10143 top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
10144 left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
10145 };
10146 },
922610147
922710148 position: function() {
9228 if ( !this[0] ) {
9229 return null;
9230 }
9231
9232 var elem = this[0],
9233
9234 // Get *real* offsetParent
9235 offsetParent = this.offsetParent(),
9236
9237 // Get correct offsets
9238 offset = this.offset(),
9239 parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9240
9241 // Subtract element margins
10149 if ( !this[ 0 ] ) {
10150 return;
10151 }
10152
10153 var offsetParent, offset,
10154 parentOffset = { top: 0, left: 0 },
10155 elem = this[ 0 ];
10156
10157 // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
10158 if ( jQuery.css( elem, "position" ) === "fixed" ) {
10159 // we assume that getBoundingClientRect is available when computed position is fixed
10160 offset = elem.getBoundingClientRect();
10161 } else {
10162 // Get *real* offsetParent
10163 offsetParent = this.offsetParent();
10164
10165 // Get correct offsets
10166 offset = this.offset();
10167 if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
10168 parentOffset = offsetParent.offset();
10169 }
10170
10171 // Add offsetParent borders
10172 parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
10173 parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
10174 }
10175
10176 // Subtract parent offsets and element margins
924210177 // note: when an element has margin: auto the offsetLeft and marginLeft
924310178 // are the same in Safari causing offset.left to incorrectly be 0
9244 offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9245 offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9246
9247 // Add offsetParent borders
9248 parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9249 parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9250
9251 // Subtract the two offsets
925210179 return {
9253 top: offset.top - parentOffset.top,
9254 left: offset.left - parentOffset.left
10180 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10181 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
925510182 };
925610183 },
925710184
925810185 offsetParent: function() {
925910186 return this.map(function() {
9260 var offsetParent = this.offsetParent || document.body;
9261 while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
10187 var offsetParent = this.offsetParent || docElem;
10188
10189 while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
926210190 offsetParent = offsetParent.offsetParent;
926310191 }
9264 return offsetParent;
10192 return offsetParent || docElem;
926510193 });
926610194 }
926710195 });
926810196
9269
927010197 // Create scrollLeft and scrollTop methods
9271 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
10198 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
927210199 var top = /Y/.test( prop );
927310200
927410201 jQuery.fn[ method ] = function( val ) {
9275 return jQuery.access( this, function( elem, method, val ) {
10202 return access( this, function( elem, method, val ) {
927610203 var win = getWindow( elem );
927710204
927810205 if ( val === undefined ) {
927910206 return win ? (prop in win) ? win[ prop ] :
9280 jQuery.support.boxModel && win.document.documentElement[ method ] ||
9281 win.document.body[ method ] :
10207 win.document.documentElement[ method ] :
928210208 elem[ method ];
928310209 }
928410210
928510211 if ( win ) {
928610212 win.scrollTo(
928710213 !top ? val : jQuery( win ).scrollLeft(),
9288 top ? val : jQuery( win ).scrollTop()
10214 top ? val : jQuery( win ).scrollTop()
928910215 );
929010216
929110217 } else {
929510221 };
929610222 });
929710223
9298 function getWindow( elem ) {
9299 return jQuery.isWindow( elem ) ?
9300 elem :
9301 elem.nodeType === 9 ?
9302 elem.defaultView || elem.parentWindow :
9303 false;
10224 // Add the top/left cssHooks using jQuery.fn.position
10225 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10226 // getComputedStyle returns percent when specified for top/left/bottom/right
10227 // rather than make the css module depend on the offset module, we just check for it here
10228 jQuery.each( [ "top", "left" ], function( i, prop ) {
10229 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10230 function( elem, computed ) {
10231 if ( computed ) {
10232 computed = curCSS( elem, prop );
10233 // if curCSS returns percentage, fallback to offset
10234 return rnumnonpx.test( computed ) ?
10235 jQuery( elem ).position()[ prop ] + "px" :
10236 computed;
10237 }
10238 }
10239 );
10240 });
10241
10242
10243 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10244 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10245 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
10246 // margin is only for outerHeight, outerWidth
10247 jQuery.fn[ funcName ] = function( margin, value ) {
10248 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10249 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10250
10251 return access( this, function( elem, type, value ) {
10252 var doc;
10253
10254 if ( jQuery.isWindow( elem ) ) {
10255 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10256 // isn't a whole lot we can do. See pull request at this URL for discussion:
10257 // https://github.com/jquery/jquery/pull/764
10258 return elem.document.documentElement[ "client" + name ];
10259 }
10260
10261 // Get document width or height
10262 if ( elem.nodeType === 9 ) {
10263 doc = elem.documentElement;
10264
10265 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
10266 // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
10267 return Math.max(
10268 elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10269 elem.body[ "offset" + name ], doc[ "offset" + name ],
10270 doc[ "client" + name ]
10271 );
10272 }
10273
10274 return value === undefined ?
10275 // Get width or height on the element, requesting but not forcing parseFloat
10276 jQuery.css( elem, type, extra ) :
10277
10278 // Set width or height on the element
10279 jQuery.style( elem, type, value, extra );
10280 }, type, chainable ? margin : undefined, chainable, null );
10281 };
10282 });
10283 });
10284
10285
10286 // The number of elements contained in the matched element set
10287 jQuery.fn.size = function() {
10288 return this.length;
10289 };
10290
10291 jQuery.fn.andSelf = jQuery.fn.addBack;
10292
10293
10294
10295
10296 // Register as a named AMD module, since jQuery can be concatenated with other
10297 // files that may use define, but not via a proper concatenation script that
10298 // understands anonymous AMD modules. A named AMD is safest and most robust
10299 // way to register. Lowercase jquery is used because AMD module names are
10300 // derived from file names, and jQuery is normally delivered in a lowercase
10301 // file name. Do this after creating the global so that if an AMD module wants
10302 // to call noConflict to hide this version of jQuery, it will work.
10303
10304 // Note that for maximum portability, libraries that are not jQuery should
10305 // declare themselves as anonymous modules, and avoid setting a global if an
10306 // AMD loader is present. jQuery is a special case. For more information, see
10307 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10308
10309 if ( typeof define === "function" && define.amd ) {
10310 define( "jquery", [], function() {
10311 return jQuery;
10312 });
930410313 }
930510314
930610315
930710316
930810317
9309 // Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
9310 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9311 var clientProp = "client" + name,
9312 scrollProp = "scroll" + name,
9313 offsetProp = "offset" + name;
9314
9315 // innerHeight and innerWidth
9316 jQuery.fn[ "inner" + name ] = function() {
9317 var elem = this[0];
9318 return elem ?
9319 elem.style ?
9320 parseFloat( jQuery.css( elem, type, "padding" ) ) :
9321 this[ type ]() :
9322 null;
9323 };
9324
9325 // outerHeight and outerWidth
9326 jQuery.fn[ "outer" + name ] = function( margin ) {
9327 var elem = this[0];
9328 return elem ?
9329 elem.style ?
9330 parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
9331 this[ type ]() :
9332 null;
9333 };
9334
9335 jQuery.fn[ type ] = function( value ) {
9336 return jQuery.access( this, function( elem, type, value ) {
9337 var doc, docElemProp, orig, ret;
9338
9339 if ( jQuery.isWindow( elem ) ) {
9340 // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
9341 doc = elem.document;
9342 docElemProp = doc.documentElement[ clientProp ];
9343 return jQuery.support.boxModel && docElemProp ||
9344 doc.body && doc.body[ clientProp ] || docElemProp;
9345 }
9346
9347 // Get document width or height
9348 if ( elem.nodeType === 9 ) {
9349 // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
9350 doc = elem.documentElement;
9351
9352 // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
9353 // so we can't use max, as it'll choose the incorrect offset[Width/Height]
9354 // instead we use the correct client[Width/Height]
9355 // support:IE6
9356 if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
9357 return doc[ clientProp ];
9358 }
9359
9360 return Math.max(
9361 elem.body[ scrollProp ], doc[ scrollProp ],
9362 elem.body[ offsetProp ], doc[ offsetProp ]
9363 );
9364 }
9365
9366 // Get width or height on the element
9367 if ( value === undefined ) {
9368 orig = jQuery.css( elem, type );
9369 ret = parseFloat( orig );
9370 return jQuery.isNumeric( ret ) ? ret : orig;
9371 }
9372
9373 // Set the width or height on the element
9374 jQuery( elem ).css( type, value );
9375 }, type, value, arguments.length, null );
9376 };
9377 });
9378
9379
9380
9381
9382 // Expose jQuery to the global object
9383 window.jQuery = window.$ = jQuery;
9384
9385 // Expose jQuery as an AMD module, but only for AMD loaders that
9386 // understand the issues with loading multiple versions of jQuery
9387 // in a page that all might call define(). The loader will indicate
9388 // they have special allowances for multiple jQuery versions by
9389 // specifying define.amd.jQuery = true. Register as a named module,
9390 // since jQuery can be concatenated with other files that may use define,
9391 // but not use a proper concatenation script that understands anonymous
9392 // AMD modules. A named AMD is safest and most robust way to register.
9393 // Lowercase jquery is used because AMD module names are derived from
9394 // file names, and jQuery is normally delivered in a lowercase file name.
9395 // Do this after creating the global so that if an AMD module wants to call
9396 // noConflict to hide this version of jQuery, it will work.
9397 if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9398 define( "jquery", [], function () { return jQuery; } );
10318 var
10319 // Map over jQuery in case of overwrite
10320 _jQuery = window.jQuery,
10321
10322 // Map over the $ in case of overwrite
10323 _$ = window.$;
10324
10325 jQuery.noConflict = function( deep ) {
10326 if ( window.$ === jQuery ) {
10327 window.$ = _$;
10328 }
10329
10330 if ( deep && window.jQuery === jQuery ) {
10331 window.jQuery = _jQuery;
10332 }
10333
10334 return jQuery;
10335 };
10336
10337 // Expose jQuery and $ identifiers, even in
10338 // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10339 // and CommonJS for browser emulators (#13566)
10340 if ( typeof noGlobal === strundefined ) {
10341 window.jQuery = window.$ = jQuery;
939910342 }
940010343
940110344
940210345
9403 })( window );
10346
10347 return jQuery;
10348
10349
10350 }));
Binary diff not shown
33 .highlight .err { border: 1px solid #FF0000 } /* Error */
44 .highlight .k { color: #007020; font-weight: bold } /* Keyword */
55 .highlight .o { color: #666666 } /* Operator */
6 .highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
67 .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
78 .highlight .cp { color: #007020 } /* Comment.Preproc */
9 .highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
810 .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
911 .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
1012 .highlight .gd { color: #A00000 } /* Generic.Deleted */
3941 .highlight .nv { color: #bb60d5 } /* Name.Variable */
4042 .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
4143 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
44 .highlight .mb { color: #208050 } /* Literal.Number.Bin */
4245 .highlight .mf { color: #208050 } /* Literal.Number.Float */
4346 .highlight .mh { color: #208050 } /* Literal.Number.Hex */
4447 .highlight .mi { color: #208050 } /* Literal.Number.Integer */
33 *
44 * Sphinx JavaScript utilties for the full-text search.
55 *
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
1010
1111
12 /* Non-minified version JS is _stemmer.js if file is provided */
1213 /**
1314 * Porter Stemmer
1415 */
372373 }
373374
374375 // lookup as search terms in fulltext
375 results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
376 .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
376 results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
377377
378378 // let the scorer override scores with a custom scoring function
379379 if (Scorer.score) {
438438 dataType: "text",
439439 complete: function(jqxhr, textstatus) {
440440 var data = jqxhr.responseText;
441 if (data !== '') {
441 if (data !== '' && data !== undefined) {
442442 listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
443443 }
444444 Search.output.append(listItem);
537537 /**
538538 * search for full-text terms in the index
539539 */
540 performTermsSearch : function(searchterms, excluded, terms, score) {
540 performTermsSearch : function(searchterms, excluded, terms, titleterms) {
541541 var filenames = this._index.filenames;
542542 var titles = this._index.titles;
543543
544 var i, j, file, files;
544 var i, j, file;
545545 var fileMap = {};
546 var scoreMap = {};
546547 var results = [];
547548
548549 // perform the search on the required terms
549550 for (i = 0; i < searchterms.length; i++) {
550551 var word = searchterms[i];
552 var files = [];
553 var _o = [
554 {files: terms[word], score: Scorer.term},
555 {files: titleterms[word], score: Scorer.title}
556 ];
557
551558 // no match but word was a required one
552 if ((files = terms[word]) === undefined)
559 if ($u.every(_o, function(o){return o.files === undefined;})) {
553560 break;
554 if (files.length === undefined) {
555 files = [files];
556 }
561 }
562 // found search word in contents
563 $u.each(_o, function(o) {
564 var _files = o.files;
565 if (_files === undefined)
566 return
567
568 if (_files.length === undefined)
569 _files = [_files];
570 files = files.concat(_files);
571
572 // set score for the word in each file to Scorer.term
573 for (j = 0; j < _files.length; j++) {
574 file = _files[j];
575 if (!(file in scoreMap))
576 scoreMap[file] = {}
577 scoreMap[file][word] = o.score;
578 }
579 });
580
557581 // create the mapping
558582 for (j = 0; j < files.length; j++) {
559583 file = files[j];
575599 // ensure that none of the excluded terms is in the search result
576600 for (i = 0; i < excluded.length; i++) {
577601 if (terms[excluded[i]] == file ||
578 $u.contains(terms[excluded[i]] || [], file)) {
602 titleterms[excluded[i]] == file ||
603 $u.contains(terms[excluded[i]] || [], file) ||
604 $u.contains(titleterms[excluded[i]] || [], file)) {
579605 valid = false;
580606 break;
581607 }
583609
584610 // if we have still a valid result we can add it to the result list
585611 if (valid) {
612 // select one (max) score for the file.
613 // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
614 var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
586615 results.push([filenames[file], titles[file], '', null, score]);
587616 }
588617 }
44 * Sphinx stylesheet -- sphinxdoc theme. Originally created by
55 * Armin Ronacher for Werkzeug.
66 *
7 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
7 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
88 * :license: BSD, see LICENSE for details.
99 *
1010 */
203203 color: white!important;
204204 }
205205
206 cite, code, tt {
206 cite, code, code {
207207 font-family: 'Consolas', 'Deja Vu Sans Mono',
208208 'Bitstream Vera Sans Mono', monospace;
209209 font-size: 0.95em;
210210 letter-spacing: 0.01em;
211211 }
212212
213 tt {
213 code {
214214 background-color: #f2f2f2;
215215 border-bottom: 1px solid #ddd;
216216 color: #333;
217217 }
218218
219 tt.descname, tt.descclassname, tt.xref {
219 code.descname, code.descclassname, code.xref {
220220 border: 0;
221221 }
222222
225225 margin: 2em;
226226 }
227227
228 a tt {
228 a code {
229229 border: 0;
230230 color: #CA7900;
231231 }
232232
233 a tt:hover {
233 a code:hover {
234234 color: #2491CF;
235235 }
236236
335335 background-color: #f4debf;
336336 border-top: 1px solid #ac9;
337337 border-bottom: 1px solid #ac9;
338 }
339
340 div.code-block-caption {
341 background-color: #ddd;
342 color: #222;
343 border: 1px solid #ccc;
338344 }
0 // Underscore.js 1.4.4
0 // Underscore.js 1.7.0
11 // http://underscorejs.org
2 // (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
2 // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
33 // Underscore may be freely distributed under the MIT license.
44
55 (function() {
77 // Baseline setup
88 // --------------
99
10 // Establish the root object, `window` in the browser, or `global` on the server.
10 // Establish the root object, `window` in the browser, or `exports` on the server.
1111 var root = this;
1212
1313 // Save the previous value of the `_` variable.
1414 var previousUnderscore = root._;
1515
16 // Establish the object that gets returned to break out of a loop iteration.
17 var breaker = {};
18
1916 // Save bytes in the minified (but not gzipped) version:
2017 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
2118
2219 // Create quick reference variables for speed access to core prototypes.
23 var push = ArrayProto.push,
24 slice = ArrayProto.slice,
25 concat = ArrayProto.concat,
26 toString = ObjProto.toString,
27 hasOwnProperty = ObjProto.hasOwnProperty;
20 var
21 push = ArrayProto.push,
22 slice = ArrayProto.slice,
23 concat = ArrayProto.concat,
24 toString = ObjProto.toString,
25 hasOwnProperty = ObjProto.hasOwnProperty;
2826
2927 // All **ECMAScript 5** native function implementations that we hope to use
3028 // are declared here.
3129 var
32 nativeForEach = ArrayProto.forEach,
33 nativeMap = ArrayProto.map,
34 nativeReduce = ArrayProto.reduce,
35 nativeReduceRight = ArrayProto.reduceRight,
36 nativeFilter = ArrayProto.filter,
37 nativeEvery = ArrayProto.every,
38 nativeSome = ArrayProto.some,
39 nativeIndexOf = ArrayProto.indexOf,
40 nativeLastIndexOf = ArrayProto.lastIndexOf,
4130 nativeIsArray = Array.isArray,
4231 nativeKeys = Object.keys,
4332 nativeBind = FuncProto.bind;
5140
5241 // Export the Underscore object for **Node.js**, with
5342 // backwards-compatibility for the old `require()` API. If we're in
54 // the browser, add `_` as a global object via a string identifier,
55 // for Closure Compiler "advanced" mode.
43 // the browser, add `_` as a global object.
5644 if (typeof exports !== 'undefined') {
5745 if (typeof module !== 'undefined' && module.exports) {
5846 exports = module.exports = _;
6351 }
6452
6553 // Current version.
66 _.VERSION = '1.4.4';
54 _.VERSION = '1.7.0';
55
56 // Internal function that returns an efficient (for current engines) version
57 // of the passed-in callback, to be repeatedly applied in other Underscore
58 // functions.
59 var createCallback = function(func, context, argCount) {
60 if (context === void 0) return func;
61 switch (argCount == null ? 3 : argCount) {
62 case 1: return function(value) {
63 return func.call(context, value);
64 };
65 case 2: return function(value, other) {
66 return func.call(context, value, other);
67 };
68 case 3: return function(value, index, collection) {
69 return func.call(context, value, index, collection);
70 };
71 case 4: return function(accumulator, value, index, collection) {
72 return func.call(context, accumulator, value, index, collection);
73 };
74 }
75 return function() {
76 return func.apply(context, arguments);
77 };
78 };
79
80 // A mostly-internal function to generate callbacks that can be applied
81 // to each element in a collection, returning the desired result — either
82 // identity, an arbitrary callback, a property matcher, or a property accessor.
83 _.iteratee = function(value, context, argCount) {
84 if (value == null) return _.identity;
85 if (_.isFunction(value)) return createCallback(value, context, argCount);
86 if (_.isObject(value)) return _.matches(value);
87 return _.property(value);
88 };
6789
6890 // Collection Functions
6991 // --------------------
7092
7193 // The cornerstone, an `each` implementation, aka `forEach`.
72 // Handles objects with the built-in `forEach`, arrays, and raw objects.
73 // Delegates to **ECMAScript 5**'s native `forEach` if available.
74 var each = _.each = _.forEach = function(obj, iterator, context) {
75 if (obj == null) return;
76 if (nativeForEach && obj.forEach === nativeForEach) {
77 obj.forEach(iterator, context);
78 } else if (obj.length === +obj.length) {
79 for (var i = 0, l = obj.length; i < l; i++) {
80 if (iterator.call(context, obj[i], i, obj) === breaker) return;
94 // Handles raw objects in addition to array-likes. Treats all
95 // sparse array-likes as if they were dense.
96 _.each = _.forEach = function(obj, iteratee, context) {
97 if (obj == null) return obj;
98 iteratee = createCallback(iteratee, context);
99 var i, length = obj.length;
100 if (length === +length) {
101 for (i = 0; i < length; i++) {
102 iteratee(obj[i], i, obj);
81103 }
82104 } else {
83 for (var key in obj) {
84 if (_.has(obj, key)) {
85 if (iterator.call(context, obj[key], key, obj) === breaker) return;
86 }
87 }
88 }
89 };
90
91 // Return the results of applying the iterator to each element.
92 // Delegates to **ECMAScript 5**'s native `map` if available.
93 _.map = _.collect = function(obj, iterator, context) {
105 var keys = _.keys(obj);
106 for (i = 0, length = keys.length; i < length; i++) {
107 iteratee(obj[keys[i]], keys[i], obj);
108 }
109 }
110 return obj;
111 };
112
113 // Return the results of applying the iteratee to each element.
114 _.map = _.collect = function(obj, iteratee, context) {
115 if (obj == null) return [];
116 iteratee = _.iteratee(iteratee, context);
117 var keys = obj.length !== +obj.length && _.keys(obj),
118 length = (keys || obj).length,
119 results = Array(length),
120 currentKey;
121 for (var index = 0; index < length; index++) {
122 currentKey = keys ? keys[index] : index;
123 results[index] = iteratee(obj[currentKey], currentKey, obj);
124 }
125 return results;
126 };
127
128 var reduceError = 'Reduce of empty array with no initial value';
129
130 // **Reduce** builds up a single result from a list of values, aka `inject`,
131 // or `foldl`.
132 _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
133 if (obj == null) obj = [];
134 iteratee = createCallback(iteratee, context, 4);
135 var keys = obj.length !== +obj.length && _.keys(obj),
136 length = (keys || obj).length,
137 index = 0, currentKey;
138 if (arguments.length < 3) {
139 if (!length) throw new TypeError(reduceError);
140 memo = obj[keys ? keys[index++] : index++];
141 }
142 for (; index < length; index++) {
143 currentKey = keys ? keys[index] : index;
144 memo = iteratee(memo, obj[currentKey], currentKey, obj);
145 }
146 return memo;
147 };
148
149 // The right-associative version of reduce, also known as `foldr`.
150 _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
151 if (obj == null) obj = [];
152 iteratee = createCallback(iteratee, context, 4);
153 var keys = obj.length !== + obj.length && _.keys(obj),
154 index = (keys || obj).length,
155 currentKey;
156 if (arguments.length < 3) {
157 if (!index) throw new TypeError(reduceError);
158 memo = obj[keys ? keys[--index] : --index];
159 }
160 while (index--) {
161 currentKey = keys ? keys[index] : index;
162 memo = iteratee(memo, obj[currentKey], currentKey, obj);
163 }
164 return memo;
165 };
166
167 // Return the first value which passes a truth test. Aliased as `detect`.
168 _.find = _.detect = function(obj, predicate, context) {
169 var result;
170 predicate = _.iteratee(predicate, context);
171 _.some(obj, function(value, index, list) {
172 if (predicate(value, index, list)) {
173 result = value;
174 return true;
175 }
176 });
177 return result;
178 };
179
180 // Return all the elements that pass a truth test.
181 // Aliased as `select`.
182 _.filter = _.select = function(obj, predicate, context) {
94183 var results = [];
95184 if (obj == null) return results;
96 if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
97 each(obj, function(value, index, list) {
98 results[results.length] = iterator.call(context, value, index, list);
185 predicate = _.iteratee(predicate, context);
186 _.each(obj, function(value, index, list) {
187 if (predicate(value, index, list)) results.push(value);
99188 });
100189 return results;
101190 };
102191
103 var reduceError = 'Reduce of empty array with no initial value';
104
105 // **Reduce** builds up a single result from a list of values, aka `inject`,
106 // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
107 _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
108 var initial = arguments.length > 2;
109 if (obj == null) obj = [];
110 if (nativeReduce && obj.reduce === nativeReduce) {
111 if (context) iterator = _.bind(iterator, context);
112 return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
113 }
114 each(obj, function(value, index, list) {
115 if (!initial) {
116 memo = value;
117 initial = true;
118 } else {
119 memo = iterator.call(context, memo, value, index, list);
120 }
121 });
122 if (!initial) throw new TypeError(reduceError);
123 return memo;
124 };
125
126 // The right-associative version of reduce, also known as `foldr`.
127 // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
128 _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
129 var initial = arguments.length > 2;
130 if (obj == null) obj = [];
131 if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
132 if (context) iterator = _.bind(iterator, context);
133 return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
134 }
135 var length = obj.length;
136 if (length !== +length) {
137 var keys = _.keys(obj);
138 length = keys.length;
139 }
140 each(obj, function(value, index, list) {
141 index = keys ? keys[--length] : --length;
142 if (!initial) {
143 memo = obj[index];
144 initial = true;
145 } else {
146 memo = iterator.call(context, memo, obj[index], index, list);
147 }
148 });
149 if (!initial) throw new TypeError(reduceError);
150 return memo;
151 };
152
153 // Return the first value which passes a truth test. Aliased as `detect`.
154 _.find = _.detect = function(obj, iterator, context) {
155 var result;
156 any(obj, function(value, index, list) {
157 if (iterator.call(context, value, index, list)) {
158 result = value;
159 return true;
160 }
161 });
162 return result;
163 };
164
165 // Return all the elements that pass a truth test.
166 // Delegates to **ECMAScript 5**'s native `filter` if available.
167 // Aliased as `select`.
168 _.filter = _.select = function(obj, iterator, context) {
169 var results = [];
170 if (obj == null) return results;
171 if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
172 each(obj, function(value, index, list) {
173 if (iterator.call(context, value, index, list)) results[results.length] = value;
174 });
175 return results;
176 };
177
178192 // Return all the elements for which a truth test fails.
179 _.reject = function(obj, iterator, context) {
180 return _.filter(obj, function(value, index, list) {
181 return !iterator.call(context, value, index, list);
182 }, context);
193 _.reject = function(obj, predicate, context) {
194 return _.filter(obj, _.negate(_.iteratee(predicate)), context);
183195 };
184196
185197 // Determine whether all of the elements match a truth test.
186 // Delegates to **ECMAScript 5**'s native `every` if available.
187198 // Aliased as `all`.
188 _.every = _.all = function(obj, iterator, context) {
189 iterator || (iterator = _.identity);
190 var result = true;
191 if (obj == null) return result;
192 if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
193 each(obj, function(value, index, list) {
194 if (!(result = result && iterator.call(context, value, index, list))) return breaker;
195 });
196 return !!result;
199 _.every = _.all = function(obj, predicate, context) {
200 if (obj == null) return true;
201 predicate = _.iteratee(predicate, context);
202 var keys = obj.length !== +obj.length && _.keys(obj),
203 length = (keys || obj).length,
204 index, currentKey;
205 for (index = 0; index < length; index++) {
206 currentKey = keys ? keys[index] : index;
207 if (!predicate(obj[currentKey], currentKey, obj)) return false;
208 }
209 return true;
197210 };
198211
199212 // Determine if at least one element in the object matches a truth test.
200 // Delegates to **ECMAScript 5**'s native `some` if available.
201213 // Aliased as `any`.
202 var any = _.some = _.any = function(obj, iterator, context) {
203 iterator || (iterator = _.identity);
204 var result = false;
205 if (obj == null) return result;
206 if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
207 each(obj, function(value, index, list) {
208 if (result || (result = iterator.call(context, value, index, list))) return breaker;
209 });
210 return !!result;
214 _.some = _.any = function(obj, predicate, context) {
215 if (obj == null) return false;
216 predicate = _.iteratee(predicate, context);
217 var keys = obj.length !== +obj.length && _.keys(obj),
218 length = (keys || obj).length,
219 index, currentKey;
220 for (index = 0; index < length; index++) {
221 currentKey = keys ? keys[index] : index;
222 if (predicate(obj[currentKey], currentKey, obj)) return true;
223 }
224 return false;
211225 };
212226
213227 // Determine if the array or object contains a given value (using `===`).
214228 // Aliased as `include`.
215229 _.contains = _.include = function(obj, target) {
216230 if (obj == null) return false;
217 if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
218 return any(obj, function(value) {
219 return value === target;
220 });
231 if (obj.length !== +obj.length) obj = _.values(obj);
232 return _.indexOf(obj, target) >= 0;
221233 };
222234
223235 // Invoke a method (with arguments) on every item in a collection.
231243
232244 // Convenience version of a common use case of `map`: fetching a property.
233245 _.pluck = function(obj, key) {
234 return _.map(obj, function(value){ return value[key]; });
246 return _.map(obj, _.property(key));
235247 };
236248
237249 // Convenience version of a common use case of `filter`: selecting only objects
238250 // containing specific `key:value` pairs.
239 _.where = function(obj, attrs, first) {
240 if (_.isEmpty(attrs)) return first ? null : [];
241 return _[first ? 'find' : 'filter'](obj, function(value) {
242 for (var key in attrs) {
243 if (attrs[key] !== value[key]) return false;
244 }
245 return true;
246 });
251 _.where = function(obj, attrs) {
252 return _.filter(obj, _.matches(attrs));
247253 };
248254
249255 // Convenience version of a common use case of `find`: getting the first object
250256 // containing specific `key:value` pairs.
251257 _.findWhere = function(obj, attrs) {
252 return _.where(obj, attrs, true);
253 };
254
255 // Return the maximum element or (element-based computation).
256 // Can't optimize arrays of integers longer than 65,535 elements.
257 // See: https://bugs.webkit.org/show_bug.cgi?id=80797
258 _.max = function(obj, iterator, context) {
259 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
260 return Math.max.apply(Math, obj);
261 }
262 if (!iterator && _.isEmpty(obj)) return -Infinity;
263 var result = {computed : -Infinity, value: -Infinity};
264 each(obj, function(value, index, list) {
265 var computed = iterator ? iterator.call(context, value, index, list) : value;
266 computed >= result.computed && (result = {value : value, computed : computed});
267 });
268 return result.value;
258 return _.find(obj, _.matches(attrs));
259 };
260
261 // Return the maximum element (or element-based computation).
262 _.max = function(obj, iteratee, context) {
263 var result = -Infinity, lastComputed = -Infinity,
264 value, computed;
265 if (iteratee == null && obj != null) {
266 obj = obj.length === +obj.length ? obj : _.values(obj);
267 for (var i = 0, length = obj.length; i < length; i++) {
268 value = obj[i];
269 if (value > result) {
270 result = value;
271 }
272 }
273 } else {
274 iteratee = _.iteratee(iteratee, context);
275 _.each(obj, function(value, index, list) {
276 computed = iteratee(value, index, list);
277 if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
278 result = value;
279 lastComputed = computed;
280 }
281 });
282 }
283 return result;
269284 };
270285
271286 // Return the minimum element (or element-based computation).
272 _.min = function(obj, iterator, context) {
273 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
274 return Math.min.apply(Math, obj);
275 }
276 if (!iterator && _.isEmpty(obj)) return Infinity;
277 var result = {computed : Infinity, value: Infinity};
278 each(obj, function(value, index, list) {
279 var computed = iterator ? iterator.call(context, value, index, list) : value;
280 computed < result.computed && (result = {value : value, computed : computed});
281 });
282 return result.value;
283 };
284
285 // Shuffle an array.
287 _.min = function(obj, iteratee, context) {
288 var result = Infinity, lastComputed = Infinity,
289 value, computed;
290 if (iteratee == null && obj != null) {
291 obj = obj.length === +obj.length ? obj : _.values(obj);
292 for (var i = 0, length = obj.length; i < length; i++) {
293 value = obj[i];
294 if (value < result) {
295 result = value;
296 }
297 }
298 } else {
299 iteratee = _.iteratee(iteratee, context);
300 _.each(obj, function(value, index, list) {
301 computed = iteratee(value, index, list);
302 if (computed < lastComputed || computed === Infinity && result === Infinity) {
303 result = value;
304 lastComputed = computed;
305 }
306 });
307 }
308 return result;
309 };
310
311 // Shuffle a collection, using the modern version of the
312 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
286313 _.shuffle = function(obj) {
287 var rand;
288 var index = 0;
289 var shuffled = [];
290 each(obj, function(value) {
291 rand = _.random(index++);
292 shuffled[index - 1] = shuffled[rand];
293 shuffled[rand] = value;
294 });
314 var set = obj && obj.length === +obj.length ? obj : _.values(obj);
315 var length = set.length;
316 var shuffled = Array(length);
317 for (var index = 0, rand; index < length; index++) {
318 rand = _.random(0, index);
319 if (rand !== index) shuffled[index] = shuffled[rand];
320 shuffled[rand] = set[index];
321 }
295322 return shuffled;
296323 };
297324
298 // An internal function to generate lookup iterators.
299 var lookupIterator = function(value) {
300 return _.isFunction(value) ? value : function(obj){ return obj[value]; };
301 };
302
303 // Sort the object's values by a criterion produced by an iterator.
304 _.sortBy = function(obj, value, context) {
305 var iterator = lookupIterator(value);
325 // Sample **n** random values from a collection.
326 // If **n** is not specified, returns a single random element.
327 // The internal `guard` argument allows it to work with `map`.
328 _.sample = function(obj, n, guard) {
329 if (n == null || guard) {
330 if (obj.length !== +obj.length) obj = _.values(obj);
331 return obj[_.random(obj.length - 1)];
332 }
333 return _.shuffle(obj).slice(0, Math.max(0, n));
334 };
335
336 // Sort the object's values by a criterion produced by an iteratee.
337 _.sortBy = function(obj, iteratee, context) {
338 iteratee = _.iteratee(iteratee, context);
306339 return _.pluck(_.map(obj, function(value, index, list) {
307340 return {
308 value : value,
309 index : index,
310 criteria : iterator.call(context, value, index, list)
341 value: value,
342 index: index,
343 criteria: iteratee(value, index, list)
311344 };
312345 }).sort(function(left, right) {
313346 var a = left.criteria;
316349 if (a > b || a === void 0) return 1;
317350 if (a < b || b === void 0) return -1;
318351 }
319 return left.index < right.index ? -1 : 1;
352 return left.index - right.index;
320353 }), 'value');
321354 };
322355
323356 // An internal function used for aggregate "group by" operations.
324 var group = function(obj, value, context, behavior) {
325 var result = {};
326 var iterator = lookupIterator(value || _.identity);
327 each(obj, function(value, index) {
328 var key = iterator.call(context, value, index, obj);
329 behavior(result, key, value);
330 });
331 return result;
357 var group = function(behavior) {
358 return function(obj, iteratee, context) {
359 var result = {};
360 iteratee = _.iteratee(iteratee, context);
361 _.each(obj, function(value, index) {
362 var key = iteratee(value, index, obj);
363 behavior(result, value, key);
364 });
365 return result;
366 };
332367 };
333368
334369 // Groups the object's values by a criterion. Pass either a string attribute
335370 // to group by, or a function that returns the criterion.
336 _.groupBy = function(obj, value, context) {
337 return group(obj, value, context, function(result, key, value) {
338 (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
339 });
340 };
371 _.groupBy = group(function(result, value, key) {
372 if (_.has(result, key)) result[key].push(value); else result[key] = [value];
373 });
374
375 // Indexes the object's values by a criterion, similar to `groupBy`, but for
376 // when you know that your index values will be unique.
377 _.indexBy = group(function(result, value, key) {
378 result[key] = value;
379 });
341380
342381 // Counts instances of an object that group by a certain criterion. Pass
343382 // either a string attribute to count by, or a function that returns the
344383 // criterion.
345 _.countBy = function(obj, value, context) {
346 return group(obj, value, context, function(result, key) {
347 if (!_.has(result, key)) result[key] = 0;
348 result[key]++;
349 });
350 };
384 _.countBy = group(function(result, value, key) {
385 if (_.has(result, key)) result[key]++; else result[key] = 1;
386 });
351387
352388 // Use a comparator function to figure out the smallest index at which
353389 // an object should be inserted so as to maintain order. Uses binary search.
354 _.sortedIndex = function(array, obj, iterator, context) {
355 iterator = iterator == null ? _.identity : lookupIterator(iterator);
356 var value = iterator.call(context, obj);
390 _.sortedIndex = function(array, obj, iteratee, context) {
391 iteratee = _.iteratee(iteratee, context, 1);
392 var value = iteratee(obj);
357393 var low = 0, high = array.length;
358394 while (low < high) {
359 var mid = (low + high) >>> 1;
360 iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
395 var mid = low + high >>> 1;
396 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
361397 }
362398 return low;
363399 };
364400
365 // Safely convert anything iterable into a real, live array.
401 // Safely create a real, live array from anything iterable.
366402 _.toArray = function(obj) {
367403 if (!obj) return [];
368404 if (_.isArray(obj)) return slice.call(obj);
373409 // Return the number of elements in an object.
374410 _.size = function(obj) {
375411 if (obj == null) return 0;
376 return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
412 return obj.length === +obj.length ? obj.length : _.keys(obj).length;
413 };
414
415 // Split a collection into two arrays: one whose elements all satisfy the given
416 // predicate, and one whose elements all do not satisfy the predicate.
417 _.partition = function(obj, predicate, context) {
418 predicate = _.iteratee(predicate, context);
419 var pass = [], fail = [];
420 _.each(obj, function(value, key, obj) {
421 (predicate(value, key, obj) ? pass : fail).push(value);
422 });
423 return [pass, fail];
377424 };
378425
379426 // Array Functions
384431 // allows it to work with `_.map`.
385432 _.first = _.head = _.take = function(array, n, guard) {
386433 if (array == null) return void 0;
387 return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
434 if (n == null || guard) return array[0];
435 if (n < 0) return [];
436 return slice.call(array, 0, n);
388437 };
389438
390439 // Returns everything but the last entry of the array. Especially useful on
392441 // the array, excluding the last N. The **guard** check allows it to work with
393442 // `_.map`.
394443 _.initial = function(array, n, guard) {
395 return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
444 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
396445 };
397446
398447 // Get the last element of an array. Passing **n** will return the last N
399448 // values in the array. The **guard** check allows it to work with `_.map`.
400449 _.last = function(array, n, guard) {
401450 if (array == null) return void 0;
402 if ((n != null) && !guard) {
403 return slice.call(array, Math.max(array.length - n, 0));
404 } else {
405 return array[array.length - 1];
406 }
451 if (n == null || guard) return array[array.length - 1];
452 return slice.call(array, Math.max(array.length - n, 0));
407453 };
408454
409455 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
411457 // the rest N values in the array. The **guard**
412458 // check allows it to work with `_.map`.
413459 _.rest = _.tail = _.drop = function(array, n, guard) {
414 return slice.call(array, (n == null) || guard ? 1 : n);
460 return slice.call(array, n == null || guard ? 1 : n);
415461 };
416462
417463 // Trim out all falsy values from an array.
420466 };
421467
422468 // Internal implementation of a recursive `flatten` function.
423 var flatten = function(input, shallow, output) {
424 each(input, function(value) {
425 if (_.isArray(value)) {
426 shallow ? push.apply(output, value) : flatten(value, shallow, output);
469 var flatten = function(input, shallow, strict, output) {
470 if (shallow && _.every(input, _.isArray)) {
471 return concat.apply(output, input);
472 }
473 for (var i = 0, length = input.length; i < length; i++) {
474 var value = input[i];
475 if (!_.isArray(value) && !_.isArguments(value)) {
476 if (!strict) output.push(value);
477 } else if (shallow) {
478 push.apply(output, value);
427479 } else {
428 output.push(value);
429 }
430 });
480 flatten(value, shallow, strict, output);
481 }
482 }
431483 return output;
432484 };
433485
434 // Return a completely flattened version of an array.
486 // Flatten out an array, either recursively (by default), or just one level.
435487 _.flatten = function(array, shallow) {
436 return flatten(array, shallow, []);
488 return flatten(array, shallow, false, []);
437489 };
438490
439491 // Return a version of the array that does not contain the specified value(s).
444496 // Produce a duplicate-free version of the array. If the array has already
445497 // been sorted, you have the option of using a faster algorithm.
446498 // Aliased as `unique`.
447 _.uniq = _.unique = function(array, isSorted, iterator, context) {
448 if (_.isFunction(isSorted)) {
449 context = iterator;
450 iterator = isSorted;
499 _.uniq = _.unique = function(array, isSorted, iteratee, context) {
500 if (array == null) return [];
501 if (!_.isBoolean(isSorted)) {
502 context = iteratee;
503 iteratee = isSorted;
451504 isSorted = false;
452505 }
453 var initial = iterator ? _.map(array, iterator, context) : array;
454 var results = [];
506 if (iteratee != null) iteratee = _.iteratee(iteratee, context);
507 var result = [];
455508 var seen = [];
456 each(initial, function(value, index) {
457 if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
458 seen.push(value);
459 results.push(array[index]);
460 }
461 });
462 return results;
509 for (var i = 0, length = array.length; i < length; i++) {
510 var value = array[i];
511 if (isSorted) {
512 if (!i || seen !== value) result.push(value);
513 seen = value;
514 } else if (iteratee) {
515 var computed = iteratee(value, i, array);
516 if (_.indexOf(seen, computed) < 0) {
517 seen.push(computed);
518 result.push(value);
519 }
520 } else if (_.indexOf(result, value) < 0) {
521 result.push(value);
522 }
523 }
524 return result;
463525 };
464526
465527 // Produce an array that contains the union: each distinct element from all of
466528 // the passed-in arrays.
467529 _.union = function() {
468 return _.uniq(concat.apply(ArrayProto, arguments));
530 return _.uniq(flatten(arguments, true, true, []));
469531 };
470532
471533 // Produce an array that contains every item shared between all the
472534 // passed-in arrays.
473535 _.intersection = function(array) {
474 var rest = slice.call(arguments, 1);
475 return _.filter(_.uniq(array), function(item) {
476 return _.every(rest, function(other) {
477 return _.indexOf(other, item) >= 0;
478 });
479 });
536 if (array == null) return [];
537 var result = [];
538 var argsLength = arguments.length;
539 for (var i = 0, length = array.length; i < length; i++) {
540 var item = array[i];
541 if (_.contains(result, item)) continue;
542 for (var j = 1; j < argsLength; j++) {
543 if (!_.contains(arguments[j], item)) break;
544 }
545 if (j === argsLength) result.push(item);
546 }
547 return result;
480548 };
481549
482550 // Take the difference between one array and a number of other arrays.
483551 // Only the elements present in just the first array will remain.
484552 _.difference = function(array) {
485 var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
486 return _.filter(array, function(value){ return !_.contains(rest, value); });
553 var rest = flatten(slice.call(arguments, 1), true, true, []);
554 return _.filter(array, function(value){
555 return !_.contains(rest, value);
556 });
487557 };
488558
489559 // Zip together multiple lists into a single array -- elements that share
490560 // an index go together.
491 _.zip = function() {
492 var args = slice.call(arguments);
493 var length = _.max(_.pluck(args, 'length'));
494 var results = new Array(length);
561 _.zip = function(array) {
562 if (array == null) return [];
563 var length = _.max(arguments, 'length').length;
564 var results = Array(length);
495565 for (var i = 0; i < length; i++) {
496 results[i] = _.pluck(args, "" + i);
566 results[i] = _.pluck(arguments, i);
497567 }
498568 return results;
499569 };
504574 _.object = function(list, values) {
505575 if (list == null) return {};
506576 var result = {};
507 for (var i = 0, l = list.length; i < l; i++) {
577 for (var i = 0, length = list.length; i < length; i++) {
508578 if (values) {
509579 result[list[i]] = values[i];
510580 } else {
514584 return result;
515585 };
516586
517 // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
518 // we need this function. Return the position of the first occurrence of an
519 // item in an array, or -1 if the item is not included in the array.
520 // Delegates to **ECMAScript 5**'s native `indexOf` if available.
587 // Return the position of the first occurrence of an item in an array,
588 // or -1 if the item is not included in the array.
521589 // If the array is large and already in sort order, pass `true`
522590 // for **isSorted** to use binary search.
523591 _.indexOf = function(array, item, isSorted) {
524592 if (array == null) return -1;
525 var i = 0, l = array.length;
593 var i = 0, length = array.length;
526594 if (isSorted) {
527595 if (typeof isSorted == 'number') {
528 i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
596 i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
529597 } else {
530598 i = _.sortedIndex(array, item);
531599 return array[i] === item ? i : -1;
532600 }
533601 }
534 if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
535 for (; i < l; i++) if (array[i] === item) return i;
602 for (; i < length; i++) if (array[i] === item) return i;
536603 return -1;
537604 };
538605
539 // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
540606 _.lastIndexOf = function(array, item, from) {
541607 if (array == null) return -1;
542 var hasIndex = from != null;
543 if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
544 return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
545 }
546 var i = (hasIndex ? from : array.length);
547 while (i--) if (array[i] === item) return i;
608 var idx = array.length;
609 if (typeof from == 'number') {
610 idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
611 }
612 while (--idx >= 0) if (array[idx] === item) return idx;
548613 return -1;
549614 };
550615
556621 stop = start || 0;
557622 start = 0;
558623 }
559 step = arguments[2] || 1;
560
561 var len = Math.max(Math.ceil((stop - start) / step), 0);
562 var idx = 0;
563 var range = new Array(len);
564
565 while(idx < len) {
566 range[idx++] = start;
567 start += step;
624 step = step || 1;
625
626 var length = Math.max(Math.ceil((stop - start) / step), 0);
627 var range = Array(length);
628
629 for (var idx = 0; idx < length; idx++, start += step) {
630 range[idx] = start;
568631 }
569632
570633 return range;
572635
573636 // Function (ahem) Functions
574637 // ------------------
638
639 // Reusable constructor function for prototype setting.
640 var Ctor = function(){};
575641
576642 // Create a function bound to a given object (assigning `this`, and arguments,
577643 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
578644 // available.
579645 _.bind = function(func, context) {
580 if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
581 var args = slice.call(arguments, 2);
646 var args, bound;
647 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
648 if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
649 args = slice.call(arguments, 2);
650 bound = function() {
651 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
652 Ctor.prototype = func.prototype;
653 var self = new Ctor;
654 Ctor.prototype = null;
655 var result = func.apply(self, args.concat(slice.call(arguments)));
656 if (_.isObject(result)) return result;
657 return self;
658 };
659 return bound;
660 };
661
662 // Partially apply a function by creating a version that has had some of its
663 // arguments pre-filled, without changing its dynamic `this` context. _ acts
664 // as a placeholder, allowing any combination of arguments to be pre-filled.
665 _.partial = function(func) {
666 var boundArgs = slice.call(arguments, 1);
582667 return function() {
583 return func.apply(context, args.concat(slice.call(arguments)));
584 };
585 };
586
587 // Partially apply a function by creating a version that has had some of its
588 // arguments pre-filled, without changing its dynamic `this` context.
589 _.partial = function(func) {
590 var args = slice.call(arguments, 1);
591 return function() {
592 return func.apply(this, args.concat(slice.call(arguments)));
593 };
594 };
595
596 // Bind all of an object's methods to that object. Useful for ensuring that
597 // all callbacks defined on an object belong to it.
668 var position = 0;
669 var args = boundArgs.slice();
670 for (var i = 0, length = args.length; i < length; i++) {
671 if (args[i] === _) args[i] = arguments[position++];
672 }
673 while (position < arguments.length) args.push(arguments[position++]);
674 return func.apply(this, args);
675 };
676 };
677
678 // Bind a number of an object's methods to that object. Remaining arguments
679 // are the method names to be bound. Useful for ensuring that all callbacks
680 // defined on an object belong to it.
598681 _.bindAll = function(obj) {
599 var funcs = slice.call(arguments, 1);
600 if (funcs.length === 0) funcs = _.functions(obj);
601 each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
682 var i, length = arguments.length, key;
683 if (length <= 1) throw new Error('bindAll must be passed function names');
684 for (i = 1; i < length; i++) {
685 key = arguments[i];
686 obj[key] = _.bind(obj[key], obj);
687 }
602688 return obj;
603689 };
604690
605691 // Memoize an expensive function by storing its results.
606692 _.memoize = function(func, hasher) {
607 var memo = {};
608 hasher || (hasher = _.identity);
609 return function() {
610 var key = hasher.apply(this, arguments);
611 return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
612 };
693 var memoize = function(key) {
694 var cache = memoize.cache;
695 var address = hasher ? hasher.apply(this, arguments) : key;
696 if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
697 return cache[address];
698 };
699 memoize.cache = {};
700 return memoize;
613701 };
614702
615703 // Delays a function for the given number of milliseconds, and then calls
616704 // it with the arguments supplied.
617705 _.delay = function(func, wait) {
618706 var args = slice.call(arguments, 2);
619 return setTimeout(function(){ return func.apply(null, args); }, wait);
707 return setTimeout(function(){
708 return func.apply(null, args);
709 }, wait);
620710 };
621711
622712 // Defers a function, scheduling it to run after the current call stack has
626716 };
627717
628718 // Returns a function, that, when invoked, will only be triggered at most once
629 // during a given window of time.
630 _.throttle = function(func, wait) {
631 var context, args, timeout, result;
719 // during a given window of time. Normally, the throttled function will run
720 // as much as it can, without ever going more than once per `wait` duration;
721 // but if you'd like to disable the execution on the leading edge, pass
722 // `{leading: false}`. To disable execution on the trailing edge, ditto.
723 _.throttle = function(func, wait, options) {
724 var context, args, result;
725 var timeout = null;
632726 var previous = 0;
727 if (!options) options = {};
633728 var later = function() {
634 previous = new Date;
729 previous = options.leading === false ? 0 : _.now();
635730 timeout = null;
636731 result = func.apply(context, args);
732 if (!timeout) context = args = null;
637733 };
638734 return function() {
639 var now = new Date;
735 var now = _.now();
736 if (!previous && options.leading === false) previous = now;
640737 var remaining = wait - (now - previous);
641738 context = this;
642739 args = arguments;
643 if (remaining <= 0) {
740 if (remaining <= 0 || remaining > wait) {
644741 clearTimeout(timeout);
645742 timeout = null;
646743 previous = now;
647744 result = func.apply(context, args);
648 } else if (!timeout) {
745 if (!timeout) context = args = null;
746 } else if (!timeout && options.trailing !== false) {
649747 timeout = setTimeout(later, remaining);
650748 }
651749 return result;
657755 // N milliseconds. If `immediate` is passed, trigger the function on the
658756 // leading edge, instead of the trailing.
659757 _.debounce = function(func, wait, immediate) {
660 var timeout, result;
758 var timeout, args, context, timestamp, result;
759
760 var later = function() {
761 var last = _.now() - timestamp;
762
763 if (last < wait && last > 0) {
764 timeout = setTimeout(later, wait - last);
765 } else {
766 timeout = null;
767 if (!immediate) {
768 result = func.apply(context, args);
769 if (!timeout) context = args = null;
770 }
771 }
772 };
773
661774 return function() {
662 var context = this, args = arguments;
663 var later = function() {
664 timeout = null;
665 if (!immediate) result = func.apply(context, args);
666 };
775 context = this;
776 args = arguments;
777 timestamp = _.now();
667778 var callNow = immediate && !timeout;
668 clearTimeout(timeout);
669 timeout = setTimeout(later, wait);
670 if (callNow) result = func.apply(context, args);
779 if (!timeout) timeout = setTimeout(later, wait);
780 if (callNow) {
781 result = func.apply(context, args);
782 context = args = null;
783 }
784
671785 return result;
672 };
673 };
674
675 // Returns a function that will be executed at most one time, no matter how
676 // often you call it. Useful for lazy initialization.
677 _.once = function(func) {
678 var ran = false, memo;
679 return function() {
680 if (ran) return memo;
681 ran = true;
682 memo = func.apply(this, arguments);
683 func = null;
684 return memo;
685786 };
686787 };
687788
689790 // allowing you to adjust arguments, run code before and after, and
690791 // conditionally execute the original function.
691792 _.wrap = function(func, wrapper) {
793 return _.partial(wrapper, func);
794 };
795
796 // Returns a negated version of the passed-in predicate.
797 _.negate = function(predicate) {
692798 return function() {
693 var args = [func];
694 push.apply(args, arguments);
695 return wrapper.apply(this, args);
799 return !predicate.apply(this, arguments);
696800 };
697801 };
698802
699803 // Returns a function that is the composition of a list of functions, each
700804 // consuming the return value of the function that follows.
701805 _.compose = function() {
702 var funcs = arguments;
806 var args = arguments;
807 var start = args.length - 1;
703808 return function() {
704 var args = arguments;
705 for (var i = funcs.length - 1; i >= 0; i--) {
706 args = [funcs[i].apply(this, args)];
707 }
708 return args[0];
809 var i = start;
810 var result = args[start].apply(this, arguments);
811 while (i--) result = args[i].call(this, result);
812 return result;
709813 };
710814 };
711815
712816 // Returns a function that will only be executed after being called N times.
713817 _.after = function(times, func) {
714 if (times <= 0) return func();
715818 return function() {
716819 if (--times < 1) {
717820 return func.apply(this, arguments);
719822 };
720823 };
721824
825 // Returns a function that will only be executed before being called N times.
826 _.before = function(times, func) {
827 var memo;
828 return function() {
829 if (--times > 0) {
830 memo = func.apply(this, arguments);
831 } else {
832 func = null;
833 }
834 return memo;
835 };
836 };
837
838 // Returns a function that will be executed at most one time, no matter how
839 // often you call it. Useful for lazy initialization.
840 _.once = _.partial(_.before, 2);
841
722842 // Object Functions
723843 // ----------------
724844
725845 // Retrieve the names of an object's properties.
726846 // Delegates to **ECMAScript 5**'s native `Object.keys`
727 _.keys = nativeKeys || function(obj) {
728 if (obj !== Object(obj)) throw new TypeError('Invalid object');
847 _.keys = function(obj) {
848 if (!_.isObject(obj)) return [];
849 if (nativeKeys) return nativeKeys(obj);
729850 var keys = [];
730 for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
851 for (var key in obj) if (_.has(obj, key)) keys.push(key);
731852 return keys;
732853 };
733854
734855 // Retrieve the values of an object's properties.
735856 _.values = function(obj) {
736 var values = [];
737 for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
857 var keys = _.keys(obj);
858 var length = keys.length;
859 var values = Array(length);
860 for (var i = 0; i < length; i++) {
861 values[i] = obj[keys[i]];
862 }
738863 return values;
739864 };
740865
741866 // Convert an object into a list of `[key, value]` pairs.
742867 _.pairs = function(obj) {
743 var pairs = [];
744 for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
868 var keys = _.keys(obj);
869 var length = keys.length;
870 var pairs = Array(length);
871 for (var i = 0; i < length; i++) {
872 pairs[i] = [keys[i], obj[keys[i]]];
873 }
745874 return pairs;
746875 };
747876
748877 // Invert the keys and values of an object. The values must be serializable.
749878 _.invert = function(obj) {
750879 var result = {};
751 for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
880 var keys = _.keys(obj);
881 for (var i = 0, length = keys.length; i < length; i++) {
882 result[obj[keys[i]]] = keys[i];
883 }
752884 return result;
753885 };
754886
764896
765897 // Extend a given object with all the properties in passed-in object(s).
766898 _.extend = function(obj) {
767 each(slice.call(arguments, 1), function(source) {
768 if (source) {
769 for (var prop in source) {
770 obj[prop] = source[prop];
899 if (!_.isObject(obj)) return obj;
900 var source, prop;
901 for (var i = 1, length = arguments.length; i < length; i++) {
902 source = arguments[i];
903 for (prop in source) {
904 if (hasOwnProperty.call(source, prop)) {
905 obj[prop] = source[prop];
771906 }
772907 }
773 });
908 }
774909 return obj;
775910 };
776911
777912 // Return a copy of the object only containing the whitelisted properties.
778 _.pick = function(obj) {
779 var copy = {};
780 var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
781 each(keys, function(key) {
782 if (key in obj) copy[key] = obj[key];
783 });
784 return copy;
913 _.pick = function(obj, iteratee, context) {
914 var result = {}, key;
915 if (obj == null) return result;
916 if (_.isFunction(iteratee)) {
917 iteratee = createCallback(iteratee, context);
918 for (key in obj) {
919 var value = obj[key];
920 if (iteratee(value, key, obj)) result[key] = value;
921 }
922 } else {
923 var keys = concat.apply([], slice.call(arguments, 1));
924 obj = new Object(obj);
925 for (var i = 0, length = keys.length; i < length; i++) {
926 key = keys[i];
927 if (key in obj) result[key] = obj[key];
928 }
929 }
930 return result;
785931 };
786932
787933 // Return a copy of the object without the blacklisted properties.
788 _.omit = function(obj) {
789 var copy = {};
790 var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
791 for (var key in obj) {
792 if (!_.contains(keys, key)) copy[key] = obj[key];
793 }
794 return copy;
934 _.omit = function(obj, iteratee, context) {
935 if (_.isFunction(iteratee)) {
936 iteratee = _.negate(iteratee);
937 } else {
938 var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
939 iteratee = function(value, key) {
940 return !_.contains(keys, key);
941 };
942 }
943 return _.pick(obj, iteratee, context);
795944 };
796945
797946 // Fill in a given object with default properties.
798947 _.defaults = function(obj) {
799 each(slice.call(arguments, 1), function(source) {
800 if (source) {
801 for (var prop in source) {
802 if (obj[prop] == null) obj[prop] = source[prop];
803 }
804 }
805 });
948 if (!_.isObject(obj)) return obj;
949 for (var i = 1, length = arguments.length; i < length; i++) {
950 var source = arguments[i];
951 for (var prop in source) {
952 if (obj[prop] === void 0) obj[prop] = source[prop];
953 }
954 }
806955 return obj;
807956 };
808957
823972 // Internal recursive comparison function for `isEqual`.
824973 var eq = function(a, b, aStack, bStack) {
825974 // Identical objects are equal. `0 === -0`, but they aren't identical.
826 // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
827 if (a === b) return a !== 0 || 1 / a == 1 / b;
975 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
976 if (a === b) return a !== 0 || 1 / a === 1 / b;
828977 // A strict comparison is necessary because `null == undefined`.
829978 if (a == null || b == null) return a === b;
830979 // Unwrap any wrapped objects.
832981 if (b instanceof _) b = b._wrapped;
833982 // Compare `[[Class]]` names.
834983 var className = toString.call(a);
835 if (className != toString.call(b)) return false;
984 if (className !== toString.call(b)) return false;
836985 switch (className) {
837 // Strings, numbers, dates, and booleans are compared by value.
986 // Strings, numbers, regular expressions, dates, and booleans are compared by value.
987 case '[object RegExp]':
988 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
838989 case '[object String]':
839990 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
840991 // equivalent to `new String("5")`.
841 return a == String(b);
992 return '' + a === '' + b;
842993 case '[object Number]':
843 // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
844 // other numeric values.
845 return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
994 // `NaN`s are equivalent, but non-reflexive.
995 // Object(NaN) is equivalent to NaN
996 if (+a !== +a) return +b !== +b;
997 // An `egal` comparison is performed for other numeric values.
998 return +a === 0 ? 1 / +a === 1 / b : +a === +b;
846999 case '[object Date]':
8471000 case '[object Boolean]':
8481001 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
8491002 // millisecond representations. Note that invalid dates with millisecond representations
8501003 // of `NaN` are not equivalent.
851 return +a == +b;
852 // RegExps are compared by their source patterns and flags.
853 case '[object RegExp]':
854 return a.source == b.source &&
855 a.global == b.global &&
856 a.multiline == b.multiline &&
857 a.ignoreCase == b.ignoreCase;
1004 return +a === +b;
8581005 }
8591006 if (typeof a != 'object' || typeof b != 'object') return false;
8601007 // Assume equality for cyclic structures. The algorithm for detecting cyclic
8631010 while (length--) {
8641011 // Linear search. Performance is inversely proportional to the number of
8651012 // unique nested structures.
866 if (aStack[length] == a) return bStack[length] == b;
1013 if (aStack[length] === a) return bStack[length] === b;
1014 }
1015 // Objects with different constructors are not equivalent, but `Object`s
1016 // from different frames are.
1017 var aCtor = a.constructor, bCtor = b.constructor;
1018 if (
1019 aCtor !== bCtor &&
1020 // Handle Object.create(x) cases
1021 'constructor' in a && 'constructor' in b &&
1022 !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
1023 _.isFunction(bCtor) && bCtor instanceof bCtor)
1024 ) {
1025 return false;
8671026 }
8681027 // Add the first object to the stack of traversed objects.
8691028 aStack.push(a);
8701029 bStack.push(b);
871 var size = 0, result = true;
1030 var size, result;
8721031 // Recursively compare objects and arrays.
873 if (className == '[object Array]') {
1032 if (className === '[object Array]') {
8741033 // Compare array lengths to determine if a deep comparison is necessary.
8751034 size = a.length;
876 result = size == b.length;
1035 result = size === b.length;
8771036 if (result) {
8781037 // Deep compare the contents, ignoring non-numeric properties.
8791038 while (size--) {
8811040 }
8821041 }
8831042 } else {
884 // Objects with different constructors are not equivalent, but `Object`s
885 // from different frames are.
886 var aCtor = a.constructor, bCtor = b.constructor;
887 if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
888 _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
889 return false;
890 }
8911043 // Deep compare objects.
892 for (var key in a) {
893 if (_.has(a, key)) {
894 // Count the expected number of properties.
895 size++;
896 // Deep compare each member.
1044 var keys = _.keys(a), key;
1045 size = keys.length;
1046 // Ensure that both objects contain the same number of properties before comparing deep equality.
1047 result = _.keys(b).length === size;
1048 if (result) {
1049 while (size--) {
1050 // Deep compare each member
1051 key = keys[size];
8971052 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
8981053 }
899 }
900 // Ensure that both objects contain the same number of properties.
901 if (result) {
902 for (key in b) {
903 if (_.has(b, key) && !(size--)) break;
904 }
905 result = !size;
9061054 }
9071055 }
9081056 // Remove the first object from the stack of traversed objects.
9201068 // An "empty" object has no enumerable own-properties.
9211069 _.isEmpty = function(obj) {
9221070 if (obj == null) return true;
923 if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
1071 if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
9241072 for (var key in obj) if (_.has(obj, key)) return false;
9251073 return true;
9261074 };
9331081 // Is a given value an array?
9341082 // Delegates to ECMA5's native Array.isArray
9351083 _.isArray = nativeIsArray || function(obj) {
936 return toString.call(obj) == '[object Array]';
1084 return toString.call(obj) === '[object Array]';
9371085 };
9381086
9391087 // Is a given variable an object?
9401088 _.isObject = function(obj) {
941 return obj === Object(obj);
1089 var type = typeof obj;
1090 return type === 'function' || type === 'object' && !!obj;
9421091 };
9431092
9441093 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
945 each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
1094 _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
9461095 _['is' + name] = function(obj) {
947 return toString.call(obj) == '[object ' + name + ']';
1096 return toString.call(obj) === '[object ' + name + ']';
9481097 };
9491098 });
9501099
9521101 // there isn't any inspectable "Arguments" type.
9531102 if (!_.isArguments(arguments)) {
9541103 _.isArguments = function(obj) {
955 return !!(obj && _.has(obj, 'callee'));
1104 return _.has(obj, 'callee');
9561105 };
9571106 }
9581107
959 // Optimize `isFunction` if appropriate.
960 if (typeof (/./) !== 'function') {
1108 // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
1109 if (typeof /./ !== 'function') {
9611110 _.isFunction = function(obj) {
962 return typeof obj === 'function';
1111 return typeof obj == 'function' || false;
9631112 };
9641113 }
9651114
9701119
9711120 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
9721121 _.isNaN = function(obj) {
973 return _.isNumber(obj) && obj != +obj;
1122 return _.isNumber(obj) && obj !== +obj;
9741123 };
9751124
9761125 // Is a given value a boolean?
9771126 _.isBoolean = function(obj) {
978 return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
1127 return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
9791128 };
9801129
9811130 // Is a given value equal to null?
9911140 // Shortcut function for checking if an object has a given property directly
9921141 // on itself (in other words, not on a prototype).
9931142 _.has = function(obj, key) {
994 return hasOwnProperty.call(obj, key);
1143 return obj != null && hasOwnProperty.call(obj, key);
9951144 };
9961145
9971146 // Utility Functions
10041153 return this;
10051154 };
10061155
1007 // Keep the identity function around for default iterators.
1156 // Keep the identity function around for default iteratees.
10081157 _.identity = function(value) {
10091158 return value;
10101159 };
10111160
1161 _.constant = function(value) {
1162 return function() {
1163 return value;
1164 };
1165 };
1166
1167 _.noop = function(){};
1168
1169 _.property = function(key) {
1170 return function(obj) {
1171 return obj[key];
1172 };
1173 };
1174
1175 // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
1176 _.matches = function(attrs) {
1177 var pairs = _.pairs(attrs), length = pairs.length;
1178 return function(obj) {
1179 if (obj == null) return !length;
1180 obj = new Object(obj);
1181 for (var i = 0; i < length; i++) {
1182 var pair = pairs[i], key = pair[0];
1183 if (pair[1] !== obj[key] || !(key in obj)) return false;
1184 }
1185 return true;
1186 };
1187 };
1188
10121189 // Run a function **n** times.
1013 _.times = function(n, iterator, context) {
1014 var accum = Array(n);
1015 for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1190 _.times = function(n, iteratee, context) {
1191 var accum = Array(Math.max(0, n));
1192 iteratee = createCallback(iteratee, context, 1);
1193 for (var i = 0; i < n; i++) accum[i] = iteratee(i);
10161194 return accum;
10171195 };
10181196
10251203 return min + Math.floor(Math.random() * (max - min + 1));
10261204 };
10271205
1028 // List of HTML entities for escaping.
1029 var entityMap = {
1030 escape: {
1031 '&': '&amp;',
1032 '<': '&lt;',
1033 '>': '&gt;',
1034 '"': '&quot;',
1035 "'": '&#x27;',
1036 '/': '&#x2F;'
1037 }
1038 };
1039 entityMap.unescape = _.invert(entityMap.escape);
1040
1041 // Regexes containing the keys and values listed immediately above.
1042 var entityRegexes = {
1043 escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
1044 unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
1045 };
1206 // A (possibly faster) way to get the current timestamp as an integer.
1207 _.now = Date.now || function() {
1208 return new Date().getTime();
1209 };
1210
1211 // List of HTML entities for escaping.
1212 var escapeMap = {
1213 '&': '&amp;',
1214 '<': '&lt;',
1215 '>': '&gt;',
1216 '"': '&quot;',
1217 "'": '&#x27;',
1218 '`': '&#x60;'
1219 };
1220 var unescapeMap = _.invert(escapeMap);
10461221
10471222 // Functions for escaping and unescaping strings to/from HTML interpolation.
1048 _.each(['escape', 'unescape'], function(method) {
1049 _[method] = function(string) {
1050 if (string == null) return '';
1051 return ('' + string).replace(entityRegexes[method], function(match) {
1052 return entityMap[method][match];
1053 });
1054 };
1055 });
1056
1057 // If the value of the named property is a function then invoke it;
1058 // otherwise, return it.
1223 var createEscaper = function(map) {
1224 var escaper = function(match) {
1225 return map[match];
1226 };
1227 // Regexes for identifying a key that needs to be escaped
1228 var source = '(?:' + _.keys(map).join('|') + ')';
1229 var testRegexp = RegExp(source);
1230 var replaceRegexp = RegExp(source, 'g');
1231 return function(string) {
1232 string = string == null ? '' : '' + string;
1233 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
1234 };
1235 };
1236 _.escape = createEscaper(escapeMap);
1237 _.unescape = createEscaper(unescapeMap);
1238
1239 // If the value of the named `property` is a function then invoke it with the
1240 // `object` as context; otherwise, return it.
10591241 _.result = function(object, property) {
1060 if (object == null) return null;
1242 if (object == null) return void 0;
10611243 var value = object[property];
1062 return _.isFunction(value) ? value.call(object) : value;
1244 return _.isFunction(value) ? object[property]() : value;
1245 };
1246
1247 // Generate a unique integer id (unique within the entire client session).
1248 // Useful for temporary DOM ids.
1249 var idCounter = 0;
1250 _.uniqueId = function(prefix) {
1251 var id = ++idCounter + '';
1252 return prefix ? prefix + id : id;
1253 };
1254
1255 // By default, Underscore uses ERB-style template delimiters, change the
1256 // following template settings to use alternative delimiters.
1257 _.templateSettings = {
1258 evaluate : /<%([\s\S]+?)%>/g,
1259 interpolate : /<%=([\s\S]+?)%>/g,
1260 escape : /<%-([\s\S]+?)%>/g
1261 };
1262
1263 // When customizing `templateSettings`, if you don't want to define an
1264 // interpolation, evaluation or escaping regex, we need one that is
1265 // guaranteed not to match.
1266 var noMatch = /(.)^/;
1267
1268 // Certain characters need to be escaped so that they can be put into a
1269 // string literal.
1270 var escapes = {
1271 "'": "'",
1272 '\\': '\\',
1273 '\r': 'r',
1274 '\n': 'n',
1275 '\u2028': 'u2028',
1276 '\u2029': 'u2029'
1277 };
1278
1279 var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
1280
1281 var escapeChar = function(match) {
1282 return '\\' + escapes[match];
1283 };
1284
1285 // JavaScript micro-templating, similar to John Resig's implementation.
1286 // Underscore templating handles arbitrary delimiters, preserves whitespace,
1287 // and correctly escapes quotes within interpolated code.
1288 // NB: `oldSettings` only exists for backwards compatibility.
1289 _.template = function(text, settings, oldSettings) {
1290 if (!settings && oldSettings) settings = oldSettings;
1291 settings = _.defaults({}, settings, _.templateSettings);
1292
1293 // Combine delimiters into one regular expression via alternation.
1294 var matcher = RegExp([
1295 (settings.escape || noMatch).source,
1296 (settings.interpolate || noMatch).source,
1297 (settings.evaluate || noMatch).source
1298 ].join('|') + '|$', 'g');
1299
1300 // Compile the template source, escaping string literals appropriately.
1301 var index = 0;
1302 var source = "__p+='";
1303 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1304 source += text.slice(index, offset).replace(escaper, escapeChar);
1305 index = offset + match.length;
1306
1307 if (escape) {
1308 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1309 } else if (interpolate) {
1310 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1311 } else if (evaluate) {
1312 source += "';\n" + evaluate + "\n__p+='";
1313 }
1314
1315 // Adobe VMs need the match returned to produce the correct offest.
1316 return match;
1317 });
1318 source += "';\n";
1319
1320 // If a variable is not specified, place data values in local scope.
1321 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1322
1323 source = "var __t,__p='',__j=Array.prototype.join," +
1324 "print=function(){__p+=__j.call(arguments,'');};\n" +
1325 source + 'return __p;\n';
1326
1327 try {
1328 var render = new Function(settings.variable || 'obj', '_', source);
1329 } catch (e) {
1330 e.source = source;
1331 throw e;
1332 }
1333
1334 var template = function(data) {
1335 return render.call(this, data, _);
1336 };
1337
1338 // Provide the compiled source as a convenience for precompilation.
1339 var argument = settings.variable || 'obj';
1340 template.source = 'function(' + argument + '){\n' + source + '}';
1341
1342 return template;
1343 };
1344
1345 // Add a "chain" function. Start chaining a wrapped Underscore object.
1346 _.chain = function(obj) {
1347 var instance = _(obj);
1348 instance._chain = true;
1349 return instance;
1350 };
1351
1352 // OOP
1353 // ---------------
1354 // If Underscore is called as a function, it returns a wrapped object that
1355 // can be used OO-style. This wrapper holds altered versions of all the
1356 // underscore functions. Wrapped objects may be chained.
1357
1358 // Helper function to continue chaining intermediate results.
1359 var result = function(obj) {
1360 return this._chain ? _(obj).chain() : obj;
10631361 };
10641362
10651363 // Add your own custom functions to the Underscore object.
10661364 _.mixin = function(obj) {
1067 each(_.functions(obj), function(name){
1365 _.each(_.functions(obj), function(name) {
10681366 var func = _[name] = obj[name];
10691367 _.prototype[name] = function() {
10701368 var args = [this._wrapped];
10741372 });
10751373 };
10761374
1077 // Generate a unique integer id (unique within the entire client session).
1078 // Useful for temporary DOM ids.
1079 var idCounter = 0;
1080 _.uniqueId = function(prefix) {
1081 var id = ++idCounter + '';
1082 return prefix ? prefix + id : id;
1083 };
1084
1085 // By default, Underscore uses ERB-style template delimiters, change the
1086 // following template settings to use alternative delimiters.
1087 _.templateSettings = {
1088 evaluate : /<%([\s\S]+?)%>/g,
1089 interpolate : /<%=([\s\S]+?)%>/g,
1090 escape : /<%-([\s\S]+?)%>/g
1091 };
1092
1093 // When customizing `templateSettings`, if you don't want to define an
1094 // interpolation, evaluation or escaping regex, we need one that is
1095 // guaranteed not to match.
1096 var noMatch = /(.)^/;
1097
1098 // Certain characters need to be escaped so that they can be put into a
1099 // string literal.
1100 var escapes = {
1101 "'": "'",
1102 '\\': '\\',
1103 '\r': 'r',
1104 '\n': 'n',
1105 '\t': 't',
1106 '\u2028': 'u2028',
1107 '\u2029': 'u2029'
1108 };
1109
1110 var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
1111
1112 // JavaScript micro-templating, similar to John Resig's implementation.
1113 // Underscore templating handles arbitrary delimiters, preserves whitespace,
1114 // and correctly escapes quotes within interpolated code.
1115 _.template = function(text, data, settings) {
1116 var render;
1117 settings = _.defaults({}, settings, _.templateSettings);
1118
1119 // Combine delimiters into one regular expression via alternation.
1120 var matcher = new RegExp([
1121 (settings.escape || noMatch).source,
1122 (settings.interpolate || noMatch).source,
1123 (settings.evaluate || noMatch).source
1124 ].join('|') + '|$', 'g');
1125
1126 // Compile the template source, escaping string literals appropriately.
1127 var index = 0;
1128 var source = "__p+='";
1129 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1130 source += text.slice(index, offset)
1131 .replace(escaper, function(match) { return '\\' + escapes[match]; });
1132
1133 if (escape) {
1134 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1135 }
1136 if (interpolate) {
1137 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1138 }
1139 if (evaluate) {
1140 source += "';\n" + evaluate + "\n__p+='";
1141 }
1142 index = offset + match.length;
1143 return match;
1144 });
1145 source += "';\n";
1146
1147 // If a variable is not specified, place data values in local scope.
1148 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1149
1150 source = "var __t,__p='',__j=Array.prototype.join," +
1151 "print=function(){__p+=__j.call(arguments,'');};\n" +
1152 source + "return __p;\n";
1153
1154 try {
1155 render = new Function(settings.variable || 'obj', '_', source);
1156 } catch (e) {
1157 e.source = source;
1158 throw e;
1159 }
1160
1161 if (data) return render(data, _);
1162 var template = function(data) {
1163 return render.call(this, data, _);
1164 };
1165
1166 // Provide the compiled function source as a convenience for precompilation.
1167 template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
1168
1169 return template;
1170 };
1171
1172 // Add a "chain" function, which will delegate to the wrapper.
1173 _.chain = function(obj) {
1174 return _(obj).chain();
1175 };
1176
1177 // OOP
1178 // ---------------
1179 // If Underscore is called as a function, it returns a wrapped object that
1180 // can be used OO-style. This wrapper holds altered versions of all the
1181 // underscore functions. Wrapped objects may be chained.
1182
1183 // Helper function to continue chaining intermediate results.
1184 var result = function(obj) {
1185 return this._chain ? _(obj).chain() : obj;
1186 };
1187
11881375 // Add all of the Underscore functions to the wrapper object.
11891376 _.mixin(_);
11901377
11911378 // Add all mutator Array functions to the wrapper.
1192 each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1379 _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
11931380 var method = ArrayProto[name];
11941381 _.prototype[name] = function() {
11951382 var obj = this._wrapped;
11961383 method.apply(obj, arguments);
1197 if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1384 if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
11981385 return result.call(this, obj);
11991386 };
12001387 });
12011388
12021389 // Add all accessor Array functions to the wrapper.
1203 each(['concat', 'join', 'slice'], function(name) {
1390 _.each(['concat', 'join', 'slice'], function(name) {
12041391 var method = ArrayProto[name];
12051392 _.prototype[name] = function() {
12061393 return result.call(this, method.apply(this._wrapped, arguments));
12071394 };
12081395 });
12091396
1210 _.extend(_.prototype, {
1211
1212 // Start chaining a wrapped Underscore object.
1213 chain: function() {
1214 this._chain = true;
1215 return this;
1216 },
1217
1218 // Extracts the result from a wrapped and chained object.
1219 value: function() {
1220 return this._wrapped;
1221 }
1222
1223 });
1224
1225 }).call(this);
1397 // Extracts the result from a wrapped and chained object.
1398 _.prototype.value = function() {
1399 return this._wrapped;
1400 };
1401
1402 // AMD registration happens at the end for compatibility with AMD loaders
1403 // that may not enforce next-turn semantics on modules. Even though general
1404 // practice for AMD registration is to be anonymous, underscore registers
1405 // as a named module because, like jQuery, it is a base library that is
1406 // popular enough to be bundled in a third party lib, but not be part of
1407 // an AMD load request. Those cases could generate an error when an
1408 // anonymous define() is called outside of a loader request.
1409 if (typeof define === 'function' && define.amd) {
1410 define('underscore', [], function() {
1411 return _;
1412 });
1413 }
1414 }.call(this));
Binary diff not shown
33 *
44 * sphinx.websupport utilties for all documentation.
55 *
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
4949 }
5050
5151 function initEvents() {
52 $('a.comment-close').live("click", function(event) {
52 $(document).on("click", 'a.comment-close', function(event) {
5353 event.preventDefault();
5454 hide($(this).attr('id').substring(2));
5555 });
56 $('a.vote').live("click", function(event) {
56 $(document).on("click", 'a.vote', function(event) {
5757 event.preventDefault();
5858 handleVote($(this));
5959 });
60 $('a.reply').live("click", function(event) {
60 $(document).on("click", 'a.reply', function(event) {
6161 event.preventDefault();
6262 openReply($(this).attr('id').substring(2));
6363 });
64 $('a.close-reply').live("click", function(event) {
64 $(document).on("click", 'a.close-reply', function(event) {
6565 event.preventDefault();
6666 closeReply($(this).attr('id').substring(2));
6767 });
68 $('a.sort-option').live("click", function(event) {
68 $(document).on("click", 'a.sort-option', function(event) {
6969 event.preventDefault();
7070 handleReSort($(this));
7171 });
72 $('a.show-proposal').live("click", function(event) {
72 $(document).on("click", 'a.show-proposal', function(event) {
7373 event.preventDefault();
7474 showProposal($(this).attr('id').substring(2));
7575 });
76 $('a.hide-proposal').live("click", function(event) {
76 $(document).on("click", 'a.hide-proposal', function(event) {
7777 event.preventDefault();
7878 hideProposal($(this).attr('id').substring(2));
7979 });
80 $('a.show-propose-change').live("click", function(event) {
80 $(document).on("click", 'a.show-propose-change', function(event) {
8181 event.preventDefault();
8282 showProposeChange($(this).attr('id').substring(2));
8383 });
84 $('a.hide-propose-change').live("click", function(event) {
84 $(document).on("click", 'a.hide-propose-change', function(event) {
8585 event.preventDefault();
8686 hideProposeChange($(this).attr('id').substring(2));
8787 });
88 $('a.accept-comment').live("click", function(event) {
88 $(document).on("click", 'a.accept-comment', function(event) {
8989 event.preventDefault();
9090 acceptComment($(this).attr('id').substring(2));
9191 });
92 $('a.delete-comment').live("click", function(event) {
92 $(document).on("click", 'a.delete-comment', function(event) {
9393 event.preventDefault();
9494 deleteComment($(this).attr('id').substring(2));
9595 });
96 $('a.comment-markup').live("click", function(event) {
96 $(document).on("click", 'a.comment-markup', function(event) {
9797 event.preventDefault();
9898 toggleCommentMarkupBox($(this).attr('id').substring(2));
9999 });
699699 (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
700700 <div class="comment-markup-box" id="mb<%id%>">\
701701 reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
702 <tt>``code``</tt>, \
703 code blocks: <tt>::</tt> and an indented block after blank line</div>\
702 <code>``code``</code>, \
703 code blocks: <code>::</code> and an indented block after blank line</div>\
704704 <form method="post" id="cf<%id%>" class="comment-form" action="">\
705705 <textarea name="comment" cols="80"></textarea>\
706706 <p class="propose-button">\
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>NBNSProtocol Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>NBNSProtocol Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="../index.html" title="Welcome to pysmb’s documentation!"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h4>Previous topic</h4>
4848 <p class="topless"><a href="../index.html"
5050 <h4>Next topic</h4>
5151 <p class="topless"><a href="nmb_NetBIOS.html"
5252 title="next chapter">NetBIOS class</a></p>
53 <h3>This Page</h3>
54 <ul class="this-page-menu">
55 <li><a href="../_sources/api/nmb_NBNSProtocol.txt"
56 rel="nofollow">Show Source</a></li>
57 </ul>
58 <div id="searchbox" style="display: none">
53 <div role="note" aria-label="source link">
54 <h3>This Page</h3>
55 <ul class="this-page-menu">
56 <li><a href="../_sources/api/nmb_NBNSProtocol.txt"
57 rel="nofollow">Show Source</a></li>
58 </ul>
59 </div>
60 <div id="searchbox" style="display: none" role="search">
5961 <h3>Quick search</h3>
6062 <form class="search" action="../search.html" method="get">
6163 <input type="text" name="q" />
7476 <div class="document">
7577 <div class="documentwrapper">
7678 <div class="bodywrapper">
77 <div class="body">
79 <div class="body" role="main">
7880
7981 <div class="section" id="nbnsprotocol-class">
8082 <h1>NBNSProtocol Class<a class="headerlink" href="#nbnsprotocol-class" title="Permalink to this headline">¶</a></h1>
9193 </dl>
9294 <dl class="class">
9395 <dt id="nmb.NetBIOSProtocol.NBNSProtocol">
94 <em class="property">class </em><tt class="descclassname">nmb.NetBIOSProtocol.</tt><tt class="descname">NBNSProtocol</tt><big>(</big><em>broadcast=True</em>, <em>listen_port=0</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol" title="Permalink to this definition">¶</a></dt>
96 <em class="property">class </em><code class="descclassname">nmb.NetBIOSProtocol.</code><code class="descname">NBNSProtocol</code><span class="sig-paren">(</span><em>broadcast=True</em>, <em>listen_port=0</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol" title="Permalink to this definition">¶</a></dt>
9597 <dd><dl class="method">
9698 <dt id="nmb.NetBIOSProtocol.NBNSProtocol.__init__">
97 <tt class="descname">__init__</tt><big>(</big><em>broadcast=True</em>, <em>listen_port=0</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.__init__" title="Permalink to this definition">¶</a></dt>
99 <code class="descname">__init__</code><span class="sig-paren">(</span><em>broadcast=True</em>, <em>listen_port=0</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.__init__" title="Permalink to this definition">¶</a></dt>
98100 <dd><p>Instantiate a NBNSProtocol instance.</p>
99101 <p>This automatically calls reactor.listenUDP method to start listening for incoming packets, so you <strong>must not</strong> call the listenUDP method again.</p>
100102 <table class="docutils field-list" frame="void" rules="none">
113115
114116 <dl class="method">
115117 <dt id="nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName">
116 <tt class="descname">queryIPForName</tt><big>(</big><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.queryIPForName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName" title="Permalink to this definition">¶</a></dt>
118 <code class="descname">queryIPForName</code><span class="sig-paren">(</span><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.queryIPForName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName" title="Permalink to this definition">¶</a></dt>
117119 <dd><p>Send a query to the machine with <em>ip</em> and hopes that the machine will reply back with its name.</p>
118120 <p>The implementation of this function is contributed by Jason Anderson.</p>
119121 <table class="docutils field-list" frame="void" rules="none">
138140
139141 <dl class="method">
140142 <dt id="nmb.NetBIOSProtocol.NBNSProtocol.queryName">
141 <tt class="descname">queryName</tt><big>(</big><em>name</em>, <em>ip=''</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.queryName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.queryName" title="Permalink to this definition">¶</a></dt>
143 <code class="descname">queryName</code><span class="sig-paren">(</span><em>name</em>, <em>ip=''</em>, <em>port=137</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NBNSProtocol.queryName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.queryName" title="Permalink to this definition">¶</a></dt>
142144 <dd><p>Send a query on the network and hopes that if machine matching the <em>name</em> will reply with its IP address.</p>
143145 <table class="docutils field-list" frame="void" rules="none">
144146 <col class="field-name" />
164166
165167 <dl class="class">
166168 <dt id="nmb.NetBIOSProtocol.NetBIOSTimeout">
167 <em class="property">class </em><tt class="descclassname">nmb.NetBIOSProtocol.</tt><tt class="descname">NetBIOSTimeout</tt><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NetBIOSTimeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NetBIOSTimeout" title="Permalink to this definition">¶</a></dt>
169 <em class="property">class </em><code class="descclassname">nmb.NetBIOSProtocol.</code><code class="descname">NetBIOSTimeout</code><a class="reference internal" href="../_modules/nmb/NetBIOSProtocol.html#NetBIOSTimeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOSProtocol.NetBIOSTimeout" title="Permalink to this definition">¶</a></dt>
168170 <dd><p>Raised in NBNSProtocol via Deferred.errback method when queryName method has timeout waiting for reply</p>
169171 </dd></dl>
170172
176178 </div>
177179 <div class="clearer"></div>
178180 </div>
179 <div class="related">
181 <div class="related" role="navigation" aria-label="related navigation">
180182 <h3>Navigation</h3>
181183 <ul>
182184 <li class="right" style="margin-right: 10px">
188190 <li class="right" >
189191 <a href="../index.html" title="Welcome to pysmb’s documentation!"
190192 >previous</a> |</li>
191 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
193 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
192194 </ul>
193195 </div>
194 <div class="footer">
196 <div class="footer" role="contentinfo">
195197 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
196 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
198 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
197199 </div>
198200 </body>
199201 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>NetBIOS class &mdash; pysmb 1.1.15 documentation</title>
8 <title>NetBIOS class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h4>Previous topic</h4>
4848 <p class="topless"><a href="nmb_NBNSProtocol.html"
5050 <h4>Next topic</h4>
5151 <p class="topless"><a href="smb_SMBConnection.html"
5252 title="next chapter">SMBConnection Class</a></p>
53 <h3>This Page</h3>
54 <ul class="this-page-menu">
55 <li><a href="../_sources/api/nmb_NetBIOS.txt"
56 rel="nofollow">Show Source</a></li>
57 </ul>
58 <div id="searchbox" style="display: none">
53 <div role="note" aria-label="source link">
54 <h3>This Page</h3>
55 <ul class="this-page-menu">
56 <li><a href="../_sources/api/nmb_NetBIOS.txt"
57 rel="nofollow">Show Source</a></li>
58 </ul>
59 </div>
60 <div id="searchbox" style="display: none" role="search">
5961 <h3>Quick search</h3>
6062 <form class="search" action="../search.html" method="get">
6163 <input type="text" name="q" />
7476 <div class="document">
7577 <div class="documentwrapper">
7678 <div class="bodywrapper">
77 <div class="body">
79 <div class="body" role="main">
7880
7981 <div class="section" id="netbios-class">
8082 <h1>NetBIOS class<a class="headerlink" href="#netbios-class" title="Permalink to this headline">¶</a></h1>
8991 </dl>
9092 <dl class="class">
9193 <dt id="nmb.NetBIOS.NetBIOS">
92 <em class="property">class </em><tt class="descclassname">nmb.NetBIOS.</tt><tt class="descname">NetBIOS</tt><big>(</big><em>broadcast=True</em>, <em>listen_port=0</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS" title="Permalink to this definition">¶</a></dt>
94 <em class="property">class </em><code class="descclassname">nmb.NetBIOS.</code><code class="descname">NetBIOS</code><span class="sig-paren">(</span><em>broadcast=True</em>, <em>listen_port=0</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS" title="Permalink to this definition">¶</a></dt>
9395 <dd><dl class="method">
9496 <dt id="nmb.NetBIOS.NetBIOS.__init__">
95 <tt class="descname">__init__</tt><big>(</big><em>broadcast=True</em>, <em>listen_port=0</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.__init__" title="Permalink to this definition">¶</a></dt>
97 <code class="descname">__init__</code><span class="sig-paren">(</span><em>broadcast=True</em>, <em>listen_port=0</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.__init__" title="Permalink to this definition">¶</a></dt>
9698 <dd><p>Instantiate a NetBIOS instance, and creates a IPv4 UDP socket to listen/send NBNS packets.</p>
9799 <table class="docutils field-list" frame="void" rules="none">
98100 <col class="field-name" />
110112
111113 <dl class="method">
112114 <dt id="nmb.NetBIOS.NetBIOS.close">
113 <tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.close" title="Permalink to this definition">¶</a></dt>
115 <code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.close" title="Permalink to this definition">¶</a></dt>
114116 <dd><p>Close the underlying and free resources.</p>
115117 <p>The NetBIOS instance should not be used to perform any operations after this method returns.</p>
116118 <table class="docutils field-list" frame="void" rules="none">
125127
126128 <dl class="method">
127129 <dt id="nmb.NetBIOS.NetBIOS.queryIPForName">
128 <tt class="descname">queryIPForName</tt><big>(</big><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.queryIPForName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.queryIPForName" title="Permalink to this definition">¶</a></dt>
130 <code class="descname">queryIPForName</code><span class="sig-paren">(</span><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.queryIPForName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.queryIPForName" title="Permalink to this definition">¶</a></dt>
129131 <dd><p>Send a query to the machine with <em>ip</em> and hopes that the machine will reply back with its name.</p>
130132 <p>The implementation of this function is contributed by Jason Anderson.</p>
131133 <table class="docutils field-list" frame="void" rules="none">
149151
150152 <dl class="method">
151153 <dt id="nmb.NetBIOS.NetBIOS.queryName">
152 <tt class="descname">queryName</tt><big>(</big><em>name</em>, <em>ip=''</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.queryName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.queryName" title="Permalink to this definition">¶</a></dt>
154 <code class="descname">queryName</code><span class="sig-paren">(</span><em>name</em>, <em>ip=''</em>, <em>port=137</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/nmb/NetBIOS.html#NetBIOS.queryName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.queryName" title="Permalink to this definition">¶</a></dt>
153155 <dd><p>Send a query on the network and hopes that if machine matching the <em>name</em> will reply with its IP address.</p>
154156 <table class="docutils field-list" frame="void" rules="none">
155157 <col class="field-name" />
180182 </div>
181183 <div class="clearer"></div>
182184 </div>
183 <div class="related">
185 <div class="related" role="navigation" aria-label="related navigation">
184186 <h3>Navigation</h3>
185187 <ul>
186188 <li class="right" style="margin-right: 10px">
192194 <li class="right" >
193195 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
194196 >previous</a> |</li>
195 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
197 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
196198 </ul>
197199 </div>
198 <div class="footer">
200 <div class="footer" role="contentinfo">
199201 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
200 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
202 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
201203 </div>
202204 </body>
203205 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMBConnection Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>SMBConnection Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="nmb_NetBIOS.html" title="NetBIOS class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h3><a href="../index.html">Table Of Contents</a></h3>
4848 <ul>
6060 <h4>Next topic</h4>
6161 <p class="topless"><a href="smb_SMBHandler.html"
6262 title="next chapter">SMbHandler Class</a></p>
63 <h3>This Page</h3>
64 <ul class="this-page-menu">
65 <li><a href="../_sources/api/smb_SMBConnection.txt"
66 rel="nofollow">Show Source</a></li>
67 </ul>
68 <div id="searchbox" style="display: none">
63 <div role="note" aria-label="source link">
64 <h3>This Page</h3>
65 <ul class="this-page-menu">
66 <li><a href="../_sources/api/smb_SMBConnection.txt"
67 rel="nofollow">Show Source</a></li>
68 </ul>
69 </div>
70 <div id="searchbox" style="display: none" role="search">
6971 <h3>Quick search</h3>
7072 <form class="search" action="../search.html" method="get">
7173 <input type="text" name="q" />
8486 <div class="document">
8587 <div class="documentwrapper">
8688 <div class="bodywrapper">
87 <div class="body">
89 <div class="body" role="main">
8890
8991 <div class="section" id="smbconnection-class">
9092 <h1>SMBConnection Class<a class="headerlink" href="#smbconnection-class" title="Permalink to this headline">¶</a></h1>
9698 <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">tempfile</span>
9799 <span class="kn">from</span> <span class="nn">smb.SMBConnection</span> <span class="kn">import</span> <span class="n">SMBConnection</span>
98100
99 <span class="c"># There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip</span>
100 <span class="c"># client_machine_name can be an arbitary ASCII string</span>
101 <span class="c"># server_name should match the remote machine name, or else the connection will be rejected</span>
101 <span class="c1"># There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip</span>
102 <span class="c1"># client_machine_name can be an arbitary ASCII string</span>
103 <span class="c1"># server_name should match the remote machine name, or else the connection will be rejected</span>
102104 <span class="n">conn</span> <span class="o">=</span> <span class="n">SMBConnection</span><span class="p">(</span><span class="n">userID</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">client_machine_name</span><span class="p">,</span> <span class="n">server_name</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>
103105 <span class="k">assert</span> <span class="n">conn</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">server_ip</span><span class="p">,</span> <span class="mi">139</span><span class="p">)</span>
104106
105107 <span class="n">file_obj</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">()</span>
106 <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filesize</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">retrieveFile</span><span class="p">(</span><span class="s">&#39;smbtest&#39;</span><span class="p">,</span> <span class="s">&#39;/rfc1001.txt&#39;</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">)</span>
107
108 <span class="c"># Retrieved file contents are inside file_obj</span>
109 <span class="c"># Do what you need with the file_obj and then close it</span>
110 <span class="c"># Note that the file obj is positioned at the end-of-file,</span>
111 <span class="c"># so you might need to perform a file_obj.seek() if you need</span>
112 <span class="c"># to read from the beginning</span>
108 <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filesize</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">retrieveFile</span><span class="p">(</span><span class="s1">&#39;smbtest&#39;</span><span class="p">,</span> <span class="s1">&#39;/rfc1001.txt&#39;</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">)</span>
109
110 <span class="c1"># Retrieved file contents are inside file_obj</span>
111 <span class="c1"># Do what you need with the file_obj and then close it</span>
112 <span class="c1"># Note that the file obj is positioned at the end-of-file,</span>
113 <span class="c1"># so you might need to perform a file_obj.seek() if you need</span>
114 <span class="c1"># to read from the beginning</span>
113115 <span class="n">file_obj</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
114116 </pre></div>
115117 </div>
135137 </ul>
136138 <dl class="class">
137139 <dt id="smb.SMBConnection.SMBConnection">
138 <em class="property">class </em><tt class="descclassname">smb.SMBConnection.</tt><tt class="descname">SMBConnection</tt><big>(</big><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><big>)</big><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>
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>
139141 <dd><dl class="method">
140142 <dt id="smb.SMBConnection.SMBConnection.__init__">
141 <tt class="descname">__init__</tt><big>(</big><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><big>)</big><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>
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>
142144 <dd><p>Create a new SMBConnection instance.</p>
143145 <p><em>username</em> and <em>password</em> are the user credentials required to authenticate the underlying SMB connection with the remote server.
144146 File operations can only be proceeded after the connection has been authenticated successfully.</p>
151153 <tbody valign="top">
152154 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
153155 <li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
154 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 <tt class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></tt></li>
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>
155157 <li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
156158 On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
157159 This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
175177
176178 <dl class="method">
177179 <dt id="smb.SMBConnection.SMBConnection.close">
178 <tt class="descname">close</tt><big>(</big><big>)</big><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>
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>
179181 <dd><p>Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</p>
180182 </dd></dl>
181183
182184 <dl class="method">
183185 <dt id="smb.SMBConnection.SMBConnection.connect">
184 <tt class="descname">connect</tt><big>(</big><em>ip</em>, <em>port=139</em>, <em>sock_family=2</em>, <em>timeout=60</em><big>)</big><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>
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>
185187 <dd><p>Establish the SMB connection to the remote SMB/CIFS server.</p>
186188 <p>You must call this method before attempting any of the file operations with the remote server.
187189 This method will block until the SMB connection has attempted at least one authentication.</p>
197199
198200 <dl class="method">
199201 <dt id="smb.SMBConnection.SMBConnection.createDirectory">
200 <tt class="descname">createDirectory</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
201203 <dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
202204 <table class="docutils field-list" frame="void" rules="none">
203205 <col class="field-name" />
219221
220222 <dl class="method">
221223 <dt id="smb.SMBConnection.SMBConnection.deleteDirectory">
222 <tt class="descname">deleteDirectory</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
223225 <dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
224226 <table class="docutils field-list" frame="void" rules="none">
225227 <col class="field-name" />
241243
242244 <dl class="method">
243245 <dt id="smb.SMBConnection.SMBConnection.deleteFiles">
244 <tt class="descname">deleteFiles</tt><big>(</big><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><big>)</big><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>
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>
245247 <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>
246248 <table class="docutils field-list" frame="void" rules="none">
247249 <col class="field-name" />
264266
265267 <dl class="method">
266268 <dt id="smb.SMBConnection.SMBConnection.echo">
267 <tt class="descname">echo</tt><big>(</big><em>data</em>, <em>timeout=10</em><big>)</big><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>
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>
268270 <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>
269271 <table class="docutils field-list" frame="void" rules="none">
270272 <col class="field-name" />
280282
281283 <dl class="method">
282284 <dt id="smb.SMBConnection.SMBConnection.getAttributes">
283 <tt class="descname">getAttributes</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
284286 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
285287 <table class="docutils field-list" frame="void" rules="none">
286288 <col class="field-name" />
301303
302304 <dl class="method">
303305 <dt id="smb.SMBConnection.SMBConnection.listPath">
304 <tt class="descname">listPath</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><big>)</big><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>
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>
305307 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
306308 <table class="docutils field-list" frame="void" rules="none">
307309 <col class="field-name" />
325327
326328 <dl class="method">
327329 <dt id="smb.SMBConnection.SMBConnection.listShares">
328 <tt class="descname">listShares</tt><big>(</big><em>timeout=30</em><big>)</big><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>
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>
329331 <dd><p>Retrieve a list of shared resources on remote server.</p>
330332 <table class="docutils field-list" frame="void" rules="none">
331333 <col class="field-name" />
339341
340342 <dl class="method">
341343 <dt id="smb.SMBConnection.SMBConnection.listSnapshots">
342 <tt class="descname">listSnapshots</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
343345 <dd><p>Retrieve a list of available snapshots (shadow copies) for <em>path</em>.</p>
344346 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
345347 <table class="docutils field-list" frame="void" rules="none">
361363
362364 <dl class="method">
363365 <dt id="smb.SMBConnection.SMBConnection.rename">
364 <tt class="descname">rename</tt><big>(</big><em>service_name</em>, <em>old_path</em>, <em>new_path</em>, <em>timeout=30</em><big>)</big><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>
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>
365367 <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>
366368 <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.
367369 If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
378380 </dd></dl>
379381
380382 <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">
381409 <dt id="smb.SMBConnection.SMBConnection.retrieveFile">
382 <tt class="descname">retrieveFile</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><big>)</big><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>
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>
383411 <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>
384412 <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>
385413 <table class="docutils field-list" frame="void" rules="none">
403431
404432 <dl class="method">
405433 <dt id="smb.SMBConnection.SMBConnection.retrieveFileFromOffset">
406 <tt class="descname">retrieveFileFromOffset</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><big>)</big><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>
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>
407435 <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>
408436 <table class="docutils field-list" frame="void" rules="none">
409437 <col class="field-name" />
429457
430458 <dl class="method">
431459 <dt id="smb.SMBConnection.SMBConnection.storeFile">
432 <tt class="descname">storeFile</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><big>)</big><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>
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>
433461 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.
434462 If the file already exists on the remote server, it will be truncated and overwritten.</p>
435463 <table class="docutils field-list" frame="void" rules="none">
453481
454482 <dl class="method">
455483 <dt id="smb.SMBConnection.SMBConnection.storeFileFromOffset">
456 <tt class="descname">storeFileFromOffset</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>truncate=False</em>, <em>timeout=30</em><big>)</big><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>
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>
457485 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
458486 <table class="docutils field-list" frame="void" rules="none">
459487 <col class="field-name" />
478506
479507 <dl class="attribute">
480508 <dt id="smb.SMBConnection.SMBConnection.SIGN_NEVER">
481 <tt class="descname">SIGN_NEVER</tt><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_NEVER" title="Permalink to this definition">¶</a></dt>
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>
482510 <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>
483511 </dd></dl>
484512
485513 <dl class="attribute">
486514 <dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED">
487 <tt class="descname">SIGN_WHEN_REQUIRED</tt><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED" title="Permalink to this definition">¶</a></dt>
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>
488516 <dd><p>SMB messages will only be signed when remote server requires signing.</p>
489517 </dd></dl>
490518
491519 <dl class="attribute">
492520 <dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED">
493 <tt class="descname">SIGN_WHEN_SUPPORTED</tt><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">¶</a></dt>
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>
494522 <dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
495523 </dd></dl>
496524
497525 <dl class="attribute">
498526 <dt id="smb.SMBConnection.SMBConnection.isUsingSMB2">
499 <tt class="descname">isUsingSMB2</tt><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.isUsingSMB2"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
527 <code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBConnection.SMBConnection.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
500528 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
501529 </dd></dl>
502530
511539 </div>
512540 <div class="clearer"></div>
513541 </div>
514 <div class="related">
542 <div class="related" role="navigation" aria-label="related navigation">
515543 <h3>Navigation</h3>
516544 <ul>
517545 <li class="right" style="margin-right: 10px">
523551 <li class="right" >
524552 <a href="nmb_NetBIOS.html" title="NetBIOS class"
525553 >previous</a> |</li>
526 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
554 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
527555 </ul>
528556 </div>
529 <div class="footer">
557 <div class="footer" role="contentinfo">
530558 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
531 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
559 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
532560 </div>
533561 </body>
534562 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMbHandler Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>SMbHandler Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="smb_SMBConnection.html" title="SMBConnection Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h3><a href="../index.html">Table Of Contents</a></h3>
4848 <ul>
5959 <h4>Next topic</h4>
6060 <p class="topless"><a href="smb_SMBProtocolFactory.html"
6161 title="next chapter">SMBProtocolFactory Class</a></p>
62 <h3>This Page</h3>
63 <ul class="this-page-menu">
64 <li><a href="../_sources/api/smb_SMBHandler.txt"
65 rel="nofollow">Show Source</a></li>
66 </ul>
67 <div id="searchbox" style="display: none">
62 <div role="note" aria-label="source link">
63 <h3>This Page</h3>
64 <ul class="this-page-menu">
65 <li><a href="../_sources/api/smb_SMBHandler.txt"
66 rel="nofollow">Show Source</a></li>
67 </ul>
68 </div>
69 <div id="searchbox" style="display: none" role="search">
6870 <h3>Quick search</h3>
6971 <form class="search" action="../search.html" method="get">
7072 <input type="text" name="q" />
8385 <div class="document">
8486 <div class="documentwrapper">
8587 <div class="bodywrapper">
86 <div class="body">
88 <div class="body" role="main">
8789
8890 <div class="section" id="smbhandler-class">
8991 <h1>SMbHandler Class<a class="headerlink" href="#smbhandler-class" title="Permalink to this headline">¶</a></h1>
102104 <div class="section" id="example">
103105 <h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
104106 <p>The following code snippet illustrates file retrieval.:</p>
105 <div class="highlight-python"><div class="highlight"><pre><span class="c"># -*- coding: utf-8 -*-</span>
107 <div class="highlight-python"><div class="highlight"><pre><span class="c1"># -*- coding: utf-8 -*-</span>
106108 <span class="kn">import</span> <span class="nn">urllib2</span>
107109 <span class="kn">from</span> <span class="nn">smb.SMBHandler</span> <span class="kn">import</span> <span class="n">SMBHandler</span>
108110
109111 <span class="n">director</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">SMBHandler</span><span class="p">)</span>
110 <span class="n">fh</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s">&#39;smb://myuserID:[email protected]/sharedfolder/rfc1001.txt&#39;</span><span class="p">)</span>
112 <span class="n">fh</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;smb://myuserID:[email protected]/sharedfolder/rfc1001.txt&#39;</span><span class="p">)</span>
111113
112 <span class="c"># Process fh like a file-like object and then close it.</span>
114 <span class="c1"># Process fh like a file-like object and then close it.</span>
113115 <span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
114116
115 <span class="c"># For paths/files with unicode characters, simply pass in the URL as an unicode string</span>
116 <span class="n">fh2</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s">u&#39;smb://myuserID:[email protected]/sharedfolder/测试文件夹/垃圾文件.dat&#39;</span><span class="p">)</span>
117 <span class="c1"># For paths/files with unicode characters, simply pass in the URL as an unicode string</span>
118 <span class="n">fh2</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">u&#39;smb://myuserID:[email protected]/sharedfolder/测试文件夹/垃圾文件.dat&#39;</span><span class="p">)</span>
117119
118 <span class="c"># Process fh2 like a file-like object and then close it.</span>
120 <span class="c1"># Process fh2 like a file-like object and then close it.</span>
119121 <span class="n">fh2</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
120122 </pre></div>
121123 </div>
123125 <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">urllib2</span>
124126 <span class="kn">from</span> <span class="nn">smb.SMBHandler</span> <span class="kn">import</span> <span class="n">SMBHandler</span>
125127
126 <span class="n">file_fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;local_file.dat&#39;</span><span class="p">,</span> <span class="s">&#39;rb&#39;</span><span class="p">)</span>
128 <span class="n">file_fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;local_file.dat&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
127129
128130 <span class="n">director</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">SMBHandler</span><span class="p">)</span>
129 <span class="n">fh</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s">&#39;smb://myuserID:[email protected]/sharedfolder/upload_file.dat&#39;</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">file_fh</span><span class="p">)</span>
131 <span class="n">fh</span> <span class="o">=</span> <span class="n">director</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;smb://myuserID:[email protected]/sharedfolder/upload_file.dat&#39;</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">file_fh</span><span class="p">)</span>
130132
131 <span class="c"># Reading from fh will only return an empty string</span>
133 <span class="c1"># Reading from fh will only return an empty string</span>
132134 <span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
133135 </pre></div>
134136 </div>
141143 </div>
142144 <div class="clearer"></div>
143145 </div>
144 <div class="related">
146 <div class="related" role="navigation" aria-label="related navigation">
145147 <h3>Navigation</h3>
146148 <ul>
147149 <li class="right" style="margin-right: 10px">
153155 <li class="right" >
154156 <a href="smb_SMBConnection.html" title="SMBConnection Class"
155157 >previous</a> |</li>
156 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
158 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
157159 </ul>
158160 </div>
159 <div class="footer">
161 <div class="footer" role="contentinfo">
160162 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
161 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
163 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
162164 </div>
163165 </body>
164166 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="smb_SMBHandler.html" title="SMbHandler Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h3><a href="../index.html">Table Of Contents</a></h3>
4848 <ul>
6060 <h4>Next topic</h4>
6161 <p class="topless"><a href="smb_SharedDevice.html"
6262 title="next chapter">SharedDevice Class</a></p>
63 <h3>This Page</h3>
64 <ul class="this-page-menu">
65 <li><a href="../_sources/api/smb_SMBProtocolFactory.txt"
66 rel="nofollow">Show Source</a></li>
67 </ul>
68 <div id="searchbox" style="display: none">
63 <div role="note" aria-label="source link">
64 <h3>This Page</h3>
65 <ul class="this-page-menu">
66 <li><a href="../_sources/api/smb_SMBProtocolFactory.txt"
67 rel="nofollow">Show Source</a></li>
68 </ul>
69 </div>
70 <div id="searchbox" style="display: none" role="search">
6971 <h3>Quick search</h3>
7072 <form class="search" action="../search.html" method="get">
7173 <input type="text" name="q" />
8486 <div class="document">
8587 <div class="documentwrapper">
8688 <div class="bodywrapper">
87 <div class="body">
89 <div class="body" role="main">
8890
8991 <div class="section" id="smbprotocolfactory-class">
9092 <h1>SMBProtocolFactory Class<a class="headerlink" href="#smbprotocolfactory-class" title="Permalink to this headline">¶</a></h1>
125127 <span class="k">def</span> <span class="nf">fileRetrieved</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">write_result</span><span class="p">):</span>
126128 <span class="n">file_obj</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">file_size</span> <span class="o">=</span> <span class="n">write_result</span>
127129
128 <span class="c"># Retrieved file contents are inside file_obj</span>
129 <span class="c"># Do what you need with the file_obj and then close it</span>
130 <span class="c"># Note that the file obj is positioned at the end-of-file,</span>
131 <span class="c"># so you might need to perform a file_obj.seek() to if you</span>
132 <span class="c"># need to read from the beginning</span>
130 <span class="c1"># Retrieved file contents are inside file_obj</span>
131 <span class="c1"># Do what you need with the file_obj and then close it</span>
132 <span class="c1"># Note that the file obj is positioned at the end-of-file,</span>
133 <span class="c1"># so you might need to perform a file_obj.seek() to if you</span>
134 <span class="c1"># need to read from the beginning</span>
133135 <span class="n">file_obj</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
134136
135137 <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span>
140142 <span class="n">d</span><span class="o">.</span><span class="n">addErrback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
141143
142144 <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
143 <span class="k">print</span> <span class="s">&#39;Auth failed&#39;</span>
144
145 <span class="c"># There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip</span>
146 <span class="c"># client_machine_name can be an arbitary ASCII string</span>
147 <span class="c"># server_name should match the remote machine name, or else the connection will be rejected</span>
145 <span class="k">print</span> <span class="s1">&#39;Auth failed&#39;</span>
146
147 <span class="c1"># There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip</span>
148 <span class="c1"># client_machine_name can be an arbitary ASCII string</span>
149 <span class="c1"># server_name should match the remote machine name, or else the connection will be rejected</span>
148150 <span class="n">factory</span> <span class="o">=</span> <span class="n">RetrieveFileFactory</span><span class="p">(</span><span class="n">userID</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">client_machine_name</span><span class="p">,</span> <span class="n">server_name</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>
149 <span class="n">factory</span><span class="o">.</span><span class="n">service</span> <span class="o">=</span> <span class="s">&#39;smbtest&#39;</span>
150 <span class="n">factory</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="s">&#39;/rfc1001.txt&#39;</span>
151 <span class="n">factory</span><span class="o">.</span><span class="n">service</span> <span class="o">=</span> <span class="s1">&#39;smbtest&#39;</span>
152 <span class="n">factory</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;/rfc1001.txt&#39;</span>
151153 <span class="n">reactor</span><span class="o">.</span><span class="n">connectTCP</span><span class="p">(</span><span class="n">server_ip</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="n">factory</span><span class="p">)</span>
152154 </pre></div>
153155 </div>
172174 </ul>
173175 <dl class="class">
174176 <dt id="smb.SMBProtocol.SMBProtocolFactory">
175 <em class="property">class </em><tt class="descclassname">smb.SMBProtocol.</tt><tt class="descname">SMBProtocolFactory</tt><big>(</big><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><big>)</big><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>
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>
176178 <dd><dl class="method">
177179 <dt id="smb.SMBProtocol.SMBProtocolFactory.__init__">
178 <tt class="descname">__init__</tt><big>(</big><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><big>)</big><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>
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>
179181 <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.
180182 Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.
181183 Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</p>
187189 <tbody valign="top">
188190 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
189191 <li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
190 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 <tt class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></tt>.</li>
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>
191193 <li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
192194 On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
193195 This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
211213
212214 <dl class="method">
213215 <dt id="smb.SMBProtocol.SMBProtocolFactory.closeConnection">
214 <tt class="descname">closeConnection</tt><big>(</big><big>)</big><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>
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>
215217 <dd><p>Disconnect from the remote SMB/CIFS server. The TCP connection will be closed at the earliest opportunity after this method returns.</p>
216218 <table class="docutils field-list" frame="void" rules="none">
217219 <col class="field-name" />
225227
226228 <dl class="method">
227229 <dt id="smb.SMBProtocol.SMBProtocolFactory.createDirectory">
228 <tt class="descname">createDirectory</tt><big>(</big><em>service_name</em>, <em>path</em><big>)</big><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>
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>
229231 <dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
230232 <table class="docutils field-list" frame="void" rules="none">
231233 <col class="field-name" />
248250
249251 <dl class="method">
250252 <dt id="smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">
251 <tt class="descname">deleteDirectory</tt><big>(</big><em>service_name</em>, <em>path</em><big>)</big><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>
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>
252254 <dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
253255 <table class="docutils field-list" frame="void" rules="none">
254256 <col class="field-name" />
271273
272274 <dl class="method">
273275 <dt id="smb.SMBProtocol.SMBProtocolFactory.deleteFiles">
274 <tt class="descname">deleteFiles</tt><big>(</big><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><big>)</big><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>
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>
275277 <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>
276278 <table class="docutils field-list" frame="void" rules="none">
277279 <col class="field-name" />
295297
296298 <dl class="method">
297299 <dt id="smb.SMBProtocol.SMBProtocolFactory.echo">
298 <tt class="descname">echo</tt><big>(</big><em>data</em>, <em>timeout=10</em><big>)</big><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>
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>
299301 <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>
300302 <table class="docutils field-list" frame="void" rules="none">
301303 <col class="field-name" />
316318
317319 <dl class="method">
318320 <dt id="smb.SMBProtocol.SMBProtocolFactory.getAttributes">
319 <tt class="descname">getAttributes</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
320322 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
321323 <table class="docutils field-list" frame="void" rules="none">
322324 <col class="field-name" />
337339
338340 <dl class="method">
339341 <dt id="smb.SMBProtocol.SMBProtocolFactory.listPath">
340 <tt class="descname">listPath</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><big>)</big><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>
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>
341343 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
342344 <table class="docutils field-list" frame="void" rules="none">
343345 <col class="field-name" />
362364
363365 <dl class="method">
364366 <dt id="smb.SMBProtocol.SMBProtocolFactory.listShares">
365 <tt class="descname">listShares</tt><big>(</big><em>timeout=30</em><big>)</big><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>
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>
366368 <dd><p>Retrieve a list of shared resources on remote server.</p>
367369 <table class="docutils field-list" frame="void" rules="none">
368370 <col class="field-name" />
378380
379381 <dl class="method">
380382 <dt id="smb.SMBProtocol.SMBProtocolFactory.listSnapshots">
381 <tt class="descname">listSnapshots</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><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>
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>
382384 <dd><p>Retrieve a list of available snapshots (a.k.a. shadow copies) for <em>path</em>.</p>
383385 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
384386 <table class="docutils field-list" frame="void" rules="none">
401403
402404 <dl class="method">
403405 <dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">
404 <tt class="descname">onAuthFailed</tt><big>(</big><big>)</big><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>
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>
405407 <dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
406408 This method will be called when the server has replied that the SMB connection has been successfully authenticated.</p>
407409 <dl class="docutils">
408410 <dt>If you want to retry authenticating from this method,</dt>
409411 <dd><ol class="first last arabic simple">
410 <li>Disconnect the underlying SMB connection (call <tt class="docutils literal"><span class="pre">self.instance.transport.loseConnection()</span></tt>)</li>
412 <li>Disconnect the underlying SMB connection (call <code class="docutils literal"><span class="pre">self.instance.transport.loseConnection()</span></code>)</li>
411413 <li>Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</li>
412 <li>Call <tt class="docutils literal"><span class="pre">reactor.connectTCP</span></tt> with the new instance to re-establish the SMB connection</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>
413415 </ol>
414416 </dd>
415417 </dl>
417419
418420 <dl class="method">
419421 <dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthOK">
420 <tt class="descname">onAuthOK</tt><big>(</big><big>)</big><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>
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>
421423 <dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
422424 This method will be called when the server has replied that the SMB connection has been successfully authenticated.
423425 File operations can proceed when this method has been called.</p>
425427
426428 <dl class="method">
427429 <dt id="smb.SMBProtocol.SMBProtocolFactory.rename">
428 <tt class="descname">rename</tt><big>(</big><em>service_name</em>, <em>old_path</em>, <em>new_path</em><big>)</big><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>
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>
429431 <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>
430432 <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.
431433 If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
448450
449451 <dl class="method">
450452 <dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFile">
451 <tt class="descname">retrieveFile</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><big>)</big><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>
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>
452454 <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>
453455 <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>
454456 <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
475477
476478 <dl class="method">
477479 <dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">
478 <tt class="descname">retrieveFileFromOffset</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><big>)</big><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>
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>
479481 <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>
480482 <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
481483 of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
504506
505507 <dl class="method">
506508 <dt id="smb.SMBProtocol.SMBProtocolFactory.storeFile">
507 <tt class="descname">storeFile</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><big>)</big><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>
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>
508510 <dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
509511 <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
510512 of each SMB/CIFS data message, it will be packetized into a series of messages (usually about 60kBytes).
531533
532534 <dl class="attribute">
533535 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER">
534 <tt class="descname">SIGN_NEVER</tt><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER" title="Permalink to this definition">¶</a></dt>
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>
535537 <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>
536538 </dd></dl>
537539
538540 <dl class="attribute">
539541 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED">
540 <tt class="descname">SIGN_WHEN_REQUIRED</tt><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED" title="Permalink to this definition">¶</a></dt>
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>
541543 <dd><p>SMB messages will only be signed when remote server requires signing.</p>
542544 </dd></dl>
543545
544546 <dl class="attribute">
545547 <dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED">
546 <tt class="descname">SIGN_WHEN_SUPPORTED</tt><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">¶</a></dt>
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>
547549 <dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
548550 </dd></dl>
549551
550552 <dl class="attribute">
551553 <dt id="smb.SMBProtocol.SMBProtocolFactory.instance">
552 <tt class="descname">instance</tt><em class="property"> = None</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.instance" title="Permalink to this definition">¶</a></dt>
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>
553555 <dd><p>The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</p>
554556 </dd></dl>
555557
556558 <dl class="attribute">
557559 <dt id="smb.SMBProtocol.SMBProtocolFactory.isReady">
558 <tt class="descname">isReady</tt><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.isReady"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isReady" title="Permalink to this definition">¶</a></dt>
560 <code class="descname">isReady</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isReady" title="Permalink to this definition">¶</a></dt>
559561 <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>
560562 </dd></dl>
561563
562564 <dl class="attribute">
563565 <dt id="smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">
564 <tt class="descname">isUsingSMB2</tt><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.isUsingSMB2"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
566 <code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
565567 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
566568 </dd></dl>
567569
576578 </div>
577579 <div class="clearer"></div>
578580 </div>
579 <div class="related">
581 <div class="related" role="navigation" aria-label="related navigation">
580582 <h3>Navigation</h3>
581583 <ul>
582584 <li class="right" style="margin-right: 10px">
588590 <li class="right" >
589591 <a href="smb_SMBHandler.html" title="SMbHandler Class"
590592 >previous</a> |</li>
591 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
593 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
592594 </ul>
593595 </div>
594 <div class="footer">
596 <div class="footer" role="contentinfo">
595597 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
596 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
598 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
597599 </div>
598600 </body>
599601 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SharedDevice Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>SharedDevice Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h4>Previous topic</h4>
4848 <p class="topless"><a href="smb_SMBProtocolFactory.html"
5050 <h4>Next topic</h4>
5151 <p class="topless"><a href="smb_SharedFile.html"
5252 title="next chapter">SharedFile Class</a></p>
53 <h3>This Page</h3>
54 <ul class="this-page-menu">
55 <li><a href="../_sources/api/smb_SharedDevice.txt"
56 rel="nofollow">Show Source</a></li>
57 </ul>
58 <div id="searchbox" style="display: none">
53 <div role="note" aria-label="source link">
54 <h3>This Page</h3>
55 <ul class="this-page-menu">
56 <li><a href="../_sources/api/smb_SharedDevice.txt"
57 rel="nofollow">Show Source</a></li>
58 </ul>
59 </div>
60 <div id="searchbox" style="display: none" role="search">
5961 <h3>Quick search</h3>
6062 <form class="search" action="../search.html" method="get">
6163 <input type="text" name="q" />
7476 <div class="document">
7577 <div class="documentwrapper">
7678 <div class="bodywrapper">
77 <div class="body">
79 <div class="body" role="main">
7880
7981 <div class="section" id="shareddevice-class">
8082 <h1>SharedDevice Class<a class="headerlink" href="#shareddevice-class" title="Permalink to this headline">¶</a></h1>
8183 <dl class="class">
8284 <dt id="smb.base.SharedDevice">
83 <em class="property">class </em><tt class="descclassname">smb.base.</tt><tt class="descname">SharedDevice</tt><big>(</big><em>type</em>, <em>name</em>, <em>comments</em><big>)</big><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>
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>
8486 <dd><p>Contains information about a single shared device on the remote server.</p>
8587 <dl class="attribute">
8688 <dt id="smb.base.SharedDevice.comments">
87 <tt class="descname">comments</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.comments" title="Permalink to this definition">¶</a></dt>
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>
8890 <dd><p>An unicode string containing the user description of the shared device</p>
8991 </dd></dl>
9092
9193 <dl class="attribute">
9294 <dt id="smb.base.SharedDevice.isSpecial">
93 <tt class="descname">isSpecial</tt><a class="reference internal" href="../_modules/smb/base.html#SharedDevice.isSpecial"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedDevice.isSpecial" title="Permalink to this definition">¶</a></dt>
95 <code class="descname">isSpecial</code><a class="headerlink" href="#smb.base.SharedDevice.isSpecial" title="Permalink to this definition">¶</a></dt>
9496 <dd><p>Returns True if this shared device is a special share reserved for interprocess communication (IPC$)
9597 or remote administration of the server (ADMIN$). Can also refer to administrative shares such as
9698 C$, D$, E$, and so forth</p>
98100
99101 <dl class="attribute">
100102 <dt id="smb.base.SharedDevice.isTemporary">
101 <tt class="descname">isTemporary</tt><a class="reference internal" href="../_modules/smb/base.html#SharedDevice.isTemporary"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedDevice.isTemporary" title="Permalink to this definition">¶</a></dt>
103 <code class="descname">isTemporary</code><a class="headerlink" href="#smb.base.SharedDevice.isTemporary" title="Permalink to this definition">¶</a></dt>
102104 <dd><p>Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</p>
103105 </dd></dl>
104106
105107 <dl class="attribute">
106108 <dt id="smb.base.SharedDevice.name">
107 <tt class="descname">name</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.name" title="Permalink to this definition">¶</a></dt>
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>
108110 <dd><p>An unicode string containing the name of the shared device</p>
109111 </dd></dl>
110112
111113 <dl class="attribute">
112114 <dt id="smb.base.SharedDevice.type">
113 <tt class="descname">type</tt><a class="reference internal" href="../_modules/smb/base.html#SharedDevice.type"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedDevice.type" title="Permalink to this definition">¶</a></dt>
115 <code class="descname">type</code><a class="headerlink" href="#smb.base.SharedDevice.type" title="Permalink to this definition">¶</a></dt>
114116 <dd><dl class="docutils">
115117 <dt>Returns one of the following integral constants.</dt>
116118 <dd><ul class="first last simple">
133135 </div>
134136 <div class="clearer"></div>
135137 </div>
136 <div class="related">
138 <div class="related" role="navigation" aria-label="related navigation">
137139 <h3>Navigation</h3>
138140 <ul>
139141 <li class="right" style="margin-right: 10px">
145147 <li class="right" >
146148 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
147149 >previous</a> |</li>
148 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
150 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
149151 </ul>
150152 </div>
151 <div class="footer">
153 <div class="footer" role="contentinfo">
152154 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
153 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
155 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
154156 </div>
155157 </body>
156158 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SharedFile Class &mdash; pysmb 1.1.15 documentation</title>
8 <title>SharedFile Class &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 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>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="smb_SharedDevice.html" title="SharedDevice Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h4>Previous topic</h4>
4848 <p class="topless"><a href="smb_SharedDevice.html"
5050 <h4>Next topic</h4>
5151 <p class="topless"><a href="smb_exceptions.html"
5252 title="next chapter">SMB Exceptions</a></p>
53 <h3>This Page</h3>
54 <ul class="this-page-menu">
55 <li><a href="../_sources/api/smb_SharedFile.txt"
56 rel="nofollow">Show Source</a></li>
57 </ul>
58 <div id="searchbox" style="display: none">
53 <div role="note" aria-label="source link">
54 <h3>This Page</h3>
55 <ul class="this-page-menu">
56 <li><a href="../_sources/api/smb_SharedFile.txt"
57 rel="nofollow">Show Source</a></li>
58 </ul>
59 </div>
60 <div id="searchbox" style="display: none" role="search">
5961 <h3>Quick search</h3>
6062 <form class="search" action="../search.html" method="get">
6163 <input type="text" name="q" />
7476 <div class="document">
7577 <div class="documentwrapper">
7678 <div class="bodywrapper">
77 <div class="body">
79 <div class="body" role="main">
7880
7981 <div class="section" id="sharedfile-class">
8082 <h1>SharedFile Class<a class="headerlink" href="#sharedfile-class" title="Permalink to this headline">¶</a></h1>
8183 <dl class="class">
8284 <dt id="smb.base.SharedFile">
83 <em class="property">class </em><tt class="descclassname">smb.base.</tt><tt class="descname">SharedFile</tt><big>(</big><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><big>)</big><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>
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>
8486 <dd><p>Contain information about a file/folder entry that is shared on the shared device.</p>
8587 <p>As an application developer, you should not need to instantiate a <em>SharedFile</em> instance directly in your application.
8688 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>
8991 one of these prohibited characters: &#8220;/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).</p>
9092 <dl class="attribute">
9193 <dt id="smb.base.SharedFile.alloc_size">
92 <tt class="descname">alloc_size</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.alloc_size" title="Permalink to this definition">¶</a></dt>
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>
9395 <dd><p>Total number of bytes allocated to store this file</p>
9496 </dd></dl>
9597
9698 <dl class="attribute">
9799 <dt id="smb.base.SharedFile.create_time">
98 <tt class="descname">create_time</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.create_time" title="Permalink to this definition">¶</a></dt>
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>
99101 <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>
100102 </dd></dl>
101103
102104 <dl class="attribute">
103105 <dt id="smb.base.SharedFile.file_attributes">
104 <tt class="descname">file_attributes</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_attributes" title="Permalink to this definition">¶</a></dt>
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>
105107 <dd><p>A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</p>
106108 </dd></dl>
107109
108110 <dl class="attribute">
109111 <dt id="smb.base.SharedFile.file_size">
110 <tt class="descname">file_size</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_size" title="Permalink to this definition">¶</a></dt>
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>
111113 <dd><p>File size in number of bytes</p>
112114 </dd></dl>
113115
114116 <dl class="attribute">
115117 <dt id="smb.base.SharedFile.filename">
116 <tt class="descname">filename</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.filename" title="Permalink to this definition">¶</a></dt>
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>
117119 <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>
118120 </dd></dl>
119121
120122 <dl class="attribute">
121123 <dt id="smb.base.SharedFile.isDirectory">
122 <tt class="descname">isDirectory</tt><a class="reference internal" href="../_modules/smb/base.html#SharedFile.isDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedFile.isDirectory" title="Permalink to this definition">¶</a></dt>
124 <code class="descname">isDirectory</code><a class="headerlink" href="#smb.base.SharedFile.isDirectory" title="Permalink to this definition">¶</a></dt>
123125 <dd><p>A convenient property to return True if this file resource is a directory on the remote server</p>
124126 </dd></dl>
125127
126128 <dl class="attribute">
127129 <dt id="smb.base.SharedFile.isReadOnly">
128 <tt class="descname">isReadOnly</tt><a class="reference internal" href="../_modules/smb/base.html#SharedFile.isReadOnly"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedFile.isReadOnly" title="Permalink to this definition">¶</a></dt>
130 <code class="descname">isReadOnly</code><a class="headerlink" href="#smb.base.SharedFile.isReadOnly" title="Permalink to this definition">¶</a></dt>
129131 <dd><p>A convenient property to return True if this file resource is read-only on the remote server</p>
130132 </dd></dl>
131133
132134 <dl class="attribute">
133135 <dt id="smb.base.SharedFile.last_access_time">
134 <tt class="descname">last_access_time</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_access_time" title="Permalink to this definition">¶</a></dt>
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>
135137 <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>
136138 </dd></dl>
137139
138140 <dl class="attribute">
139141 <dt id="smb.base.SharedFile.last_attr_change_time">
140 <tt class="descname">last_attr_change_time</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_attr_change_time" title="Permalink to this definition">¶</a></dt>
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>
141143 <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>
142144 </dd></dl>
143145
144146 <dl class="attribute">
145147 <dt id="smb.base.SharedFile.last_write_time">
146 <tt class="descname">last_write_time</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_write_time" title="Permalink to this definition">¶</a></dt>
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>
147149 <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>
148150 </dd></dl>
149151
150152 <dl class="attribute">
151153 <dt id="smb.base.SharedFile.short_name">
152 <tt class="descname">short_name</tt><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.short_name" title="Permalink to this definition">¶</a></dt>
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>
153155 <dd><p>Unicode string containing the short name of this file (usually in 8.3 notation)</p>
154156 </dd></dl>
155157
163165 </div>
164166 <div class="clearer"></div>
165167 </div>
166 <div class="related">
168 <div class="related" role="navigation" aria-label="related navigation">
167169 <h3>Navigation</h3>
168170 <ul>
169171 <li class="right" style="margin-right: 10px">
175177 <li class="right" >
176178 <a href="smb_SharedDevice.html" title="SharedDevice Class"
177179 >previous</a> |</li>
178 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
180 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
179181 </ul>
180182 </div>
181 <div class="footer">
183 <div class="footer" role="contentinfo">
182184 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
183 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
185 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
184186 </div>
185187 </body>
186188 </html>
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>SMB Exceptions &mdash; pysmb 1.1.15 documentation</title>
8 <title>SMB Exceptions &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
2626 <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
2727 <link rel="prev" title="SharedFile Class" href="smb_SharedFile.html" />
2828 </head>
29 <body>
30 <div class="related">
29 <body role="document">
30 <div class="related" role="navigation" aria-label="related navigation">
3131 <h3>Navigation</h3>
3232 <ul>
3333 <li class="right" style="margin-right: 10px">
3939 <li class="right" >
4040 <a href="smb_SharedFile.html" title="SharedFile Class"
4141 accesskey="P">previous</a> |</li>
42 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 <h4>Previous topic</h4>
4848 <p class="topless"><a href="smb_SharedFile.html"
5050 <h4>Next topic</h4>
5151 <p class="topless"><a href="../extending.html"
5252 title="next chapter">Extending pysmb For Other Frameworks</a></p>
53 <h3>This Page</h3>
54 <ul class="this-page-menu">
55 <li><a href="../_sources/api/smb_exceptions.txt"
56 rel="nofollow">Show Source</a></li>
57 </ul>
58 <div id="searchbox" style="display: none">
53 <div role="note" aria-label="source link">
54 <h3>This Page</h3>
55 <ul class="this-page-menu">
56 <li><a href="../_sources/api/smb_exceptions.txt"
57 rel="nofollow">Show Source</a></li>
58 </ul>
59 </div>
60 <div id="searchbox" style="display: none" role="search">
5961 <h3>Quick search</h3>
6062 <form class="search" action="../search.html" method="get">
6163 <input type="text" name="q" />
7476 <div class="document">
7577 <div class="documentwrapper">
7678 <div class="bodywrapper">
77 <div class="body">
79 <div class="body" role="main">
7880
7981 <div class="section" id="smb-exceptions">
8082 <h1>SMB Exceptions<a class="headerlink" href="#smb-exceptions" title="Permalink to this headline">¶</a></h1>
8183 <dl class="class">
8284 <dt id="smb.base.SMBTimeout">
83 <em class="property">class </em><tt class="descclassname">smb.base.</tt><tt class="descname">SMBTimeout</tt><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>
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>
8486 <dd><p>Raised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.</p>
8587 </dd></dl>
8688
8789 <dl class="class">
8890 <dt id="smb.base.NotReadyError">
89 <em class="property">class </em><tt class="descclassname">smb.base.</tt><tt class="descname">NotReadyError</tt><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>
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>
9092 <dd><p>Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)</p>
9193 </dd></dl>
9294
9395 <dl class="class">
9496 <dt id="smb.base.NotConnectedError">
95 <em class="property">class </em><tt class="descclassname">smb.base.</tt><tt class="descname">NotConnectedError</tt><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>
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>
9698 <dd><p>Raised when underlying SMB connection has been disconnected or not connected yet</p>
9799 </dd></dl>
98100
99101 <dl class="class">
100102 <dt id="smb.smb_structs.UnsupportedFeature">
101 <em class="property">class </em><tt class="descclassname">smb.smb_structs.</tt><tt class="descname">UnsupportedFeature</tt><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>
103 <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>
102104 <dd><p>Raised when an supported feature is present/required in the protocol but is not
103105 currently supported by pysmb</p>
104106 </dd></dl>
105107
106108 <dl class="class">
107109 <dt id="smb.smb_structs.ProtocolError">
108 <em class="property">class </em><tt class="descclassname">smb.smb_structs.</tt><tt class="descname">ProtocolError</tt><big>(</big><em>message</em>, <em>data_buf=None</em>, <em>smb_message=None</em><big>)</big><a class="reference internal" href="../_modules/smb/smb_structs.html#ProtocolError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.ProtocolError" title="Permalink to this definition">¶</a></dt>
110 <em class="property">class </em><code class="descclassname">smb.smb_structs.</code><code class="descname">ProtocolError</code><span class="sig-paren">(</span><em>message</em>, <em>data_buf=None</em>, <em>smb_message=None</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/smb_structs.html#ProtocolError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.ProtocolError" title="Permalink to this definition">¶</a></dt>
109111 <dd></dd></dl>
110112
111113 <dl class="class">
112114 <dt id="smb.smb_structs.OperationFailure">
113 <em class="property">class </em><tt class="descclassname">smb.smb_structs.</tt><tt class="descname">OperationFailure</tt><big>(</big><em>message</em>, <em>smb_messages</em><big>)</big><a class="reference internal" href="../_modules/smb/smb_structs.html#OperationFailure"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.OperationFailure" title="Permalink to this definition">¶</a></dt>
115 <em class="property">class </em><code class="descclassname">smb.smb_structs.</code><code class="descname">OperationFailure</code><span class="sig-paren">(</span><em>message</em>, <em>smb_messages</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/smb_structs.html#OperationFailure"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.OperationFailure" title="Permalink to this definition">¶</a></dt>
114116 <dd></dd></dl>
115117
116118 </div>
121123 </div>
122124 <div class="clearer"></div>
123125 </div>
124 <div class="related">
126 <div class="related" role="navigation" aria-label="related navigation">
125127 <h3>Navigation</h3>
126128 <ul>
127129 <li class="right" style="margin-right: 10px">
133135 <li class="right" >
134136 <a href="smb_SharedFile.html" title="SharedFile Class"
135137 >previous</a> |</li>
136 <li><a href="../index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
138 <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
137139 </ul>
138140 </div>
139 <div class="footer">
141 <div class="footer" role="contentinfo">
140142 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
141 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
143 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
142144 </div>
143145 </body>
144146 </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.15 documentation</title>
8 <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="index.html" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
2626 <link rel="prev" title="SMB Exceptions" href="api/smb_exceptions.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3535 <li class="right" >
3636 <a href="api/smb_exceptions.html" title="SMB Exceptions"
3737 accesskey="P">previous</a> |</li>
38 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
38 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
3939 </ul>
4040 </div>
41 <div class="sphinxsidebar">
41 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4242 <div class="sphinxsidebarwrapper">
4343 <h4>Previous topic</h4>
4444 <p class="topless"><a href="api/smb_exceptions.html"
4545 title="previous chapter">SMB Exceptions</a></p>
46 <h3>This Page</h3>
47 <ul class="this-page-menu">
48 <li><a href="_sources/extending.txt"
49 rel="nofollow">Show Source</a></li>
50 </ul>
51 <div id="searchbox" style="display: none">
46 <div role="note" aria-label="source link">
47 <h3>This Page</h3>
48 <ul class="this-page-menu">
49 <li><a href="_sources/extending.txt"
50 rel="nofollow">Show Source</a></li>
51 </ul>
52 </div>
53 <div id="searchbox" style="display: none" role="search">
5254 <h3>Quick search</h3>
5355 <form class="search" action="search.html" method="get">
5456 <input type="text" name="q" />
6769 <div class="document">
6870 <div class="documentwrapper">
6971 <div class="bodywrapper">
70 <div class="body">
72 <div class="body" role="main">
7173
7274 <div class="section" id="extending-pysmb-for-other-frameworks">
7375 <h1>Extending pysmb For Other Frameworks<a class="headerlink" href="#extending-pysmb-for-other-frameworks" title="Permalink to this headline">¶</a></h1>
101103 </div>
102104 <div class="clearer"></div>
103105 </div>
104 <div class="related">
106 <div class="related" role="navigation" aria-label="related navigation">
105107 <h3>Navigation</h3>
106108 <ul>
107109 <li class="right" style="margin-right: 10px">
110112 <li class="right" >
111113 <a href="api/smb_exceptions.html" title="SMB Exceptions"
112114 >previous</a> |</li>
113 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
115 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
114116 </ul>
115117 </div>
116 <div class="footer">
118 <div class="footer" role="contentinfo">
117119 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
118 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
120 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
119121 </div>
120122 </body>
121123 </html>
66 <head>
77 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
88
9 <title>Index &mdash; pysmb 1.1.15 documentation</title>
9 <title>Index &mdash; pysmb 1.1.18 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.15',
17 VERSION: '1.1.18',
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.15 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3333 <a href="#" title="General Index"
3434 accesskey="I">index</a></li>
35 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
35 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
3636 </ul>
3737 </div>
38 <div class="sphinxsidebar">
38 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
3939 <div class="sphinxsidebarwrapper">
4040
4141
4242
43 <div id="searchbox" style="display: none">
43 <div id="searchbox" style="display: none" role="search">
4444 <h3>Quick search</h3>
4545 <form class="search" action="search.html" method="get">
4646 <input type="text" name="q" />
5959 <div class="document">
6060 <div class="documentwrapper">
6161 <div class="bodywrapper">
62 <div class="body">
62 <div class="body" role="main">
6363
6464
6565 <h1 id="index">Index</h1>
438438
439439 </dl></dd>
440440
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
441447 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFile">retrieveFile() (smb.SMBConnection.SMBConnection method)</a>
442448 </dt>
443449
447453 </dt>
448454
449455 </dl></dd>
450 </dl></td>
451 <td style="width: 33%" valign="top"><dl>
452456
453457 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFileFromOffset">retrieveFileFromOffset() (smb.SMBConnection.SMBConnection method)</a>
454458 </dt>
565569 </div>
566570 <div class="clearer"></div>
567571 </div>
568 <div class="related">
572 <div class="related" role="navigation" aria-label="related navigation">
569573 <h3>Navigation</h3>
570574 <ul>
571575 <li class="right" style="margin-right: 10px">
572576 <a href="#" title="General Index"
573577 >index</a></li>
574 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
578 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
575579 </ul>
576580 </div>
577 <div class="footer">
581 <div class="footer" role="contentinfo">
578582 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
579 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
583 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
580584 </div>
581585 </body>
582586 </html>
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.15 documentation</title>
8 <title>Welcome to pysmb’s documentation! &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="#" />
25 <link rel="top" title="pysmb 1.1.18 documentation" href="#" />
2626 <link rel="next" title="NBNSProtocol Class" href="api/nmb_NBNSProtocol.html" />
2727 </head>
28 <body>
29 <div class="related">
28 <body role="document">
29 <div class="related" role="navigation" aria-label="related navigation">
3030 <h3>Navigation</h3>
3131 <ul>
3232 <li class="right" style="margin-right: 10px">
3535 <li class="right" >
3636 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
3737 accesskey="N">next</a> |</li>
38 <li><a href="#">pysmb 1.1.15 documentation</a> &raquo;</li>
38 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li>
3939 </ul>
4040 </div>
41 <div class="sphinxsidebar">
41 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4242 <div class="sphinxsidebarwrapper">
4343 <h3><a href="#">Table Of Contents</a></h3>
4444 <ul>
5555 <h4>Next topic</h4>
5656 <p class="topless"><a href="api/nmb_NBNSProtocol.html"
5757 title="next chapter">NBNSProtocol Class</a></p>
58 <h3>This Page</h3>
59 <ul class="this-page-menu">
60 <li><a href="_sources/index.txt"
61 rel="nofollow">Show Source</a></li>
62 </ul>
63 <div id="searchbox" style="display: none">
58 <div role="note" aria-label="source link">
59 <h3>This Page</h3>
60 <ul class="this-page-menu">
61 <li><a href="_sources/index.txt"
62 rel="nofollow">Show Source</a></li>
63 </ul>
64 </div>
65 <div id="searchbox" style="display: none" role="search">
6466 <h3>Quick search</h3>
6567 <form class="search" action="search.html" method="get">
6668 <input type="text" name="q" />
7981 <div class="document">
8082 <div class="documentwrapper">
8183 <div class="bodywrapper">
82 <div class="body">
84 <div class="body" role="main">
8385
8486 <div class="section" id="welcome-to-pysmb-s-documentation">
8587 <h1>Welcome to pysmb&#8217;s documentation!<a class="headerlink" href="#welcome-to-pysmb-s-documentation" title="Permalink to this headline">¶</a></h1>
188190 </ul>
189191 </div>
190192 <ul class="simple">
191 <li><a class="reference internal" href="genindex.html"><em>Index</em></a></li>
192 <li><a class="reference internal" href="search.html"><em>Search Page</em></a></li>
193 <li><a class="reference internal" href="genindex.html"><span>Index</span></a></li>
194 <li><a class="reference internal" href="search.html"><span>Search Page</span></a></li>
193195 </ul>
194196 </div>
195197
199201 </div>
200202 <div class="clearer"></div>
201203 </div>
202 <div class="related">
204 <div class="related" role="navigation" aria-label="related navigation">
203205 <h3>Navigation</h3>
204206 <ul>
205207 <li class="right" style="margin-right: 10px">
208210 <li class="right" >
209211 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
210212 >next</a> |</li>
211 <li><a href="#">pysmb 1.1.15 documentation</a> &raquo;</li>
213 <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li>
212214 </ul>
213215 </div>
214 <div class="footer">
216 <div class="footer" role="contentinfo">
215217 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
216 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
218 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
217219 </div>
218220 </body>
219221 </html>
Binary diff not shown
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
77
8 <title>Search &mdash; pysmb 1.1.15 documentation</title>
8 <title>Search &mdash; pysmb 1.1.18 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.15',
16 VERSION: '1.1.18',
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.15 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
2727 <script type="text/javascript">
2828 jQuery(function() { Search.loadIndex("searchindex.js"); });
2929 </script>
3232
3333
3434 </head>
35 <body>
36 <div class="related">
35 <body role="document">
36 <div class="related" role="navigation" aria-label="related navigation">
3737 <h3>Navigation</h3>
3838 <ul>
3939 <li class="right" style="margin-right: 10px">
4040 <a href="genindex.html" title="General Index"
4141 accesskey="I">index</a></li>
42 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
42 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
45 <div class="sphinxsidebar">
45 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
4646 <div class="sphinxsidebarwrapper">
4747 </div>
4848 </div>
5050 <div class="document">
5151 <div class="documentwrapper">
5252 <div class="bodywrapper">
53 <div class="body">
53 <div class="body" role="main">
5454
5555 <h1 id="search-documentation">Search</h1>
5656 <div id="fallback" class="admonition warning">
8181 </div>
8282 <div class="clearer"></div>
8383 </div>
84 <div class="related">
84 <div class="related" role="navigation" aria-label="related navigation">
8585 <h3>Navigation</h3>
8686 <ul>
8787 <li class="right" style="margin-right: 10px">
8888 <a href="genindex.html" title="General Index"
8989 >index</a></li>
90 <li><a href="index.html">pysmb 1.1.15 documentation</a> &raquo;</li>
90 <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
9191 </ul>
9292 </div>
93 <div class="footer">
93 <div class="footer" role="contentinfo">
9494 &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
95 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
95 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
9696 </div>
9797 </body>
9898 </html>
0 Search.setIndex({envversion:42,terms:{all:[8,0,7],code:2,jason:[4,9],illustr:[8,7,2],queri:[4,0,8,9,7],follow:[7,0,2,8,1],whose:0,accur:8,depend:0,listen_port:[4,9],netbiostimeout:9,service_nam:[8,7],send:[4,7,8,9],those:8,under:0,sha256:0,arbitari:[8,7],fh2:2,last_write_tim:3,sourc:[0,1,3,4,6,7,8,9],string:[8,1,2,3,4,7,9],fals:[4,7,8,9],util:[8,7],mechan:[8,7],fileretriev:8,failur:9,miketeo:0,administr:1,meant:7,list:[4,0,8,9,7],upload:[8,7,2],smb:[],"try":[8,5,7],upload_fil:2,concurr:[8,7],ddd:[4,9],pleas:0,sign_when_requir:[8,7],direct:[8,7],sign:[8,7],deletedirectori:[8,7],zero:[4,7,8,9],nbn:[4,0],pass:[8,7,2],sock_famili:7,client_machine_nam:[8,7],port:[4,7,8,9],compat:[8,7],index:0,what:[4,5,8,9,7],sub:[8,7],repli:[4,7,8,9],section:0,invok:[8,7],access:[8,7,3],delet:[8,7,2],version:0,u32:0,"new":[4,5,8,7],net:0,method:[8,2,3,4,5,7,9],urlerror:2,hash:0,gener:5,never:[8,7],my_nam:[8,7],lgpl:0,modif:3,address:[4,0,2,9,5],path:[8,7,2],modifi:0,sinc:3,valu:[8,7,3],wait:[4,8,9,6],search:[8,0,7],zone:[8,7],host:[8,7,2],queue:8,datetim:[8,7],nmb:[4,0,9],implement:[0,4,5,7,8,9],stoplisten:9,overrid:[8,5],via:[8,0,9,3],regardless:[8,7],ntlmv2:[8,0,7],ntlmv1:[8,0,7],appli:[8,7],modul:[8,0,7],filenam:[8,7,3],"boolean":[4,7,8,9],listshar:[8,7],instal:[8,0,7],txt:[8,7,2],establish:[8,7],select:[4,7,8,9],from:[0,2,4,5,7,8,9],proceed:[8,7],commun:[7,0,8,1],next:7,call:[8,3,4,5,7,9],isreadonli:3,type:1,until:[4,7,8],more:[7,0,8,3,5],sort:7,relat:0,sambda:[8,7],flag:[4,7,8,9],accept:[8,5],known:[8,7],obj:[8,7],must:[8,7,9],none:[8,1,3,4,6,7,9],retriev:[8,7,2],setup:[4,5,8,9],dmitri:0,archiv:[8,7],can:[0,1,2,4,5,7,8,9],learn:[8,7],purpos:0,def:8,control:[8,7],defer:[8,9],process:[5,2],share:[0,1,2,3,8,7],sharedfil:[],indic:[],want:[8,0],opensourc:0,unsign:0,occur:[8,7,6],addcallback:[8,9],alwai:0,multipl:[8,7],secur:0,namedtemporaryfil:[8,7],snippet:2,"__init__":[4,5,8,9,7],pure:0,reject:[8,7],onauthfail:[8,5],simpl:[8,7],old_path:[8,7],dialect:0,resourc:[4,7,8,3],remote_nam:[8,5,7],referenc:0,sp3:0,befor:[8,7],wrong:5,mai:[8,7],end:[8,7],smb_ext_file_attr:3,data:[7,0,2,8,5],alloc:3,"short":3,attempt:7,read:[0,2,3,8,5,7],bind:[4,9],credenti:[8,7],correspond:3,element:[8,7],callback:[8,5,9],allow:[8,7,9],fallback:[8,7],origin:[8,7,3],over:[8,0,7],file_s:[8,3],queryipfornam:[4,9],through:8,digest:0,paramet:[0,2,4,5,7,8,9],getattribut:[8,7],write:[8,5,7],style:0,disconnect:[8,7,6],window:[8,0,2,3,7],persist:1,hidden:[8,7],main:0,might:[8,7],shareddevic:[],non:[8,7],within:[8,0,7],"return":[0,1,2,3,4,7,8,9],thei:0,python:[8,0,2,7],auto:[8,7],safe:[8,7],auth:8,dat:2,framework:[],promis:0,facilit:0,now:5,myuserid:2,choic:[8,7],term:0,name:[0,1,2,3,4,7,8,9],edit:[8,7],ntlm:[8,0,5],userid:[8,7],authent:[7,0,8,6,5],separ:0,mode:[4,9],timeout:[4,7,8,9,6],each:[4,7,8,3,1],done:[4,9],unicod:[8,7,2,3,1],side:0,truncat:7,errback:[8,9],prohibit:3,domain:[8,0,7],smbtimeout:[8,6],individu:8,instiant:[4,9],continu:[8,7],connect:[8,5,6,7],todd:0,special:1,out:[8,7],network:[4,0,8,9,7],"3rd":0,space:[8,7],ntlmssp:0,content:[],suitabl:[0,7],rel:[8,7],internet:[8,9],print:[8,0],determin:[4,0,8,9,7],forth:1,factori:8,after:[4,0,8,9,7],insid:[8,7],querynam:[4,9],differ:[7,0,8,5],free:[4,0,9],standard:[4,0,9],base:[0,1,3,8,5,6,7],connecttcp:8,releas:[4,7],"byte":[8,7,3],earliest:8,asn:0,md4:0,care:5,english:[8,7],last_access_tim:3,could:[0,3],synchron:[0,5],success:[5,7],keep:7,filter:[8,7],length:3,place:0,due:5,first:[8,7,2],oper:[0,4,5,6,7,8],softwar:0,directli:[8,3],enterpris:[8,7],onc:[8,5],number:[4,7,8,9,3],yourself:0,alreadi:7,"\u5783\u573e\u6587\u4ef6":2,messag:[8,0,6,7],path_file_pattern:[8,7],open:[8,0,2,7],size:[8,3],guess:[8,7],notreadyerror:[8,6],system:[8,7],least:7,max_length:[8,7],too:7,termin:[8,7],conveni:[8,7,3],store:[8,7,3],listen:[4,9],udp:[4,9],copi:[8,0,7],specifi:[4,7,8,9],broadcast:[4,9],part:5,pars:0,packet:[4,5,8,9],than:[8,7],aaa:[4,9],target:[4,9],provid:[0,2,4,5,7,8,9],remov:9,second:[4,8,9,3],charact:[8,7,2,3],project:[8,0,9],reus:8,sign_nev:[8,7],posit:[8,7],seri:8,"function":[4,0,8,9],comput:[8,7],arg:8,ani:[4,0,8,3,7],smb1:[8,0,7],packag:[],netbiossess:0,have:[7,0,9,5],close:[4,7,2,8],need:[0,2,3,8,5,7],smb2_constant:0,seek:[8,7],bitwis:[8,7],inform:[8,7,3,1],support_smb2:[8,7],self:[8,5],comm_devic:1,click:[8,7],note:[],also:[8,7,1],discret:0,take:[0,5],which:[0,3,4,5,7,8,9],transmit:8,mit:0,singl:[8,7,1],begin:[8,7],unless:[4,9],usernam:[8,7],who:[8,0,7],smb_file_attribute_xxx:[8,7],most:[7,0,8,5],regular:[8,7],renam:[8,7],url:[0,2],request:[8,7],doe:[8,0,3,7],snapshot:[8,7],wildcard:[8,7],neg:[8,7],usual:[7,0,8,3,5],microsoft:0,dot:[4,9],reactor:[8,9],netbiosprotocol:[0,9],server_nam:[8,7],session:[0,5],identifi:[8,7],find:[8,5,7],involv:5,current:6,onli:[8,0,2,3,7],configur:[8,7],should:[4,7,8,9,3],busi:[8,7],folder:[8,0,2,3,7],local:[8,7],hope:[4,9],overwritten:[8,7],disk_tre:1,listenudp:9,contribut:[4,9],variou:0,notat:[4,9,3],familiar:0,interprocess:1,cannot:[8,7,2],listsnapshot:[8,7],requir:[8,7,6],enabl:[8,7],organ:0,held:7,"public":8,sha:0,integr:[0,1],contain:[0,1,3,4,7,8],feeddata:5,where:[8,0,3,7],respond:7,set:[8,7],storefilefromoffset:7,rfc1001:[8,7,2],deletefil:[8,7],see:[8,7,3],sec:8,result:[8,7,9],respons:6,fail:[8,5,6,7],reserv:1,asynchron:[5,9,7],detect:[8,7],new_path:[8,7],pattern:[8,7],user:[8,7,1],retrievefilefromoffset:[8,7],written:[8,7],smb_constant:[8,0,7],between:0,"import":[8,0,2,7],across:[8,7],attribut:[8,7,3],parent:2,tempfil:[8,7],sign_opt:[8,7],entir:8,come:0,both:[8,7],last:3,is_direct_tcp:[8,7],admin:1,alon:0,against:0,constructor:5,etc:8,instanc:[4,7,8,9,3],onnmbsessionfail:5,freeli:[8,7],isusingsmb2:[8,7],comment:1,simpli:2,technic:5,point:2,instanti:[4,8,9,3],"\u6d4b\u8bd5\u6587\u4ef6\u5939":2,last_attr_change_tim:3,period:8,except:[],securityblob:0,onauthok:[8,5],wider:[8,7],ultim:[8,7],rozmanov:0,short_nam:3,devic:[3,1],isreadi:8,been:[7,0,8,6,5],compon:[8,7,2],operationfailur:[8,7,6],server_ip:[8,7],immedi:[8,7],use_ntlm_v2:[8,5,7],dixon:0,smb_struct:[8,0,6,7],thousand:8,wish:[4,7],assert:7,togeth:0,present:6,"case":8,look:0,sign_when_support:[8,7],servic:[4,0,7,8,5],properti:[8,7,3],batch:8,defin:[4,9],"while":6,abov:5,error:[8,5,7],report:5,gmt:[8,7],loop:5,readi:[8,6],alloc_s:3,henc:[8,0,7],site:0,kwarg:8,incom:9,ascii:[8,7],conn:7,precis:8,isdirectori:3,develop:[0,3,7],perform:[4,5,8,9,7],parti:0,isspeci:1,same:[8,7],proce:8,decod:0,create_tim:3,conflict:0,complet:[8,0,6,7],closeconnect:8,hostnam:2,keepal:7,director:2,remot:[8,1,3,4,5,7],rais:[8,7,2,9,6],temporari:1,initi:[5,1],protocolerror:6,chang:3,excee:8,appropri:[4,9],entri:3,well:0,without:[0,9],command:[8,7],thi:[0,1,3,4,5,7,8,9],choos:[8,7],file_obj:[8,7],sequenti:7,ccc:[4,9],latest:0,protocol:[8,0,6,7],just:[8,9],mypassword:2,createdirectori:[8,7],tcp:[8,5,7],notconnectederror:[8,6],touch:[4,8,9],yet:6,iana:[4,9],storefil:[8,7],web:0,samba:0,expos:8,adderrback:8,param:[],add:[8,9],valid:2,blob:0,exercis:0,els:[8,7],subsequ:2,match:[4,7,8,9],retrievefilefactori:8,applic:[4,0,8,9,3],around:9,handl:[8,5],thoma:0,know:[4,8,9],bit:[8,0,7],password:[8,7],like:[8,7,2],specif:0,integ:[0,3,4,7,8,9],server:[0,1,3,8,5,7],build_open:2,print_queu:1,either:[8,7],page:[0,5],underli:[4,0,8,6,7],encount:[7,3],right:[8,7],old:[8,7],often:5,captur:[8,7],acknowledg:8,interv:8,linux:0,some:[8,0,7],back:[4,7,8,9],intern:[8,0,5],istemporari:1,successfulli:[8,7],transport:[8,0,9],total:3,smbtest:[8,7],avoid:8,smb2_struct:0,sharedfold:2,subclass:[8,5],buffer:5,retri:8,leav:[4,7,8,9],ipv4:4,pysmb:[],refer:[7,0,8,1],machin:[0,2,4,7,8,9],object:[8,7,2],shadow:[8,7],workgroup:[8,7],atttempt:7,step:5,loseconnect:8,offset:[8,7],post:[8,5],impos:[8,7],describ:[5,7],about:[8,7,3,1],actual:7,socket:[4,5,7],idl:7,pymsb:8,commerci:0,mean:8,pyasn1:0,disabl:[8,7],block:[4,0,9,7],routin:0,client:[8,0,7],own:[8,0,5],"float":[4,8,9,3],encod:0,automat:[4,7,8,9],bbb:[4,9],empti:[8,2,3,4,7,9],wrap:9,opportun:8,your:[0,3,4,5,7,8,9],local_fil:2,transfer:[8,0],ipc:1,"long":[8,7,3],smb_messag:6,avail:[8,0,7],start:[8,7,9],anderson:[4,9],includ:[0,5],files:7,creation:[3,1],interest:[8,7],tupl:[8,7],whiteman:0,translat:0,newer:[8,7],"true":[8,1,3,4,7,9],utc:[8,7],made:[8,0,7],utf:2,cif:[0,3,4,5,6,7,8],possibl:0,whether:[8,7],pyde:0,maximum:[8,7],"60kbyte":8,limit:[8,7,3],otherwis:[8,7],listpath:[8,7,3],netbio:[],credienti:8,featur:[8,7,6],constant:[0,1],creat:[8,2,4,5,7,9],"int":[8,7],cover:0,"abstract":0,unsupportedfeatur:6,twist:[8,0,9],incomplet:5,exist:[8,7,2],file:[0,1,2,3,8,5,7],download:[8,0],write_result:8,echo:[8,7],again:9,vista:[8,0,7],encrypt:0,googl:0,retrievefil:[8,7],when:[0,4,5,6,7,8,9],detail:[0,3,5],data_buf:6,"default":[8,7],other:[],librari:0,test:0,you:[0,2,3,4,5,7,8,9],functionl:8,smbprotocol:[8,0,3],file_attribut:[8,7,3],urllib2:[0,2],authenthent:8,briefli:5,receiv:[4,7,8,9],eof:[8,7],algorithm:[7,0,8,5],directori:[8,7,2,3],descript:[],alphanumer:[8,7],itself:[8,0],pathnam:[8,7],time:[7,0,8,3,1],file_fh:2},objtypes:{"0":"py:attribute","1":"py:method","2":"py:class"},objnames:{"0":["py","attribute","Python attribute"],"1":["py","method","Python method"],"2":["py","class","Python class"]},filenames:["index","api/smb_SharedDevice","api/smb_SMBHandler","api/smb_SharedFile","api/nmb_NetBIOS","extending","api/smb_exceptions","api/smb_SMBConnection","api/smb_SMBProtocolFactory","api/nmb_NBNSProtocol"],titles:["Welcome to pysmb&#8217;s documentation!","SharedDevice Class","SMbHandler Class","SharedFile Class","NetBIOS class","Extending pysmb For Other Frameworks","SMB Exceptions","SMBConnection Class","SMBProtocolFactory Class","NBNSProtocol Class"],objects:{"nmb.NetBIOS":{NetBIOS:[4,2,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[9,2,1,""],NetBIOSTimeout:[9,2,1,""]},"smb.SMBProtocol":{SMBProtocolFactory:[8,2,1,""]},"nmb.NetBIOS.NetBIOS":{close:[4,1,1,""],queryName:[4,1,1,""],"__init__":[4,1,1,""],queryIPForName:[4,1,1,""]},"smb.base":{SharedDevice:[1,2,1,""],NotConnectedError:[6,2,1,""],SharedFile:[3,2,1,""],SMBTimeout:[6,2,1,""],NotReadyError:[6,2,1,""]},"smb.SMBConnection.SMBConnection":{rename:[7,1,1,""],deleteDirectory:[7,1,1,""],listSnapshots:[7,1,1,""],deleteFiles:[7,1,1,""],SIGN_WHEN_REQUIRED:[7,0,1,""],listShares:[7,1,1,""],storeFileFromOffset:[7,1,1,""],SIGN_WHEN_SUPPORTED:[7,0,1,""],retrieveFileFromOffset:[7,1,1,""],SIGN_NEVER:[7,0,1,""],listPath:[7,1,1,""],getAttributes:[7,1,1,""],storeFile:[7,1,1,""],connect:[7,1,1,""],close:[7,1,1,""],createDirectory:[7,1,1,""],echo:[7,1,1,""],retrieveFile:[7,1,1,""],"__init__":[7,1,1,""],isUsingSMB2:[7,0,1,""]},"smb.base.SharedFile":{short_name:[3,0,1,""],last_access_time:[3,0,1,""],isReadOnly:[3,0,1,""],last_attr_change_time:[3,0,1,""],last_write_time:[3,0,1,""],file_attributes:[3,0,1,""],filename:[3,0,1,""],isDirectory:[3,0,1,""],create_time:[3,0,1,""],file_size:[3,0,1,""],alloc_size:[3,0,1,""]},"smb.SMBProtocol.SMBProtocolFactory":{rename:[8,1,1,""],isReady:[8,0,1,""],echo:[8,1,1,""],listPath:[8,1,1,""],"__init__":[8,1,1,""],deleteDirectory:[8,1,1,""],listSnapshots:[8,1,1,""],SIGN_NEVER:[8,0,1,""],instance:[8,0,1,""],storeFile:[8,1,1,""],isUsingSMB2:[8,0,1,""],SIGN_WHEN_SUPPORTED:[8,0,1,""],listShares:[8,1,1,""],retrieveFileFromOffset:[8,1,1,""],onAuthFailed:[8,1,1,""],retrieveFile:[8,1,1,""],getAttributes:[8,1,1,""],closeConnection:[8,1,1,""],SIGN_WHEN_REQUIRED:[8,0,1,""],onAuthOK:[8,1,1,""],createDirectory:[8,1,1,""],deleteFiles:[8,1,1,""]},"smb.SMBConnection":{SMBConnection:[7,2,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{queryName:[9,1,1,""],"__init__":[9,1,1,""],queryIPForName:[9,1,1,""]},"smb.smb_structs":{UnsupportedFeature:[6,2,1,""],ProtocolError:[6,2,1,""],OperationFailure:[6,2,1,""]},"smb.base.SharedDevice":{isSpecial:[1,0,1,""],type:[1,0,1,""],comments:[1,0,1,""],isTemporary:[1,0,1,""],name:[1,0,1,""]}},titleterms:{smb2:[8,7],sharedfil:3,indic:0,packag:0,tabl:0,content:0,welcom:0,support:[8,7],except:6,note:2,other:5,pysmb:[0,5],document:0,smb:6,shareddevic:1,extend:5,framework:5,smbprotocolfactori:8,"class":[8,1,2,3,4,7,9],nbnsprotocol:9,smbconnect:7,descript:0,credit:0,exampl:[8,7,2],caveat:[8,7],smbhandler:2,licens:0,netbio:4}})
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}})
223223 def getAttributes(self, service_name, path, timeout = 30):
224224 """
225225 Retrieve information about the file at *path* on the *service_name*.
226
226
227227 :param string/unicode service_name: the name of the shared folder for the *path*
228228 :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.
229229 :return: A :doc:`smb.base.SharedFile<smb_SharedFile>` instance containing the attributes of the file.
300300 self.is_busy = False
301301
302302 return results[0]
303
303
304304 def storeFile(self, service_name, path, file_obj, timeout = 30):
305305 """
306306 Store the contents of the *file_obj* at *path* on the *service_name*.
383383 It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
384384 This function is very helpful when deleting files/folders that are read-only.
385385 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
386387 :param string/unicode service_name: Contains the name of the shared folder.
387388 :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
388 Wildcards may be used in th filename component of the path.
389 Wildcards may be used in the filename component of the path.
389390 If your path/filename contains non-English characters, you must pass in an unicode string.
390391 :return: None
391392 """
383383 It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
384384 This function is very helpful when deleting files/folders that are read-only.
385385 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
386387 :param string/unicode service_name: Contains the name of the shared folder.
387388 :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
388 Wildcards may be used in th filename component of the path.
389 Wildcards may be used in the filename component of the path.
389390 If your path/filename contains non-English characters, you must pass in an unicode string.
390391 :return: None
391392 """
4848 # built documents.
4949 #
5050 # The short X.Y version.
51 version = '1.1.15'
51 version = '1.1.18'
5252 # The full version, including alpha/beta/rc tags.
53 release = '1.1.15'
53 release = '1.1.18'
5454
5555 # The language for content autogenerated by Sphinx. Refer to documentation
5656 # for a list of supported languages.