Codebase list pysmb / fdd3bdc
Add getAttributes() method to SMBConnection and SMBProtocolFactory class Add isReadOnly property to SharedFile class Michael Teo 9 years ago
56 changed file(s) with 13979 addition(s) and 693 deletion(s). Raw diff Collapse all Expand all
0
1 pysmb-1.1.10, 29 Jun 2014
2 =========================
3
4 - Add getAttributes() method to SMBConnection and SMBProtocol class
5 - Add isReadOnly property to SharedFile class
6
07 pysmb-1.1.9, 1 Jun 2014
18 =======================
29
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: f12178f8fe0cf450bc418892f72f8298
3 tags: fbb0d17656682115ca4d033fb2f83ba1
2 config: 7957001a5782e912cc1e1d91689e5bcd
3 tags: 645f666f9bcd5a90fca523b33c5a78b7
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>Overview: module code &mdash; pysmb 1.1.5 documentation</title>
8 <title>Overview: module code &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 </head>
2927 <body>
3028 <div class="related">
3331 <li class="right" style="margin-right: 10px">
3432 <a href="../genindex.html" title="General Index"
3533 accesskey="I">index</a></li>
36 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
34 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3735 </ul>
3836 </div>
3937 <div class="sphinxsidebar">
7977 <li class="right" style="margin-right: 10px">
8078 <a href="../genindex.html" title="General Index"
8179 >index</a></li>
82 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
80 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
8381 </ul>
8482 </div>
8583 <div class="footer">
86 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
87 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
84 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
85 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
8886 </div>
8987 </body>
9088 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>nmb.NetBIOS &mdash; pysmb 1.1.5 documentation</title>
8 <title>nmb.NetBIOS &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
6361
6462 <h1>Source code for nmb.NetBIOS</h1><div class="highlight"><pre>
6563 <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>
66 <span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">NBNS</span>
64 <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>
65 <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>
6766
6867 <span class="k">class</span> <span class="nc">NetBIOS</span><span class="p">(</span><span class="n">NBNS</span><span class="p">):</span>
6968 <div class="viewcode-block" id="NetBIOS"><a class="viewcode-back" href="../../api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS">[docs]</a>
121120
122121 <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>
123122
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>
125 <span class="sd"> Send a query to the machine with *ip* and hopes that the machine will reply back with its name.</span>
126
127 <span class="sd"> The implementation of this function is contributed by Jason Anderson.</span>
128
129 <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>
130 <span class="sd"> If the NBNSProtocol instance was instianted with broadcast=False, then you should provide a target IP to send the query.</span>
131 <span class="sd"> :param integer port: The NetBIOS-NS port (IANA standard defines this port to be 137). You should not touch this parameter unless you know what you are doing.</span>
132 <span class="sd"> :param integer/float timeout: Number of seconds to wait for a reply, after which the method will return None</span>
133 <span class="sd"> :return: A list of string containing the names of the machine at *ip*. On timeout, returns None.</span>
134 <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
137 <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>
138 <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>
139 <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>
140 <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pollForQueryPacket</span><span class="p">(</span><span class="n">trn_id</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
141 <span class="k">if</span> <span class="n">ret</span><span class="p">:</span>
142 <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>
143 <span class="k">else</span><span class="p">:</span>
144 <span class="k">return</span> <span class="bp">None</span>
145
124146 <span class="c">#</span>
125147 <span class="c"># Protected Methods</span>
126148 <span class="c">#</span>
127149
128150 <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>
129 <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>
151 <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>
130152 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
131153 <span class="k">try</span><span class="p">:</span>
132 <span class="n">_timeout</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">end_time</span>
154 <span class="n">_timeout</span> <span class="o">=</span> <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>
133155 <span class="k">if</span> <span class="n">_timeout</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
134156 <span class="k">return</span> <span class="bp">None</span>
135157
138160 <span class="k">return</span> <span class="bp">None</span>
139161
140162 <span class="n">data</span><span class="p">,</span> <span class="n">_</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">recvfrom</span><span class="p">(</span><span class="mh">0xFFFF</span><span class="p">)</span>
163 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
164 <span class="k">raise</span> <span class="n">NotConnectedError</span>
165
141166 <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>
167
168 <span class="k">if</span> <span class="n">trn_id</span> <span class="o">==</span> <span class="n">wait_trn_id</span><span class="p">:</span>
169 <span class="k">return</span> <span class="n">ret</span>
170 <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>
171 <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>
172 <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>
173 <span class="k">raise</span> <span class="n">ex</span>
174 <span class="k">else</span><span class="p">:</span>
175 <span class="k">raise</span> <span class="n">ex</span>
176
177 <span class="c">#</span>
178 <span class="c"># Contributed by Jason Anderson</span>
179 <span class="c">#</span>
180 <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>
181 <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>
182 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
183 <span class="k">try</span><span class="p">:</span>
184 <span class="n">_timeout</span> <span class="o">=</span> <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>
185 <span class="k">if</span> <span class="n">_timeout</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
186 <span class="k">return</span> <span class="bp">None</span>
187
188 <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">_timeout</span><span class="p">)</span>
189 <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
190 <span class="k">return</span> <span class="bp">None</span>
191
192 <span class="n">data</span><span class="p">,</span> <span class="n">_</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">recvfrom</span><span class="p">(</span><span class="mh">0xFFFF</span><span class="p">)</span>
193 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
194 <span class="k">raise</span> <span class="n">NotConnectedError</span>
195
196 <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>
142197
143198 <span class="k">if</span> <span class="n">trn_id</span> <span class="o">==</span> <span class="n">wait_trn_id</span><span class="p">:</span>
144199 <span class="k">return</span> <span class="n">ret</span>
161216 <li class="right" style="margin-right: 10px">
162217 <a href="../../genindex.html" title="General Index"
163218 >index</a></li>
164 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
219 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
165220 <li><a href="../index.html" >Module code</a> &raquo;</li>
166221 </ul>
167222 </div>
168223 <div class="footer">
169 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
170 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
224 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
225 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
171226 </div>
172227 </body>
173228 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.5 documentation</title>
8 <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
6563 <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>
6664 <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>
6765 <span class="kn">from</span> <span class="nn">twisted.internet.protocol</span> <span class="kn">import</span> <span class="n">DatagramProtocol</span>
66 <span class="kn">from</span> <span class="nn">nmb_constants</span> <span class="kn">import</span> <span class="n">TYPE_SERVER</span>
6867 <span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">NBNS</span>
68
69 <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>
6970
7071 <span class="k">class</span> <span class="nc">NetBIOSTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
7172 <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>
9192 <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>
9293 <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>
9394
94 <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="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)):</span></div>
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>
96 <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">from_info</span>
9597 <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>
9698
97 <span class="n">_</span><span class="p">,</span> <span class="n">_</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> <span class="bp">None</span><span class="p">)</span>
98 <span class="k">if</span> <span class="n">d</span><span class="p">:</span>
99 <span class="c"># pending transaction exists for trn_id - handle it and remove from queue</span>
100 <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>
101 <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>
102 <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="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>
99105 <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>
100106
101107 <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>
132138 <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>
133139 <span class="k">return</span> <span class="n">d</span>
134140
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>
143 <span class="sd"> Send a query to the machine with *ip* and hopes that the machine will reply back with its name.</span>
144
145 <span class="sd"> The implementation of this function is contributed by Jason Anderson.</span>
146
147 <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>
148 <span class="sd"> If the NBNSProtocol instance was instianted with broadcast=False, then you should provide a target IP to send the query.</span>
149 <span class="sd"> :param integer port: The NetBIOS-NS port (IANA standard defines this port to be 137). You should not touch this parameter unless you know what you are doing.</span>
150 <span class="sd"> :param integer/float timeout: Number of seconds to wait for a reply, after which the method will return None</span>
151 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of names of the machine at *ip*.</span>
152 <span class="sd"> On timeout, the errback function will be called with a Failure instance wrapping around a NetBIOSTimeout exception</span>
153 <span class="sd"> &quot;&quot;&quot;</span>
154 <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>
155 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
156 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">trn_id</span><span class="p">):</span>
157 <span class="k">break</span>
158 <span class="k">else</span><span class="p">:</span>
159 <span class="n">trn_id</span> <span class="o">=</span> <span class="p">(</span><span class="n">trn_id</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span>
160
161 <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>
162 <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>
163
164 <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>
165 <span class="n">d2</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
166 <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>
167
168 <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="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>
171
172 <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>
173 <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
135176 <span class="k">def</span> <span class="nf">stopProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
136177 <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>
137178
138179 <span class="k">def</span> <span class="nf">cleanupPendingTrns</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
139180 <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>
140 <span class="k">for</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="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_trns</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
141 <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">:</span>
142 <span class="k">del</span> <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>
143 <span class="k">try</span><span class="p">:</span>
144 <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">NetBIOSTimeout</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
145 <span class="k">except</span><span class="p">:</span> <span class="k">pass</span>
181
182 <span class="c"># reply should have been received in the past</span>
183 <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>
184
185 <span class="c"># remove expired items from dict + call errback</span>
186 <span class="k">def</span> <span class="nf">expire_item</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
187 <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>
188
189 <span class="k">del</span> <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>
190 <span class="k">try</span><span class="p">:</span>
191 <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">NetBIOSTimeout</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
192 <span class="k">except</span><span class="p">:</span> <span class="k">pass</span>
193
194 <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>
146195
147196 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="p">:</span>
148197 <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>
159208 <li class="right" style="margin-right: 10px">
160209 <a href="../../genindex.html" title="General Index"
161210 >index</a></li>
162 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
211 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
163212 <li><a href="../index.html" >Module code</a> &raquo;</li>
164213 </ul>
165214 </div>
166215 <div class="footer">
167 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
168 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
216 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
217 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
169218 </div>
170219 </body>
171220 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>smb.SMBConnection &mdash; pysmb 1.1.5 documentation</title>
8 <title>smb.SMBConnection &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
7270 <div class="viewcode-block" id="SMBConnection"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">[docs]</a>
7371 <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>
7472
75 <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>
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>
74 <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="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="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
79
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>
7681 <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>
7782 <span class="sd"> Create a new SMBConnection instance.</span>
7883
8085 <span class="sd"> File operations can only be proceeded after the connection has been authenticated successfully.</span>
8186
8287 <span class="sd"> Note that you need to call *connect* method to actually establish the SMB connection to the remote server and perform authentication.</span>
88
89 <span class="sd"> The default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
90 <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>
8391
8492 <span class="sd"> :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
8593 <span class="sd"> You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``</span>
9199 <span class="sd"> The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
92100 <span class="sd"> Hence, we can only &quot;guess&quot; or try both algorithms.</span>
93101 <span class="sd"> On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
94 <span class="sd"> &quot;&quot;&quot;</span>
95 <span class="n">SMB</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">use_ntlm_v2</span><span class="p">)</span>
102 <span class="sd"> :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
103 <span class="sd"> If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
104 <span class="sd"> If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
105 <span class="sd"> If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
106 <span class="sd"> :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
107 <span class="sd"> The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
108 <span class="sd"> &quot;&quot;&quot;</span>
109 <span class="n">SMB</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">use_ntlm_v2</span><span class="p">,</span> <span class="n">sign_options</span><span class="p">,</span> <span class="n">is_direct_tcp</span><span class="p">)</span>
96110 <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
97111 <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
98112 <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>
99114
100115 <span class="c">#</span>
101116 <span class="c"># SMB (and its superclass) Methods</span>
110125 <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>
111126 <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span>
112127 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
113 <span class="k">assert</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="o">==</span> <span class="n">data_len</span>
128 <span class="n">total_sent</span> <span class="o">=</span> <span class="mi">0</span>
129 <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>
130 <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>
131 <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="n">total_sent</span> <span class="o">=</span> <span class="n">total_sent</span> <span class="o">+</span> <span class="n">sent</span>
134
135 <span class="c">#</span>
136 <span class="c"># Misc Properties</span>
137 <span class="c">#</span>
138
139 <span class="nd">@property</span>
140 <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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span>
143
114144
115145 <span class="c">#</span>
116146 <span class="c"># Public Methods</span>
117147 <span class="c">#</span>
118148
119 <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="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>
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>
120150 <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>
121151 <span class="sd"> Establish the SMB connection to the remote SMB/CIFS server.</span>
122152
134164
135165 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
136166 <span class="k">try</span><span class="p">:</span>
137 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
167 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
168 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
169 <span class="k">else</span><span class="p">:</span>
170 <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
138171 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
139172 <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>
140173 <span class="k">finally</span><span class="p">:</span>
181214
182215 <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>
183216 <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>
184 <span class="n">pattern</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
217 <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>
185218 <span class="sd">&quot;&quot;&quot;</span>
186219 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
187220
215248
216249 <span class="k">return</span> <span class="n">results</span>
217250
251 <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>
252 <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>
253 <span class="sd"> Retrieve a list of available snapshots (shadow copies) for *path*.</span>
254
255 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
256
257 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
258 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
259 <span class="sd"> :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone</span>
260 <span class="sd"> &quot;&quot;&quot;</span>
261 <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>
262 <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>
263
264 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
265
266 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
267 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
268 <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
269
270 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
271 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
272 <span class="k">raise</span> <span class="n">failure</span>
273
274 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
275 <span class="k">try</span><span class="p">:</span>
276 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
277 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
278 <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>
279 <span class="k">finally</span><span class="p">:</span>
280 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
281
282 <span class="k">return</span> <span class="n">results</span>
283
284 <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>
285 <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>
286 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
287 <span class="sd"> </span>
288 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
289 <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>
290 <span class="sd"> :return: A :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
291 <span class="sd"> &quot;&quot;&quot;</span>
292 <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>
293 <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>
294
295 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
296
297 <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">info</span><span class="p">):</span>
298 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
299 <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
300
301 <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
302 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
303 <span class="k">raise</span> <span class="n">failure</span>
304
305 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
306 <span class="k">try</span><span class="p">:</span>
307 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
308 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
309 <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>
310 <span class="k">finally</span><span class="p">:</span>
311 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
312
313 <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
314
218315 <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>
219316 <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>
220317 <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>
221318
319 <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>
320
222321 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
223 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
322 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
224323 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
225 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes retrieved ).</span>
324 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
226325 <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>
227326 <span class="sd"> &quot;&quot;&quot;</span>
327 <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>
328
329 <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>
330 <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>
331 <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>
332
333 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
334 <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>
335 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* up to *max_length* number of bytes.</span>
336 <span class="sd"> :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
337 <span class="sd"> :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
338 <span class="sd"> If zero, the method returns immediately after the file is opened successfully for reading.</span>
339 <span class="sd"> :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
340 <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>
341 <span class="sd"> &quot;&quot;&quot;</span>
228342 <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>
229343 <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>
230344
240354
241355 <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
242356 <span class="k">try</span><span class="p">:</span>
243 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
357 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
244358 <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
245359 <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>
246360 <span class="k">finally</span><span class="p">:</span>
254368
255369 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
256370 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created. Otherwise, it will be overwritten.</span>
257 <span class="sd"> If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
371 <span class="sd"> If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
258372 <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>
259373 <span class="sd"> :return: Number of bytes uploaded</span>
260374 <span class="sd"> &quot;&quot;&quot;</span>
426540 <span class="c">#</span>
427541
428542 <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>
543 <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>
429544 <span class="n">read_len</span> <span class="o">=</span> <span class="mi">4</span>
430545 <span class="n">data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
431546
432547 <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>
433548 <span class="k">try</span><span class="p">:</span>
549 <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
550 <span class="k">raise</span> <span class="n">SMBTimeout</span>
551
434552 <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
435553 <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
436554 <span class="k">raise</span> <span class="n">SMBTimeout</span>
437555
438556 <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
557 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
558 <span class="k">raise</span> <span class="n">NotConnectedError</span>
559
439560 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
440561 <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>
441562 <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>
452573 <span class="n">read_len</span> <span class="o">=</span> <span class="n">length</span>
453574 <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>
454575 <span class="k">try</span><span class="p">:</span>
576 <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
577 <span class="k">raise</span> <span class="n">SMBTimeout</span>
578
455579 <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
456580 <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
457581 <span class="k">raise</span> <span class="n">SMBTimeout</span>
458582
459583 <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
584 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
585 <span class="k">raise</span> <span class="n">NotConnectedError</span>
586
460587 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
461588 <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>
462589 <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>
480607 <li class="right" style="margin-right: 10px">
481608 <a href="../../genindex.html" title="General Index"
482609 >index</a></li>
483 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
610 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
484611 <li><a href="../index.html" >Module code</a> &raquo;</li>
485612 </ul>
486613 </div>
487614 <div class="footer">
488 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
489 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
615 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
616 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
490617 </div>
491618 </body>
492619 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>smb.SMBProtocol &mdash; pysmb 1.1.5 documentation</title>
8 <title>smb.SMBProtocol &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
8381
8482 <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
8583 <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>
86 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
84 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
85 <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
86 <span class="k">else</span><span class="p">:</span>
87 <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
8788
8889 <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
8990 <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>
118119 <span class="k">def</span> <span class="nf">_cleanupPendingRequests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
119120 <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>
120121 <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>
121 <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">items</span><span class="p">():</span>
122 <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>
122123 <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>
123124 <span class="k">try</span><span class="p">:</span>
124125 <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>
133134 <span class="n">protocol</span> <span class="o">=</span> <span class="n">SMBProtocol</span>
134135 <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>
135136
136 <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>
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>
138 <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>
140 <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>
142 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
143
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>
137145 <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>
138 <span class="sd"> Create a new SMBProtocolFactory instance.</span>
146 <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>
147 <span class="sd"> Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
148 <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>
139149
140150 <span class="sd"> *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
141151 <span class="sd"> File operations can only be proceeded after the connection has been authenticated successfully.</span>
142152
143153 <span class="sd"> :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
144 <span class="sd"> You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``</span>
154 <span class="sd"> You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``.</span>
145155 <span class="sd"> :param string remote_name: The NetBIOS machine name of the remote server.</span>
146156 <span class="sd"> On windows, you can find out the machine name by right-clicking on the &quot;My Computer&quot; and selecting &quot;Properties&quot;.</span>
147157 <span class="sd"> This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</span>
150160 <span class="sd"> The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
151161 <span class="sd"> Hence, we can only &quot;guess&quot; or try both algorithms.</span>
152162 <span class="sd"> On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
163 <span class="sd"> :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
164 <span class="sd"> If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
165 <span class="sd"> If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
166 <span class="sd"> If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
167 <span class="sd"> :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
168 <span class="sd"> The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
153169 <span class="sd"> &quot;&quot;&quot;</span>
154170 <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
155171 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
157173 <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">=</span> <span class="n">remote_name</span>
158174 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">domain</span>
159175 <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>
176 <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>
177 <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>
160178 <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>
161179
162180 <span class="c">#</span>
167185 <span class="k">def</span> <span class="nf">isReady</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
168186 <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>
169187 <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>
188
189 <span class="nd">@property</span></div>
190 <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>
192 <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>
170193
171194 <span class="c">#</span>
172195 <span class="c"># Public Methods for Callbacks</span>
212235
213236 <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>
214237 <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>
215 <span class="n">pattern</span> <span class="o">=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</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>
216239 <span class="sd">&quot;&quot;&quot;</span>
217240 <span class="sd"> Retrieve a directory listing of files/folders at *path*</span>
218241
231254 <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>
232255 <span class="k">return</span> <span class="n">d</span>
233256
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>
259 <span class="sd"> Retrieve a list of available snapshots (a.k.a. shadow copies) for *path*.</span>
260
261 <span class="sd"> Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
262
263 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
264 <span class="sd"> :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
265 <span class="sd"> :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of python *datetime.DateTime*</span>
266 <span class="sd"> instances in GMT/UTC time zone</span>
267 <span class="sd"> &quot;&quot;&quot;</span>
268 <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>
270
271 <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>
272 <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>
277 <span class="sd"> Retrieve information about the file at *path* on the *service_name*.</span>
278 <span class="sd"> </span>
279 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
280 <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>
281 <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>
282 <span class="sd"> &quot;&quot;&quot;</span>
283 <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>
285
286 <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>
287 <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
234290 <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>
235291 <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>
236292 <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>
237293
294 <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>
295
238296 <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>
239297 <span class="sd"> of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
240298 <span class="sd"> The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
242300 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
243301 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
244302 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
245 <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 retrieved ).</span>
303 <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>
246304 <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>
247305 <span class="sd"> &quot;&quot;&quot;</span>
248 <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>
249 <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>
250
251 <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>
252 <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_retrieveFile</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>
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>
310 <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>
311
312 <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>
313 <span class="sd"> of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
314 <span class="sd"> The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
315
316 <span class="sd"> :param string/unicode service_name: the name of the shared folder for the *path*</span>
317 <span class="sd"> :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
318 <span class="sd"> :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
319 <span class="sd"> :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
320 <span class="sd"> :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
321 <span class="sd"> If zero, the *Deferred* callback is invoked immediately after the file is opened successfully for reading.</span>
322 <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>
323 <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>
324 <span class="sd"> &quot;&quot;&quot;</span>
325 <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>
327
328 <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>
329 <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>
253330 <span class="k">return</span> <span class="n">d</span>
254331
255332 <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>
376453 <span class="c">#</span>
377454
378455 <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>
379 <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>
456 <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>
380457 <span class="n">p</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">self</span>
381458 <span class="k">return</span> <span class="n">p</span>
382459 </pre></div></div>
392469 <li class="right" style="margin-right: 10px">
393470 <a href="../../genindex.html" title="General Index"
394471 >index</a></li>
395 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
472 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
396473 <li><a href="../index.html" >Module code</a> &raquo;</li>
397474 </ul>
398475 </div>
399476 <div class="footer">
400 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
401 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
477 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
478 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
402479 </div>
403480 </body>
404481 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>smb.base &mdash; pysmb 1.1.5 documentation</title>
8 <title>smb.base &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
6260 <div class="body">
6361
6462 <h1>Source code for smb.base</h1><div class="highlight"><pre>
65 <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>
63 <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>
64 <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
6665 <span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
66 <span class="kn">from</span> <span class="nn">smb2_constants</span> <span class="kn">import</span> <span class="o">*</span>
6767 <span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
68 <span class="kn">from</span> <span class="nn">smb2_structs</span> <span class="kn">import</span> <span class="o">*</span>
6869 <span class="kn">from</span> <span class="nn">nmb.base</span> <span class="kn">import</span> <span class="n">NMBSession</span>
6970 <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">convertFILETIMEtoEpoch</span>
7071 <span class="kn">import</span> <span class="nn">ntlm</span><span class="o">,</span> <span class="nn">securityblob</span>
72
73 <span class="k">try</span><span class="p">:</span>
74 <span class="kn">import</span> <span class="nn">hashlib</span>
75 <span class="n">sha256</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span>
76 <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
77 <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">sha256</span>
78
7179
7280 <span class="k">class</span> <span class="nc">NotReadyError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
7381 <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>
99107
100108 <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>
101109
102 <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>
103 <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>
110 <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
111 <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
112 <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
113
114 <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>
115 <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>
104116 <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
105117 <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
106118 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">domain</span>
119 <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>
120 <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>
107121 <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>
108122 <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>
123 <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>
109124 <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>
110125 <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>
111 <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span> <span class="o">=</span> <span class="mi">0</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>
126 <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>
112127
113128 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">False</span>
114129 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
130 <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>
131 <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>
132 <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>
115133 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>
116134 <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="mi">0</span>
117
118 <span class="c"># Most of the following attributes will be initialized upon receipt of SMB_COM_NEGOTIATE message from server (via self._updateServerInfo method)</span>
135 <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>
136
137 <span class="c"># SMB1 and SMB2 attributes</span>
138 <span class="c"># Note that the interpretations of the values may differ between SMB1 and SMB2 protocols</span>
139 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="mi">0</span>
140 <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>
141
142 <span class="c"># SMB1 attributes</span>
143 <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>
119144 <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>
120145 <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>
121146 <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>
122147 <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>
123 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="mi">0</span>
148
149 <span class="c"># SMB2 attributes</span>
150 <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>
151 <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>
152 <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>
153 <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>
154
155 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB1Methods</span><span class="p">()</span>
124156
125157 <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;Authetication 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>
126158 <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>
139171 <span class="k">pass</span>
140172
141173 <span class="k">def</span> <span class="nf">onNMBSessionMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
142 <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>
143 <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
144 <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>
145 <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>
146 <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>
147 <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>
148 <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>
174 <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
175 <span class="k">try</span><span class="p">:</span>
176 <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>
177 <span class="k">except</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">:</span>
178 <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>
179 <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>
180 <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>
181 <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB2Methods</span><span class="p">()</span>
182 <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>
183 <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
184
185 <span class="n">next_message_offset</span> <span class="o">=</span> <span class="mi">0</span>
186 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span><span class="p">:</span>
187 <span class="n">next_message_offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">next_command_offset</span>
188
189 <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
190 <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>
191 <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>
192 <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>
193 <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>
194 <span class="k">else</span><span class="p">:</span>
195 <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>
196 <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>
197 <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>
198 <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>
199 <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>
200 <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>
201
202 <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>
203 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">next_message_offset</span><span class="p">:]</span>
204 <span class="k">else</span><span class="p">:</span>
205 <span class="k">break</span>
149206
150207 <span class="c">#</span>
151208 <span class="c"># Public Methods for Overriding in Subclasses</span>
161218 <span class="c"># Protected Methods</span>
162219 <span class="c">#</span>
163220
164 <span class="k">def</span> <span class="nf">_sendSMBMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">smb_message</span><span class="p">):</span>
221 <span class="k">def</span> <span class="nf">_setupSMB1Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
222 <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMBMessage</span>
223 <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB1</span>
224 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB1</span>
225 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB1</span>
226 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB1</span>
227 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB1</span>
228 <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB1</span>
229 <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB1</span>
230 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB1</span>
231 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB1</span>
232 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB1</span>
233 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB1</span>
234 <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>
235 <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>
236 <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>
237 <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>
238 <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>
239 <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB1</span>
240
241 <span class="k">def</span> <span class="nf">_setupSMB2Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
242 <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMB2Message</span>
243 <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB2</span>
244 <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB2</span>
245 <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB2</span>
246 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB2</span>
247 <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB2</span>
248 <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB2</span>
249 <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB2</span>
250 <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB2</span>
251 <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB2</span>
252 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB2</span>
253 <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB2</span>
254 <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>
255 <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>
256 <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>
257 <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>
258 <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>
259 <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB2</span>
260
261 <span class="k">def</span> <span class="nf">_getNextRPCCallID</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
262 <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>
263 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span>
264
265 <span class="c">#</span>
266 <span class="c"># SMB2 Methods Family</span>
267 <span class="c">#</span>
268
269 <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>
165270 <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>
166 <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID</span><span class="p">()</span>
271 <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB2</span><span class="p">()</span>
272
273 <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_NEGOTIATE</span> <span class="ow">and</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_ECHO</span><span class="p">:</span>
274 <span class="n">smb_message</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span>
275
276 <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>
277 <span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">SMB2_FLAGS_SIGNED</span>
278 <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>
279 <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>
280
281 <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>
282 <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>
283 <span class="k">else</span><span class="p">:</span>
284 <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>
285 <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>
286
287 <span class="k">def</span> <span class="nf">_getNextMID_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
288 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
289 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
290
291 <span class="k">def</span> <span class="nf">_updateState_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
292 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
293 <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>
294 <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>
295 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
296 <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>
297 <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>
298 <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>
299 <span class="k">else</span><span class="p">:</span>
300 <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>
301 <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>
302 <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>
303 <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>
304 <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>
305 <span class="k">try</span><span class="p">:</span>
306 <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>
307 <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>
308 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
309 <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>
310 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
311 <span class="k">else</span><span class="p">:</span>
312 <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>
313 <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>
314 <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>
315 <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>
316 <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>
317 <span class="k">try</span><span class="p">:</span>
318 <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>
319 <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>
320 <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>
321 <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>
322 <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">0xc000006d</span><span class="p">:</span> <span class="c"># STATUS_LOGON_FAILURE</span>
324 <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
325 <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>
326 <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
327 <span class="k">else</span><span class="p">:</span>
328 <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>
329 <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>
330
331 <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>
332 <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
333 <span class="n">req</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
334 <span class="k">return</span> <span class="bp">True</span>
335
336
337 <span class="k">def</span> <span class="nf">_updateServerInfo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
338 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
339 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
340 <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>
341 <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>
342 <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>
343 <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>
344
345
346 <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>
347 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
348 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
349 <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>
350
351
352 <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>
353 <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>
354
355 <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>
356
357 <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>
358 <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>
359 <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>
360 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
361 <span class="n">server_challenge</span><span class="p">,</span>
362 <span class="n">server_info</span><span class="p">,</span>
363 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
364
365 <span class="k">else</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 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>
367 <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>
368
369 <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>
370 <span class="n">nt_challenge_response</span><span class="p">,</span>
371 <span class="n">lm_challenge_response</span><span class="p">,</span>
372 <span class="n">session_key</span><span class="p">,</span>
373 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
374 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
375
376 <span class="k">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>
377 <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>
378 <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>
379
380 <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>
381 <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>
382
383 <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>
384 <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>
385 <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>
386 <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>
387 <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>
388 <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>
389 <span class="k">else</span><span class="p">:</span>
390 <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>
391
392 <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>
393 <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>
394 <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>
395 <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>
396 <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>
397 <span class="k">else</span><span class="p">:</span>
398 <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>
399 <span class="k">else</span><span class="p">:</span>
400 <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>
401
402
403 <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>
404 <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>
405 <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>
406
407 <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>
408 <span class="n">path</span> <span class="o">=</span> <span class="s">&#39;IPC$&#39;</span>
409 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
410
411 <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
412 <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>
413 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
414 <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>
415 <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>
416 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
417 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
418 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_OPEN_NO_RECALL</span><span class="p">,</span>
419 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">))</span>
420
421 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
422 <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>
423 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectSrvSvcCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
424 <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>
425
426 <span class="k">def</span> <span class="nf">connectSrvSvcCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
427 <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>
428 <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>
429 <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>
430 <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>
431 <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>
432 <span class="n">data_bytes</span> <span class="o">=</span> \
433 <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> \
434 <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> \
435 <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>
436 <span class="s">b8 10 b8 10 00 00 00 00 02 00 00 00 00 00 01 00</span>
437 <span class="s">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
438 <span class="s">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
439 <span class="s">2b 10 48 60 02 00 00 00 01 00 01 00 c8 4f 32 4b</span>
440 <span class="s">70 16 d3 01 12 78 5a 47 bf 6e e1 88 03 00 00 00</span>
441 <span class="s">2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00</span>
442 <span class="s">01 00 00 00</span>
443 <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">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>
445 <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>
446 <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>
447 <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>
448 <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>
449 <span class="k">else</span><span class="p">:</span>
450 <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>
451
452 <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>
453 <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>
454 <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>
455 <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>
456 <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>
457 <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
458 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">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>
459 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
460 <span class="k">else</span><span class="p">:</span>
461 <span class="n">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>
462
463 <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>
464 <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>
465 <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>
466 <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>
467
468 <span class="n">padding</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
469 <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>
470 <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>
471 <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>
472 <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>
473 <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>
474 <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
475
476 <span class="c"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
477 <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>
478 <span class="n">data_bytes</span> <span class="o">=</span> \
479 <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> \
480 <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> \
481 <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> \
482 <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> \
483 <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> \
484 <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>
485 <span class="s">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
486 <span class="s">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
487 <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>
488 <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>
489 <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>
490 <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>
491 <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>
492 <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>
493 <span class="k">else</span><span class="p">:</span>
494 <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>
495
496 <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>
497 <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>
498 <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>
499 <span class="c"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
500 <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>
501
502 <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>
503 <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>
504 <span class="k">else</span><span class="p">:</span>
505 <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>
506 <span class="k">else</span><span class="p">:</span>
507 <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>
508 <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>
509
510 <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>
511 <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>
512 <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>
513 <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>
514 <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>
515 <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>
516 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
517
518 <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>
519 <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>
520 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
521 <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>
522
523 <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>
524 <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>
525 <span class="k">else</span><span class="p">:</span>
526 <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>
527
528 <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>
529 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
530 <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>
531
532 <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>
533 <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>
534 <span class="k">else</span><span class="p">:</span>
535 <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>
536
537 <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>
538 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
539
540 <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
541 <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span><span class="p">)</span>
542 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
543 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
544 <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>
545 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
546 <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
547
548 <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>
549 <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>
550 <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>
551 <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>
552 <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>
553
554 <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>
555 <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>
556 <span class="k">else</span><span class="p">:</span>
557 <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>
558 <span class="k">else</span><span class="p">:</span>
559 <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>
560 <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>
561
562 <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>
563 <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>
564 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
565 <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>
566 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
567 <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>
568
569 <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>
570 <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>
571 <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>
572 <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>
573 <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>
574
575 <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>
576 <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>
577 <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>
578 <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>
579 <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>
580 <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>
581 <span class="k">else</span><span class="p">:</span>
582 <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>
583
584 <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>
585 <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>
586 <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>
587 <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>
588 <span class="k">else</span><span class="p">:</span>
589 <span class="n">connectSrvSvc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">])</span>
590
591 <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>
592 <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>
593 <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>
594
595 <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>
596 <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>
597 <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>
598 <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>
599 <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>
600 <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>
601 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
602 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
603
604 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
605 <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>
606 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
607 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
608 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
609 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
610 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
611 <span class="s">51 46 69 64 00 00 00 00</span>
612 <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>
613 <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>
614 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
615 <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>
616 <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>
617 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
618 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
619 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
620 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
621 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
622 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
623 <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>
624 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
625 <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>
626
627 <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>
628 <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>
629 <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>
630 <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>
631 <span class="k">else</span><span class="p">:</span>
632 <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>
633
634 <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>
635 <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>
636 <span class="n">info_class</span> <span class="o">=</span> <span class="mh">0x03</span><span class="p">,</span> <span class="c"># FileBothDirectoryInformation</span>
637 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
638 <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>
639 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
640 <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>
641 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">queryCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_buf</span> <span class="o">=</span> <span class="n">data_buf</span><span class="p">)</span>
642 <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>
643
644 <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>
645 <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>
646 <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>
647 <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>
648 <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>
649 <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>
650 <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>
651 <span class="k">else</span><span class="p">:</span>
652 <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>
653
654 <span class="k">def</span> <span class="nf">decodeQueryStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
655 <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>
656 <span class="n">info_format</span> <span class="o">=</span> <span class="s">&#39;&lt;IIQQQQQQIIIBB24s&#39;</span>
657 <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>
658
659 <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>
660 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
661 <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
662 <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
663 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
664
665 <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
666 <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> \
667 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
668 <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
669
670 <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
671 <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>
672 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
673
674 <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>
675 <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>
676 <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>
677 <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>
678 <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>
679
680 <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
681 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
682 <span class="k">else</span><span class="p">:</span>
683 <span class="k">break</span>
684 <span class="k">return</span> <span class="s">&#39;&#39;</span>
685
686 <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>
687 <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>
688 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
689 <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>
690 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
691 <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>
692
693 <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>
694 <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>
695 <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>
696 <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>
697 <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>
698
699 <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>
700 <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>
701 <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>
702 <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>
703 <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>
704 <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>
705 <span class="k">else</span><span class="p">:</span>
706 <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>
707
708 <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>
709 <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>
710 <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>
711 <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>
712 <span class="k">else</span><span class="p">:</span>
713 <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>
714
715 <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>
716 <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>
717 <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>
718
719 <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>
720 <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>
721 <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>
722 <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>
723 <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>
724 <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>
725 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
726
727 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
728 <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>
729 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
730 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
731 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
732 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
733 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
734 <span class="s">51 46 69 64 00 00 00 00</span>
735 <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>
736 <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>
737 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
738 <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>
739 <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>
740 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
741 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
742 <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
743 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
744 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
745 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
746 <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>
747 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
748 <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>
749
750 <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>
751 <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>
752 <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>
753 <span class="n">p</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span>
754 <span class="n">info</span> <span class="o">=</span> <span class="n">SharedFile</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">create_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastaccess_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastwrite_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">change_time</span><span class="p">,</span>
755 <span class="n">p</span><span class="o">.</span><span class="n">file_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">allocation_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span>
756 <span class="n">path</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
757 <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>
758 <span class="k">else</span><span class="p">:</span>
759 <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>
760
761 <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>
762 <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>
763 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
764 <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>
765 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
766 <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>
767
768 <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>
769 <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>
770 <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>
771 <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>
772 <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>
773
774 <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>
775 <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>
776 <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>
777 <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>
778 <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>
779 <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>
780 <span class="k">else</span><span class="p">:</span>
781 <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>
782
783 <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>
784 <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>
785 <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>
786 <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>
787 <span class="k">else</span><span class="p">:</span>
788 <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>
789
790 <span class="k">def</span> <span class="nf">_retrieveFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
791 <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>
792
793 <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>
794 <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>
795 <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>
796
797 <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>
798 <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>
799 <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>
800 <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>
801 <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>
802 <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>
803 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
804 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
805
806 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
807 <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>
808 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
809 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
810 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
811 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
812 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
813 <span class="s">51 46 69 64 00 00 00 00</span>
814 <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>
815 <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>
816 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
817 <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>
818 <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span><span class="p">,</span>
819 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
820 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
821 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
822 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
823 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
824 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
825 <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>
826 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
827 <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>
828
829 <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>
830 <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>
831 <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>
832 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2QueryInfoRequest</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span>
833 <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
834 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
835 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
836 <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>
837 <span class="n">input_buf</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">,</span>
838 <span class="n">output_buf_len</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">))</span>
839 <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>
840 <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>
841 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">infoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
842 <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>
843 <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>
844 <span class="k">else</span><span class="p">:</span>
845 <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>
846
847 <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>
848 <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>
849 <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>
850 <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>
851 <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>
852 <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>
853 <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>
854 <span class="k">else</span><span class="p">:</span>
855 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">max_length</span>
856 <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>
857 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span>
858 <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>
859 <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>
860 <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>
861 <span class="k">else</span><span class="p">:</span>
862 <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>
863
864 <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>
865 <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>
866 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
867 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
868 <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>
869 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
870 <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
871 <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">remaining_len</span><span class="p">,</span>
872 <span class="n">read_len</span> <span class="o">=</span> <span class="n">read_len</span><span class="p">,</span>
873 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">)</span>
874
875 <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>
876 <span class="c"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
877 <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>
878 <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>
879 <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>
880
881 <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>
882
883 <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>
884 <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>
885 <span class="k">else</span><span class="p">:</span>
886 <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>
887 <span class="k">else</span><span class="p">:</span>
888 <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>
889 <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>
890
891 <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>
892 <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>
893 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
894 <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>
895 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
896 <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>
897
898 <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>
899 <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>
900 <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>
901 <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>
902 <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>
903
904 <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>
905 <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>
906 <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>
907 <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>
908 <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>
909 <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>
910 <span class="k">else</span><span class="p">:</span>
911 <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>
912
913 <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>
914 <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>
915 <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>
916 <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>
917 <span class="k">else</span><span class="p">:</span>
918 <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>
919
920 <span class="k">def</span> <span class="nf">_storeFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
921 <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>
922 <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>
923
924 <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>
925 <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>
926 <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>
927 <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>
928 <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>
929 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
930
931 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
932 <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>
933 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
934 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
935 <span class="s">00 00 00 00 00 00 00 00 20 00 00 00 10 00 04 00</span>
936 <span class="s">00 00 18 00 08 00 00 00 41 6c 53 69 00 00 00 00</span>
937 <span class="s">85 62 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
938 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
939 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
940 <span class="s">51 46 69 64 00 00 00 00</span>
941 <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>
942 <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>
943 <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">ATTR_ARCHIVE</span><span class="p">,</span>
944 <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>
945 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
946 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
947 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
948 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
949 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OVERWRITE_IF</span><span class="p">,</span>
950 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
951 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
952 <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>
953 <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>
954 <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>
955
956 <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>
957 <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>
958 <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>
959 <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="il">0L</span><span class="p">)</span>
960 <span class="k">else</span><span class="p">:</span>
961 <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>
962
963 <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>
964 <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>
965 <span class="n">data</span> <span class="o">=</span> <span class="n">file_obj</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">write_count</span><span class="p">)</span>
966 <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
967 <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>
968 <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2WriteRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">offset</span><span class="p">))</span>
969 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
970 <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>
971 <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>
972 <span class="k">else</span><span class="p">:</span>
973 <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>
974
975 <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>
976 <span class="c"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</span>
977 <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>
978 <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>
979 <span class="k">else</span><span class="p">:</span>
980 <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>
981 <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>
982 <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>
983
984 <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>
985 <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>
986 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
987 <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>
988 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
989 <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>
990
991 <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>
992 <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>
993 <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>
994 <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>
995 <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>
996
997 <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>
998 <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>
999 <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>
1000 <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>
1001 <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>
1002 <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>
1003 <span class="k">else</span><span class="p">:</span>
1004 <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>
1005
1006 <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>
1007 <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>
1008 <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>
1009 <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>
1010 <span class="k">else</span><span class="p">:</span>
1011 <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>
1012
1013
1014 <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>
1015 <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>
1016 <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>
1017
1018 <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>
1019 <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>
1020 <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>
1021 <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>
1022 <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>
1023 <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>
1024 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1025
1026 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1027 <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>
1028 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1029 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1030 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1031 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1032 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1033 <span class="s">51 46 69 64 00 00 00 00</span>
1034 <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>
1035 <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>
1036 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1037 <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>
1038 <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>
1039 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1040 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1041 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
1042 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1043 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1044 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1045 <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>
1046 <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>
1047 <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>
1048
1049 <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>
1050 <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>
1051 <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>
1052 <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>
1053 <span class="k">else</span><span class="p">:</span>
1054 <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>
1055
1056 <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>
1057 <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>
1058 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1059 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1060 <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>
1061 <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>
1062 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1063 <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>
1064 <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>
1065 <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>
1066
1067 <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>
1068 <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>
1069 <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>
1070 <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>
1071 <span class="k">else</span><span class="p">:</span>
1072 <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>
1073
1074 <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>
1075 <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>
1076 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1077 <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>
1078 <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>
1079 <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>
1080
1081 <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>
1082 <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>
1083 <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
1084 <span class="k">else</span><span class="p">:</span>
1085 <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>
1086
1087 <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>
1088 <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>
1089 <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>
1090 <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>
1091 <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>
1092 <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>
1093 <span class="k">else</span><span class="p">:</span>
1094 <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>
1095
1096 <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>
1097 <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>
1098 <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>
1099 <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>
1100 <span class="k">else</span><span class="p">:</span>
1101 <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>
1102
1103 <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>
1104 <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>
1105 <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>
1106
1107 <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>
1108 <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>
1109 <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>
1110 <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>
1111 <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>
1112 <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>
1113 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1114
1115 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1116 <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>
1117 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1118 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1119 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1120 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1121 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1122 <span class="s">51 46 69 64 00 00 00 00</span>
1123 <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>
1124 <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>
1125 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1126 <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>
1127 <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1128 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1129 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1130 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1131 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_CREATE</span><span class="p">,</span>
1132 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1133 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1134 <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>
1135 <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>
1136 <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>
1137
1138 <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>
1139 <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>
1140 <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>
1141 <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>
1142 <span class="k">else</span><span class="p">:</span>
1143 <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>
1144
1145 <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>
1146 <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>
1147 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1148 <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>
1149 <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>
1150 <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>
1151
1152 <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>
1153 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
1154
1155 <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>
1156 <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>
1157 <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>
1158 <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>
1159 <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>
1160 <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>
1161 <span class="k">else</span><span class="p">:</span>
1162 <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>
1163
1164 <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>
1165 <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>
1166 <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>
1167 <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>
1168 <span class="k">else</span><span class="p">:</span>
1169 <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>
1170
1171 <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>
1172 <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>
1173 <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>
1174
1175 <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>
1176 <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>
1177 <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>
1178 <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>
1179 <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>
1180 <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>
1181 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1182
1183 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1184 <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>
1185 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1186 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1187 <span class="s">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
1188 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1189 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
1190 <span class="s">51 46 69 64 00 00 00 00</span>
1191 <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>
1192 <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>
1193 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1194 <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>
1195 <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>
1196 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1197 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1198 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
1199 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1200 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1201 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1202 <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>
1203 <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>
1204 <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>
1205
1206 <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>
1207 <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>
1208 <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>
1209 <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>
1210 <span class="k">else</span><span class="p">:</span>
1211 <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>
1212
1213 <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>
1214 <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>
1215 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1216 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1217 <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>
1218 <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>
1219 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1220 <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>
1221 <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>
1222 <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>
1223
1224 <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>
1225 <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>
1226 <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>
1227 <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>
1228 <span class="k">else</span><span class="p">:</span>
1229 <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>
1230
1231 <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>
1232 <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>
1233 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1234 <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>
1235 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1236 <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>
1237
1238 <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>
1239 <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>
1240 <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
1241 <span class="k">else</span><span class="p">:</span>
1242 <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>
1243
1244 <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>
1245 <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>
1246 <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>
1247 <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>
1248 <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>
1249 <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>
1250 <span class="k">else</span><span class="p">:</span>
1251 <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>
1252
1253 <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>
1254 <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>
1255 <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>
1256 <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>
1257 <span class="k">else</span><span class="p">:</span>
1258 <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>
1259
1260 <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>
1261 <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>
1262 <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>
1263
1264 <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>
1265 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1266
1267 <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>
1268 <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>
1269 <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>
1270 <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>
1271 <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>
1272
1273 <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>
1274 <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>
1275 <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>
1276 <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>
1277 <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>
1278
1279 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1280 <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>
1281 <span class="s">20 00 00 00 10 00 04 00 00 00 18 00 08 00 00 00</span>
1282 <span class="s">4d 78 41 63 00 00 00 00 00 00 00 00 ff 01 1f 00</span>
1283 <span class="s">00 00 00 00 10 00 04 00 00 00 18 00 20 00 00 00</span>
1284 <span class="s">51 46 69 64 00 00 00 00 14 e7 01 00 00 00 50 00</span>
1285 <span class="s">30 e0 4c 0b 80 fa ff ff 00 00 00 00 00 00 00 00</span>
1286 <span class="s">00 00 00 00 00 00 00 00</span>
1287 <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>
1288 <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>
1289 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1290 <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>
1291 <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>
1292 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1293 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1294 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1295 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1296 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1297 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1298 <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>
1299 <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>
1300 <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>
1301
1302 <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>
1303 <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>
1304 <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>
1305 <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>
1306 <span class="k">else</span><span class="p">:</span>
1307 <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>
1308
1309 <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>
1310 <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>
1311 <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>
1312 <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1313 <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
1314 <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>
1315 <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
1316 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1317 <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>
1318 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">renameCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
1319 <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>
1320
1321 <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>
1322 <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>
1323 <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>
1324 <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>
1325 <span class="k">else</span><span class="p">:</span>
1326 <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>
1327
1328 <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>
1329 <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>
1330 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1331 <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>
1332 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
1333 <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>
1334
1335 <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>
1336 <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>
1337 <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>
1338 <span class="k">else</span><span class="p">:</span>
1339 <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>
1340
1341 <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>
1342 <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>
1343 <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>
1344 <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>
1345 <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>
1346 <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>
1347 <span class="k">else</span><span class="p">:</span>
1348 <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>
1349
1350 <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>
1351 <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>
1352 <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>
1353 <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>
1354 <span class="k">else</span><span class="p">:</span>
1355 <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>
1356
1357 <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>
1358 <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>
1359 <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>
1360
1361 <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>
1362 <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>
1363 <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>
1364 <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>
1365 <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>
1366 <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>
1367 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1368
1369 <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
1370 <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>
1371 <span class="s">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
1372 <span class="s">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
1373 <span class="s">00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00</span>
1374 <span class="s">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
1375 <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>
1376 <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>
1377 <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1378 <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>
1379 <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>
1380 <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
1381 <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
1382 <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
1383 <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
1384 <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
1385 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1386 <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>
1387 <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>
1388 <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>
1389
1390 <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>
1391 <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>
1392 <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>
1393 <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>
1394 <span class="k">else</span><span class="p">:</span>
1395 <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>
1396
1397 <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>
1398 <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>
1399 <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>
1400 <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>
1401 <span class="n">in_data</span> <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">))</span>
1402 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1403 <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>
1404 <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>
1405 <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>
1406
1407 <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1408 <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>
1409 <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>
1410 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1411 <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>
1412 <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>
1413 <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>
1414 <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>
1415 <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>
1416 <span class="k">else</span><span class="p">:</span>
1417 <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>
1418
1419 <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>
1420 <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>
1421 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1422 <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>
1423 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
1424 <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>
1425
1426 <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>
1427 <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>
1428 <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>
1429 <span class="k">else</span><span class="p">:</span>
1430 <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>
1431
1432 <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>
1433 <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>
1434 <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>
1435 <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>
1436 <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>
1437 <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>
1438 <span class="k">else</span><span class="p">:</span>
1439 <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>
1440
1441 <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>
1442 <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>
1443 <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>
1444 <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>
1445 <span class="k">else</span><span class="p">:</span>
1446 <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>
1447
1448 <span class="k">def</span> <span class="nf">_echo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
1449 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
1450
1451 <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
1452 <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">echo_message</span><span class="p">)</span>
1453 <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>
1454 <span class="n">callback</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
1455 <span class="k">else</span><span class="p">:</span>
1456 <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>
1457
1458 <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>
1459 <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>
1460 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">echoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
1461 <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>
1462
1463
1464 <span class="c">#</span>
1465 <span class="c"># SMB1 Methods Family</span>
1466 <span class="c">#</span>
1467
1468 <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>
1469 <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>
1470 <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB1</span><span class="p">()</span>
1671471 <span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span>
168 <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>
1472 <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>
1473 <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>
1474
1475 <span class="c"># Increment the next_signing_id as described in [MS-CIFS] 3.2.4.1.3</span>
1476 <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>
1477 <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>
1478 <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>
1479
1480 <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>
1481 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">:</span>
1482 <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">)</span>
1483 <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>
1484 <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>
1485
1486 <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>
1487 <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>
1488 <span class="k">else</span><span class="p">:</span>
1489 <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>
1691490 <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>
1701491
171 <span class="k">def</span> <span class="nf">_getNextMID</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1492 <span class="k">def</span> <span class="nf">_getNextMID_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1721493 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
1731494 <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>
1741495 <span class="c"># We don&#39;t use MID of 0 as MID can be reused for SMB_COM_TRANSACTION2_SECONDARY messages</span>
1761497 <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">1</span>
1771498 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
1781499
179 <span class="k">def</span> <span class="nf">_getNextRPCCallID</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
180 <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>
181 <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span>
182
183 <span class="k">def</span> <span class="nf">_updateState</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1500 <span class="k">def</span> <span class="nf">_updateState_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1841501 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
1851502 <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>
186 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
187 <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>
188 <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>
189 <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>
1503 <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>
1504 <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
1505 <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>
1506 <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>
1507 <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>
1508 <span class="k">else</span><span class="p">:</span>
1509 <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>
1510 <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>
1901511 <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>
1911512 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
1921513 <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>
2381559 <span class="k">return</span> <span class="bp">True</span>
2391560
2401561
241 <span class="k">def</span> <span class="nf">_updateServerInfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
1562 <span class="k">def</span> <span class="nf">_updateServerInfo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
2421563 <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
1564 <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
2431565 <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_raw_size</span>
2441566 <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_buffer_size</span>
2451567 <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_mpx_count</span>
2481570 <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>
2491571 <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>
2501572
251 <span class="k">if</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_SECURITY_SIGNATURES_REQUIRE</span><span class="p">:</span>
252 <span class="k">raise</span> <span class="n">UnsupportedFeature</span><span class="p">(</span><span class="s">&#39;Remote server requires secure SMB message signing but current version pysmb does not support this yet.&#39;</span><span class="p">)</span>
253
254
255 <span class="k">def</span> <span class="nf">_handleSessionChallenge</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>
1573
1574 <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>
2561575 <span class="k">assert</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span>
2571576
2581577 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
2761595 <span class="n">nt_challenge_response</span><span class="p">,</span>
2771596 <span class="n">lm_challenge_response</span><span class="p">,</span>
2781597 <span class="n">session_key</span><span class="p">,</span>
279 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">)</span>
1598 <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
1599 <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
2801600
2811601 <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>
2821602 <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>
2851605 <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>
2861606 <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>
2871607
288
289 <span class="k">def</span> <span class="nf">_handleNegotiateResponse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
1608 <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>
1609 <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>
1610 <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>
1611 <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>
1612 <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>
1613 <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>
1614 <span class="k">else</span><span class="p">:</span>
1615 <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>
1616
1617 <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>
1618 <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>
1619 <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>
1620 <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>
1621 <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>
1622 <span class="k">else</span><span class="p">:</span>
1623 <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>
1624 <span class="k">else</span><span class="p">:</span>
1625 <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>
1626
1627
1628 <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>
2901629 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
2911630 <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>
2921631 <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>
2931632
294 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
1633 <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span> <span class="ow">or</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">supportsExtendedSecurity</span><span class="p">:</span>
2951634 <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
2961635 <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
2971636 <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>
3061645 <span class="bp">True</span><span class="p">,</span>
3071646 <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>
3081647
309 <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">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>
1648 <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>
3101649 <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>
3111650 <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>
3121651
4001739 <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>
4011740 <span class="c"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
4021741 <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>
403 <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>
404
405 <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>
406 <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>
407 <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>
408 <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>
409 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
410
411 <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>
412 <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>
413 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
414 <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>
415
416 <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>
417 <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>
418 <span class="k">else</span><span class="p">:</span>
419 <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>
420
421 <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>
422 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
423 <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>
424
425 <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>
426 <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>
427 <span class="k">else</span><span class="p">:</span>
428 <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>
429
1742
1743 <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>
1744 <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>
1745 <span class="k">else</span><span class="p">:</span>
1746 <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>
1747 <span class="k">else</span><span class="p">:</span>
4301748 <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>
431 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
432 <span class="k">else</span><span class="p">:</span>
433 <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>
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 retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
1750
1751 <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>
1752 <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>
1753 <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>
1754 <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>
1755 <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>
1756 <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>
1757 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1758
1759 <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>
1760 <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>
1761 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1762 <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>
1763
1764 <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>
1765 <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>
1766 <span class="k">else</span><span class="p">:</span>
1767 <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>
1768
1769 <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>
1770 <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
1771 <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>
1772
1773 <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>
1774 <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>
1775 <span class="k">else</span><span class="p">:</span>
1776 <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>
1777
1778 <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>
1779 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
1780
1781 <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
1782 <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
1783 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
1784 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
1785 <span class="n">max_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">,</span>
1786 <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">))</span>
1787 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
1788 <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>
1789 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
1790
1791 <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>
1792 <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>
1793 <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>
1794 <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>
1795 <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>
1796
1797 <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>
1798 <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>
1799 <span class="k">else</span><span class="p">:</span>
1800 <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>
1801 <span class="k">else</span><span class="p">:</span>
1802 <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>
4341803 <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>
4351804
4361805 <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>
4431812 <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>
4441813 <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>
4451814 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1815 <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>
4461816 <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>
4471817 <span class="k">else</span><span class="p">:</span>
4481818 <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>
4541824 <span class="k">else</span><span class="p">:</span>
4551825 <span class="n">connectSrvSvc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">])</span>
4561826
457 <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> <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>
1827 <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>
4581828 <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>
4591829 <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>
4601830
4611831 <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>
4621832 <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>
1833 <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>
1834 <span class="n">path</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span>
4631835 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
4641836 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
4651837
4721844 <span class="mh">0x0006</span><span class="p">,</span> <span class="c"># Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
4731845 <span class="mh">0x0104</span><span class="p">,</span> <span class="c"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
4741846 <span class="mh">0x0000</span><span class="p">)</span> <span class="c"># SearchStorageType</span>
475 <span class="n">params_bytes</span> <span class="o">+=</span> <span class="n">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>
1847 <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>
4761848
4771849 <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>
4781850 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
4921864 <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>
4931865 <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
4941866 <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
1867 <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
1868 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
1869
4951870 <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
4961871 <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> \
4971872 <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
4981873 <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
4991874
5001875 <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
1876 <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>
1877 <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
5011878
5021879 <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>
5031880 <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>
504 <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">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>
1881 <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>
1882 <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>
5051883 <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>
5061884
5071885 <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
5081886 <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
5091887 <span class="k">else</span><span class="p">:</span>
5101888 <span class="k">break</span>
1889 <span class="k">return</span> <span class="s">&#39;&#39;</span>
5111890
5121891 <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>
5131892 <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>
5141893 <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>
515 <span class="c"># TRANS2_FIND_FIRST2 response. [MS-CIFS]: 2.2.6.2.2</span>
516 <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>
1894 <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>
1895 <span class="c"># TRANS2_FIND_FIRST2 response. [MS-CIFS]: 2.2.6.2.2</span>
1896 <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>
1897 <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>
1898 <span class="k">else</span><span class="p">:</span>
1899 <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>
1900
1901 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
5171902 <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>
518 <span class="n">decodeFindStruct</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>
519
520 <span class="k">if</span> <span class="n">end_of_search</span><span class="p">:</span>
1903 <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>
1904 <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>
1905 <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>
1906 <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>
1907 <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>
1908 <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
1909 <span class="p">})</span>
1910 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
1911 <span class="k">else</span><span class="p">:</span>
1912 <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>
1913 <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>
1914 <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>
1915 <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>
1916 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
1917
1918 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
1919 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findFirstCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
1920 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
5211921 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
5221922 <span class="k">else</span><span class="p">:</span>
5231923 <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>
5481948 <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>
5491949 <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>
5501950 <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>
551 <span class="c"># TRANS2_FIND_NEXT2 response. [MS-CIFS]: 2.2.6.3.2</span>
552 <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>
1951 <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>
1952 <span class="c"># TRANS2_FIND_NEXT2 response. [MS-CIFS]: 2.2.6.3.2</span>
1953 <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>
1954 <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>
1955 <span class="k">else</span><span class="p">:</span>
1956 <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>
1957
1958 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
5531959 <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>
554 <span class="n">decodeFindStruct</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>
555
556 <span class="k">if</span> <span class="n">end_of_search</span><span class="p">:</span>
1960 <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>
1961 <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>
1962 <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>
1963 <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>
1964 <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>
1965 <span class="s">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
1966 <span class="p">})</span>
1967 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
1968 <span class="k">else</span><span class="p">:</span>
1969 <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>
1970 <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>
1971 <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>
1972 <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>
1973 <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
1974
1975 <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
1976 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findNextCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
1977 <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
5571978 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
5581979 <span class="k">else</span><span class="p">:</span>
5591980 <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>
5641985 <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>
5651986 <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>
5661987 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
1988 <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>
5671989 <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>
5681990 <span class="k">else</span><span class="p">:</span>
5691991 <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>
5751997 <span class="k">else</span><span class="p">:</span>
5761998 <span class="n">sendFindFirst</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
5771999
578 <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">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>
2000 <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>
2001 <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>
2002 <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>
2003
2004 <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>
2005 <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>
2006 <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>
2007 <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>
2008 <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>
2009 <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>
2010 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2011
2012 <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2013 <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>
2014 <span class="n">params_bytes</span> <span class="o">=</span> \
2015 <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>
2016 <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>
2017 <span class="mh">0x0000</span><span class="p">)</span> <span class="c"># Reserved</span>
2018 <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>
2019
2020 <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>
2021 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">65535</span><span class="p">,</span>
2022 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2023 <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
2024 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2025 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2026 <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>
2027 <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>
2028 <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>
2029
2030 <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>
2031 <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>
2032 <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>
2033 <span class="n">info_format</span> <span class="o">=</span> <span class="s">&#39;&lt;QQQQIQQ&#39;</span>
2034 <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>
2035 <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> \
2036 <span class="n">file_attributes</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>
2037
2038 <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>
2039 <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">path</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
2040 <span class="n">callback</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
2041 <span class="k">else</span><span class="p">:</span>
2042 <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>
2043
2044 <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>
2045 <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>
2046 <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>
2047 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2048 <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>
2049 <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>
2050 <span class="k">else</span><span class="p">:</span>
2051 <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>
2052
2053 <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>
2054 <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>
2055 <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>
2056 <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>
2057 <span class="k">else</span><span class="p">:</span>
2058 <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>
2059
2060 <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>
2061 <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>
2062
2063 <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>
5792064 <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>
5802065 <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>
5812066
5962081 <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
5972082 <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>
5982083 <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>
599 <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="il">0L</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>
2084 <span class="k">if</span> <span class="n">max_length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
2085 <span class="n">closeFid</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
2086 <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="il">0L</span> <span class="p">))</span>
2087 <span class="k">else</span><span class="p">:</span>
2088 <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>
6002089 <span class="k">else</span><span class="p">:</span>
6012090 <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>
6022091
603 <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>
2092 <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>
6042093 <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>
6052094 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
6062095 <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
6082097 <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mh">0xFFFF</span><span class="p">,</span> <span class="n">read_count</span><span class="p">)))</span>
6092098 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
6102099 <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>
611 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">)</span>
2100 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">,</span>
2101 <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>
6122102
6132103 <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>
6142104 <span class="c"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
6152105 <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>
616 <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>
617 <span class="k">if</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> <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>
2106 <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>
2107 <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>
2108 <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>
2109 <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>
2110 <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>
2111 <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="n">remaining_len</span><span class="p">])</span>
2112 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">remaining_len</span>
2113 <span class="n">remaining_len</span> <span class="o">=</span> <span class="mi">0</span>
2114 <span class="k">else</span><span class="p">:</span>
2115 <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>
2116 <span class="n">remaining_len</span> <span class="o">-=</span> <span class="n">data_len</span>
2117 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
2118 <span class="k">else</span><span class="p">:</span>
2119 <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>
2120 <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
2121
2122 <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>
6182123 <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>
619 <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">kwargs</span><span class="p">[</span><span class="s">&#39;offset&#39;</span><span class="p">]</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> <span class="p">))</span> <span class="c"># Note that this is a tuple of 3-elements</span>
620 <span class="k">else</span><span class="p">:</span>
621 <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">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</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>
2124 <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>
2125 <span class="k">else</span><span class="p">:</span>
2126 <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>
6222127 <span class="k">else</span><span class="p">:</span>
6232128 <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>
6242129 <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>
6342139 <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>
6352140 <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>
6362141 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2142 <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>
6372143 <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>
6382144 <span class="k">else</span><span class="p">:</span>
6392145 <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>
6452151 <span class="k">else</span><span class="p">:</span>
6462152 <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>
6472153
648 <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">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>
2154 <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>
6492155 <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>
6502156 <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>
6512157
6552161 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
6562162 <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>
6572163 <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>
658 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0010</span><span class="p">,</span> <span class="c"># Create file if file does not exist</span>
2164 <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0011</span><span class="p">,</span> <span class="c"># Create file if file does not exist. Overwrite if exists.</span>
6592165 <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>
6602166 <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>
6612167 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
6712177 <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>
6722178
6732179 <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>
674 <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">max_raw_size</span><span class="p">,</span> <span class="mh">0xFFFF</span><span class="p">)</span>
2180 <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>
2181 <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>
6752182 <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>
676 <span class="k">if</span> <span class="n">data_bytes</span><span class="p">:</span>
2183 <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>
2184 <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>
6772185 <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComWriteAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">))</span>
6782186 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
6792187 <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>
680 <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="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">))</span>
2188 <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>
6812189 <span class="k">else</span><span class="p">:</span>
6822190 <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>
6832191 <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>
7012209 <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>
7022210 <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>
7032211 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2212 <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>
7042213 <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>
7052214 <span class="k">else</span><span class="p">:</span>
7062215 <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>
7122221 <span class="k">else</span><span class="p">:</span>
7132222 <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>
7142223
715 <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">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>
2224 <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>
7162225 <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>
7172226 <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>
7182227
7382247 <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>
7392248 <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>
7402249 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2250 <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>
7412251 <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>
7422252 <span class="k">else</span><span class="p">:</span>
7432253 <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>
7492259 <span class="k">else</span><span class="p">:</span>
7502260 <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>
7512261
752 <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">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>
2262 <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>
7532263 <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>
7542264 <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>
7552265
7742284 <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>
7752285 <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>
7762286 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2287 <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>
7772288 <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>
7782289 <span class="k">else</span><span class="p">:</span>
7792290 <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>
7852296 <span class="k">else</span><span class="p">:</span>
7862297 <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>
7872298
788 <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">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>
2299 <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>
7892300 <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>
7902301 <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>
7912302
8102321 <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>
8112322 <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>
8122323 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2324 <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>
8132325 <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>
8142326 <span class="k">else</span><span class="p">:</span>
8152327 <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>
8212333 <span class="k">else</span><span class="p">:</span>
8222334 <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>
8232335
824 <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">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>
2336 <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>
8252337 <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>
8262338 <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>
8272339
8492361 <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>
8502362 <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>
8512363 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2364 <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
8522365 <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>
8532366 <span class="k">else</span><span class="p">:</span>
8542367 <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>
8602373 <span class="k">else</span><span class="p">:</span>
8612374 <span class="n">sendRename</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
8622375
863 <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">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>
2376 <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>
2377 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
2378 <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
2379
2380 <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>
2381 <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>
2382 <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>
2383 <span class="n">path</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span>
2384 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2385 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2386
2387 <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
2388 <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>
2389 <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>
2390 <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>
2391 <span class="n">search_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2392 <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>
2393 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2394 <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>
2395 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
2396 <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>
2397
2398 <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2399 <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>
2400 <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>
2401 <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>
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 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>
2404
2405 <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>
2406 <span class="c"># [MS-CIFS]: 2.2.7.2</span>
2407 <span class="c"># [MS-SMB]: 2.2.7.2.1</span>
2408 <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>
2409 <span class="mh">0x00144064</span><span class="p">,</span> <span class="c"># [MS-SMB]: 2.2.7.2.1</span>
2410 <span class="n">fid</span><span class="p">,</span> <span class="c"># FID</span>
2411 <span class="mh">0x01</span><span class="p">,</span> <span class="c"># IsFctl</span>
2412 <span class="mi">0</span><span class="p">)</span> <span class="c"># IsFlags</span>
2413 <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>
2414 <span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2415 <span class="n">max_data_count</span> <span class="o">=</span> <span class="mh">0xFFFF</span><span class="p">,</span>
2416 <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
2417 <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
2418 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2419 <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>
2420 <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">enumSnapshotsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
2421 <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>
2422
2423 <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
2424 <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>
2425 <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>
2426 <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
2427 <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>
2428 <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>
2429 <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>
2430 <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>
2431 <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>
2432 <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
2433 <span class="k">else</span><span class="p">:</span>
2434 <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>
2435 <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>
2436
2437 <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>
2438 <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>
2439 <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
2440 <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>
2441 <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>
2442
2443 <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>
2444 <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>
2445 <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>
2446 <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
2447 <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>
2448 <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>
2449 <span class="k">else</span><span class="p">:</span>
2450 <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>
2451
2452 <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>
2453 <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>
2454 <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>
2455 <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>
2456 <span class="k">else</span><span class="p">:</span>
2457 <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>
2458
2459 <span class="k">def</span> <span class="nf">_echo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
8642460 <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
8652461
8662462 <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
9522548 <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 convenience property to return True if this file resource is a directory on the remote server&quot;&quot;&quot;</span>
9532549 <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>
9542550
2551 <span class="nd">@property</span></div>
2552 <span class="k">def</span> <span class="nf">isReadOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
2553 <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 convenience property to return True if this file resource is read-only on the remote server&quot;&quot;&quot;</span>
2554 <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>
2555
9552556 <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div>
9562557 <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>
9572558
9772578 <li class="right" style="margin-right: 10px">
9782579 <a href="../../genindex.html" title="General Index"
9792580 >index</a></li>
980 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
2581 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
9812582 <li><a href="../index.html" >Module code</a> &raquo;</li>
9822583 </ul>
9832584 </div>
9842585 <div class="footer">
985 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
986 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
2586 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
2587 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
9872588 </div>
9882589 </body>
9892590 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>smb.smb_structs &mdash; pysmb 1.1.5 documentation</title>
8 <title>smb.smb_structs &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../../index.html" />
2826 <link rel="up" title="Module code" href="../index.html" />
2927 </head>
3028 <body>
3432 <li class="right" style="margin-right: 10px">
3533 <a href="../../genindex.html" title="General Index"
3634 accesskey="I">index</a></li>
37 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3836 <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
3937 </ul>
4038 </div>
7068 <span class="c"># Set to True if you want to enable support for extended security. Required for Windows Vista and later</span>
7169 <span class="n">SUPPORT_EXTENDED_SECURITY</span> <span class="o">=</span> <span class="bp">True</span>
7270
71 <span class="c"># Set to True if you want to enable SMB2 protocol.</span>
72 <span class="n">SUPPORT_SMB2</span> <span class="o">=</span> <span class="bp">True</span>
73
7374 <span class="c"># Supported dialects</span>
7475 <span class="n">DIALECTS</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
7576 <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>
7677 <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>
7778 <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>
79
80 <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="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>
83 <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>
7884
7985
8086 <span class="k">class</span> <span class="nc">UnsupportedFeature</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
106112
107113 <span class="k">return</span> <span class="n">b</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
108114
109
110 <span class="k">class</span> <span class="nc">OperationFailure</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span></div>
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>
116
117 <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>
111121 <div class="viewcode-block" id="OperationFailure"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.OperationFailure">[docs]</a>
112122 <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>
123 <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>
113124 <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
114125 <span class="bp">self</span><span class="o">.</span><span class="n">smb_messages</span> <span class="o">=</span> <span class="n">smb_messages</span>
115126
156167 <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>
157168
158169 <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">protocol</span> <span class="o">=</span> <span class="mi">1</span>
159171
160172 <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>
161173 <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
245257 <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> \
246258 <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>
247259
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">raise</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">()</span>
248262 <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>
249263 <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>
250264
337351 <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>
338352 <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>
339353 <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>
340 <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>
354 <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="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>
341358
342359
343360 <span class="k">class</span> <span class="nc">ComNegotiateResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
429446
430447 <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>
431448 <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>
449
450 <span class="nd">@property</span>
451 <span class="k">def</span> <span class="nf">supportsExtendedSecurity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
452 <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">capabilities</span> <span class="o">&amp;</span> <span class="n">CAP_EXTENDED_SECURITY</span><span class="p">)</span>
432453
433454
434455 <span class="k">class</span> <span class="nc">ComSessionSetupAndxRequest__WithSecurityExtension</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
13411362 <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>
13421363 <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>
13431364 <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>
1365
1366
1367 <span class="k">class</span> <span class="nc">ComNTTransactRequest</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
1368 <span class="sd">&quot;&quot;&quot;</span>
1369 <span class="sd"> References:</span>
1370 <span class="sd"> ===========</span>
1371 <span class="sd"> - [MS-CIFS]: 2.2.4.62.1</span>
1372 <span class="sd"> &quot;&quot;&quot;</span>
1373 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;BHIIIIIIIIBH&#39;</span>
1374 <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>
1375
1376 <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>
1377 <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>
1378 <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>
1379 <span class="bp">self</span><span class="o">.</span><span class="n">function</span> <span class="o">=</span> <span class="n">function</span>
1380 <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>
1381 <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>
1382 <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>
1383 <span class="bp">self</span><span class="o">.</span><span class="n">max_data_count</span> <span class="o">=</span> <span class="n">max_data_count</span>
1384 <span class="bp">self</span><span class="o">.</span><span class="n">max_setup_count</span> <span class="o">=</span> <span class="n">max_setup_count</span>
1385 <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span>
1386 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span>
1387 <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span>
1388
1389 <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>
1390 <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>
1391 <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">SMB_COM_NT_TRANSACT</span>
1392
1393 <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>
1394 <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>
1395 <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>
1396 <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>
1397
1398 <span class="n">padding0</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1399 <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>
1400 <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>
1401 <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>
1402 <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>
1403
1404 <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>
1405 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="n">offset</span>
1406 <span class="k">else</span><span class="p">:</span>
1407 <span class="n">params_bytes_offset</span> <span class="o">=</span> <span class="mi">0</span>
1408
1409 <span class="n">offset</span> <span class="o">+=</span> <span class="n">params_bytes_len</span>
1410 <span class="n">padding1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
1411 <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>
1412 <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>
1413 <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>
1414
1415 <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>
1416 <span class="n">data_bytes_offset</span> <span class="o">=</span> <span class="n">offset</span>
1417 <span class="k">else</span><span class="p">:</span>
1418 <span class="n">data_bytes_offset</span> <span class="o">=</span> <span class="mi">0</span>
1419
1420 <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> \
1421 <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>
1422 <span class="bp">self</span><span class="o">.</span><span class="n">max_setup_count</span><span class="p">,</span>
1423 <span class="mh">0x00</span><span class="p">,</span> <span class="c"># Reserved1. Must be 0x00</span>
1424 <span class="bp">self</span><span class="o">.</span><span class="n">total_params_count</span><span class="p">,</span>
1425 <span class="bp">self</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
1426 <span class="bp">self</span><span class="o">.</span><span class="n">max_params_count</span><span class="p">,</span>
1427 <span class="bp">self</span><span class="o">.</span><span class="n">max_data_count</span><span class="p">,</span>
1428 <span class="n">params_bytes_len</span><span class="p">,</span>
1429 <span class="n">params_bytes_offset</span><span class="p">,</span>
1430 <span class="n">data_bytes_len</span><span class="p">,</span>
1431 <span class="n">data_bytes_offset</span><span class="p">,</span>
1432 <span class="nb">int</span><span class="p">(</span><span class="n">setup_bytes_len</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span>
1433 <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">)</span> <span class="o">+</span> \
1434 <span class="bp">self</span><span class="o">.</span><span class="n">setup_bytes</span>
1435
1436 <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">padding0</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">params_bytes</span> <span class="o">+</span> <span class="n">padding1</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_bytes</span>
1437
1438
1439 <span class="k">class</span> <span class="nc">ComNTTransactResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
1440 <span class="sd">&quot;&quot;&quot;</span>
1441 <span class="sd"> Contains information about a SMB_COM_NT_TRANSACT response from the server</span>
1442
1443 <span class="sd"> After decoding, each instance contains the following attributes:</span>
1444 <span class="sd"> - total_params_count (integer)</span>
1445 <span class="sd"> - total_data_count (integer)</span>
1446 <span class="sd"> - setup_bytes (string)</span>
1447 <span class="sd"> - data_bytes (string)</span>
1448 <span class="sd"> - params_bytes (string)</span>
1449
1450 <span class="sd"> References:</span>
1451 <span class="sd"> ===========</span>
1452 <span class="sd"> - [MS-CIFS]: 2.2.4.62.2</span>
1453 <span class="sd"> &quot;&quot;&quot;</span>
1454 <span class="n">PAYLOAD_STRUCT_FORMAT</span> <span class="o">=</span> <span class="s">&#39;&lt;3sIIIIIIIIBH&#39;</span>
1455 <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>
1456
1457 <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>
1458 <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_NT_TRANSACT</span>
1459
1460 <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>
1461 <span class="n">_</span><span class="p">,</span> <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> \
1462 <span class="n">params_count</span><span class="p">,</span> <span class="n">params_offset</span><span class="p">,</span> <span class="n">params_displ</span><span class="p">,</span> \
1463 <span class="n">data_count</span><span class="p">,</span> <span class="n">data_offset</span><span class="p">,</span> <span class="n">data_displ</span><span class="p">,</span> <span class="n">setup_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">PAYLOAD_STRUCT_FORMAT</span><span class="p">,</span>
1464 <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>
1465
1466 <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_count</span><span class="o">*</span><span class="mi">2</span><span class="p">]</span>
1467
1468 <span class="k">if</span> <span class="n">params_count</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
1469 <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>
1470 <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>
1471 <span class="k">else</span><span class="p">:</span>
1472 <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>
1473
1474 <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>
1475 <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>
1476 <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>
1477 <span class="k">else</span><span class="p">:</span>
1478 <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>
13441479 </pre></div>
13451480
13461481 </div>
13541489 <li class="right" style="margin-right: 10px">
13551490 <a href="../../genindex.html" title="General Index"
13561491 >index</a></li>
1357 <li><a href="../../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
1492 <li><a href="../../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
13581493 <li><a href="../index.html" >Module code</a> &raquo;</li>
13591494 </ul>
13601495 </div>
13611496 <div class="footer">
1362 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
1363 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
1497 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
1498 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
13641499 </div>
13651500 </body>
13661501 </html>
33 *
44 * Sphinx stylesheet -- basic theme.
55 *
6 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
7878 font-size: 1em;
7979 }
8080
81 div.sphinxsidebar input[type="text"] {
81 div.sphinxsidebar #searchbox input[type="text"] {
8282 width: 170px;
8383 }
8484
85 div.sphinxsidebar input[type="submit"] {
85 div.sphinxsidebar #searchbox input[type="submit"] {
8686 width: 30px;
8787 }
8888
8989 img {
9090 border: 0;
91 max-width: 100%;
9192 }
9293
9394 /* -- search page ----------------------------------------------------------- */
400401 margin: 0;
401402 }
402403
403 .refcount {
404 color: #060;
405 }
406
407404 .optional {
408405 font-size: 1.3em;
409406 }
33 *
44 * Sphinx JavaScript utilities for all documentation.
55 *
6 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
3131 */
3232 jQuery.urldecode = function(x) {
3333 return decodeURIComponent(x).replace(/\+/g, ' ');
34 }
34 };
3535
3636 /**
3737 * small helper function to urlencode strings
6161 };
6262
6363 /**
64 * small function to check if an array contains
65 * a given item.
66 */
67 jQuery.contains = function(arr, item) {
68 for (var i = 0; i < arr.length; i++) {
69 if (arr[i] == item)
70 return true;
71 }
72 return false;
73 };
74
75 /**
7664 * highlight a given string on a jquery object by wrapping it in
7765 * span elements with the given class name.
7866 */
179167 var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
180168 if (terms.length) {
181169 var body = $('div.body');
170 if (!body.length) {
171 body = $('body');
172 }
182173 window.setTimeout(function() {
183174 $.each(terms, function() {
184175 body.highlightText(this.toLowerCase(), 'highlighted');
00 /*!
1 * jQuery JavaScript Library v1.4.2
1 * jQuery JavaScript Library v1.7.2
22 * http://jquery.com/
33 *
4 * Copyright 2010, John Resig
4 * Copyright 2011, John Resig
55 * Dual licensed under the MIT or GPL Version 2 licenses.
66 * http://jquery.org/license
77 *
88 * Includes Sizzle.js
99 * http://sizzlejs.com/
10 * Copyright 2010, The Dojo Foundation
10 * Copyright 2011, The Dojo Foundation
1111 * Released under the MIT, BSD, and GPL Licenses.
1212 *
13 * Date: Sat Feb 13 22:33:48 2010 -0500
13 * Date: Fri Jul 5 14:07:58 UTC 2013
1414 */
15 (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
16 e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
17 j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
18 "&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
19 true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
20 Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
21 (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
22 a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
23 "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
24 function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
25 c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
26 L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
27 "isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
28 a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
29 d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
30 a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
31 !c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
32 true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
33 var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
34 parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
35 false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
36 s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
37 applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
38 else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
39 a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
40 w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
41 cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
42 i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
43 " ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
44 this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
45 e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
46 c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
47 a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
48 function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
49 k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
50 C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
51 null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
52 e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
53 f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
54 if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
55 fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
56 d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
57 "events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
58 a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
59 isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
60 {setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
61 if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
62 e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
63 "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
64 d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
65 !a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
66 toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
67 u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
68 function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
69 if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
70 e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
71 t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
72 g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
73 for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
74 1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
75 CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
76 relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
77 l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
78 h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
79 CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
80 g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
81 text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
82 setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
83 h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
84 m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
85 "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
86 h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
87 !h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
88 h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
89 q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
90 if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
91 (function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
92 function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
93 gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
94 c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
95 {},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
96 "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
97 d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
98 a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
99 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
100 a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
101 c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
102 wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
103 prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
104 this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
105 return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
106 ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
107 this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
108 u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
109 1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
110 return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
111 ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
112 c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
113 c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
114 function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
115 Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
116 "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
117 a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
118 a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
119 "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
120 serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
121 function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
122 global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
123 e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
124 "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
125 false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
126 false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
127 c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
128 d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
129 g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
130 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
131 "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
132 if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
133 this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
134 "olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
135 animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
136 j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
137 this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
138 "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
139 c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
140 this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
141 this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
142 e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
143 c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
144 function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
145 this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
146 k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
147 f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
148 a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
149 c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
150 d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
151 f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
152 "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
153 e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
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 ) {
25 // 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.]+))?/,
63
64 // Matches dashed string for camelizing
65 rdashAlpha = /-([a-z]|[0-9])/ig,
66 rmsPrefix = /^-ms-/,
67
68 // Used by jQuery.camelCase as callback to replace()
69 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 = {};
95
96 jQuery.fn = jQuery.prototype = {
97 constructor: jQuery,
98 init: function( selector, context, rootjQuery ) {
99 var match, elem, ret, doc;
100
101 // Handle $(""), $(null), or $(undefined)
102 if ( !selector ) {
103 return this;
104 }
105
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
122 // Handle HTML strings
123 if ( typeof selector === "string" ) {
124 // Are we dealing with HTML string or an ID?
125 if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
126 // Assume that strings that start and end with <> are HTML and skip the regex check
127 match = [ null, selector, null ];
128
129 } else {
130 match = quickExpr.exec( selector );
131 }
132
133 // Verify a match, and that no context was specified for #id
134 if ( match && (match[1] || !context) ) {
135
136 // HANDLE: $(html) -> $(array)
137 if ( match[1] ) {
138 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] ) ];
152 }
153
154 } else {
155 ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
156 selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
157 }
158
159 return jQuery.merge( this, selector );
160
161 // HANDLE: $("#id")
162 } else {
163 elem = document.getElementById( match[2] );
164
165 // Check parentNode to catch when Blackberry 4.6 returns
166 // nodes that are no longer in the document #6963
167 if ( elem && elem.parentNode ) {
168 // Handle the case where IE and Opera return items
169 // by name instead of ID
170 if ( elem.id !== match[2] ) {
171 return rootjQuery.find( selector );
172 }
173
174 // Otherwise, we inject the element directly into the jQuery object
175 this.length = 1;
176 this[0] = elem;
177 }
178
179 this.context = document;
180 this.selector = selector;
181 return this;
182 }
183
184 // HANDLE: $(expr, $(...))
185 } else if ( !context || context.jquery ) {
186 return ( context || rootjQuery ).find( selector );
187
188 // HANDLE: $(expr, context)
189 // (which is just equivalent to: $(context).find(expr)
190 } else {
191 return this.constructor( context ).find( selector );
192 }
193
194 // HANDLE: $(function)
195 // Shortcut for document ready
196 } else if ( jQuery.isFunction( selector ) ) {
197 return rootjQuery.ready( selector );
198 }
199
200 if ( selector.selector !== undefined ) {
201 this.selector = selector.selector;
202 this.context = selector.context;
203 }
204
205 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 };
319
320 // 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 };
386
387 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 = [],
764 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: {}
917 });
918
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();
922 });
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 }
996 return object;
997 }
998
999 /*
1000 * Create a callback list using the following parameters:
1001 *
1002 * flags: an optional list of space-separated flags that will change how
1003 * the callback list behaves
1004 *
1005 * By default a callback list will act like an event callback list and can be
1006 * "fired" multiple times.
1007 *
1008 * Possible flags:
1009 *
1010 * once: will ensure the callback list can only be fired once (like a Deferred)
1011 *
1012 * memory: will keep track of previous values and will call any callback added
1013 * after the list has been fired right away with the latest "memorized"
1014 * values (like a Deferred)
1015 *
1016 * unique: will ensure a callback can only be added once (no duplicate in the list)
1017 *
1018 * stopOnFalse: interrupt callings when a callback returns false
1019 *
1020 */
1021 jQuery.Callbacks = function( flags ) {
1022
1023 // Convert flags from String-formatted to Object-formatted
1024 // (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 = [],
1031 // Last fire value (for non-forgettable lists)
1032 memory,
1033 // Flag to know if list was already fired
1034 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,
1039 // End of the loop when firing
1040 firingLength,
1041 // Index of currently firing callback (modified by remove if needed)
1042 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 },
1064 // Fire callbacks
1065 fire = function( context, args ) {
1066 args = args || [];
1067 memory = !flags.memory || [ context, args ];
1068 fired = true;
1069 firing = true;
1070 firingIndex = firingStart || 0;
1071 firingStart = 0;
1072 firingLength = list.length;
1073 for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1074 if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1075 memory = true; // Mark as halted
1076 break;
1077 }
1078 }
1079 firing = false;
1080 if ( list ) {
1081 if ( !flags.once ) {
1082 if ( stack && stack.length ) {
1083 memory = stack.shift();
1084 self.fireWith( memory[ 0 ], memory[ 1 ] );
1085 }
1086 } else if ( memory === true ) {
1087 self.disable();
1088 } else {
1089 list = [];
1090 }
1091 }
1092 },
1093 // Actual Callbacks object
1094 self = {
1095 // Add a callback or a collection of callbacks to the list
1096 add: function() {
1097 if ( list ) {
1098 var length = list.length;
1099 add( arguments );
1100 // Do we need to add the callbacks to the
1101 // current firing batch?
1102 if ( firing ) {
1103 firingLength = list.length;
1104 // 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 ] );
1110 }
1111 }
1112 return this;
1113 },
1114 // Remove a callback from the list
1115 remove: function() {
1116 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 }
1131 }
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;
1138 }
1139 }
1140 }
1141 }
1142 }
1143 return this;
1144 },
1145 // Control if a given callback is in the list
1146 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;
1157 },
1158 // Remove all callbacks from the list
1159 empty: function() {
1160 list = [];
1161 return this;
1162 },
1163 // Have the list do nothing anymore
1164 disable: function() {
1165 list = stack = memory = undefined;
1166 return this;
1167 },
1168 // Is it disabled?
1169 disabled: function() {
1170 return !list;
1171 },
1172 // Lock the list in its current state
1173 lock: function() {
1174 stack = undefined;
1175 if ( !memory || memory === true ) {
1176 self.disable();
1177 }
1178 return this;
1179 },
1180 // Is it locked?
1181 locked: function() {
1182 return !stack;
1183 },
1184 // Call all callbacks with the given context and arguments
1185 fireWith: function( context, args ) {
1186 if ( stack ) {
1187 if ( firing ) {
1188 if ( !flags.once ) {
1189 stack.push( [ context, args ] );
1190 }
1191 } else if ( !( flags.once && memory ) ) {
1192 fire( context, args );
1193 }
1194 }
1195 return this;
1196 },
1197 // Call all the callbacks with the given arguments
1198 fire: function() {
1199 self.fireWith( this, arguments );
1200 return this;
1201 },
1202 // To know if the callbacks have already been called at least once
1203 fired: function() {
1204 return !!fired;
1205 }
1206 };
1207
1208 return self;
1209 };
1210
1211
1212
1213
1214 var // Static reference to slice
1215 sliceDeferred = [].slice;
1216
1217 jQuery.extend({
1218
1219 Deferred: function( func ) {
1220 var doneList = jQuery.Callbacks( "once memory" ),
1221 failList = jQuery.Callbacks( "once memory" ),
1222 progressList = jQuery.Callbacks( "memory" ),
1223 state = "pending",
1224 lists = {
1225 resolve: doneList,
1226 reject: failList,
1227 notify: progressList
1228 },
1229 promise = {
1230 done: doneList.add,
1231 fail: failList.add,
1232 progress: progressList.add,
1233
1234 state: function() {
1235 return state;
1236 },
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 );
1244 return this;
1245 },
1246 always: function() {
1247 deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1248 return this;
1249 },
1250 pipe: function( fnDone, fnFail, fnProgress ) {
1251 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 }
1272 });
1273 }).promise();
1274 },
1275 // Get a promise for this deferred
1276 // If obj is provided, the promise aspect is added to the object
1277 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;
1286 }
1287 },
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 );
1302
1303 // Call given func if any
1304 if ( func ) {
1305 func.call( deferred, deferred );
1306 }
1307
1308 // All done!
1309 return deferred;
1310 },
1311
1312 // 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 }
1338 if ( length > 1 ) {
1339 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) );
1342 } 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;
1353 }
1354 });
1355
1356
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
1544 return;
1545 }
1546
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;
1660 })();
1661
1662
1663
1664
1665 var rbrace = /^(?:\{.*\}|\[.*\])$/,
1666 rmultiDash = /([A-Z])/g;
1667
1668 jQuery.extend({
1669 cache: {},
1670
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.
1680 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
1685 },
1686
1687 hasData: function( elem ) {
1688 elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1689 return !!elem && !isEmptyDataObject( elem );
1690 },
1691
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 }
1888 },
1889
1890 // For internal use only.
1891 _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;
1906 }
1907 });
1908
1909 jQuery.fn.extend({
1910 data: function( key, value ) {
1911 var parts, part, attr, name, l,
1912 elem = this[0],
1913 i = 0,
1914 data = null;
1915
1916 // Gets all values
1917 if ( key === undefined ) {
1918 if ( this.length ) {
1919 data = jQuery.data( elem );
1920
1921 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 ] );
1930 }
1931 }
1932 jQuery._data( elem, "parsedAttrs", true );
1933 }
1934 }
1935
1936 return data;
1937 }
1938
1939 // Sets multiple values
1940 if ( typeof key === "object" ) {
1941 return this.each(function() {
1942 jQuery.data( this, key );
1943 });
1944 }
1945
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;
1967 this.each(function() {
1968 var self = jQuery( this );
1969
1970 self.triggerHandler( "setData" + part, parts );
1971 jQuery.data( this, key, value );
1972 self.triggerHandler( "changeData" + part, parts );
1973 });
1974 }, null, value, arguments.length > 1, null, false );
1975 },
1976
1977 removeData: function( key ) {
1978 return this.each(function() {
1979 jQuery.removeData( this, key );
1980 });
1981 }
1982 });
1983
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 }
2052
2053 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
2081 queue: function( elem, type, data ) {
2082 var q;
2083 if ( elem ) {
2084 type = ( type || "fx" ) + "queue";
2085 q = jQuery._data( elem, type );
2086
2087 // Speed up dequeue by getting out quickly if this is just a lookup
2088 if ( data ) {
2089 if ( !q || jQuery.isArray(data) ) {
2090 q = jQuery._data( elem, type, jQuery.makeArray(data) );
2091 } else {
2092 q.push( data );
2093 }
2094 }
2095 return q || [];
2096 }
2097 },
2098
2099 dequeue: function( elem, type ) {
2100 type = type || "fx";
2101
2102 var queue = jQuery.queue( elem, type ),
2103 fn = queue.shift(),
2104 hooks = {};
2105
2106 // If the fx queue is dequeued, always remove the progress sentinel
2107 if ( fn === "inprogress" ) {
2108 fn = queue.shift();
2109 }
2110
2111 if ( fn ) {
2112 // Add a progress sentinel to prevent the fx queue from being
2113 // automatically dequeued
2114 if ( type === "fx" ) {
2115 queue.unshift( "inprogress" );
2116 }
2117
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 }
2128 }
2129 });
2130
2131 jQuery.fn.extend({
2132 queue: function( type, data ) {
2133 var setter = 2;
2134
2135 if ( typeof type !== "string" ) {
2136 data = type;
2137 type = "fx";
2138 setter--;
2139 }
2140
2141 if ( arguments.length < setter ) {
2142 return jQuery.queue( this[0], type );
2143 }
2144
2145 return data === undefined ?
2146 this :
2147 this.each(function() {
2148 var queue = jQuery.queue( this, type, data );
2149
2150 if ( type === "fx" && queue[0] !== "inprogress" ) {
2151 jQuery.dequeue( this, type );
2152 }
2153 });
2154 },
2155 dequeue: function( type ) {
2156 return this.each(function() {
2157 jQuery.dequeue( this, type );
2158 });
2159 },
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 },
2173 clearQueue: function( type ) {
2174 return this.queue( type || "fx", [] );
2175 },
2176 // Get a promise resolved when queues of a certain type
2177 // are emptied (fx is the type by default)
2178 promise: function( type, object ) {
2179 if ( typeof type !== "string" ) {
2180 object = type;
2181 type = undefined;
2182 }
2183 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 ) )) {
2202 count++;
2203 tmp.add( resolve );
2204 }
2205 }
2206 resolve();
2207 return defer.promise( object );
2208 }
2209 });
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 );
2232 });
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 };
2794 }
2795
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 });
2807 }
2808
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 };
2820 }
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 };
2899
2900 /*
2901 * Helper functions for managing events -- not part of the public interface.
2902 * Props to Dean Edwards' addEvent library for many of the ideas.
2903 */
2904 jQuery.event = {
2905
2906 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 )) ) {
2914 return;
2915 }
2916
2917 // Caller can pass in an object of custom data in lieu of the handler
2918 if ( handler.handler ) {
2919 handleObjIn = handler;
2920 handler = handleObjIn.handler;
2921 selector = handleObjIn.selector;
2922 }
2923
2924 // Make sure that the handler has a unique ID, used to find/remove it later
2925 if ( !handler.guid ) {
2926 handler.guid = jQuery.guid++;
2927 }
2928
2929 // 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 ) {
2937 // Discard the second event of a jQuery.event.trigger() and
2938 // when an event is called after a page has unloaded
2939 return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2940 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2941 undefined;
2942 };
2943 // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2944 eventHandle.elem = elem;
2945 }
2946
2947 // 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();
2955
2956 // If event changes its type, use the special event handlers for the changed type
2957 special = jQuery.event.special[ type ] || {};
2958
2959 // If selector defined, determine special event api type, otherwise given type
2960 type = ( selector ? special.delegateType : special.bindType ) || type;
2961
2962 // Update special based on newly reset type
2963 special = jQuery.event.special[ type ] || {};
2964
2965 // handleObj is passed to all event handlers
2966 handleObj = jQuery.extend({
2967 type: type,
2968 origType: tns[1],
2969 data: data,
2970 handler: handler,
2971 guid: handler.guid,
2972 selector: selector,
2973 quick: selector && quickParse( selector ),
2974 namespace: namespaces.join(".")
2975 }, handleObjIn );
2976
2977 // Init the event handler queue if we're the first
2978 handlers = events[ type ];
2979 if ( !handlers ) {
2980 handlers = events[ type ] = [];
2981 handlers.delegateCount = 0;
2982
2983 // Only use addEventListener/attachEvent if the special events handler returns false
2984 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2985 // Bind the global event handler to the element
2986 if ( elem.addEventListener ) {
2987 elem.addEventListener( type, eventHandle, false );
2988
2989 } else if ( elem.attachEvent ) {
2990 elem.attachEvent( "on" + type, eventHandle );
2991 }
2992 }
2993 }
2994
2995 if ( special.add ) {
2996 special.add.call( elem, handleObj );
2997
2998 if ( !handleObj.handler.guid ) {
2999 handleObj.handler.guid = handler.guid;
3000 }
3001 }
3002
3003 // Add to the element's handler list, delegates in front
3004 if ( selector ) {
3005 handlers.splice( handlers.delegateCount++, 0, handleObj );
3006 } else {
3007 handlers.push( handleObj );
3008 }
3009
3010 // Keep track of which events have ever been used, for event optimization
3011 jQuery.event.global[ type ] = true;
3012 }
3013
3014 // Nullify elem to prevent memory leaks in IE
3015 elem = null;
3016 },
3017
3018 global: {},
3019
3020 // Detach an event or set of events from an element
3021 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;
3026
3027 if ( !elemData || !(events = elemData.events) ) {
3028 return;
3029 }
3030
3031 // 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];
3037
3038 // Unbind all events (on this namespace, if provided) for the element
3039 if ( !type ) {
3040 for ( type in events ) {
3041 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
3042 }
3043 continue;
3044 }
3045
3046 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;
3051
3052 // Remove matching events
3053 for ( j = 0; j < eventType.length; j++ ) {
3054 handleObj = eventType[ j ];
3055
3056 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 );
3061
3062 if ( handleObj.selector ) {
3063 eventType.delegateCount--;
3064 }
3065 if ( special.remove ) {
3066 special.remove.call( elem, handleObj );
3067 }
3068 }
3069 }
3070
3071 // Remove generic event handler if we removed something and no more handlers exist
3072 // (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 ) {
3075 jQuery.removeEvent( elem, type, elemData.handle );
3076 }
3077
3078 delete events[ type ];
3079 }
3080 }
3081
3082 // Remove the expando if it's no longer used
3083 if ( jQuery.isEmptyObject( events ) ) {
3084 handle = elemData.handle;
3085 if ( handle ) {
3086 handle.elem = null;
3087 }
3088
3089 // removeData also checks for emptiness and clears the expando if empty
3090 // 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
3101 },
3102
3103 trigger: function( event, data, elem, onlyHandlers ) {
3104 // Don't do events on text and comment nodes
3105 if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3106 return;
3107 }
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;
3113
3114 // focus/blur morphs to focusin/out; ensure we're not firing them right now
3115 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
3116 return;
3117 }
3118
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 ) {
3126 // Namespaced trigger; create a regexp to match event type in handle()
3127 namespaces = type.split(".");
3128 type = namespaces.shift();
3129 namespaces.sort();
3130 }
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 }
3165
3166 // Clean up the event in case it is being reused
3167 event.result = undefined;
3168 if ( !event.target ) {
3169 event.target = elem;
3170 }
3171
3172 // Clone any incoming data and prepend the event, creating the handler arg list
3173 data = data != null ? jQuery.makeArray( data ) : [];
3174 data.unshift( event );
3175
3176 // Allow special events to draw outside the lines
3177 special = jQuery.event.special[ type ] || {};
3178 if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3179 return;
3180 }
3181
3182 // Determine event propagation path in advance, per W3C events spec (#9951)
3183 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3184 eventPath = [[ elem, special.bindType || type ]];
3185 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3186
3187 bubbleType = special.delegateType || type;
3188 cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3189 old = null;
3190 for ( ; cur; cur = cur.parentNode ) {
3191 eventPath.push([ cur, bubbleType ]);
3192 old = cur;
3193 }
3194
3195 // 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 ]);
3198 }
3199 }
3200
3201 // 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
3207 handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3208 if ( handle ) {
3209 handle.apply( cur, data );
3210 }
3211 // Note that this is a bare JS function and not a jQuery handler
3212 handle = ontype && cur[ ontype ];
3213 if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3214 event.preventDefault();
3215 }
3216 }
3217 event.type = type;
3218
3219 // If nobody prevented the default action, do it now
3220 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
3221
3222 if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3223 !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3224
3225 // Call a native DOM method on the target with the same name name as the event.
3226 // Can't use an .isFunction() check here because IE6/7 fails that test.
3227 // 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 ) ) {
3230
3231 // Don't re-trigger an onFOO event when we call its FOO() method
3232 old = elem[ ontype ];
3233
3234 if ( old ) {
3235 elem[ ontype ] = null;
3236 }
3237
3238 // Prevent re-triggering of the same event, since we already bubbled it above
3239 jQuery.event.triggered = type;
3240 elem[ type ]();
3241 jQuery.event.triggered = undefined;
3242
3243 if ( old ) {
3244 elem[ ontype ] = old;
3245 }
3246 }
3247 }
3248 }
3249
3250 return event.result;
3251 },
3252
3253 dispatch: function( event ) {
3254
3255 // 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 ] || {},
3263 handlerQueue = [],
3264 i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
3265
3266 // Use the fix-ed jQuery.Event rather than the (read-only) native event
3267 args[0] = event;
3268 event.delegateTarget = this;
3269
3270 // Call the preDispatch hook for the mapped type, and let it bail if desired
3271 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
3272 return;
3273 }
3274
3275 // Determine handlers that should run if there are delegated events
3276 // 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 = {};
3288 matches = [];
3289 jqcur[0] = cur;
3290 for ( i = 0; i < delegateCount; i++ ) {
3291 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 );
3298 }
3299 if ( selMatch[ sel ] ) {
3300 matches.push( handleObj );
3301 }
3302 }
3303 if ( matches.length ) {
3304 handlerQueue.push({ elem: cur, matches: matches });
3305 }
3306 }
3307 }
3308 }
3309
3310 // 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;
3350 },
3351
3352 // 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(" "),
3355
3356 fixHooks: {},
3357
3358 keyHooks: {
3359 props: "char charCode key keyCode".split(" "),
3360 filter: function( event, original ) {
3361
3362 // Add which for key events
3363 if ( event.which == null ) {
3364 event.which = original.charCode != null ? original.charCode : original.keyCode;
3365 }
3366
3367 return event;
3368 }
3369 },
3370
3371 mouseHooks: {
3372 props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3373 filter: function( event, original ) {
3374 var eventDoc, doc, body,
3375 button = original.button,
3376 fromElement = original.fromElement;
3377
3378 // Calculate pageX/Y if missing and clientX/Y available
3379 if ( event.pageX == null && original.clientX != null ) {
3380 eventDoc = event.target.ownerDocument || document;
3381 doc = eventDoc.documentElement;
3382 body = eventDoc.body;
3383
3384 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3385 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
3386 }
3387
3388 // Add relatedTarget, if necessary
3389 if ( !event.relatedTarget && fromElement ) {
3390 event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3391 }
3392
3393 // Add which for click: 1 === left; 2 === middle; 3 === right
3394 // Note: button is not normalized, so don't use it
3395 if ( !event.which && button !== undefined ) {
3396 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3397 }
3398
3399 return event;
3400 }
3401 },
3402
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
3439 special: {
3440 ready: {
3441 // Make sure the ready event is setup
3442 setup: jQuery.bindReady
3443 },
3444
3445 load: {
3446 // Prevent triggered image.load events from bubbling to window.load
3447 noBubble: true
3448 },
3449
3450 focus: {
3451 delegateType: "focusin"
3452 },
3453 blur: {
3454 delegateType: "focusout"
3455 },
3456
3457 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;
3468 }
3469 }
3470 }
3471 },
3472
3473 simulate: function( type, elem, event, bubble ) {
3474 // Piggyback on a donor event to simulate a different one.
3475 // Fake originalEvent to avoid donor's stopPropagation, but if the
3476 // simulated event prevents default then we do the same on the donor.
3477 var e = jQuery.extend(
3478 new jQuery.Event(),
3479 event,
3480 { type: type,
3481 isSimulated: true,
3482 originalEvent: {}
3483 }
3484 );
3485 if ( bubble ) {
3486 jQuery.event.trigger( e, null, elem );
3487 } else {
3488 jQuery.event.dispatch.call( elem, e );
3489 }
3490 if ( e.isDefaultPrevented() ) {
3491 event.preventDefault();
3492 }
3493 }
3494 };
3495
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
3500 jQuery.removeEvent = document.removeEventListener ?
3501 function( elem, type, handle ) {
3502 if ( elem.removeEventListener ) {
3503 elem.removeEventListener( type, handle, false );
3504 }
3505 } :
3506 function( elem, type, handle ) {
3507 if ( elem.detachEvent ) {
3508 elem.detachEvent( "on" + type, handle );
3509 }
3510 };
3511
3512 jQuery.Event = function( src, props ) {
3513 // Allow instantiation without the 'new' keyword
3514 if ( !(this instanceof jQuery.Event) ) {
3515 return new jQuery.Event( src, props );
3516 }
3517
3518 // Event object
3519 if ( src && src.type ) {
3520 this.originalEvent = src;
3521 this.type = src.type;
3522
3523 // Events bubbling up the document may have been marked as prevented
3524 // 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;
3527
3528 // Event type
3529 } else {
3530 this.type = src;
3531 }
3532
3533 // Put explicitly provided properties onto the event object
3534 if ( props ) {
3535 jQuery.extend( this, props );
3536 }
3537
3538 // Create a timestamp if incoming event doesn't have one
3539 this.timeStamp = src && src.timeStamp || jQuery.now();
3540
3541 // Mark it as fixed
3542 this[ jQuery.expando ] = true;
3543 };
3544
3545 function returnFalse() {
3546 return false;
3547 }
3548 function returnTrue() {
3549 return true;
3550 }
3551
3552 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3553 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3554 jQuery.Event.prototype = {
3555 preventDefault: function() {
3556 this.isDefaultPrevented = returnTrue;
3557
3558 var e = this.originalEvent;
3559 if ( !e ) {
3560 return;
3561 }
3562
3563 // if preventDefault exists run it on the original event
3564 if ( e.preventDefault ) {
3565 e.preventDefault();
3566
3567 // otherwise set the returnValue property of the original event to false (IE)
3568 } else {
3569 e.returnValue = false;
3570 }
3571 },
3572 stopPropagation: function() {
3573 this.isPropagationStopped = returnTrue;
3574
3575 var e = this.originalEvent;
3576 if ( !e ) {
3577 return;
3578 }
3579 // if stopPropagation exists run it on the original event
3580 if ( e.stopPropagation ) {
3581 e.stopPropagation();
3582 }
3583 // otherwise set the cancelBubble property of the original event to true (IE)
3584 e.cancelBubble = true;
3585 },
3586 stopImmediatePropagation: function() {
3587 this.isImmediatePropagationStopped = returnTrue;
3588 this.stopPropagation();
3589 },
3590 isDefaultPrevented: returnFalse,
3591 isPropagationStopped: returnFalse,
3592 isImmediatePropagationStopped: returnFalse
3593 };
3594
3595 // Create mouseenter/leave events using mouseover/out and event-time checks
3596 jQuery.each({
3597 mouseenter: "mouseover",
3598 mouseleave: "mouseout"
3599 }, function( orig, fix ) {
3600 jQuery.event.special[ orig ] = {
3601 delegateType: fix,
3602 bindType: fix,
3603
3604 handle: function( event ) {
3605 var target = this,
3606 related = event.relatedTarget,
3607 handleObj = event.handleObj,
3608 selector = handleObj.selector,
3609 ret;
3610
3611 // For mousenter/leave call the handler if related is outside the target.
3612 // NB: No relatedTarget if the mouse left/entered the browser window
3613 if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3614 event.type = handleObj.origType;
3615 ret = handleObj.handler.apply( this, arguments );
3616 event.type = fix;
3617 }
3618 return ret;
3619 }
3620 };
3621 });
3622
3623 // IE submit delegation
3624 if ( !jQuery.support.submitBubbles ) {
3625
3626 jQuery.event.special.submit = {
3627 setup: function() {
3628 // Only need this for delegated form submit events
3629 if ( jQuery.nodeName( this, "form" ) ) {
3630 return false;
3631 }
3632
3633 // Lazy-add a submit handler when a descendant form may potentially be submitted
3634 jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3635 // Node name check avoids a VML-related crash in IE (#9807)
3636 var elem = e.target,
3637 form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3638 if ( form && !form._submit_attached ) {
3639 jQuery.event.add( form, "submit._submit", function( event ) {
3640 event._submit_bubble = true;
3641 });
3642 form._submit_attached = true;
3643 }
3644 });
3645 // return undefined since we don't need an event listener
3646 },
3647
3648 postDispatch: function( event ) {
3649 // If form was submitted by the user, bubble the event up the tree
3650 if ( event._submit_bubble ) {
3651 delete event._submit_bubble;
3652 if ( this.parentNode && !event.isTrigger ) {
3653 jQuery.event.simulate( "submit", this.parentNode, event, true );
3654 }
3655 }
3656 },
3657
3658 teardown: function() {
3659 // Only need this for delegated form submit events
3660 if ( jQuery.nodeName( this, "form" ) ) {
3661 return false;
3662 }
3663
3664 // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3665 jQuery.event.remove( this, "._submit" );
3666 }
3667 };
3668 }
3669
3670 // IE change delegation and checkbox/radio fix
3671 if ( !jQuery.support.changeBubbles ) {
3672
3673 jQuery.event.special.change = {
3674
3675 setup: function() {
3676
3677 if ( rformElems.test( this.nodeName ) ) {
3678 // IE doesn't fire change on a check/radio until blur; trigger it on click
3679 // after a propertychange. Eat the blur-change in special.change.handle.
3680 // This still fires onchange a second time for check/radio after blur.
3681 if ( this.type === "checkbox" || this.type === "radio" ) {
3682 jQuery.event.add( this, "propertychange._change", function( event ) {
3683 if ( event.originalEvent.propertyName === "checked" ) {
3684 this._just_changed = true;
3685 }
3686 });
3687 jQuery.event.add( this, "click._change", function( event ) {
3688 if ( this._just_changed && !event.isTrigger ) {
3689 this._just_changed = false;
3690 jQuery.event.simulate( "change", this, event, true );
3691 }
3692 });
3693 }
3694 return false;
3695 }
3696 // Delegated event; lazy-add a change handler on descendant inputs
3697 jQuery.event.add( this, "beforeactivate._change", function( e ) {
3698 var elem = e.target;
3699
3700 if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3701 jQuery.event.add( elem, "change._change", function( event ) {
3702 if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3703 jQuery.event.simulate( "change", this.parentNode, event, true );
3704 }
3705 });
3706 elem._change_attached = true;
3707 }
3708 });
3709 },
3710
3711 handle: function( event ) {
3712 var elem = event.target;
3713
3714 // Swallow native change events from checkbox/radio, we already triggered them above
3715 if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3716 return event.handleObj.handler.apply( this, arguments );
3717 }
3718 },
3719
3720 teardown: function() {
3721 jQuery.event.remove( this, "._change" );
3722
3723 return rformElems.test( this.nodeName );
3724 }
3725 };
3726 }
3727
3728 // Create "bubbling" focus and blur events
3729 if ( !jQuery.support.focusinBubbles ) {
3730 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3731
3732 // Attach a single capturing handler while someone wants focusin/focusout
3733 var attaches = 0,
3734 handler = function( event ) {
3735 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3736 };
3737
3738 jQuery.event.special[ fix ] = {
3739 setup: function() {
3740 if ( attaches++ === 0 ) {
3741 document.addEventListener( orig, handler, true );
3742 }
3743 },
3744 teardown: function() {
3745 if ( --attaches === 0 ) {
3746 document.removeEventListener( orig, handler, true );
3747 }
3748 }
3749 };
3750 });
3751 }
3752
3753 jQuery.fn.extend({
3754
3755 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3756 var origFn, type;
3757
3758 // Types can be a map of types/handlers
3759 if ( typeof types === "object" ) {
3760 // ( types-Object, selector, data )
3761 if ( typeof selector !== "string" ) { // && selector != null
3762 // ( types-Object, data )
3763 data = data || selector;
3764 selector = undefined;
3765 }
3766 for ( type in types ) {
3767 this.on( type, selector, data, types[ type ], one );
3768 }
3769 return this;
3770 }
3771
3772 if ( data == null && fn == null ) {
3773 // ( types, fn )
3774 fn = selector;
3775 data = selector = undefined;
3776 } else if ( fn == null ) {
3777 if ( typeof selector === "string" ) {
3778 // ( types, selector, fn )
3779 fn = data;
3780 data = undefined;
3781 } else {
3782 // ( types, data, fn )
3783 fn = data;
3784 data = selector;
3785 selector = undefined;
3786 }
3787 }
3788 if ( fn === false ) {
3789 fn = returnFalse;
3790 } else if ( !fn ) {
3791 return this;
3792 }
3793
3794 if ( one === 1 ) {
3795 origFn = fn;
3796 fn = function( event ) {
3797 // Can use an empty set, since event contains the info
3798 jQuery().off( event );
3799 return origFn.apply( this, arguments );
3800 };
3801 // Use same guid so caller can remove using origFn
3802 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3803 }
3804 return this.each( function() {
3805 jQuery.event.add( this, types, fn, data, selector );
3806 });
3807 },
3808 one: function( types, selector, data, fn ) {
3809 return this.on( types, selector, data, fn, 1 );
3810 },
3811 off: function( types, selector, fn ) {
3812 if ( types && types.preventDefault && types.handleObj ) {
3813 // ( event ) dispatched jQuery.Event
3814 var handleObj = types.handleObj;
3815 jQuery( types.delegateTarget ).off(
3816 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
3817 handleObj.selector,
3818 handleObj.handler
3819 );
3820 return this;
3821 }
3822 if ( typeof types === "object" ) {
3823 // ( types-object [, selector] )
3824 for ( var type in types ) {
3825 this.off( type, selector, types[ type ] );
3826 }
3827 return this;
3828 }
3829 if ( selector === false || typeof selector === "function" ) {
3830 // ( types [, fn] )
3831 fn = selector;
3832 selector = undefined;
3833 }
3834 if ( fn === false ) {
3835 fn = returnFalse;
3836 }
3837 return this.each(function() {
3838 jQuery.event.remove( this, types, fn, selector );
3839 });
3840 },
3841
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
3866 trigger: function( type, data ) {
3867 return this.each(function() {
3868 jQuery.event.trigger( type, data, this );
3869 });
3870 },
3871 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 );
3905 }
3906 });
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
5717
5718
5719 function createSafeFragment( document ) {
5720 var list = nodeNames.split( "|" ),
5721 safeFrag = document.createDocumentFragment();
5722
5723 if ( safeFrag.createElement ) {
5724 while ( list.length ) {
5725 safeFrag.createElement(
5726 list.pop()
5727 );
5728 }
5729 }
5730 return safeFrag;
5731 }
5732
5733 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5734 "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5735 rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5736 rleadingWhitespace = /^\s+/,
5737 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5738 rtagName = /<([\w:]+)/,
5739 rtbody = /<tbody/i,
5740 rhtml = /<|&#?\w+;/,
5741 rnoInnerhtml = /<(?:script|style)/i,
5742 rnocache = /<(?:script|object|embed|option|style)/i,
5743 rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5744 // checked="checked" or checked
5745 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5746 rscriptType = /\/(java|ecma)script/i,
5747 rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5748 wrapMap = {
5749 option: [ 1, "<select multiple='multiple'>", "</select>" ],
5750 legend: [ 1, "<fieldset>", "</fieldset>" ],
5751 thead: [ 1, "<table>", "</table>" ],
5752 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5753 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 );
5759
5760 wrapMap.optgroup = wrapMap.option;
5761 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5762 wrapMap.th = wrapMap.td;
5763
5764 // IE can't serialize <link> and <script> tags normally
5765 if ( !jQuery.support.htmlSerialize ) {
5766 wrapMap._default = [ 1, "div<div>", "</div>" ];
5767 }
5768
5769 jQuery.fn.extend({
5770 text: function( value ) {
5771 return jQuery.access( this, function( value ) {
5772 return value === undefined ?
5773 jQuery.text( this ) :
5774 this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
5775 }, null, value, arguments.length );
5776 },
5777
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 );
5802 }
5803
5804 return this;
5805 },
5806
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
5901 empty: function() {
5902 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5903 // Remove element nodes and prevent memory leaks
5904 if ( elem.nodeType === 1 ) {
5905 jQuery.cleanData( elem.getElementsByTagName("*") );
5906 }
5907
5908 // Remove any remaining nodes
5909 while ( elem.firstChild ) {
5910 elem.removeChild( elem.firstChild );
5911 }
5912 }
5913
5914 return this;
5915 },
5916
5917 clone: function( dataAndEvents, deepDataAndEvents ) {
5918 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5919 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5920
5921 return this.map( function () {
5922 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5923 });
5924 },
5925
5926 html: function( value ) {
5927 return jQuery.access( this, function( value ) {
5928 var elem = this[0] || {},
5929 i = 0,
5930 l = this.length;
5931
5932 if ( value === undefined ) {
5933 return elem.nodeType === 1 ?
5934 elem.innerHTML.replace( rinlinejQuery, "" ) :
5935 null;
5936 }
5937
5938
5939 if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5940 ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
5941 !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
5942
5943 value = value.replace( rxhtmlTag, "<$1></$2>" );
5944
5945 try {
5946 for (; i < l; i++ ) {
5947 // Remove element nodes and prevent memory leaks
5948 elem = this[i] || {};
5949 if ( elem.nodeType === 1 ) {
5950 jQuery.cleanData( elem.getElementsByTagName( "*" ) );
5951 elem.innerHTML = value;
5952 }
5953 }
5954
5955 elem = 0;
5956
5957 // If using innerHTML throws an exception, use the fallback method
5958 } catch(e) {}
5959 }
5960
5961 if ( elem ) {
5962 this.empty().append( value );
5963 }
5964 }, null, value, arguments.length );
5965 },
5966
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 }
5999 },
6000
6001 detach: function( selector ) {
6002 return this.remove( selector, true );
6003 },
6004
6005 domManip: function( args, table, callback ) {
6006 var results, first, fragment, parent,
6007 value = args[0],
6008 scripts = [];
6009
6010 // 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 );
6014 });
6015 }
6016
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;
6037
6038 if ( fragment.childNodes.length === 1 ) {
6039 first = fragment = fragment.firstChild;
6040 } else {
6041 first = fragment.firstChild;
6042 }
6043
6044 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*/" ) );
6078 }
6079
6080 if ( elem.parentNode ) {
6081 elem.parentNode.removeChild( elem );
6082 }
6083 });
6084 }
6085 }
6086
6087 return this;
6088 }
6089 });
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 = {};
6242
6243 jQuery.each({
6244 appendTo: "append",
6245 prependTo: "prepend",
6246 insertBefore: "before",
6247 insertAfter: "after",
6248 replaceAll: "replaceWith"
6249 }, function( name, original ) {
6250 jQuery.fn[ name ] = function( selector ) {
6251 var ret = [],
6252 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 }
6268 };
6269 });
6270
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 }
6281 }
6282
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 }
6288 }
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 }
6298 }
6299
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;
6307 }
6308
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/,
6561
6562 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 };
6579
6580 jQuery.extend({
6581 // Add in style property hooks for overriding the default
6582 // behavior of getting and setting a style property
6583 cssHooks: {
6584 opacity: {
6585 get: function( elem, computed ) {
6586 if ( computed ) {
6587 // We should always get a number back from opacity
6588 var ret = curCSS( elem, "opacity" );
6589 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
6599 cssNumber: {
6600 "fillOpacity": true,
6601 "fontWeight": true,
6602 "lineHeight": true,
6603 "opacity": true,
6604 "orphans": true,
6605 "widows": true,
6606 "zIndex": true,
6607 "zoom": true
6608 },
6609
6610 // Add in properties whose names you wish to fix before
6611 // setting or getting the value
6612 cssProps: {
6613 // normalize float css property
6614 "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6615 },
6616
6617 // Get and set the style property on a DOM Node
6618 style: function( elem, name, value, extra ) {
6619 // Don't set styles on text and comment nodes
6620 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6621 return;
6622 }
6623
6624 // 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;
6629
6630 // Check if we're setting a value
6631 if ( value !== undefined ) {
6632 type = typeof value;
6633
6634 // convert relative number strings (+= or -=) to relative numbers. #7345
6635 if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6636 value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
6637 // Fixes bug #9237
6638 type = "number";
6639 }
6640
6641 // Make sure that NaN and null values aren't set. See: #7116
6642 if ( value == null || type === "number" && isNaN( value ) ) {
6643 return;
6644 }
6645
6646 // If a number was passed in, add 'px' to the (except for certain CSS properties)
6647 if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6648 value += "px";
6649 }
6650
6651 // 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
6655 try {
6656 style[ name ] = value;
6657 } catch(e) {}
6658 }
6659
6660 } else {
6661 // If a hook was provided get the non-computed value from there
6662 if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6663 return ret;
6664 }
6665
6666 // Otherwise just get the value from the style object
6667 return style[ name ];
6668 }
6669 },
6670
6671 css: function( elem, name, extra ) {
6672 var ret, hooks;
6673
6674 // 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 }
6683
6684 // 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;
6687
6688 // 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;
6713 }
6714 });
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 }
6845
6846 jQuery.each([ "height", "width" ], function( i, name ) {
6847 jQuery.cssHooks[ name ] = {
6848 get: function( elem, computed, extra ) {
6849 if ( computed ) {
6850 if ( elem.offsetWidth !== 0 ) {
6851 return getWidthOrHeight( elem, name, extra );
6852 } else {
6853 return jQuery.swap( elem, cssShow, function() {
6854 return getWidthOrHeight( elem, name, extra );
6855 });
6856 }
6857 }
6858 },
6859
6860 set: function( elem, value ) {
6861 return rnum.test( value ) ?
6862 value + "px" :
6863 value;
6864 }
6865 };
6866 });
6867
6868 if ( !jQuery.support.opacity ) {
6869 jQuery.cssHooks.opacity = {
6870 get: function( elem, computed ) {
6871 // IE uses filters for opacity
6872 return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6873 ( parseFloat( RegExp.$1 ) / 100 ) + "" :
6874 computed ? "1" : "";
6875 },
6876
6877 set: function( elem, value ) {
6878 var style = elem.style,
6879 currentStyle = elem.currentStyle,
6880 opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6881 filter = currentStyle && currentStyle.filter || style.filter || "";
6882
6883 // IE has trouble with opacity if it does not have layout
6884 // Force it by setting the zoom level
6885 style.zoom = 1;
6886
6887 // 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, "" ) ) === "" ) {
6889
6890 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6891 // if "filter:" is present at all, clearType is disabled, we want to avoid this
6892 // style.removeAttribute is IE Only, but so apparently is this code path...
6893 style.removeAttribute( "filter" );
6894
6895 // if there there is no filter style applied in a css rule, we are done
6896 if ( currentStyle && !currentStyle.filter ) {
6897 return;
6898 }
6899 }
6900
6901 // otherwise, set new filter values
6902 style.filter = ralpha.test( filter ) ?
6903 filter.replace( ralpha, opacity ) :
6904 filter + " " + opacity;
6905 }
6906 };
6907 }
6908
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 }
6941
6942 // These hooks are used by animate to expand properties
6943 jQuery.each({
6944 margin: "",
6945 padding: "",
6946 border: "Width"
6947 }, function( prefix, suffix ) {
6948
6949 jQuery.cssHooks[ prefix + suffix ] = {
6950 expand: function( value ) {
6951 var i,
6952
6953 // 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++ ) {
6958 expanded[ prefix + cssExpand[ i ] + suffix ] =
6959 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6960 }
6961
6962 return expanded;
6963 }
6964 };
6965 });
6966
6967
6968
6969
6970 var r20 = /%20/g,
6971 rbracket = /\[\]$/,
6972 rCRLF = /\r?\n/g,
6973 rhash = /#.*$/,
6974 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,
6976 // #7653, #8125, #8152: local protocol detection
6977 rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
6978 rnoContent = /^(?:GET|HEAD)$/,
6979 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,
6989
6990 /* Prefilters
6991 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6992 * 2) These are called:
6993 * - BEFORE asking for a transport
6994 * - AFTER param serialization (s.data is a string if s.processData is true)
6995 * 3) key is the dataType
6996 * 4) the catchall symbol "*" can be used
6997 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6998 */
6999 prefilters = {},
7000
7001 /* Transports bindings
7002 * 1) key is the dataType
7003 * 2) the catchall symbol "*" can be used
7004 * 3) selection will start with transport dataType and THEN go to "*" if needed
7005 */
7006 transports = {},
7007
7008 // Document location
7009 ajaxLocation,
7010
7011 // Document location segments
7012 ajaxLocParts,
7013
7014 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7015 allTypes = ["*/"] + ["*"];
7016
7017 // #8138, IE may throw an exception when accessing
7018 // a field from window.location if document.domain has been set
7019 try {
7020 ajaxLocation = location.href;
7021 } catch( e ) {
7022 // Use the href attribute of an A element
7023 // since IE will modify it given document.location
7024 ajaxLocation = document.createElement( "a" );
7025 ajaxLocation.href = "";
7026 ajaxLocation = ajaxLocation.href;
7027 }
7028
7029 // Segment location into parts
7030 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7031
7032 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7033 function addToPrefiltersOrTransports( structure ) {
7034
7035 // dataTypeExpression is optional and defaults to "*"
7036 return function( dataTypeExpression, func ) {
7037
7038 if ( typeof dataTypeExpression !== "string" ) {
7039 func = dataTypeExpression;
7040 dataTypeExpression = "*";
7041 }
7042
7043 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
7051 // 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 );
7063 }
7064 }
7065 };
7066 }
7067
7068 // 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;
7106 }
7107
7108 // A special extend for ajax options
7109 // that takes "flat" options (not to be deep extended)
7110 // Fixes #9887
7111 function ajaxExtend( target, src ) {
7112 var key, deep,
7113 flatOptions = jQuery.ajaxSettings.flatOptions || {};
7114 for ( key in src ) {
7115 if ( src[ key ] !== undefined ) {
7116 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
7117 }
7118 }
7119 if ( deep ) {
7120 jQuery.extend( true, target, deep );
7121 }
7122 }
7123
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
7813 /* Handles responses to an ajax request:
7814 * - sets all responseXXX fields accordingly
7815 * - finds the right dataType (mediates between content-type and expected dataType)
7816 * - returns the corresponding response
7817 */
7818 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 }
7834
7835 // Remove auto dataType and get content-type in the process
7836 while( dataTypes[ 0 ] === "*" ) {
7837 dataTypes.shift();
7838 if ( ct === undefined ) {
7839 ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7840 }
7841 }
7842
7843 // Check if we're dealing with a known content-type
7844 if ( ct ) {
7845 for ( type in contents ) {
7846 if ( contents[ type ] && contents[ type ].test( ct ) ) {
7847 dataTypes.unshift( type );
7848 break;
7849 }
7850 }
7851 }
7852
7853 // Check to see if we have a response for the expected dataType
7854 if ( dataTypes[ 0 ] in responses ) {
7855 finalDataType = dataTypes[ 0 ];
7856 } else {
7857 // Try convertible dataTypes
7858 for ( type in responses ) {
7859 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7860 finalDataType = type;
7861 break;
7862 }
7863 if ( !firstDataType ) {
7864 firstDataType = type;
7865 }
7866 }
7867 // Or just use first one
7868 finalDataType = finalDataType || firstDataType;
7869 }
7870
7871 // If we found a dataType
7872 // We add the dataType to the list if needed
7873 // and return the corresponding response
7874 if ( finalDataType ) {
7875 if ( finalDataType !== dataTypes[ 0 ] ) {
7876 dataTypes.unshift( finalDataType );
7877 }
7878 return responses[ finalDataType ];
7879 }
7880 }
7881
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,
7891 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
7921 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;
7947 }
7948 break;
7949 }
7950 }
7951 }
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;
7965 }
7966
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++ );
7978 }
7979 });
7980
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 ];
8017 };
8018
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 }
8027 });
8028
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";
8042 }
8043 });
8044
8045
8046
8047
8048 // Install script dataType
8049 jQuery.ajaxSetup({
8050 accepts: {
8051 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8052 },
8053 contents: {
8054 script: /javascript|ecmascript/
8055 },
8056 converters: {
8057 "text script": function( text ) {
8058 jQuery.globalEval( text );
8059 return text;
8060 }
8061 }
8062 });
8063
8064 // Handle cache's special case and global
8065 jQuery.ajaxPrefilter( "script", function( s ) {
8066 if ( s.cache === undefined ) {
8067 s.cache = false;
8068 }
8069 if ( s.crossDomain ) {
8070 s.type = "GET";
8071 s.global = false;
8072 }
8073 });
8074
8075 // Bind script tag hack transport
8076 jQuery.ajaxTransport( "script", function(s) {
8077
8078 // This transport only deals with cross domain requests
8079 if ( s.crossDomain ) {
8080
8081 var script,
8082 head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
8083
8084 return {
8085
8086 send: function( _, callback ) {
8087
8088 script = document.createElement( "script" );
8089
8090 script.async = "async";
8091
8092 if ( s.scriptCharset ) {
8093 script.charset = s.scriptCharset;
8094 }
8095
8096 script.src = s.url;
8097
8098 // Attach handlers for all browsers
8099 script.onload = script.onreadystatechange = function( _, isAbort ) {
8100
8101 if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8102
8103 // Handle memory leak in IE
8104 script.onload = script.onreadystatechange = null;
8105
8106 // Remove the script
8107 if ( head && script.parentNode ) {
8108 head.removeChild( script );
8109 }
8110
8111 // Dereference the script
8112 script = undefined;
8113
8114 // Callback if not abort
8115 if ( !isAbort ) {
8116 callback( 200, "success" );
8117 }
8118 }
8119 };
8120 // Use insertBefore instead of appendChild to circumvent an IE6 bug.
8121 // This arises when a base node is used (#2709 and #4378).
8122 head.insertBefore( script, head.firstChild );
8123 },
8124
8125 abort: function() {
8126 if ( script ) {
8127 script.onload( 0, 1 );
8128 }
8129 }
8130 };
8131 }
8132 });
8133
8134
8135
8136
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 }
8685 });
8686 }
8687
8688 });
8689
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 );
8722 };
8723 });
8724
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 }
8945 };
8946
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 };
9011 }
9012
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
9166 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
9180 setOffset: function( elem, options, i ) {
9181 var position = jQuery.css( elem, "position" );
9182
9183 // set position first, in-case top/left are set even on static elem
9184 if ( position === "static" ) {
9185 elem.style.position = "relative";
9186 }
9187
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;
9194
9195 // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9196 if ( calculatePosition ) {
9197 curPosition = curElem.position();
9198 curTop = curPosition.top;
9199 curLeft = curPosition.left;
9200 } else {
9201 curTop = parseFloat( curCSSTop ) || 0;
9202 curLeft = parseFloat( curCSSLeft ) || 0;
9203 }
9204
9205 if ( jQuery.isFunction( options ) ) {
9206 options = options.call( elem, i, curOffset );
9207 }
9208
9209 if ( options.top != null ) {
9210 props.top = ( options.top - curOffset.top ) + curTop;
9211 }
9212 if ( options.left != null ) {
9213 props.left = ( options.left - curOffset.left ) + curLeft;
9214 }
9215
9216 if ( "using" in options ) {
9217 options.using.call( elem, props );
9218 } else {
9219 curElem.css( props );
9220 }
9221 }
9222 };
9223
9224
9225 jQuery.fn.extend({
9226
9227 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
9242 // note: when an element has margin: auto the offsetLeft and marginLeft
9243 // 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
9252 return {
9253 top: offset.top - parentOffset.top,
9254 left: offset.left - parentOffset.left
9255 };
9256 },
9257
9258 offsetParent: function() {
9259 return this.map(function() {
9260 var offsetParent = this.offsetParent || document.body;
9261 while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9262 offsetParent = offsetParent.offsetParent;
9263 }
9264 return offsetParent;
9265 });
9266 }
9267 });
9268
9269
9270 // Create scrollLeft and scrollTop methods
9271 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
9272 var top = /Y/.test( prop );
9273
9274 jQuery.fn[ method ] = function( val ) {
9275 return jQuery.access( this, function( elem, method, val ) {
9276 var win = getWindow( elem );
9277
9278 if ( val === undefined ) {
9279 return win ? (prop in win) ? win[ prop ] :
9280 jQuery.support.boxModel && win.document.documentElement[ method ] ||
9281 win.document.body[ method ] :
9282 elem[ method ];
9283 }
9284
9285 if ( win ) {
9286 win.scrollTo(
9287 !top ? val : jQuery( win ).scrollLeft(),
9288 top ? val : jQuery( win ).scrollTop()
9289 );
9290
9291 } else {
9292 elem[ method ] = val;
9293 }
9294 }, method, val, arguments.length, null );
9295 };
9296 });
9297
9298 function getWindow( elem ) {
9299 return jQuery.isWindow( elem ) ?
9300 elem :
9301 elem.nodeType === 9 ?
9302 elem.defaultView || elem.parentWindow :
9303 false;
9304 }
9305
9306
9307
9308
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; } );
9399 }
9400
9401
9402
9403 })( window );
1212 .highlight .gr { color: #FF0000 } /* Generic.Error */
1313 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
1414 .highlight .gi { color: #00A000 } /* Generic.Inserted */
15 .highlight .go { color: #303030 } /* Generic.Output */
15 .highlight .go { color: #333333 } /* Generic.Output */
1616 .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
1717 .highlight .gs { font-weight: bold } /* Generic.Strong */
1818 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
19 .highlight .gt { color: #0040D0 } /* Generic.Traceback */
19 .highlight .gt { color: #0044DD } /* Generic.Traceback */
2020 .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
2121 .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
2222 .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
33 *
44 * Sphinx JavaScript utilties for the full-text search.
55 *
6 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
10
11 /**
12 * helper function to return a node containing the
13 * search summary for a given text. keywords is a list
14 * of stemmed words, hlwords is the list of normal, unstemmed
15 * words. the first one is used to find the occurance, the
16 * latter for highlighting it.
17 */
18
19 jQuery.makeSearchSummary = function(text, keywords, hlwords) {
20 var textLower = text.toLowerCase();
21 var start = 0;
22 $.each(keywords, function() {
23 var i = textLower.indexOf(this.toLowerCase());
24 if (i > -1)
25 start = i;
26 });
27 start = Math.max(start - 120, 0);
28 var excerpt = ((start > 0) ? '...' : '') +
29 $.trim(text.substr(start, 240)) +
30 ((start + 240 - text.length) ? '...' : '');
31 var rv = $('<div class="context"></div>').text(excerpt);
32 $.each(hlwords, function() {
33 rv = rv.highlightText(this, 'highlighted');
34 });
35 return rv;
36 }
3710
3811
3912 /**
219192 }
220193
221194
195
196 /**
197 * Simple result scoring code.
198 */
199 var Scorer = {
200 // Implement the following function to further tweak the score for each result
201 // The function takes a result array [filename, title, anchor, descr, score]
202 // and returns the new score.
203 /*
204 score: function(result) {
205 return result[4];
206 },
207 */
208
209 // query matches the full name of an object
210 objNameMatch: 11,
211 // or matches in the last dotted part of the object name
212 objPartialMatch: 6,
213 // Additive scores depending on the priority of the object
214 objPrio: {0: 15, // used to be importantResults
215 1: 5, // used to be objectResults
216 2: -5}, // used to be unimportantResults
217 // Used when the priority is not in the mapping.
218 objPrioDefault: 0,
219
220 // query found in title
221 title: 15,
222 // query found in terms
223 term: 5
224 };
225
226
222227 /**
223228 * Search Module
224229 */
238243 },
239244
240245 loadIndex : function(url) {
241 $.ajax({type: "GET", url: url, data: null, success: null,
242 dataType: "script", cache: true});
246 $.ajax({type: "GET", url: url, data: null,
247 dataType: "script", cache: true,
248 complete: function(jqxhr, textstatus) {
249 if (textstatus != "success") {
250 document.getElementById("searchindexloader").src = url;
251 }
252 }});
243253 },
244254
245255 setIndex : function(index) {
267277 if (this._pulse_status >= 0)
268278 return;
269279 function pulse() {
280 var i;
270281 Search._pulse_status = (Search._pulse_status + 1) % 4;
271282 var dotString = '';
272 for (var i = 0; i < Search._pulse_status; i++)
283 for (i = 0; i < Search._pulse_status; i++)
273284 dotString += '.';
274285 Search.dots.text(dotString);
275286 if (Search._pulse_status > -1)
276287 window.setTimeout(pulse, 500);
277 };
288 }
278289 pulse();
279290 },
280291
281292 /**
282 * perform a search for something
293 * perform a search for something (or wait until index is loaded)
283294 */
284295 performSearch : function(query) {
285296 // create the required interface elements
299310 this.deferQuery(query);
300311 },
301312
313 /**
314 * execute search (requires search index to be loaded)
315 */
302316 query : function(query) {
303 var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
304
305 // Stem the searchterms and add them to the correct list
317 var i;
318 var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
319
320 // stem the searchterms and add them to the correct list
306321 var stemmer = new Stemmer();
307322 var searchterms = [];
308323 var excluded = [];
309324 var hlterms = [];
310325 var tmp = query.split(/\s+/);
311326 var objectterms = [];
312 for (var i = 0; i < tmp.length; i++) {
313 if (tmp[i] != "") {
327 for (i = 0; i < tmp.length; i++) {
328 if (tmp[i] !== "") {
314329 objectterms.push(tmp[i].toLowerCase());
315330 }
316331
317 if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
318 tmp[i] == "") {
332 if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
333 tmp[i] === "") {
319334 // skip this "word"
320335 continue;
321336 }
322337 // stem the word
323 var word = stemmer.stemWord(tmp[i]).toLowerCase();
338 var word = stemmer.stemWord(tmp[i].toLowerCase());
339 var toAppend;
324340 // select the correct list
325341 if (word[0] == '-') {
326 var toAppend = excluded;
342 toAppend = excluded;
327343 word = word.substr(1);
328344 }
329345 else {
330 var toAppend = searchterms;
346 toAppend = searchterms;
331347 hlterms.push(tmp[i].toLowerCase());
332348 }
333349 // only add if not already in the list
334 if (!$.contains(toAppend, word))
350 if (!$u.contains(toAppend, word))
335351 toAppend.push(word);
336 };
352 }
337353 var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
338354
339355 // console.debug('SEARCH: searching for:');
341357 // console.info('excluded: ', excluded);
342358
343359 // prepare search
344 var filenames = this._index.filenames;
345 var titles = this._index.titles;
346360 var terms = this._index.terms;
347 var fileMap = {};
348 var files = null;
349 // different result priorities
350 var importantResults = [];
351 var objectResults = [];
352 var regularResults = [];
353 var unimportantResults = [];
361 var titleterms = this._index.titleterms;
362
363 // array of [filename, title, anchor, descr, score]
364 var results = [];
354365 $('#search-progress').empty();
355366
356367 // lookup as object
357 for (var i = 0; i < objectterms.length; i++) {
358 var others = [].concat(objectterms.slice(0,i),
359 objectterms.slice(i+1, objectterms.length))
360 var results = this.performObjectSearch(objectterms[i], others);
361 // Assume first word is most likely to be the object,
362 // other words more likely to be in description.
363 // Therefore put matches for earlier words first.
364 // (Results are eventually used in reverse order).
365 objectResults = results[0].concat(objectResults);
366 importantResults = results[1].concat(importantResults);
367 unimportantResults = results[2].concat(unimportantResults);
368 }
369
370 // perform the search on the required terms
371 for (var i = 0; i < searchterms.length; i++) {
372 var word = searchterms[i];
373 // no match but word was a required one
374 if ((files = terms[word]) == null)
375 break;
376 if (files.length == undefined) {
377 files = [files];
378 }
379 // create the mapping
380 for (var j = 0; j < files.length; j++) {
381 var file = files[j];
382 if (file in fileMap)
383 fileMap[file].push(word);
384 else
385 fileMap[file] = [word];
386 }
387 }
388
389 // now check if the files don't contain excluded terms
390 for (var file in fileMap) {
391 var valid = true;
392
393 // check if all requirements are matched
394 if (fileMap[file].length != searchterms.length)
395 continue;
396
397 // ensure that none of the excluded terms is in the
398 // search result.
399 for (var i = 0; i < excluded.length; i++) {
400 if (terms[excluded[i]] == file ||
401 $.contains(terms[excluded[i]] || [], file)) {
402 valid = false;
403 break;
404 }
405 }
406
407 // if we have still a valid result we can add it
408 // to the result list
409 if (valid)
410 regularResults.push([filenames[file], titles[file], '', null]);
411 }
412
413 // delete unused variables in order to not waste
414 // memory until list is retrieved completely
415 delete filenames, titles, terms;
416
417 // now sort the regular results descending by title
418 regularResults.sort(function(a, b) {
419 var left = a[1].toLowerCase();
420 var right = b[1].toLowerCase();
421 return (left > right) ? -1 : ((left < right) ? 1 : 0);
368 for (i = 0; i < objectterms.length; i++) {
369 var others = [].concat(objectterms.slice(0, i),
370 objectterms.slice(i+1, objectterms.length));
371 results = results.concat(this.performObjectSearch(objectterms[i], others));
372 }
373
374 // 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));
377
378 // let the scorer override scores with a custom scoring function
379 if (Scorer.score) {
380 for (i = 0; i < results.length; i++)
381 results[i][4] = Scorer.score(results[i]);
382 }
383
384 // now sort the results by score (in opposite order of appearance, since the
385 // display function below uses pop() to retrieve items) and then
386 // alphabetically
387 results.sort(function(a, b) {
388 var left = a[4];
389 var right = b[4];
390 if (left > right) {
391 return 1;
392 } else if (left < right) {
393 return -1;
394 } else {
395 // same score: sort alphabetically
396 left = a[1].toLowerCase();
397 right = b[1].toLowerCase();
398 return (left > right) ? -1 : ((left < right) ? 1 : 0);
399 }
422400 });
423401
424 // combine all results
425 var results = unimportantResults.concat(regularResults)
426 .concat(objectResults).concat(importantResults);
402 // for debugging
403 //Search.lastresults = results.slice(); // a copy
404 //console.info('search results:', Search.lastresults);
427405
428406 // print the results
429407 var resultCount = results.length;
432410 if (results.length) {
433411 var item = results.pop();
434412 var listItem = $('<li style="display:none"></li>');
435 if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
413 if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
436414 // dirhtml builder
437415 var dirname = item[0] + '/';
438416 if (dirname.match(/\/index\/$/)) {
456434 displayNextItem();
457435 });
458436 } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
459 $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
460 item[0] + '.txt', function(data) {
461 if (data != '') {
462 listItem.append($.makeSearchSummary(data, searchterms, hlterms));
463 Search.output.append(listItem);
464 }
465 listItem.slideDown(5, function() {
466 displayNextItem();
467 });
468 }, "text");
437 $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
438 dataType: "text",
439 complete: function(jqxhr, textstatus) {
440 var data = jqxhr.responseText;
441 if (data !== '') {
442 listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
443 }
444 Search.output.append(listItem);
445 listItem.slideDown(5, function() {
446 displayNextItem();
447 });
448 }});
469449 } else {
470450 // no source available, just display title
471451 Search.output.append(listItem);
488468 displayNextItem();
489469 },
490470
471 /**
472 * search for object names
473 */
491474 performObjectSearch : function(object, otherterms) {
492475 var filenames = this._index.filenames;
493476 var objects = this._index.objects;
494477 var objnames = this._index.objnames;
495478 var titles = this._index.titles;
496479
497 var importantResults = [];
498 var objectResults = [];
499 var unimportantResults = [];
480 var i;
481 var results = [];
500482
501483 for (var prefix in objects) {
502484 for (var name in objects[prefix]) {
503485 var fullname = (prefix ? prefix + '.' : '') + name;
504486 if (fullname.toLowerCase().indexOf(object) > -1) {
487 var score = 0;
488 var parts = fullname.split('.');
489 // check for different match types: exact matches of full name or
490 // "last name" (i.e. last dotted part)
491 if (fullname == object || parts[parts.length - 1] == object) {
492 score += Scorer.objNameMatch;
493 // matches in last name
494 } else if (parts[parts.length - 1].indexOf(object) > -1) {
495 score += Scorer.objPartialMatch;
496 }
505497 var match = objects[prefix][name];
506498 var objname = objnames[match[1]][2];
507499 var title = titles[match[0]];
511503 var haystack = (prefix + ' ' + name + ' ' +
512504 objname + ' ' + title).toLowerCase();
513505 var allfound = true;
514 for (var i = 0; i < otherterms.length; i++) {
506 for (i = 0; i < otherterms.length; i++) {
515507 if (haystack.indexOf(otherterms[i]) == -1) {
516508 allfound = false;
517509 break;
522514 }
523515 }
524516 var descr = objname + _(', in ') + title;
525 anchor = match[3];
526 if (anchor == '')
517
518 var anchor = match[3];
519 if (anchor === '')
527520 anchor = fullname;
528521 else if (anchor == '-')
529522 anchor = objnames[match[1]][1] + '-' + fullname;
530 result = [filenames[match[0]], fullname, '#'+anchor, descr];
531 switch (match[2]) {
532 case 1: objectResults.push(result); break;
533 case 0: importantResults.push(result); break;
534 case 2: unimportantResults.push(result); break;
523 // add custom score for some objects according to scorer
524 if (Scorer.objPrio.hasOwnProperty(match[2])) {
525 score += Scorer.objPrio[match[2]];
526 } else {
527 score += Scorer.objPrioDefault;
535528 }
529 results.push([filenames[match[0]], fullname, '#'+anchor, descr, score]);
536530 }
537531 }
538532 }
539533
540 // sort results descending
541 objectResults.sort(function(a, b) {
542 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
534 return results;
535 },
536
537 /**
538 * search for full-text terms in the index
539 */
540 performTermsSearch : function(searchterms, excluded, terms, score) {
541 var filenames = this._index.filenames;
542 var titles = this._index.titles;
543
544 var i, j, file, files;
545 var fileMap = {};
546 var results = [];
547
548 // perform the search on the required terms
549 for (i = 0; i < searchterms.length; i++) {
550 var word = searchterms[i];
551 // no match but word was a required one
552 if ((files = terms[word]) === undefined)
553 break;
554 if (files.length === undefined) {
555 files = [files];
556 }
557 // create the mapping
558 for (j = 0; j < files.length; j++) {
559 file = files[j];
560 if (file in fileMap)
561 fileMap[file].push(word);
562 else
563 fileMap[file] = [word];
564 }
565 }
566
567 // now check if the files don't contain excluded terms
568 for (file in fileMap) {
569 var valid = true;
570
571 // check if all requirements are matched
572 if (fileMap[file].length != searchterms.length)
573 continue;
574
575 // ensure that none of the excluded terms is in the search result
576 for (i = 0; i < excluded.length; i++) {
577 if (terms[excluded[i]] == file ||
578 $u.contains(terms[excluded[i]] || [], file)) {
579 valid = false;
580 break;
581 }
582 }
583
584 // if we have still a valid result we can add it to the result list
585 if (valid) {
586 results.push([filenames[file], titles[file], '', null, score]);
587 }
588 }
589 return results;
590 },
591
592 /**
593 * helper function to return a node containing the
594 * search summary for a given text. keywords is a list
595 * of stemmed words, hlwords is the list of normal, unstemmed
596 * words. the first one is used to find the occurance, the
597 * latter for highlighting it.
598 */
599 makeSearchSummary : function(text, keywords, hlwords) {
600 var textLower = text.toLowerCase();
601 var start = 0;
602 $.each(keywords, function() {
603 var i = textLower.indexOf(this.toLowerCase());
604 if (i > -1)
605 start = i;
543606 });
544
545 importantResults.sort(function(a, b) {
546 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
607 start = Math.max(start - 120, 0);
608 var excerpt = ((start > 0) ? '...' : '') +
609 $.trim(text.substr(start, 240)) +
610 ((start + 240 - text.length) ? '...' : '');
611 var rv = $('<div class="context"></div>').text(excerpt);
612 $.each(hlwords, function() {
613 rv = rv.highlightText(this, 'highlighted');
547614 });
548
549 unimportantResults.sort(function(a, b) {
550 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
551 });
552
553 return [importantResults, objectResults, unimportantResults]
615 return rv;
554616 }
555 }
617 };
556618
557619 $(document).ready(function() {
558620 Search.init();
44 * Sphinx stylesheet -- sphinxdoc theme. Originally created by
55 * Armin Ronacher for Werkzeug.
66 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
7 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
88 * :license: BSD, see LICENSE for details.
99 *
1010 */
0 // Underscore.js 0.5.5
1 // (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
2 // Underscore is freely distributable under the terms of the MIT license.
3 // Portions of Underscore are inspired by or borrowed from Prototype.js,
4 // Oliver Steele's Functional, and John Resig's Micro-Templating.
5 // For all details and documentation:
6 // http://documentcloud.github.com/underscore/
7 (function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
8 a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
9 var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
10 d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
11 function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
12 function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
13 0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
14 e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
15 a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
16 return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
17 var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
18 if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
19 0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
20 a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
21 " ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
22 o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
0 // Underscore.js 1.4.4
1 // http://underscorejs.org
2 // (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
3 // Underscore may be freely distributed under the MIT license.
4
5 (function() {
6
7 // Baseline setup
8 // --------------
9
10 // Establish the root object, `window` in the browser, or `global` on the server.
11 var root = this;
12
13 // Save the previous value of the `_` variable.
14 var previousUnderscore = root._;
15
16 // Establish the object that gets returned to break out of a loop iteration.
17 var breaker = {};
18
19 // Save bytes in the minified (but not gzipped) version:
20 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
21
22 // 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;
28
29 // All **ECMAScript 5** native function implementations that we hope to use
30 // are declared here.
31 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,
41 nativeIsArray = Array.isArray,
42 nativeKeys = Object.keys,
43 nativeBind = FuncProto.bind;
44
45 // Create a safe reference to the Underscore object for use below.
46 var _ = function(obj) {
47 if (obj instanceof _) return obj;
48 if (!(this instanceof _)) return new _(obj);
49 this._wrapped = obj;
50 };
51
52 // Export the Underscore object for **Node.js**, with
53 // 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.
56 if (typeof exports !== 'undefined') {
57 if (typeof module !== 'undefined' && module.exports) {
58 exports = module.exports = _;
59 }
60 exports._ = _;
61 } else {
62 root._ = _;
63 }
64
65 // Current version.
66 _.VERSION = '1.4.4';
67
68 // Collection Functions
69 // --------------------
70
71 // 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;
81 }
82 } 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) {
94 var results = [];
95 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);
99 });
100 return results;
101 };
102
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
178 // 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);
183 };
184
185 // Determine whether all of the elements match a truth test.
186 // Delegates to **ECMAScript 5**'s native `every` if available.
187 // 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;
197 };
198
199 // Determine if at least one element in the object matches a truth test.
200 // Delegates to **ECMAScript 5**'s native `some` if available.
201 // 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;
211 };
212
213 // Determine if the array or object contains a given value (using `===`).
214 // Aliased as `include`.
215 _.contains = _.include = function(obj, target) {
216 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 });
221 };
222
223 // Invoke a method (with arguments) on every item in a collection.
224 _.invoke = function(obj, method) {
225 var args = slice.call(arguments, 2);
226 var isFunc = _.isFunction(method);
227 return _.map(obj, function(value) {
228 return (isFunc ? method : value[method]).apply(value, args);
229 });
230 };
231
232 // Convenience version of a common use case of `map`: fetching a property.
233 _.pluck = function(obj, key) {
234 return _.map(obj, function(value){ return value[key]; });
235 };
236
237 // Convenience version of a common use case of `filter`: selecting only objects
238 // 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 });
247 };
248
249 // Convenience version of a common use case of `find`: getting the first object
250 // containing specific `key:value` pairs.
251 _.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;
269 };
270
271 // 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.
286 _.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 });
295 return shuffled;
296 };
297
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);
306 return _.pluck(_.map(obj, function(value, index, list) {
307 return {
308 value : value,
309 index : index,
310 criteria : iterator.call(context, value, index, list)
311 };
312 }).sort(function(left, right) {
313 var a = left.criteria;
314 var b = right.criteria;
315 if (a !== b) {
316 if (a > b || a === void 0) return 1;
317 if (a < b || b === void 0) return -1;
318 }
319 return left.index < right.index ? -1 : 1;
320 }), 'value');
321 };
322
323 // 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;
332 };
333
334 // Groups the object's values by a criterion. Pass either a string attribute
335 // 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 };
341
342 // Counts instances of an object that group by a certain criterion. Pass
343 // either a string attribute to count by, or a function that returns the
344 // 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 };
351
352 // Use a comparator function to figure out the smallest index at which
353 // 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);
357 var low = 0, high = array.length;
358 while (low < high) {
359 var mid = (low + high) >>> 1;
360 iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
361 }
362 return low;
363 };
364
365 // Safely convert anything iterable into a real, live array.
366 _.toArray = function(obj) {
367 if (!obj) return [];
368 if (_.isArray(obj)) return slice.call(obj);
369 if (obj.length === +obj.length) return _.map(obj, _.identity);
370 return _.values(obj);
371 };
372
373 // Return the number of elements in an object.
374 _.size = function(obj) {
375 if (obj == null) return 0;
376 return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
377 };
378
379 // Array Functions
380 // ---------------
381
382 // Get the first element of an array. Passing **n** will return the first N
383 // values in the array. Aliased as `head` and `take`. The **guard** check
384 // allows it to work with `_.map`.
385 _.first = _.head = _.take = function(array, n, guard) {
386 if (array == null) return void 0;
387 return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
388 };
389
390 // Returns everything but the last entry of the array. Especially useful on
391 // the arguments object. Passing **n** will return all the values in
392 // the array, excluding the last N. The **guard** check allows it to work with
393 // `_.map`.
394 _.initial = function(array, n, guard) {
395 return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
396 };
397
398 // Get the last element of an array. Passing **n** will return the last N
399 // values in the array. The **guard** check allows it to work with `_.map`.
400 _.last = function(array, n, guard) {
401 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 }
407 };
408
409 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
410 // Especially useful on the arguments object. Passing an **n** will return
411 // the rest N values in the array. The **guard**
412 // check allows it to work with `_.map`.
413 _.rest = _.tail = _.drop = function(array, n, guard) {
414 return slice.call(array, (n == null) || guard ? 1 : n);
415 };
416
417 // Trim out all falsy values from an array.
418 _.compact = function(array) {
419 return _.filter(array, _.identity);
420 };
421
422 // 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);
427 } else {
428 output.push(value);
429 }
430 });
431 return output;
432 };
433
434 // Return a completely flattened version of an array.
435 _.flatten = function(array, shallow) {
436 return flatten(array, shallow, []);
437 };
438
439 // Return a version of the array that does not contain the specified value(s).
440 _.without = function(array) {
441 return _.difference(array, slice.call(arguments, 1));
442 };
443
444 // Produce a duplicate-free version of the array. If the array has already
445 // been sorted, you have the option of using a faster algorithm.
446 // Aliased as `unique`.
447 _.uniq = _.unique = function(array, isSorted, iterator, context) {
448 if (_.isFunction(isSorted)) {
449 context = iterator;
450 iterator = isSorted;
451 isSorted = false;
452 }
453 var initial = iterator ? _.map(array, iterator, context) : array;
454 var results = [];
455 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;
463 };
464
465 // Produce an array that contains the union: each distinct element from all of
466 // the passed-in arrays.
467 _.union = function() {
468 return _.uniq(concat.apply(ArrayProto, arguments));
469 };
470
471 // Produce an array that contains every item shared between all the
472 // passed-in arrays.
473 _.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 });
480 };
481
482 // Take the difference between one array and a number of other arrays.
483 // Only the elements present in just the first array will remain.
484 _.difference = function(array) {
485 var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
486 return _.filter(array, function(value){ return !_.contains(rest, value); });
487 };
488
489 // Zip together multiple lists into a single array -- elements that share
490 // 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);
495 for (var i = 0; i < length; i++) {
496 results[i] = _.pluck(args, "" + i);
497 }
498 return results;
499 };
500
501 // Converts lists into objects. Pass either a single array of `[key, value]`
502 // pairs, or two parallel arrays of the same length -- one of keys, and one of
503 // the corresponding values.
504 _.object = function(list, values) {
505 if (list == null) return {};
506 var result = {};
507 for (var i = 0, l = list.length; i < l; i++) {
508 if (values) {
509 result[list[i]] = values[i];
510 } else {
511 result[list[i][0]] = list[i][1];
512 }
513 }
514 return result;
515 };
516
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.
521 // If the array is large and already in sort order, pass `true`
522 // for **isSorted** to use binary search.
523 _.indexOf = function(array, item, isSorted) {
524 if (array == null) return -1;
525 var i = 0, l = array.length;
526 if (isSorted) {
527 if (typeof isSorted == 'number') {
528 i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
529 } else {
530 i = _.sortedIndex(array, item);
531 return array[i] === item ? i : -1;
532 }
533 }
534 if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
535 for (; i < l; i++) if (array[i] === item) return i;
536 return -1;
537 };
538
539 // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
540 _.lastIndexOf = function(array, item, from) {
541 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;
548 return -1;
549 };
550
551 // Generate an integer Array containing an arithmetic progression. A port of
552 // the native Python `range()` function. See
553 // [the Python documentation](http://docs.python.org/library/functions.html#range).
554 _.range = function(start, stop, step) {
555 if (arguments.length <= 1) {
556 stop = start || 0;
557 start = 0;
558 }
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;
568 }
569
570 return range;
571 };
572
573 // Function (ahem) Functions
574 // ------------------
575
576 // Create a function bound to a given object (assigning `this`, and arguments,
577 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
578 // available.
579 _.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);
582 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.
598 _.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); });
602 return obj;
603 };
604
605 // Memoize an expensive function by storing its results.
606 _.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 };
613 };
614
615 // Delays a function for the given number of milliseconds, and then calls
616 // it with the arguments supplied.
617 _.delay = function(func, wait) {
618 var args = slice.call(arguments, 2);
619 return setTimeout(function(){ return func.apply(null, args); }, wait);
620 };
621
622 // Defers a function, scheduling it to run after the current call stack has
623 // cleared.
624 _.defer = function(func) {
625 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
626 };
627
628 // 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;
632 var previous = 0;
633 var later = function() {
634 previous = new Date;
635 timeout = null;
636 result = func.apply(context, args);
637 };
638 return function() {
639 var now = new Date;
640 var remaining = wait - (now - previous);
641 context = this;
642 args = arguments;
643 if (remaining <= 0) {
644 clearTimeout(timeout);
645 timeout = null;
646 previous = now;
647 result = func.apply(context, args);
648 } else if (!timeout) {
649 timeout = setTimeout(later, remaining);
650 }
651 return result;
652 };
653 };
654
655 // Returns a function, that, as long as it continues to be invoked, will not
656 // be triggered. The function will be called after it stops being called for
657 // N milliseconds. If `immediate` is passed, trigger the function on the
658 // leading edge, instead of the trailing.
659 _.debounce = function(func, wait, immediate) {
660 var timeout, result;
661 return function() {
662 var context = this, args = arguments;
663 var later = function() {
664 timeout = null;
665 if (!immediate) result = func.apply(context, args);
666 };
667 var callNow = immediate && !timeout;
668 clearTimeout(timeout);
669 timeout = setTimeout(later, wait);
670 if (callNow) result = func.apply(context, args);
671 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;
685 };
686 };
687
688 // Returns the first function passed as an argument to the second,
689 // allowing you to adjust arguments, run code before and after, and
690 // conditionally execute the original function.
691 _.wrap = function(func, wrapper) {
692 return function() {
693 var args = [func];
694 push.apply(args, arguments);
695 return wrapper.apply(this, args);
696 };
697 };
698
699 // Returns a function that is the composition of a list of functions, each
700 // consuming the return value of the function that follows.
701 _.compose = function() {
702 var funcs = arguments;
703 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];
709 };
710 };
711
712 // Returns a function that will only be executed after being called N times.
713 _.after = function(times, func) {
714 if (times <= 0) return func();
715 return function() {
716 if (--times < 1) {
717 return func.apply(this, arguments);
718 }
719 };
720 };
721
722 // Object Functions
723 // ----------------
724
725 // Retrieve the names of an object's properties.
726 // Delegates to **ECMAScript 5**'s native `Object.keys`
727 _.keys = nativeKeys || function(obj) {
728 if (obj !== Object(obj)) throw new TypeError('Invalid object');
729 var keys = [];
730 for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
731 return keys;
732 };
733
734 // Retrieve the values of an object's properties.
735 _.values = function(obj) {
736 var values = [];
737 for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
738 return values;
739 };
740
741 // Convert an object into a list of `[key, value]` pairs.
742 _.pairs = function(obj) {
743 var pairs = [];
744 for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
745 return pairs;
746 };
747
748 // Invert the keys and values of an object. The values must be serializable.
749 _.invert = function(obj) {
750 var result = {};
751 for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
752 return result;
753 };
754
755 // Return a sorted list of the function names available on the object.
756 // Aliased as `methods`
757 _.functions = _.methods = function(obj) {
758 var names = [];
759 for (var key in obj) {
760 if (_.isFunction(obj[key])) names.push(key);
761 }
762 return names.sort();
763 };
764
765 // Extend a given object with all the properties in passed-in object(s).
766 _.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];
771 }
772 }
773 });
774 return obj;
775 };
776
777 // 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;
785 };
786
787 // 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;
795 };
796
797 // Fill in a given object with default properties.
798 _.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 });
806 return obj;
807 };
808
809 // Create a (shallow-cloned) duplicate of an object.
810 _.clone = function(obj) {
811 if (!_.isObject(obj)) return obj;
812 return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
813 };
814
815 // Invokes interceptor with the obj, and then returns obj.
816 // The primary purpose of this method is to "tap into" a method chain, in
817 // order to perform operations on intermediate results within the chain.
818 _.tap = function(obj, interceptor) {
819 interceptor(obj);
820 return obj;
821 };
822
823 // Internal recursive comparison function for `isEqual`.
824 var eq = function(a, b, aStack, bStack) {
825 // 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;
828 // A strict comparison is necessary because `null == undefined`.
829 if (a == null || b == null) return a === b;
830 // Unwrap any wrapped objects.
831 if (a instanceof _) a = a._wrapped;
832 if (b instanceof _) b = b._wrapped;
833 // Compare `[[Class]]` names.
834 var className = toString.call(a);
835 if (className != toString.call(b)) return false;
836 switch (className) {
837 // Strings, numbers, dates, and booleans are compared by value.
838 case '[object String]':
839 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
840 // equivalent to `new String("5")`.
841 return a == String(b);
842 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);
846 case '[object Date]':
847 case '[object Boolean]':
848 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
849 // millisecond representations. Note that invalid dates with millisecond representations
850 // 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;
858 }
859 if (typeof a != 'object' || typeof b != 'object') return false;
860 // Assume equality for cyclic structures. The algorithm for detecting cyclic
861 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
862 var length = aStack.length;
863 while (length--) {
864 // Linear search. Performance is inversely proportional to the number of
865 // unique nested structures.
866 if (aStack[length] == a) return bStack[length] == b;
867 }
868 // Add the first object to the stack of traversed objects.
869 aStack.push(a);
870 bStack.push(b);
871 var size = 0, result = true;
872 // Recursively compare objects and arrays.
873 if (className == '[object Array]') {
874 // Compare array lengths to determine if a deep comparison is necessary.
875 size = a.length;
876 result = size == b.length;
877 if (result) {
878 // Deep compare the contents, ignoring non-numeric properties.
879 while (size--) {
880 if (!(result = eq(a[size], b[size], aStack, bStack))) break;
881 }
882 }
883 } 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 }
891 // 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.
897 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
898 }
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;
906 }
907 }
908 // Remove the first object from the stack of traversed objects.
909 aStack.pop();
910 bStack.pop();
911 return result;
912 };
913
914 // Perform a deep comparison to check if two objects are equal.
915 _.isEqual = function(a, b) {
916 return eq(a, b, [], []);
917 };
918
919 // Is a given array, string, or object empty?
920 // An "empty" object has no enumerable own-properties.
921 _.isEmpty = function(obj) {
922 if (obj == null) return true;
923 if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
924 for (var key in obj) if (_.has(obj, key)) return false;
925 return true;
926 };
927
928 // Is a given value a DOM element?
929 _.isElement = function(obj) {
930 return !!(obj && obj.nodeType === 1);
931 };
932
933 // Is a given value an array?
934 // Delegates to ECMA5's native Array.isArray
935 _.isArray = nativeIsArray || function(obj) {
936 return toString.call(obj) == '[object Array]';
937 };
938
939 // Is a given variable an object?
940 _.isObject = function(obj) {
941 return obj === Object(obj);
942 };
943
944 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
945 each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
946 _['is' + name] = function(obj) {
947 return toString.call(obj) == '[object ' + name + ']';
948 };
949 });
950
951 // Define a fallback version of the method in browsers (ahem, IE), where
952 // there isn't any inspectable "Arguments" type.
953 if (!_.isArguments(arguments)) {
954 _.isArguments = function(obj) {
955 return !!(obj && _.has(obj, 'callee'));
956 };
957 }
958
959 // Optimize `isFunction` if appropriate.
960 if (typeof (/./) !== 'function') {
961 _.isFunction = function(obj) {
962 return typeof obj === 'function';
963 };
964 }
965
966 // Is a given object a finite number?
967 _.isFinite = function(obj) {
968 return isFinite(obj) && !isNaN(parseFloat(obj));
969 };
970
971 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
972 _.isNaN = function(obj) {
973 return _.isNumber(obj) && obj != +obj;
974 };
975
976 // Is a given value a boolean?
977 _.isBoolean = function(obj) {
978 return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
979 };
980
981 // Is a given value equal to null?
982 _.isNull = function(obj) {
983 return obj === null;
984 };
985
986 // Is a given variable undefined?
987 _.isUndefined = function(obj) {
988 return obj === void 0;
989 };
990
991 // Shortcut function for checking if an object has a given property directly
992 // on itself (in other words, not on a prototype).
993 _.has = function(obj, key) {
994 return hasOwnProperty.call(obj, key);
995 };
996
997 // Utility Functions
998 // -----------------
999
1000 // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
1001 // previous owner. Returns a reference to the Underscore object.
1002 _.noConflict = function() {
1003 root._ = previousUnderscore;
1004 return this;
1005 };
1006
1007 // Keep the identity function around for default iterators.
1008 _.identity = function(value) {
1009 return value;
1010 };
1011
1012 // 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);
1016 return accum;
1017 };
1018
1019 // Return a random integer between min and max (inclusive).
1020 _.random = function(min, max) {
1021 if (max == null) {
1022 max = min;
1023 min = 0;
1024 }
1025 return min + Math.floor(Math.random() * (max - min + 1));
1026 };
1027
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 };
1046
1047 // 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.
1059 _.result = function(object, property) {
1060 if (object == null) return null;
1061 var value = object[property];
1062 return _.isFunction(value) ? value.call(object) : value;
1063 };
1064
1065 // Add your own custom functions to the Underscore object.
1066 _.mixin = function(obj) {
1067 each(_.functions(obj), function(name){
1068 var func = _[name] = obj[name];
1069 _.prototype[name] = function() {
1070 var args = [this._wrapped];
1071 push.apply(args, arguments);
1072 return result.call(this, func.apply(_, args));
1073 };
1074 });
1075 };
1076
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
1188 // Add all of the Underscore functions to the wrapper object.
1189 _.mixin(_);
1190
1191 // Add all mutator Array functions to the wrapper.
1192 each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1193 var method = ArrayProto[name];
1194 _.prototype[name] = function() {
1195 var obj = this._wrapped;
1196 method.apply(obj, arguments);
1197 if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1198 return result.call(this, obj);
1199 };
1200 });
1201
1202 // Add all accessor Array functions to the wrapper.
1203 each(['concat', 'join', 'slice'], function(name) {
1204 var method = ArrayProto[name];
1205 _.prototype[name] = function() {
1206 return result.call(this, method.apply(this._wrapped, arguments));
1207 };
1208 });
1209
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);
33 *
44 * sphinx.websupport utilties for all documentation.
55 *
6 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
6 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
77 * :license: BSD, see LICENSE for details.
88 *
99 */
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>NBNSProtocol Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>NBNSProtocol Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="NetBIOS class" href="nmb_NetBIOS.html" />
2927 <link rel="prev" title="Welcome to pysmb’s documentation!" href="../index.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="../index.html" title="Welcome to pysmb’s documentation!"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
115113
116114 <dl class="method">
117115 <dt id="nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName">
118 <tt class="descname">queryIPForName</tt><big>(</big><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#nmb.NetBIOSProtocol.NBNSProtocol.queryIPForName" title="Permalink to this definition">¶</a></dt>
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>
119117 <dd><p>Send a query to the machine with <em>ip</em> and hopes that the machine will reply back with its name.</p>
120118 <p>The implementation of this function is contributed by Jason Anderson.</p>
121119 <table class="docutils field-list" frame="void" rules="none">
190188 <li class="right" >
191189 <a href="../index.html" title="Welcome to pysmb’s documentation!"
192190 >previous</a> |</li>
193 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
191 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
194192 </ul>
195193 </div>
196194 <div class="footer">
197 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
198 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
195 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
196 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
199197 </div>
200198 </body>
201199 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>NetBIOS class &mdash; pysmb 1.1.5 documentation</title>
8 <title>NetBIOS class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SMBConnection Class" href="smb_SMBConnection.html" />
2927 <link rel="prev" title="NBNSProtocol Class" href="nmb_NBNSProtocol.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
127125
128126 <dl class="method">
129127 <dt id="nmb.NetBIOS.NetBIOS.queryIPForName">
130 <tt class="descname">queryIPForName</tt><big>(</big><em>ip</em>, <em>port=137</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#nmb.NetBIOS.NetBIOS.queryIPForName" title="Permalink to this definition">¶</a></dt>
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>
131129 <dd><p>Send a query to the machine with <em>ip</em> and hopes that the machine will reply back with its name.</p>
132130 <p>The implementation of this function is contributed by Jason Anderson.</p>
133131 <table class="docutils field-list" frame="void" rules="none">
194192 <li class="right" >
195193 <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
196194 >previous</a> |</li>
197 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
195 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
198196 </ul>
199197 </div>
200198 <div class="footer">
201 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
202 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
199 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
200 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
203201 </div>
204202 </body>
205203 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SMBConnection Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>SMBConnection Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SMbHandler Class" href="smb_SMBHandler.html" />
2927 <link rel="prev" title="NetBIOS class" href="nmb_NetBIOS.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="nmb_NetBIOS.html" title="NetBIOS class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
281279 </dd></dl>
282280
283281 <dl class="method">
282 <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>
284 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
285 <table class="docutils field-list" frame="void" rules="none">
286 <col class="field-name" />
287 <col class="field-body" />
288 <tbody valign="top">
289 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
290 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
291 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
292 </ul>
293 </td>
294 </tr>
295 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
296 </td>
297 </tr>
298 </tbody>
299 </table>
300 </dd></dl>
301
302 <dl class="method">
284303 <dt id="smb.SMBConnection.SMBConnection.listPath">
285304 <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>
286305 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
320339
321340 <dl class="method">
322341 <dt id="smb.SMBConnection.SMBConnection.listSnapshots">
323 <tt class="descname">listSnapshots</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listSnapshots" title="Permalink to this definition">¶</a></dt>
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>
324343 <dd><p>Retrieve a list of available snapshots (shadow copies) for <em>path</em>.</p>
325344 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
326345 <table class="docutils field-list" frame="void" rules="none">
370389 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
371390 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
372391 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
373 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service. In Python3, this file-like object must have a <em>write</em> method which accepts a bytes parameter.</li>
392 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
374393 </ul>
375394 </td>
376395 </tr>
384403
385404 <dl class="method">
386405 <dt id="smb.SMBConnection.SMBConnection.retrieveFileFromOffset">
387 <tt class="descname">retrieveFileFromOffset</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0</em>, <em>max_length=-1</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#smb.SMBConnection.SMBConnection.retrieveFileFromOffset" title="Permalink to this definition">¶</a></dt>
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>
388407 <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>
389408 <table class="docutils field-list" frame="void" rules="none">
390409 <col class="field-name" />
393412 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
394413 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
395414 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
396 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> up to <em>max_length</em> number of bytes. In Python3, this file-like object must have a <em>write</em> method which accepts a bytes parameter.</li>
415 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> up to <em>max_length</em> number of bytes.</li>
397416 <li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
398417 <li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
399418 If zero, the method returns immediately after the file is opened successfully for reading.</li>
420439 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
421440 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
422441 If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
423 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF. In Python3, this file-like object must have a <em>read</em> method which returns a bytes parameter.</li>
442 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
424443 </ul>
425444 </td>
426445 </tr>
451470
452471 <dl class="attribute">
453472 <dt id="smb.SMBConnection.SMBConnection.isUsingSMB2">
454 <tt class="descname">isUsingSMB2</tt><a class="headerlink" href="#smb.SMBConnection.SMBConnection.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
473 <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>
455474 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
456475 </dd></dl>
457476
478497 <li class="right" >
479498 <a href="nmb_NetBIOS.html" title="NetBIOS class"
480499 >previous</a> |</li>
481 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
500 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
482501 </ul>
483502 </div>
484503 <div class="footer">
485 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
486 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
504 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
505 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
487506 </div>
488507 </body>
489508 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SMbHandler Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>SMbHandler Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" />
2927 <link rel="prev" title="SMBConnection Class" href="smb_SMBConnection.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="smb_SMBConnection.html" title="SMBConnection Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
155153 <li class="right" >
156154 <a href="smb_SMBConnection.html" title="SMBConnection Class"
157155 >previous</a> |</li>
158 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
156 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
159157 </ul>
160158 </div>
161159 <div class="footer">
162 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
163 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
160 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
161 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
164162 </div>
165163 </body>
166164 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>SMBProtocolFactory Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SharedDevice Class" href="smb_SharedDevice.html" />
2927 <link rel="prev" title="SMbHandler Class" href="smb_SMBHandler.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="smb_SMBHandler.html" title="SMbHandler Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
189187 <tbody valign="top">
190188 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
191189 <li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
192 You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of <tt class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></tt></li>
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>
193191 <li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
194192 On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
195193 This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
317315 </dd></dl>
318316
319317 <dl class="method">
318 <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>
320 <dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
321 <table class="docutils field-list" frame="void" rules="none">
322 <col class="field-name" />
323 <col class="field-body" />
324 <tbody valign="top">
325 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
326 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
327 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
328 </ul>
329 </td>
330 </tr>
331 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
332 </td>
333 </tr>
334 </tbody>
335 </table>
336 </dd></dl>
337
338 <dl class="method">
320339 <dt id="smb.SMBProtocol.SMBProtocolFactory.listPath">
321340 <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>
322341 <dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
359378
360379 <dl class="method">
361380 <dt id="smb.SMBProtocol.SMBProtocolFactory.listSnapshots">
362 <tt class="descname">listSnapshots</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listSnapshots" title="Permalink to this definition">¶</a></dt>
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>
363382 <dd><p>Retrieve a list of available snapshots (a.k.a. shadow copies) for <em>path</em>.</p>
364383 <p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
365384 <table class="docutils field-list" frame="void" rules="none">
372391 </ul>
373392 </td>
374393 </tr>
375 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A list of python <em>datetime.DateTime</em> instances in GMT/UTC time zone</p>
394 <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of python <em>datetime.DateTime</em>
395 instances in GMT/UTC time zone</p>
376396 </td>
377397 </tr>
378398 </tbody>
441461 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
442462 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
443463 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
444 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service. In Python3, this file-like object must have a <em>write</em> method which accepts a bytes parameter.</li>
464 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
445465 </ul>
446466 </td>
447467 </tr>
455475
456476 <dl class="method">
457477 <dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">
458 <tt class="descname">retrieveFileFromOffset</tt><big>(</big><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0</em>, <em>max_length=-1</em>, <em>timeout=30</em><big>)</big><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset" title="Permalink to this definition">¶</a></dt>
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>
459479 <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>
460480 <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
461481 of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
467487 <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
468488 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
469489 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
470 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service. In Python3, this file-like object must have a <em>write</em> method which accepts a bytes parameter.</li>
490 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
471491 <li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
472492 <li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
473493 If zero, the <em>Deferred</em> callback is invoked immediately after the file is opened successfully for reading.</li>
498518 <li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
499519 <li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
500520 If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
501 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF. In Python3, this file-like object must have a <em>read</em> method which returns a bytes parameter.</li>
521 <li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
502522 </ul>
503523 </td>
504524 </tr>
541561
542562 <dl class="attribute">
543563 <dt id="smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">
544 <tt class="descname">isUsingSMB2</tt><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
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>
545565 <dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
546566 </dd></dl>
547567
568588 <li class="right" >
569589 <a href="smb_SMBHandler.html" title="SMbHandler Class"
570590 >previous</a> |</li>
571 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
591 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
572592 </ul>
573593 </div>
574594 <div class="footer">
575 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
576 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
595 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
596 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
577597 </div>
578598 </body>
579599 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SharedDevice Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>SharedDevice Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SharedFile Class" href="smb_SharedFile.html" />
2927 <link rel="prev" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
147145 <li class="right" >
148146 <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
149147 >previous</a> |</li>
150 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
148 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
151149 </ul>
152150 </div>
153151 <div class="footer">
154 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
155 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
152 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
153 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
156154 </div>
157155 </body>
158156 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SharedFile Class &mdash; pysmb 1.1.5 documentation</title>
8 <title>SharedFile Class &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="SMB Exceptions" href="smb_exceptions.html" />
2927 <link rel="prev" title="SharedDevice Class" href="smb_SharedDevice.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="smb_SharedDevice.html" title="SharedDevice Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
126124 </dd></dl>
127125
128126 <dl class="attribute">
127 <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>
129 <dd><p>A convenience property to return True if this file resource is read-only on the remote server</p>
130 </dd></dl>
131
132 <dl class="attribute">
129133 <dt id="smb.base.SharedFile.last_access_time">
130134 <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>
131135 <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>
171175 <li class="right" >
172176 <a href="smb_SharedDevice.html" title="SharedDevice Class"
173177 >previous</a> |</li>
174 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
178 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
175179 </ul>
176180 </div>
177181 <div class="footer">
178 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
179 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
182 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
183 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
180184 </div>
181185 </body>
182186 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>SMB Exceptions &mdash; pysmb 1.1.5 documentation</title>
8 <title>SMB Exceptions &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
1715 URL_ROOT: '../',
18 VERSION: '1.1.5',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="../_static/jquery.js"></script>
2523 <script type="text/javascript" src="../_static/underscore.js"></script>
2624 <script type="text/javascript" src="../_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="../index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="../index.html" />
2826 <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
2927 <link rel="prev" title="SharedFile Class" href="smb_SharedFile.html" />
3028 </head>
4139 <li class="right" >
4240 <a href="smb_SharedFile.html" title="SharedFile Class"
4341 accesskey="P">previous</a> |</li>
44 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
42 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4543 </ul>
4644 </div>
4745 <div class="sphinxsidebar">
135133 <li class="right" >
136134 <a href="smb_SharedFile.html" title="SharedFile Class"
137135 >previous</a> |</li>
138 <li><a href="../index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
136 <li><a href="../index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
139137 </ul>
140138 </div>
141139 <div class="footer">
142 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
143 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
140 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
141 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
144142 </div>
145143 </body>
146144 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.5 documentation</title>
8 <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1412
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
17 URL_ROOT: '',
18 VERSION: '1.1.5',
15 URL_ROOT: './',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="_static/jquery.js"></script>
2523 <script type="text/javascript" src="_static/underscore.js"></script>
2624 <script type="text/javascript" src="_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="index.html" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="index.html" />
2826 <link rel="prev" title="SMB Exceptions" href="api/smb_exceptions.html" />
2927 </head>
3028 <body>
3735 <li class="right" >
3836 <a href="api/smb_exceptions.html" title="SMB Exceptions"
3937 accesskey="P">previous</a> |</li>
40 <li><a href="index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
38 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4139 </ul>
4240 </div>
4341 <div class="sphinxsidebar">
112110 <li class="right" >
113111 <a href="api/smb_exceptions.html" title="SMB Exceptions"
114112 >previous</a> |</li>
115 <li><a href="index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
113 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
116114 </ul>
117115 </div>
118116 <div class="footer">
119 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
120 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
117 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
118 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
121119 </div>
122120 </body>
123121 </html>
0
1
2
30
41 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
52 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
96 <head>
107 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
118
12 <title>Index &mdash; pysmb 1.1.5 documentation</title>
9 <title>Index &mdash; pysmb 1.1.10 documentation</title>
1310
1411 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1512 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1613
1714 <script type="text/javascript">
1815 var DOCUMENTATION_OPTIONS = {
19 URL_ROOT: '',
20 VERSION: '1.1.5',
16 URL_ROOT: './',
17 VERSION: '1.1.10',
2118 COLLAPSE_INDEX: false,
2219 FILE_SUFFIX: '.html',
2320 HAS_SOURCE: true
2623 <script type="text/javascript" src="_static/jquery.js"></script>
2724 <script type="text/javascript" src="_static/underscore.js"></script>
2825 <script type="text/javascript" src="_static/doctools.js"></script>
29 <link rel="top" title="pysmb 1.1.5 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.10 documentation" href="index.html" />
3027 </head>
3128 <body>
3229 <div class="related">
3532 <li class="right" style="margin-right: 10px">
3633 <a href="#" title="General Index"
3734 accesskey="I">index</a></li>
38 <li><a href="index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
35 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
3936 </ul>
4037 </div>
4138 <div class="sphinxsidebar">
7471 | <a href="#D"><strong>D</strong></a>
7572 | <a href="#E"><strong>E</strong></a>
7673 | <a href="#F"><strong>F</strong></a>
74 | <a href="#G"><strong>G</strong></a>
7775 | <a href="#I"><strong>I</strong></a>
7876 | <a href="#L"><strong>L</strong></a>
7977 | <a href="#N"><strong>N</strong></a>
228226 </dl></td>
229227 </tr></table>
230228
229 <h2 id="G">G</h2>
230 <table style="width: 100%" class="indextable genindextable"><tr>
231 <td style="width: 33%" valign="top"><dl>
232
233 <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.getAttributes">getAttributes() (smb.SMBConnection.SMBConnection method)</a>
234 </dt>
235
236 <dd><dl>
237
238 <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">(smb.SMBProtocol.SMBProtocolFactory method)</a>
239 </dt>
240
241 </dl></dd>
242 </dl></td>
243 </tr></table>
244
231245 <h2 id="I">I</h2>
232246 <table style="width: 100%" class="indextable genindextable"><tr>
233247 <td style="width: 33%" valign="top"><dl>
237251
238252
239253 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isDirectory">isDirectory (smb.base.SharedFile attribute)</a>
254 </dt>
255
256
257 <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isReadOnly">isReadOnly (smb.base.SharedFile attribute)</a>
240258 </dt>
241259
242260
549567 <li class="right" style="margin-right: 10px">
550568 <a href="#" title="General Index"
551569 >index</a></li>
552 <li><a href="index.html">pysmb 1.1.5 documentation</a> &raquo;</li>
570 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
553571 </ul>
554572 </div>
555573 <div class="footer">
556 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
557 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
574 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
575 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
558576 </div>
559577 </body>
560578 </html>
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>Welcome to pysmb’s documentation! &mdash; pysmb 1.1.5 documentation</title>
8 <title>Welcome to pysmb’s documentation! &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1412
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
17 URL_ROOT: '',
18 VERSION: '1.1.5',
15 URL_ROOT: './',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2422 <script type="text/javascript" src="_static/jquery.js"></script>
2523 <script type="text/javascript" src="_static/underscore.js"></script>
2624 <script type="text/javascript" src="_static/doctools.js"></script>
27 <link rel="top" title="pysmb 1.1.5 documentation" href="#" />
25 <link rel="top" title="pysmb 1.1.10 documentation" href="#" />
2826 <link rel="next" title="NBNSProtocol Class" href="api/nmb_NBNSProtocol.html" />
2927 </head>
3028 <body>
3735 <li class="right" >
3836 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
3937 accesskey="N">next</a> |</li>
40 <li><a href="#">pysmb 1.1.5 documentation</a> &raquo;</li>
38 <li><a href="#">pysmb 1.1.10 documentation</a> &raquo;</li>
4139 </ul>
4240 </div>
4341 <div class="sphinxsidebar">
5149 </li>
5250 <li><a class="reference internal" href="#package-contents-and-description">Package Contents and Description</a></li>
5351 <li><a class="reference internal" href="#using-pysmb">Using pysmb</a></li>
54 <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a><ul>
55 </ul>
56 </li>
52 <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
5753 </ul>
5854
5955 <h4>Next topic</h4>
212208 <li class="right" >
213209 <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
214210 >next</a> |</li>
215 <li><a href="#">pysmb 1.1.5 documentation</a> &raquo;</li>
211 <li><a href="#">pysmb 1.1.10 documentation</a> &raquo;</li>
216212 </ul>
217213 </div>
218214 <div class="footer">
219 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
220 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
215 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
216 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
221217 </div>
222218 </body>
223219 </html>
Binary diff not shown
0
1
20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
31 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
75 <head>
86 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
97
10 <title>Search &mdash; pysmb 1.1.5 documentation</title>
8 <title>Search &mdash; pysmb 1.1.10 documentation</title>
119
1210 <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
1311 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
1412
1513 <script type="text/javascript">
1614 var DOCUMENTATION_OPTIONS = {
17 URL_ROOT: '',
18 VERSION: '1.1.5',
15 URL_ROOT: './',
16 VERSION: '1.1.10',
1917 COLLAPSE_INDEX: false,
2018 FILE_SUFFIX: '.html',
2119 HAS_SOURCE: true
2523 <script type="text/javascript" src="_static/underscore.js"></script>
2624 <script type="text/javascript" src="_static/doctools.js"></script>
2725 <script type="text/javascript" src="_static/searchtools.js"></script>
28 <link rel="top" title="pysmb 1.1.5 documentation" href="index.html" />
26 <link rel="top" title="pysmb 1.1.10 documentation" href="index.html" />
2927 <script type="text/javascript">
3028 jQuery(function() { Search.loadIndex("searchindex.js"); });
3129 </script>
30
31 <script type="text/javascript" id="searchindexloader"></script>
3232
3333
3434 </head>
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.5 documentation</a> &raquo;</li>
42 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
4343 </ul>
4444 </div>
4545 <div class="sphinxsidebar">
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.5 documentation</a> &raquo;</li>
90 <li><a href="index.html">pysmb 1.1.10 documentation</a> &raquo;</li>
9191 </ul>
9292 </div>
9393 <div class="footer">
94 &copy; Copyright 2001-2013, Michael Teo http://miketeo.net/.
95 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
94 &copy; Copyright 2001-2014, Michael Teo http://miketeo.net/.
95 Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
9696 </div>
9797 </body>
9898 </html>
0 Search.setIndex({objects:{"nmb.NetBIOS":{NetBIOS:[4,1,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[9,1,1,""],NetBIOSTimeout:[9,1,1,""]},"smb.SMBProtocol":{SMBProtocolFactory:[8,1,1,""]},"nmb.NetBIOS.NetBIOS":{close:[4,2,1,""],queryName:[4,2,1,""],"__init__":[4,2,1,""],queryIPForName:[4,2,1,""]},"smb.base":{NotConnectedError:[6,1,1,""],SharedFile:[3,1,1,""],SMBTimeout:[6,1,1,""],NotReadyError:[6,1,1,""],SharedDevice:[1,1,1,""]},"smb.SMBConnection.SMBConnection":{rename:[7,2,1,""],deleteDirectory:[7,2,1,""],listSnapshots:[7,2,1,""],retrieveFileFromOffset:[7,2,1,""],deleteFiles:[7,2,1,""],listShares:[7,2,1,""],SIGN_WHEN_SUPPORTED:[7,0,1,""],SIGN_NEVER:[7,0,1,""],echo:[7,2,1,""],retrieveFile:[7,2,1,""],storeFile:[7,2,1,""],connect:[7,2,1,""],close:[7,2,1,""],createDirectory:[7,2,1,""],SIGN_WHEN_REQUIRED:[7,0,1,""],listPath:[7,2,1,""],"__init__":[7,2,1,""],isUsingSMB2:[7,0,1,""]},"smb.base.SharedFile":{short_name:[3,0,1,""],last_write_time:[3,0,1,""],last_attr_change_time:[3,0,1,""],last_access_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,2,1,""],deleteDirectory:[8,2,1,""],SIGN_WHEN_SUPPORTED:[8,0,1,""],onAuthFailed:[8,2,1,""],retrieveFileFromOffset:[8,2,1,""],listSnapshots:[8,2,1,""],retrieveFile:[8,2,1,""],listShares:[8,2,1,""],isReady:[8,0,1,""],SIGN_NEVER:[8,0,1,""],listPath:[8,2,1,""],instance:[8,0,1,""],closeConnection:[8,2,1,""],SIGN_WHEN_REQUIRED:[8,0,1,""],onAuthOK:[8,2,1,""],storeFile:[8,2,1,""],createDirectory:[8,2,1,""],echo:[8,2,1,""],deleteFiles:[8,2,1,""],"__init__":[8,2,1,""],isUsingSMB2:[8,0,1,""]},"smb.SMBConnection":{SMBConnection:[7,1,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{queryName:[9,2,1,""],"__init__":[9,2,1,""],queryIPForName:[9,2,1,""]},"smb.smb_structs":{UnsupportedFeature:[6,1,1,""],ProtocolError:[6,1,1,""],OperationFailure:[6,1,1,""]},"smb.base.SharedDevice":{isSpecial:[1,0,1,""],type:[1,0,1,""],comments:[1,0,1,""],isTemporary:[1,0,1,""],name:[1,0,1,""]}},terms:{all:[8,0,7],code:2,jason:[4,9],illustr:[8,7,2],queri:[4,0,8,9,7],overrid:[8,5],follow:[8,0,2,7,1],whose:0,accur:8,depend:0,listen_port:[4,9],netbiostimeout:9,service_nam:[8,7],specif:0,send:[4,8,9,7],present:6,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,8,9,7],util:[8,7],mechan:[8,7],fileretriev:8,failur:9,miketeo:0,administr:1,list:[4,0,8,9,7],upload:[8,7,2],smb:[0,1,2,3,4,5,6,7,8],"try":[8,5,7],upload_fil:2,session:[0,5],refer:[8,0,7,1],pleas:0,sign_when_requir:[8,7],direct:[8,7],sign:[8,7],deletedirectori:[8,7],zero:[4,8,9,7],nbn:[4,0],pass:[8,7,2],sock_famili:7,client_machine_nam:[8,7],port:[4,8,9,7],compat:[8,7],index:0,what:[4,8,7,9,5],sub:[8,7],repli:[4,8,9,7],section:0,"while":6,access:[8,7,3],delet:[8,7,2],version:0,u32:0,"new":[4,8,7,5],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],overwritten:[8,7],step:5,queue:8,credit:0,loseconnect:8,implement:[0,4,5,7,8,9],stoplisten:9,ipc:1,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,8,9,7],listshar:[8,7],instal:[8,0,7],total:3,establish:[8,7],select:[4,8,9,7],from:[0,2,4,5,7,8,9],describ:[5,7],commun:[8,0,7,1],call:[8,3,4,5,7,9],handl:[8,5],type:1,until:[4,8,7],more:[8,0,7,3,5],sort:7,relat:0,sambda:[8,7],flag:[4,8,9,7],accept:[8,5,7],known:[8,7],actual:7,must:[8,7,9],none:[8,1,3,4,6,7,9],retriev:[8,7,2],setup:[4,8,9,5],dmitri:0,kwarg:8,can:[0,1,2,4,5,7,8,9],caveat:[8,7],learn:[8,7],purpos:0,def:8,control:[8,7],defer:[8,9],process:[5,2],share:[0,1,2,3,8,7],sharedfil:[8,0,3,7],indic:[4,0,8,9,7],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,8,7,9,5],pure:0,reject:[8,7],onauthfail:[8,5],simpl:[8,7],old_path:[8,7],dialect:0,resourc:[4,8,3,7],remote_nam:[8,5,7],referenc:0,after:[4,0,8,9,7],befor:[8,7],wrong:5,mai:[8,7],end:[8,7],smb_ext_file_attr:3,data:[8,0,2,7,5],alloc:3,"short":3,attempt: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],held:7,through:8,digest:0,paramet:[0,2,4,5,7,8,9],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:[8,0,7,1],non:[8,7],"float":[4,8,9,3],"return":[0,1,2,3,4,7,8,9],thei:0,python:[8,0,2,7],auto:[8,7],safe:[8,7],initi:[5,1],dat:2,framework:[8,0,9,5],promis:0,facilit:0,pyde: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:[8,0,7,6,5],separ:0,mode:[4,9],timeout:[4,8,9,6,7],each:[4,8,7,3,1],done:[4,9],unicod:[8,7,2,3,1],side:0,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:[8,0,7],suitabl:[0,7],rel:[8,7],internet:[8,9],print:[8,0],determin:[4,0,8,9,7],forth:1,factori:8,sp3:0,insid:[8,7],querynam:[4,9],guess:[8,7],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,last_access_tim:3,could:[0,3],synchron:[0,5],keep:7,filter:[8,7],length:3,place:0,first:[8,7,2],oper:[0,4,5,6,7,8],softwar:0,directli:[8,3],enterpris:[8,7],onc:[8,5],number:[4,8,9,3,7],yourself:0,"\u5783\u573e\u6587\u4ef6":2,messag:[8,0,6,7],path_file_pattern:[8,7],open:[8,0,2,7],size:[8,3],differ:[8,0,7,5],notreadyerror:[8,6],licens:0,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,8,9,7],broadcast:[4,9],part:5,pars:0,packet:[4,8,9,5],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],other:[8,0,5],seri:8,"function":[4,0,8,9],comput:[8,7],well:0,respons:6,smb2:[8,0,7],ani:[4,0,8,3,7],smb1:[8,0,7],download:[8,0],netbiossess:0,have:[8,0,7,9,5],reserv:1,need:[0,2,3,8,5,7],smb2_constant:0,seek:[8,7],packag:[0,2],bitwis:[8,7],inform:[3,1],support_smb2:[8,7],self:[8,5],comm_devic:1,click:[8,7],note:[8,7,2],also:[8,7,1],without:[0,9],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:[8,0,7,5],regular:[8,7],smbprotocolfactori:[8,0,3],"class":[0,1,2,3,4,5,6,7,8,9],smbconnect:[0,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:[8,0,7,3,5],microsoft:0,dot:[4,9],reactor:[8,9],netbiosprotocol:[0,9],server_nam:[8,7],concurr:[8,7],protocol:[8,0,6,7],find:[8,5,7],involv:5,current:6,onli:[8,0,2,7],configur:[8,7],should:[4,8,9,3,7],busi:[8,7],folder:[8,0,2,3,7],local:[8,7],hope:[4,9],meant: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,queryipfornam:[4,9],"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],rfc1001:[8,7,2],deletefil:[8,7],see:[8,7,3],sec:8,result:[8,7,9],arg:8,fail:[8,5,6,7],close:[4,8,2,7],"60kbyte":8,detect:[8,7],new_path:[8,7],extend:[0,5],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,8,9,3,7],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:[8,0,9,6],securityblob:0,onauthok:[8,5],wider:[8,7],ultim:[8,7],rozmanov:0,short_nam:3,devic:[3,1],isreadi:8,been:[8,0,7,6,5],compon:[8,7,2],operationfailur:[8,7,6],interest:[8,7],immedi:[8,7],use_ntlm_v2:[8,5,7],blob:0,smb_struct:[8,0,6,7],thousand:8,assert:7,togeth:0,those:8,"case":8,look:0,sign_when_support:[8,7],servic:[4,0,8,7,5],properti:[8,7,3],batch:8,defin:[4,9],invok:[8,7],abov:5,error:[8,5,7],report:5,gmt:[8,7],loop:5,readi:[8,6],alloc_s:3,tabl:0,henc:[8,0,7],site:0,archiv:[8,7],incom:9,ascii:[8,7],conn:7,precis:8,isdirectori:3,develop:[0,3,7],welcom:0,datetim:[8,7],perform:[4,8,7,9,5],parti:0,isspeci:1,same:[8,7],proce:8,decod:0,create_tim:3,document:0,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,auth:8,protocolerror:6,chang:3,googl:0,nbnsprotocol:[4,0,9],appropri:[4,9],choos:[8,7],entri:3,itself:[8,0],exampl:[8,0,2,7],command:[8,7],thi:[0,1,3,4,5,7,8,9],english:[8,7],file_obj:[8,7],retrievefil:[8,7],ccc:[4,9],latest:0,identifi:[8,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,add:[8,9],discret:0,dixon:0,exercis:0,els:[8,7],subsequ:2,match:[4,8,9,7],retrievefilefactori:8,applic:[4,0,8,9,3],around:9,read:[8,0,2,7,5],thoma:0,know:[4,8,9],bit:[8,0,7],password:[8,7],python3:[8,7],like:[8,7,2],success:[5,7],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,8,9,7],intern:[8,0,5],istemporari:1,successfulli:[8,7],transport:[8,0,9],txt:[8,7,2],smbtest:[8,7],avoid:8,smb2_struct:0,sharedfold:2,subclass:[8,5],buffer:5,retri:8,leav:[4,8,9,7],pysmb:[0,8,5,6,7,9],ddd:[4,9],machin:[0,2,4,7,8,9],object:[8,7,2],shadow:[8,7],workgroup:[8,7],atttempt:7,host:[8,7,2],nmb:[4,0,9],offset:[8,7],post:[8,5],impos:[8,7],proceed:[8,7],about:[8,7,3,1],obj:[8,7],socket:[4,5,7],idl:7,pymsb:8,includ:[0,5],commerci:0,mean:8,pyasn1:0,disabl:[8,7],block:[4,0,9,7],routin:0,client:[8,0,7],own:[8,0,5],bbb:[4,9],within:[8,0,7],encod:0,automat:[4,8,9,7],due:5,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],support:[8,0,2,6,7],"long":[8,7,3],smb_messag:6,avail:[8,0,7],start:[8,7,9],anderson:[4,9],ipv4:4,files:7,creation:[3,1],server_ip:[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],wish:[4,7],maximum:[8,7],asynchron:[5,9,7],limit:[8,7,3],otherwis:[8,7],listpath:[8,7,3],netbio:[0,2,4,5,7,8,9],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],write_result:8,echo:[8,7],again:9,vista:[8,0,7],encrypt:0,excee:8,sequenti:7,when:[0,4,5,6,7,8,9],detail:[0,3,5],data_buf:6,"default":[8,7],valid:2,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,8,9,7],eof:[8,7],algorithm:[8,0,7,5],directori:[8,7,2,3],descript:[0,1],alphanumer:[8,7],pathnam:[8,7],time:[8,0,7,3,1],file_fh:2,smbhandler:[0,2]},objtypes:{"0":"py:attribute","1":"py:class","2":"py:method"},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"],objnames:{"0":["py","attribute","Python attribute"],"1":["py","class","Python class"],"2":["py","method","Python method"]},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"]})
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:[8,0,2,7,1],whose:0,accur:8,depend:0,listen_port:[4,9],netbiostimeout:9,service_nam:[8,7],specif:0,send:[4,8,9,7],present:6,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,8,9,7],util:[8,7],mechan:[8,7],fileretriev:8,failur:9,miketeo:0,administr:1,list:[4,0,8,9,7],upload:[8,7,2],smb:[4,2,3,1],"try":[8,5,7],upload_fil:2,session:[0,5],refer:[8,0,7,1],pleas:0,sign_when_requir:[8,7],direct:[8,7],sign:[8,7],deletedirectori:[8,7],zero:[4,8,9,7],nbn:[4,0],pass:[8,7,2],sock_famili:7,client_machine_nam:[8,7],port:[4,8,9,7],compat:[8,7],index:0,what:[4,8,7,9,5],sub:[8,7],repli:[4,8,9,7],section:0,"while":6,access:[8,7,3],delet:[8,7,2],version:0,u32:0,"new":[4,8,7,5],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],overwritten:[8,7],step:5,queue:8,datetim:[8,7],loseconnect:8,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,8,9,7],listshar:[8,7],instal:[8,0,7],txt:[8,7,2],establish:[8,7],select:[4,8,9,7],from:[0,2,4,5,7,8,9],proceed:[8,7],commun:[8,0,7,1],call:[8,3,4,5,7,9],isreadonli:3,type:1,until:[4,8,7],more:[8,0,7,3,5],sort:7,relat:0,sambda:[8,7],flag:[4,8,9,7],accept:[8,5],known:[8,7],actual:7,must:[8,7,9],none:[8,1,3,4,6,7,9],retriev:[8,7,2],setup:[4,8,9,5],dmitri:0,kwarg:8,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:[4,9],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,conn:7,pure:0,reject:[8,7],onauthfail:[8,5],simpl:[8,7],old_path:[8,7],dialect:0,resourc:[4,8,3,7],referenc:0,after:[4,0,8,9,7],befor:[8,7],wrong:5,mai:[8,7],end:[8,7],smb_ext_file_attr:3,data:[8,0,2,7,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],inform:[8,7,3,1],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],"float":[4,8,9,3],"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:9,promis:0,facilit:0,pyde: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:[8,0,7,6,5],separ:0,adderrback:8,mode:[4,9],timeout:[4,8,9,6,7],each:[4,8,7,3,1],done:[4,9],unicod:[8,7,2,3,1],side:0,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],forth:1,factori:8,sp3:0,insid:[8,7],querynam:[4,9],differ:[8,0,7,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,last_access_tim:3,could:[0,3],synchron:[0,5],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,8,9,3,7],yourself:0,"\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,8,9,7],broadcast:[4,9],part:5,pars:0,rfc1001:[8,7,2],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],initi:[5,1],seri:8,files:7,comput:[8,7],respons:6,ani:[4,0,8,3,7],smb1:[8,0,7],packag:2,netbiossess:0,have:[7,0,9,5],reserv:1,need:[0,2,3,8,5,7],smb2_constant:0,seek:[8,7],bitwis:[8,7],callback:[8,5,9],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:[8,0,7,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],latest:0,microsoft:0,dot:[4,9],reactor:[8,9],netbiosprotocol:[0,9],server_nam:[8,7],concurr:[8,7],protocol:[8,0,6,7],find:[8,5,7],involv:5,current:6,onli:[8,0,2,3,7],configur:[8,7],should:[4,8,9,3,7],busi:[8,7],folder:[8,0,2,3,7],local:[8,7],hope:[4,9],meant:7,disk_tre:1,listenudp:9,contribut:[4,9],variou:0,utc:[8,7],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],packet:[4,8,9,5],deletefil:[8,7],see:[8,7,3],sec:8,result:[8,7,9],arg:8,fail:[8,5,6,7],close:[4,8,2,7],"60kbyte":8,detect:[8,7],new_path:[8,7],pattern:[8,7],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,etc:8,instanc:[4,8,9,3,7],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:9,securityblob:0,onauthok:[8,5],wider:[8,7],ultim:[8,7],rozmanov:0,short_nam:3,devic:[3,1],isreadi:8,been:[8,0,7,6,5],compon:[8,7,2],operationfailur:[8,7,6],server_ip:[8,7],immedi:[8,7],use_ntlm_v2:[8,5,7],blob:0,smb_struct:[8,0,6,7],thousand:8,assert:7,togeth:0,those:8,"case":8,look:0,sign_when_support:[8,7],servic:[4,0,8,7,5],properti:[8,7,3],batch:8,defin:[4,9],invok:[8,7],abov:5,error:[8,5,7],report:5,retrievefilefactori:8,loop:5,readi:[8,6],alloc_s:3,henc:[8,0,7],site:0,archiv:[8,7],incom:9,ascii:[8,7],"__init__":[4,8,7,9,5],precis:8,isdirectori:3,develop:[0,3,7],perform:[4,8,7,9,5],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,user:[8,7,1],protocolerror:6,chang:3,googl:0,appropri:[4,9],choos:[8,7],entri:3,well:0,without:[0,9],command:[8,7],thi:[0,1,3,4,5,7,8,9],english:[8,7],file_obj:[8,7],retrievefil:[8,7],ccc:[4,9],usual:[8,0,7,3,5],identifi:[8,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,remote_nam:[8,5,7],param:[],add:[8,9],other:[],dixon:0,exercis:0,els:[8,7],subsequ:2,match:[4,8,9,7],gmt:[8,7],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],success:[5,7],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,8,9,7],intern:[8,0,5],istemporari:1,successfulli:[8,7],transport:[8,0,9],smbprotocol:[8,0,3],total:3,smbtest:[8,7],avoid:8,smb2_struct:0,sharedfold:2,subclass:[8,5],buffer:5,retri:8,leav:[4,8,9,7],commerci:0,pysmb:[9,6],ddd:[4,9],machin:[0,2,4,7,8,9],object:[8,7,2],shadow:[8,7],workgroup:[8,7],atttempt:7,host:[8,7,2],nmb:[4,0,9],offset:[8,7],post:[8,5],impos:[8,7],describ:[5,7],about:[8,7,3,1],obj:[8,7],socket:[4,5,7],idl:7,pymsb:8,includ:[0,5],constructor:5,mean:8,pyasn1:0,disabl:[8,7],block:[4,0,9,7],routin:0,client:[8,0,7],own:[8,0,5],within:[8,0,7],encod:0,automat:[4,8,9,7],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],ipv4:4,"function":[4,0,8,9],creation:[3,1],interest:[8,7],tupl:[8,7],whiteman:0,translat:0,newer:[8,7],"true":[8,1,3,4,7,9],notat:[4,9,3],made:[8,0,7],utf:2,cif:[0,3,4,5,6,7,8],possibl:0,whether:[8,7],wish:[4,7],maximum:[8,7],asynchron:[5,9,7],limit:[8,7,3],otherwis:[8,7],listpath:[8,7,3],netbio:9,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,excee:8,sequenti:7,when:[0,4,5,6,7,8,9],detail:[0,3,5],data_buf:6,"default":[8,7],valid:2,librari:0,test:0,you:[0,2,3,4,5,7,8,9],functionl:8,determin:[4,0,8,9,7],file_attribut:[8,7,3],urllib2:[0,2],authenthent:8,briefli:5,receiv:[4,8,9,7],eof:[8,7],algorithm:[8,0,7,5],directori:[8,7,2,3],descript:1,alphanumer:[8,7],itself:[8,0],pathnam:[8,7],time:[8,0,7,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.NetBIOSProtocol.NBNSProtocol":{queryName:[9,1,1,""],"__init__":[9,1,1,""],queryIPForName:[9,1,1,""]},"smb.base":{NotConnectedError:[6,2,1,""],SharedFile:[3,2,1,""],SMBTimeout:[6,2,1,""],NotReadyError:[6,2,1,""],SharedDevice:[1,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,""],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.NetBIOS.NetBIOS":{close:[4,1,1,""],queryName:[4,1,1,""],"__init__":[4,1,1,""],queryIPForName:[4,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}})
219219
220220 return results
221221
222 def getAttributes(self, service_name, path, timeout = 30):
223 """
224 Retrieve information about the file at *path* on the *service_name*.
225
226 :param string/unicode service_name: the name of the shared folder for the *path*
227 :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.
228 :return: A :doc:`smb.base.SharedFile<smb_SharedFile>` instance containing the attributes of the file.
229 """
230 if not self.sock:
231 raise NotConnectedError('Not connected to server')
232
233 results = [ ]
234
235 def cb(info):
236 self.is_busy = False
237 results.append(info)
238
239 def eb(failure):
240 self.is_busy = False
241 raise failure
242
243 self.is_busy = True
244 try:
245 self._getAttributes(service_name, path, cb, eb, timeout)
246 while self.is_busy:
247 self._pollForNetBIOSPacket(timeout)
248 finally:
249 self.is_busy = False
250
251 return results[0]
252
222253 def retrieveFile(self, service_name, path, file_obj, timeout = 30):
223254 """
224255 Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.
200200
201201 :param string/unicode service_name: the name of the shared folder for the *path*
202202 :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots
203 :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone
203 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of python *datetime.DateTime*
204 instances in GMT/UTC time zone
204205 """
205206 if not self.instance:
206207 raise NotConnectedError('Not connected to server')
207208
208209 d = defer.Deferred()
209210 self.instance._listSnapshots(service_name, path, d.callback, d.errback, timeout = timeout)
211 return d
212
213 def getAttributes(self, service_name, path, timeout = 30):
214 """
215 Retrieve information about the file at *path* on the *service_name*.
216
217 :param string/unicode service_name: the name of the shared folder for the *path*
218 :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.
219 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a :doc:`smb.base.SharedFile<smb_SharedFile>` instance containing the attributes of the file.
220 """
221 if not self.instance:
222 raise NotConnectedError('Not connected to server')
223
224 d = defer.Deferred()
225 self.instance._getAttributes(service_name, path, d.callback, d.errback, timeout = timeout)
210226 return d
211227
212228 def retrieveFile(self, service_name, path, file_obj, timeout = 30):
166166 self._listShares = self._listShares_SMB1
167167 self._listPath = self._listPath_SMB1
168168 self._listSnapshots = self._listSnapshots_SMB1
169 self._getAttributes = self._getAttributes_SMB1
169170 self._retrieveFile = self._retrieveFile_SMB1
170171 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
171172 self._storeFile = self._storeFile_SMB1
185186 self._listShares = self._listShares_SMB2
186187 self._listPath = self._listPath_SMB2
187188 self._listSnapshots = self._listSnapshots_SMB2
189 self._getAttributes = self._getAttributes_SMB2
188190 self._retrieveFile = self._retrieveFile_SMB2
189191 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
190192 self._storeFile = self._storeFile_SMB2
640642 sendCreate(connect_message.tid)
641643 else:
642644 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
645
646 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
647 self._sendSMBMessage(m)
648 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
649 messages_history.append(m)
650 else:
651 sendCreate(self.connected_trees[service_name])
652
653 def _getAttributes_SMB2(self, service_name, path, callback, errback, timeout = 30):
654 if not self.has_authenticated:
655 raise NotReadyError('SMB connection not authenticated')
656
657 expiry_time = time.time() + timeout
658 path = path.replace('/', '\\')
659 if path.startswith('\\'):
660 path = path[1:]
661 if path.endswith('\\'):
662 path = path[:-1]
663 messages_history = [ ]
664
665 def sendCreate(tid):
666 create_context_data = binascii.unhexlify("""
667 28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
668 44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
669 00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00
670 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
671 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
672 51 46 69 64 00 00 00 00
673 """.replace(' ', '').replace('\n', ''))
674 m = SMB2Message(SMB2CreateRequest(path,
675 file_attributes = 0,
676 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
677 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
678 oplock = SMB2_OPLOCK_LEVEL_NONE,
679 impersonation = SEC_IMPERSONATE,
680 create_options = 0,
681 create_disp = FILE_OPEN,
682 create_context_data = create_context_data))
683 m.tid = tid
684 self._sendSMBMessage(m)
685 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
686 messages_history.append(m)
687
688 def createCB(create_message, **kwargs):
689 messages_history.append(create_message)
690 if create_message.status == 0:
691 p = create_message.payload
692 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
693 p.file_size, p.allocation_size, p.file_attributes,
694 path, path)
695 closeFid(create_message.tid, p.fid, info = info)
696 else:
697 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
698
699 def closeFid(tid, fid, info = None, error = None):
700 m = SMB2Message(SMB2CloseRequest(fid))
701 m.tid = tid
702 self._sendSMBMessage(m)
703 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
704 messages_history.append(m)
705
706 def closeCB(close_message, **kwargs):
707 if kwargs['info'] is not None:
708 callback(kwargs['info'])
709 elif kwargs['error'] is not None:
710 errback(OperationFailure('Failed to get attributes for %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
711
712 if not self.connected_trees.has_key(service_name):
713 def connectCB(connect_message, **kwargs):
714 messages_history.append(connect_message)
715 if connect_message.status == 0:
716 self.connected_trees[service_name] = connect_message.tid
717 sendCreate(connect_message.tid)
718 else:
719 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
643720
644721 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
645722 self._sendSMBMessage(m)
18581935 else:
18591936 sendFindFirst(self.connected_trees[service_name])
18601937
1938 def _getAttributes_SMB1(self, service_name, path, callback, errback, timeout = 30):
1939 if not self.has_authenticated:
1940 raise NotReadyError('SMB connection not authenticated')
1941
1942 expiry_time = time.time() + timeout
1943 path = path.replace('/', '\\')
1944 if path.startswith('\\'):
1945 path = path[1:]
1946 if path.endswith('\\'):
1947 path = path[:-1]
1948 messages_history = [ ]
1949
1950 def sendQuery(tid):
1951 setup_bytes = struct.pack('<H', 0x0005) # TRANS2_QUERY_PATH_INFORMATION sub-command. See [MS-CIFS]: 2.2.6.6.1
1952 params_bytes = \
1953 struct.pack('<HI',
1954 0x0107, # SMB_QUERY_FILE_ALL_INFO ([MS-CIFS] 2.2.2.3.3)
1955 0x0000) # Reserved
1956 params_bytes += (path + '\0').encode('UTF-16LE')
1957
1958 m = SMBMessage(ComTransaction2Request(max_params_count = 2,
1959 max_data_count = 65535,
1960 max_setup_count = 0,
1961 params_bytes = params_bytes,
1962 setup_bytes = setup_bytes))
1963 m.tid = tid
1964 self._sendSMBMessage(m)
1965 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback)
1966 messages_history.append(m)
1967
1968 def queryCB(query_message, **kwargs):
1969 messages_history.append(query_message)
1970 if not query_message.status.hasError:
1971 info_format = '<QQQQIQQ'
1972 info_size = struct.calcsize(info_format)
1973 create_time, last_access_time, last_write_time, last_attr_change_time, \
1974 file_attributes, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
1975
1976 info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
1977 file_size, alloc_size, file_attributes, path, path)
1978 callback(info)
1979 else:
1980 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
1981
1982 if not self.connected_trees.has_key(service_name):
1983 def connectCB(connect_message, **kwargs):
1984 messages_history.append(connect_message)
1985 if not connect_message.status.hasError:
1986 self.connected_trees[service_name] = connect_message.tid
1987 sendQuery(connect_message.tid)
1988 else:
1989 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
1990
1991 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
1992 self._sendSMBMessage(m)
1993 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
1994 messages_history.append(m)
1995 else:
1996 sendQuery(self.connected_trees[service_name])
1997
18611998 def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
18621999 return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0L, -1L, timeout)
18632000
23462483
23472484 @property
23482485 def isDirectory(self):
2349 """A convenience property to return True if this file resource is a directory on the remote server"""
2486 """A convenient property to return True if this file resource is a directory on the remote server"""
23502487 return bool(self.file_attributes & ATTR_DIRECTORY)
23512488
2489 @property
2490 def isReadOnly(self):
2491 """A convenient property to return True if this file resource is read-only on the remote server"""
2492 return bool(self.file_attributes & ATTR_READONLY)
2493
23522494 def __unicode__(self):
23532495 return u'Shared file: %s (FileSize:%d bytes, isDirectory:%s)' % ( self.filename, self.file_size, self.isDirectory )
23542496
129129 GENERIC_READ = 0x80000000L
130130
131131 # SMB_EXT_FILE_ATTR bitmask ([MS-CIFS]: 2.2.1.2.3)
132 # Includes extensions defined in [MS-SMB] 2.2.1.2.1
132133 # Bitmask for FileAttributes field in SMB_COM_NT_CREATE_ANDX request ([MS-CIFS]: 2.2.4.64.1)
133134 # Also used for FileAttributes field in SMB2CreateRequest class ([MS-SMB2]: 2.2.13)
134135 ATTR_READONLY = 0x01
138139 ATTR_ARCHIVE = 0x20
139140 ATTR_NORMAL = 0x80
140141 ATTR_TEMPORARY = 0x0100
142 ATTR_SPARSE = 0x0200
143 ATTR_REPARSE_POINT = 0x0400
141144 ATTR_COMPRESSED = 0x0800
145 ATTR_OFFLINE = 0x1000
146 ATTR_NOT_CONTENT_INDEXED = 0x2000
147 ATTR_ENCRYPTED = 0x4000
142148 POSIX_SEMANTICS = 0x01000000
143149 BACKUP_SEMANTICS = 0x02000000
144150 DELETE_ON_CLOSE = 0x04000000
0 # -*- coding: utf-8 -*-
1
2 from smb.SMBConnection import SMBConnection
3 from util import getConnectionInfo
4 from nose.tools import with_setup
5 from smb import smb_structs
6
7 conn = None
8
9 def setup_func_SMB1():
10 global conn
11 smb_structs.SUPPORT_SMB2 = False
12 info = getConnectionInfo()
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
14 assert conn.connect(info['server_ip'], info['server_port'])
15
16 def setup_func_SMB2():
17 global conn
18 smb_structs.SUPPORT_SMB2 = True
19 info = getConnectionInfo()
20 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
21 assert conn.connect(info['server_ip'], info['server_port'])
22
23 def teardown_func():
24 global conn
25 conn.close()
26
27 @with_setup(setup_func_SMB2, teardown_func)
28 def test_getAttributes_SMB2():
29 global conn
30 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
31 assert info.isDirectory
32
33 info = conn.getAttributes('smbtest', '/rfc1001.txt')
34 assert not info.isDirectory
35
36 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
37 assert info.isDirectory
38
39 @with_setup(setup_func_SMB1, teardown_func)
40 def test_getAttributes_SMB1():
41 global conn
42 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
43 assert info.isDirectory
44
45 info = conn.getAttributes('smbtest', '/rfc1001.txt')
46 assert not info.isDirectory
47
48 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
49 assert info.isDirectory
50
51
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from util import getConnectionInfo
6
7
8 class GetAttributesFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14 self.path = ''
15 self.is_directory = False
16
17 def testDone(self, r):
18 if self.instance:
19 self.instance.transport.loseConnection()
20 return r
21
22 def onAuthOK(self):
23 def cb(info):
24 assert info.isDirectory == self.is_directory
25 self.d.callback(True)
26
27 d = self.getAttributes('smbtest', self.path, timeout = 15)
28 d.addCallback(cb)
29 d.addErrback(self.d.errback)
30
31 def onAuthFailed(self):
32 self.d.errback('Auth failed')
33
34
35 @deferred(timeout=15.0)
36 def test_getAttributes_SMB1_test1():
37 info = getConnectionInfo()
38 smb_structs.SUPPORT_SMB2 = False
39
40 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
41 factory.path = '/Test Folder with Long Name/'
42 factory.is_directory = True
43 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
44 return factory.d
45
46 @deferred(timeout=15.0)
47 def test_getAttributes_SMB1_test2():
48 info = getConnectionInfo()
49 smb_structs.SUPPORT_SMB2 = False
50
51 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
52 factory.path = '/rfc1001.txt'
53 factory.is_directory = False
54 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
55 return factory.d
56
57 @deferred(timeout=15.0)
58 def test_getAttributes_SMB1_test3():
59 info = getConnectionInfo()
60 smb_structs.SUPPORT_SMB2 = False
61
62 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
63 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
64 factory.is_directory = True
65 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
66 return factory.d
67
68 @deferred(timeout=15.0)
69 def test_getAttributes_SMB2_test1():
70 info = getConnectionInfo()
71 smb_structs.SUPPORT_SMB2 = True
72
73 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
74 factory.path = '/Test Folder with Long Name/'
75 factory.is_directory = True
76 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
77 return factory.d
78
79 @deferred(timeout=15.0)
80 def test_getAttributes_SMB2_test2():
81 info = getConnectionInfo()
82 smb_structs.SUPPORT_SMB2 = True
83
84 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
85 factory.path = '/rfc1001.txt'
86 factory.is_directory = False
87 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
88 return factory.d
89
90 @deferred(timeout=15.0)
91 def test_getAttributes_SMB2_test3():
92 info = getConnectionInfo()
93 smb_structs.SUPPORT_SMB2 = True
94
95 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
96 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
97 factory.is_directory = True
98 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
99 return factory.d
219219
220220 return results
221221
222 def getAttributes(self, service_name, path, timeout = 30):
223 """
224 Retrieve information about the file at *path* on the *service_name*.
225
226 :param string/unicode service_name: the name of the shared folder for the *path*
227 :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.
228 :return: A :doc:`smb.base.SharedFile<smb_SharedFile>` instance containing the attributes of the file.
229 """
230 if not self.sock:
231 raise NotConnectedError('Not connected to server')
232
233 results = [ ]
234
235 def cb(info):
236 self.is_busy = False
237 results.append(info)
238
239 def eb(failure):
240 self.is_busy = False
241 raise failure
242
243 self.is_busy = True
244 try:
245 self._getAttributes(service_name, path, cb, eb, timeout)
246 while self.is_busy:
247 self._pollForNetBIOSPacket(timeout)
248 finally:
249 self.is_busy = False
250
251 return results[0]
252
222253 def retrieveFile(self, service_name, path, file_obj, timeout = 30):
223254 """
224255 Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.
201201
202202 :param string/unicode service_name: the name of the shared folder for the *path*
203203 :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots
204 :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone
204 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of python *datetime.DateTime*
205 instances in GMT/UTC time zone
205206 """
206207 if not self.instance:
207208 raise NotConnectedError('Not connected to server')
208209
209210 d = defer.Deferred()
210211 self.instance._listSnapshots(service_name, path, d.callback, d.errback, timeout = timeout)
212 return d
213
214 def getAttributes(self, service_name, path, timeout = 30):
215 """
216 Retrieve information about the file at *path* on the *service_name*.
217
218 :param string/unicode service_name: the name of the shared folder for the *path*
219 :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.
220 :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a :doc:`smb.base.SharedFile<smb_SharedFile>` instance containing the attributes of the file.
221 """
222 if not self.instance:
223 raise NotConnectedError('Not connected to server')
224
225 d = defer.Deferred()
226 self.instance._getAttributes(service_name, path, d.callback, d.errback, timeout = timeout)
211227 return d
212228
213229 def retrieveFile(self, service_name, path, file_obj, timeout = 30):
166166 self._listShares = self._listShares_SMB1
167167 self._listPath = self._listPath_SMB1
168168 self._listSnapshots = self._listSnapshots_SMB1
169 self._getAttributes = self._getAttributes_SMB1
169170 self._retrieveFile = self._retrieveFile_SMB1
170171 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
171172 self._storeFile = self._storeFile_SMB1
185186 self._listShares = self._listShares_SMB2
186187 self._listPath = self._listPath_SMB2
187188 self._listSnapshots = self._listSnapshots_SMB2
189 self._getAttributes = self._getAttributes_SMB2
188190 self._retrieveFile = self._retrieveFile_SMB2
189191 self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
190192 self._storeFile = self._storeFile_SMB2
640642 sendCreate(connect_message.tid)
641643 else:
642644 errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
645
646 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
647 self._sendSMBMessage(m)
648 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
649 messages_history.append(m)
650 else:
651 sendCreate(self.connected_trees[service_name])
652
653 def _getAttributes_SMB2(self, service_name, path, callback, errback, timeout = 30):
654 if not self.has_authenticated:
655 raise NotReadyError('SMB connection not authenticated')
656
657 expiry_time = time.time() + timeout
658 path = path.replace('/', '\\')
659 if path.startswith('\\'):
660 path = path[1:]
661 if path.endswith('\\'):
662 path = path[:-1]
663 messages_history = [ ]
664
665 def sendCreate(tid):
666 create_context_data = binascii.unhexlify("""
667 28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00
668 44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00
669 00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00
670 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
671 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
672 51 46 69 64 00 00 00 00
673 """.replace(' ', '').replace('\n', ''))
674 m = SMB2Message(SMB2CreateRequest(path,
675 file_attributes = 0,
676 access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
677 share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
678 oplock = SMB2_OPLOCK_LEVEL_NONE,
679 impersonation = SEC_IMPERSONATE,
680 create_options = 0,
681 create_disp = FILE_OPEN,
682 create_context_data = create_context_data))
683 m.tid = tid
684 self._sendSMBMessage(m)
685 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
686 messages_history.append(m)
687
688 def createCB(create_message, **kwargs):
689 messages_history.append(create_message)
690 if create_message.status == 0:
691 p = create_message.payload
692 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
693 p.file_size, p.allocation_size, p.file_attributes,
694 path, path)
695 closeFid(create_message.tid, p.fid, info = info)
696 else:
697 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
698
699 def closeFid(tid, fid, info = None, error = None):
700 m = SMB2Message(SMB2CloseRequest(fid))
701 m.tid = tid
702 self._sendSMBMessage(m)
703 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
704 messages_history.append(m)
705
706 def closeCB(close_message, **kwargs):
707 if kwargs['info'] is not None:
708 callback(kwargs['info'])
709 elif kwargs['error'] is not None:
710 errback(OperationFailure('Failed to get attributes for %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
711
712 if service_name not in self.connected_trees:
713 def connectCB(connect_message, **kwargs):
714 messages_history.append(connect_message)
715 if connect_message.status == 0:
716 self.connected_trees[service_name] = connect_message.tid
717 sendCreate(connect_message.tid)
718 else:
719 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
643720
644721 m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
645722 self._sendSMBMessage(m)
18581935 else:
18591936 sendFindFirst(self.connected_trees[service_name])
18601937
1938 def _getAttributes_SMB1(self, service_name, path, callback, errback, timeout = 30):
1939 if not self.has_authenticated:
1940 raise NotReadyError('SMB connection not authenticated')
1941
1942 expiry_time = time.time() + timeout
1943 path = path.replace('/', '\\')
1944 if path.startswith('\\'):
1945 path = path[1:]
1946 if path.endswith('\\'):
1947 path = path[:-1]
1948 messages_history = [ ]
1949
1950 def sendQuery(tid):
1951 setup_bytes = struct.pack('<H', 0x0005) # TRANS2_QUERY_PATH_INFORMATION sub-command. See [MS-CIFS]: 2.2.6.6.1
1952 params_bytes = \
1953 struct.pack('<HI',
1954 0x0107, # SMB_QUERY_FILE_ALL_INFO ([MS-CIFS] 2.2.2.3.3)
1955 0x0000) # Reserved
1956 params_bytes += (path + '\0').encode('UTF-16LE')
1957
1958 m = SMBMessage(ComTransaction2Request(max_params_count = 2,
1959 max_data_count = 65535,
1960 max_setup_count = 0,
1961 params_bytes = params_bytes,
1962 setup_bytes = setup_bytes))
1963 m.tid = tid
1964 self._sendSMBMessage(m)
1965 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback)
1966 messages_history.append(m)
1967
1968 def queryCB(query_message, **kwargs):
1969 messages_history.append(query_message)
1970 if not query_message.status.hasError:
1971 info_format = '<QQQQIQQ'
1972 info_size = struct.calcsize(info_format)
1973 create_time, last_access_time, last_write_time, last_attr_change_time, \
1974 file_attributes, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
1975
1976 info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
1977 file_size, alloc_size, file_attributes, path, path)
1978 callback(info)
1979 else:
1980 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
1981
1982 if service_name not in self.connected_trees:
1983 def connectCB(connect_message, **kwargs):
1984 messages_history.append(connect_message)
1985 if not connect_message.status.hasError:
1986 self.connected_trees[service_name] = connect_message.tid
1987 sendQuery(connect_message.tid)
1988 else:
1989 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
1990
1991 m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
1992 self._sendSMBMessage(m)
1993 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
1994 messages_history.append(m)
1995 else:
1996 sendQuery(self.connected_trees[service_name])
1997
18611998 def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
18621999 return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0, -1, timeout)
18632000
129129 GENERIC_READ = 0x80000000
130130
131131 # SMB_EXT_FILE_ATTR bitmask ([MS-CIFS]: 2.2.1.2.3)
132 # Includes extensions defined in [MS-SMB] 2.2.1.2.1
132133 # Bitmask for FileAttributes field in SMB_COM_NT_CREATE_ANDX request ([MS-CIFS]: 2.2.4.64.1)
133134 # Also used for FileAttributes field in SMB2CreateRequest class ([MS-SMB2]: 2.2.13)
134135 ATTR_READONLY = 0x01
138139 ATTR_ARCHIVE = 0x20
139140 ATTR_NORMAL = 0x80
140141 ATTR_TEMPORARY = 0x0100
142 ATTR_SPARSE = 0x0200
143 ATTR_REPARSE_POINT = 0x0400
141144 ATTR_COMPRESSED = 0x0800
145 ATTR_OFFLINE = 0x1000
146 ATTR_NOT_CONTENT_INDEXED = 0x2000
147 ATTR_ENCRYPTED = 0x4000
142148 POSIX_SEMANTICS = 0x01000000
143149 BACKUP_SEMANTICS = 0x02000000
144150 DELETE_ON_CLOSE = 0x04000000
0 # -*- coding: utf-8 -*-
1
2 from smb.SMBConnection import SMBConnection
3 from .util import getConnectionInfo
4 from nose.tools import with_setup
5 from smb import smb_structs
6
7 conn = None
8
9 def setup_func_SMB1():
10 global conn
11 smb_structs.SUPPORT_SMB2 = False
12 info = getConnectionInfo()
13 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
14 assert conn.connect(info['server_ip'], info['server_port'])
15
16 def setup_func_SMB2():
17 global conn
18 smb_structs.SUPPORT_SMB2 = True
19 info = getConnectionInfo()
20 conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
21 assert conn.connect(info['server_ip'], info['server_port'])
22
23 def teardown_func():
24 global conn
25 conn.close()
26
27 @with_setup(setup_func_SMB2, teardown_func)
28 def test_getAttributes_SMB2():
29 global conn
30 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
31 assert info.isDirectory
32
33 info = conn.getAttributes('smbtest', '/rfc1001.txt')
34 assert not info.isDirectory
35
36 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
37 assert info.isDirectory
38
39 @with_setup(setup_func_SMB1, teardown_func)
40 def test_getAttributes_SMB1():
41 global conn
42 info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
43 assert info.isDirectory
44
45 info = conn.getAttributes('smbtest', '/rfc1001.txt')
46 assert not info.isDirectory
47
48 info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
49 assert info.isDirectory
50
51
0
1 from nose.twistedtools import reactor, deferred
2 from twisted.internet import defer
3 from smb.SMBProtocol import SMBProtocolFactory
4 from smb import smb_structs
5 from util import getConnectionInfo
6
7
8 class GetAttributesFactory(SMBProtocolFactory):
9
10 def __init__(self, *args, **kwargs):
11 SMBProtocolFactory.__init__(self, *args, **kwargs)
12 self.d = defer.Deferred()
13 self.d.addBoth(self.testDone)
14 self.path = ''
15 self.is_directory = False
16
17 def testDone(self, r):
18 if self.instance:
19 self.instance.transport.loseConnection()
20 return r
21
22 def onAuthOK(self):
23 def cb(info):
24 assert info.isDirectory == self.is_directory
25 self.d.callback(True)
26
27 d = self.getAttributes('smbtest', self.path, timeout = 15)
28 d.addCallback(cb)
29 d.addErrback(self.d.errback)
30
31 def onAuthFailed(self):
32 self.d.errback('Auth failed')
33
34
35 @deferred(timeout=15.0)
36 def test_getAttributes_SMB1_test1():
37 info = getConnectionInfo()
38 smb_structs.SUPPORT_SMB2 = False
39
40 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
41 factory.path = '/Test Folder with Long Name/'
42 factory.is_directory = True
43 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
44 return factory.d
45
46 @deferred(timeout=15.0)
47 def test_getAttributes_SMB1_test2():
48 info = getConnectionInfo()
49 smb_structs.SUPPORT_SMB2 = False
50
51 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
52 factory.path = '/rfc1001.txt'
53 factory.is_directory = False
54 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
55 return factory.d
56
57 @deferred(timeout=15.0)
58 def test_getAttributes_SMB1_test3():
59 info = getConnectionInfo()
60 smb_structs.SUPPORT_SMB2 = False
61
62 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
63 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
64 factory.is_directory = True
65 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
66 return factory.d
67
68 @deferred(timeout=15.0)
69 def test_getAttributes_SMB2_test1():
70 info = getConnectionInfo()
71 smb_structs.SUPPORT_SMB2 = True
72
73 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
74 factory.path = '/Test Folder with Long Name/'
75 factory.is_directory = True
76 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
77 return factory.d
78
79 @deferred(timeout=15.0)
80 def test_getAttributes_SMB2_test2():
81 info = getConnectionInfo()
82 smb_structs.SUPPORT_SMB2 = True
83
84 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
85 factory.path = '/rfc1001.txt'
86 factory.is_directory = False
87 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
88 return factory.d
89
90 @deferred(timeout=15.0)
91 def test_getAttributes_SMB2_test3():
92 info = getConnectionInfo()
93 smb_structs.SUPPORT_SMB2 = True
94
95 factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
96 factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
97 factory.is_directory = True
98 reactor.connectTCP(info['server_ip'], info['server_port'], factory)
99 return factory.d
77
88 setup(
99 name = "pysmb",
10 version = "1.1.9",
10 version = "1.1.10",
1111 author = "Michael Teo",
1212 author_email = "[email protected]",
1313 license = "zlib/libpng",
1616 # add these directories to sys.path here. If the directory is relative to the
1717 # documentation root, use os.path.abspath to make it absolute, like shown here.
1818 #sys.path.insert(0, os.path.abspath('.'))
19 sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'python3'))
19 sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'python2'))
2020
2121 # -- General configuration -----------------------------------------------------
2222
4141
4242 # General information about the project.
4343 project = u'pysmb'
44 copyright = u'2001-2013, Michael Teo http://miketeo.net/'
44 copyright = u'2001-2014, Michael Teo http://miketeo.net/'
4545
4646 # The version info for the project you're documenting, acts as replacement for
4747 # |version| and |release|, also used in various other places throughout the
4848 # built documents.
4949 #
5050 # The short X.Y version.
51 version = '1.1.5'
51 version = '1.1.10'
5252 # The full version, including alpha/beta/rc tags.
53 release = '1.1.5'
53 release = '1.1.10'
5454
5555 # The language for content autogenerated by Sphinx. Refer to documentation
5656 # for a list of supported languages.