pax_global_header 0000666 0000000 0000000 00000000064 13253241774 0014522 g ustar 00root root 0000000 0000000 52 comment=ad40cafa84a639a1b63e7b5e6224e82c18143258
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/ 0000775 0000000 0000000 00000000000 13253241774 0023223 5 ustar 00root root 0000000 0000000 python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/.gitignore 0000664 0000000 0000000 00000000024 13253241774 0025207 0 ustar 00root root 0000000 0000000 build/
__pycache__/
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/.gitlab-ci.yml 0000664 0000000 0000000 00000001004 13253241774 0025652 0 ustar 00root root 0000000 0000000 before_script:
- sudo apt-get update -qq && sudo apt-get build-dep -y -qq python-nbxmpp-nightly
stages:
- test
- build
run-test:
stage: test
script:
- ./test/runtests.py
run-build:
stage: build
script:
- rm -rf dist
- export FN="nbxmpp-"$(date +%F)
- python setup.py sdist
- scp dist/nbxmpp-*.tar.gz panoramix:/var/www/gajim/downloads/snap/ci/$FN-$CI_COMMIT_SHA.tar.gz
artifacts:
name: "nbxmpp-$CI_COMMIT_SHA"
expire_in: 1 week
paths:
- dist/nbxmpp-*.tar.gz
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/COPYING 0000664 0000000 0000000 00000104513 13253241774 0024262 0 ustar 00root root 0000000 0000000 GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Copyright (C)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
.
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/ChangeLog 0000664 0000000 0000000 00000004022 13253241774 0024773 0 ustar 00root root 0000000 0000000 python-nbxmpp 0.6.4 (17 March 2018)
* Fix SOCKS5 usage
python-nbxmpp 0.6.3 (26 January 2018)
* Add ALPN and SNI support for when using DirectTLS
* Bugfixes
python-nbxmpp 0.6.2 (27 December 2017)
* Correctly load client certs
* Warn on any error in the certificate chain
* Fixed a traceback loop
python-nbxmpp 0.6.1 (29 November 2017)
* Add new getStanzaIDAttrs method
* Fix BOSH connexion
* stop using PyOpenSSL for random generator
python-nbxmpp 0.6.0 (25 September 2017)
* Add new getOriginID/SetOriginID method for Messages
* Add new getJid() method for Protocol
* getTagAttr() accepts now a namespace argument
* Add new `protocol` argument for getTag()
* Add new XEP Namespaces
python-nbxmpp 0.5.6 (03 June 2017)
* Support XEP-0198 Version 1.5.2
* Add new XEP Namespaces
python-nbxmpp 0.5.5 (30 January 2017)
* Some cleanup
* Add some namespaces
python-nbxmpp 0.5.4 (04 September 2016)
* Fix SCRAM authentication
* Fix BOSH connection with UTF-8 messages
* Fix smacks implementation
* Use uuid in stanza ids
python-nbxmpp 0.5.3 (13 July 2015)
* Fix receiving long utf8 strings under py3
* Fix issue with pyopenssl 0.15.1
* Fix decoding issues
python-nbxmpp 0.5.2 (27 December 2014)
* Fix BOSH HTTP requests
* Fix handling of binary SASL data for mechanism GSSAPI
* Update MAM namespace
python-nbxmpp 0.5.1 (04 October 2014)
* Fix printing network errors in a non-utf-8 console
python-nbxmpp 0.5 (02 July 2014)
* support both python2 and python3
* Fix storing server certificate when there is no error
python-nbxmpp 0.4 (15 March 2014)
* Ability to configure TLS protocol version
* Add support for SCRAM-SHA-1-PLUS
* Security improvements
python-nbxmpp 0.3 (23 December 2013)
* Improve security level
* Ability to configure cipher list
* Store only depth 0 SSL certificate
python-nbxmpp 0.2 (26 July 2013)
* Add some namespace
* do TLS handshake without blocking
* store all SSL errors instead of only last one
python-nbxmpp 0.1 (05 August 2012)
* Initial release
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/MANIFEST.in 0000664 0000000 0000000 00000000127 13253241774 0024761 0 ustar 00root root 0000000 0000000 include ChangeLog COPYING README
recursive-include doc *
recursive-include nbxmpp *.py
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/README 0000664 0000000 0000000 00000000771 13253241774 0024110 0 ustar 00root root 0000000 0000000 python-nbxmpp
http://dev.gajim.org/gajim/python-nbxmpp
The goal of this python library is to provide a way for python applications
to use Jabber/XMPP networks in a non-blocking way. This library is initialy a
fork of xmpppy one, but using non-blocking sockets.
Installation
Simply run 'python setup.py install' as root
Usage
You have to 'import nbxmpp' in your program. Then look at examples in the doc
folder.
2012-05-08 Yann Leboulanger
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/README.md 0000664 0000000 0000000 00000001531 13253241774 0024502 0 ustar 00root root 0000000 0000000 ## Welcome to python-nbxmpp website
python-nbxmpp is a Python library that provides a way for Python applications to use Jabber/XMPP networks in a non-blocking way. This library is initialy a fork of xmpppy one, but using non-blocking sockets.
## Features
* Asynchronous
* Supports ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1, DIGEST-MD5, PLAIN, and X-MESSENGER-OAUTH2 authentication mechanisms.
* Supports connection via proxies
* Suppors TLS
* Supports [BOSH (XEP-0124)](https://xmpp.org/extensions/xep-0124.html)
* Support [Stream Management (XEP-0198)](https://xmpp.org/extensions/xep-0198.html)
## Starting Points
* [Downloads](http://dev.gajim.org/gajim/python-nbxmpp/tags)
* You can also clone the git repository at http://dev.gajim.org/gajim/python-nbxmpp.git
* [Example](http://dev.gajim.org/gajim/python-nbxmpp/tree/master/doc/examples) python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/ 0000775 0000000 0000000 00000000000 13253241774 0023770 5 ustar 00root root 0000000 0000000 python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/ 0000775 0000000 0000000 00000000000 13253241774 0025412 5 ustar 00root root 0000000 0000000 python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/api-objects.txt 0000664 0000000 0000000 00000376130 13253241774 0030365 0 ustar 00root root 0000000 0000000 nbxmpp nbxmpp-module.html
nbxmpp.isResultNode nbxmpp.protocol-module.html#isResultNode
nbxmpp.isErrorNode nbxmpp.protocol-module.html#isErrorNode
nbxmpp.ascii_upper nbxmpp.protocol-module.html#ascii_upper
nbxmpp.__package__ nbxmpp-module.html#__package__
nbxmpp.auth_nb nbxmpp.auth_nb-module.html
nbxmpp.auth_nb.challenge_splitter nbxmpp.auth_nb-module.html#challenge_splitter
nbxmpp.auth_nb.HH nbxmpp.auth_nb-module.html#HH
nbxmpp.auth_nb.SASL_IN_PROCESS nbxmpp.auth_nb-module.html#SASL_IN_PROCESS
nbxmpp.auth_nb.GSS_STATE_WRAP nbxmpp.auth_nb-module.html#GSS_STATE_WRAP
nbxmpp.auth_nb.have_kerberos nbxmpp.auth_nb-module.html#have_kerberos
nbxmpp.auth_nb.scram_parse nbxmpp.auth_nb-module.html#scram_parse
nbxmpp.auth_nb.SASL_FAILURE nbxmpp.auth_nb-module.html#SASL_FAILURE
nbxmpp.auth_nb.log nbxmpp.auth_nb-module.html#log
nbxmpp.auth_nb.__package__ nbxmpp.auth_nb-module.html#__package__
nbxmpp.auth_nb.C nbxmpp.auth_nb-module.html#C
nbxmpp.auth_nb.H nbxmpp.auth_nb-module.html#H
nbxmpp.auth_nb.kerberos nbxmpp.auth_nb-module.html#kerberos
nbxmpp.auth_nb.SASL_SUCCESS nbxmpp.auth_nb-module.html#SASL_SUCCESS
nbxmpp.auth_nb.isResultNode nbxmpp.protocol-module.html#isResultNode
nbxmpp.auth_nb.GSS_STATE_STEP nbxmpp.auth_nb-module.html#GSS_STATE_STEP
nbxmpp.auth_nb.SASL_UNSUPPORTED nbxmpp.auth_nb-module.html#SASL_UNSUPPORTED
nbxmpp.auth_nb.SASL_FAILURE_IN_PROGRESS nbxmpp.auth_nb-module.html#SASL_FAILURE_IN_PROGRESS
nbxmpp.bosh nbxmpp.bosh-module.html
nbxmpp.bosh.FAKE_DESCRIPTOR nbxmpp.bosh-module.html#FAKE_DESCRIPTOR
nbxmpp.bosh.KEY_COUNT nbxmpp.bosh-module.html#KEY_COUNT
nbxmpp.bosh.get_rand_number nbxmpp.bosh-module.html#get_rand_number
nbxmpp.bosh.bosh_errors nbxmpp.bosh-module.html#bosh_errors
nbxmpp.bosh.__package__ nbxmpp.bosh-module.html#__package__
nbxmpp.bosh.log nbxmpp.bosh-module.html#log
nbxmpp.bosh.urisplit nbxmpp.transports_nb-module.html#urisplit
nbxmpp.c14n nbxmpp.c14n-module.html
nbxmpp.c14n.ustr nbxmpp.simplexml-module.html#ustr
nbxmpp.c14n.normalise_attr nbxmpp.c14n-module.html#normalise_attr
nbxmpp.c14n.normalise_text nbxmpp.c14n-module.html#normalise_text
nbxmpp.c14n.c14n nbxmpp.c14n-module.html#c14n
nbxmpp.c14n.__package__ nbxmpp.c14n-module.html#__package__
nbxmpp.client_nb nbxmpp.client_nb-module.html
nbxmpp.client_nb.log nbxmpp.client_nb-module.html#log
nbxmpp.client_nb.__package__ nbxmpp.client_nb-module.html#__package__
nbxmpp.dispatcher_nb nbxmpp.dispatcher_nb-module.html
nbxmpp.dispatcher_nb.XML_DECLARATION nbxmpp.dispatcher_nb-module.html#XML_DECLARATION
nbxmpp.dispatcher_nb.DEFAULT_TIMEOUT_SECONDS nbxmpp.dispatcher_nb-module.html#DEFAULT_TIMEOUT_SECONDS
nbxmpp.dispatcher_nb.log nbxmpp.dispatcher_nb-module.html#log
nbxmpp.dispatcher_nb.__package__ nbxmpp.dispatcher_nb-module.html#__package__
nbxmpp.dispatcher_nb.outgoingID nbxmpp.dispatcher_nb-module.html#outgoingID
nbxmpp.features_nb nbxmpp.features_nb-module.html
nbxmpp.features_nb.getPrivacyList nbxmpp.features_nb-module.html#getPrivacyList
nbxmpp.features_nb.register nbxmpp.features_nb-module.html#register
nbxmpp.features_nb._ReceivedRegInfo nbxmpp.features_nb-module.html#_ReceivedRegInfo
nbxmpp.features_nb.setDefaultPrivacyList nbxmpp.features_nb-module.html#setDefaultPrivacyList
nbxmpp.features_nb.isResultNode nbxmpp.protocol-module.html#isResultNode
nbxmpp.features_nb.setActivePrivacyList nbxmpp.features_nb-module.html#setActivePrivacyList
nbxmpp.features_nb.getActiveAndDefaultPrivacyLists nbxmpp.features_nb-module.html#getActiveAndDefaultPrivacyLists
nbxmpp.features_nb.PL_ACT_DENY nbxmpp.features_nb-module.html#PL_ACT_DENY
nbxmpp.features_nb.__package__ nbxmpp.features_nb-module.html#__package__
nbxmpp.features_nb.delPrivacyList nbxmpp.features_nb-module.html#delPrivacyList
nbxmpp.features_nb.setPrivacyList nbxmpp.features_nb-module.html#setPrivacyList
nbxmpp.features_nb.REGISTER_DATA_RECEIVED nbxmpp.features_nb-module.html#REGISTER_DATA_RECEIVED
nbxmpp.features_nb.PRIVACY_LISTS_RECEIVED nbxmpp.features_nb-module.html#PRIVACY_LISTS_RECEIVED
nbxmpp.features_nb.PL_ACT_ALLOW nbxmpp.features_nb-module.html#PL_ACT_ALLOW
nbxmpp.features_nb.getPrivacyLists nbxmpp.features_nb-module.html#getPrivacyLists
nbxmpp.features_nb.PL_TYPE_JID nbxmpp.features_nb-module.html#PL_TYPE_JID
nbxmpp.features_nb.PRIVACY_LISTS_ACTIVE_DEFAULT nbxmpp.features_nb-module.html#PRIVACY_LISTS_ACTIVE_DEFAULT
nbxmpp.features_nb.getRegInfo nbxmpp.features_nb-module.html#getRegInfo
nbxmpp.features_nb._on_default_response nbxmpp.features_nb-module.html#_on_default_response
nbxmpp.features_nb.PL_TYPE_GROUP nbxmpp.features_nb-module.html#PL_TYPE_GROUP
nbxmpp.features_nb.changePasswordTo nbxmpp.features_nb-module.html#changePasswordTo
nbxmpp.features_nb.unregister nbxmpp.features_nb-module.html#unregister
nbxmpp.features_nb.PRIVACY_LIST_RECEIVED nbxmpp.features_nb-module.html#PRIVACY_LIST_RECEIVED
nbxmpp.features_nb.PL_TYPE_SUBC nbxmpp.features_nb-module.html#PL_TYPE_SUBC
nbxmpp.idlequeue nbxmpp.idlequeue-module.html
nbxmpp.idlequeue.PENDING_WRITE nbxmpp.idlequeue-module.html#PENDING_WRITE
nbxmpp.idlequeue.FLAG_READ_WRITE nbxmpp.idlequeue-module.html#FLAG_READ_WRITE
nbxmpp.idlequeue.PENDING_READ nbxmpp.idlequeue-module.html#PENDING_READ
nbxmpp.idlequeue.FLAG_READ nbxmpp.idlequeue-module.html#FLAG_READ
nbxmpp.idlequeue.FLAG_CLOSE nbxmpp.idlequeue-module.html#FLAG_CLOSE
nbxmpp.idlequeue.__package__ nbxmpp.idlequeue-module.html#__package__
nbxmpp.idlequeue.HAVE_GOBJECT nbxmpp.idlequeue-module.html#HAVE_GOBJECT
nbxmpp.idlequeue.IS_CLOSED nbxmpp.idlequeue-module.html#IS_CLOSED
nbxmpp.idlequeue.log nbxmpp.idlequeue-module.html#log
nbxmpp.idlequeue.FLAG_WRITE nbxmpp.idlequeue-module.html#FLAG_WRITE
nbxmpp.idlequeue.get_idlequeue nbxmpp.idlequeue-module.html#get_idlequeue
nbxmpp.plugin nbxmpp.plugin-module.html
nbxmpp.plugin.__package__ nbxmpp.plugin-module.html#__package__
nbxmpp.plugin.log nbxmpp.plugin-module.html#log
nbxmpp.protocol nbxmpp.protocol-module.html
nbxmpp.protocol.NS_MUC_ADMIN nbxmpp.protocol-module.html#NS_MUC_ADMIN
nbxmpp.protocol.STREAM_NOT_AUTHORIZED nbxmpp.protocol-module.html#STREAM_NOT_AUTHORIZED
nbxmpp.protocol.NS_FILE nbxmpp.protocol-module.html#NS_FILE
nbxmpp.protocol.NS_VCARD_UPDATE nbxmpp.protocol-module.html#NS_VCARD_UPDATE
nbxmpp.protocol.NS_PUBSUB_EVENT nbxmpp.protocol-module.html#NS_PUBSUB_EVENT
nbxmpp.protocol.isResultNode nbxmpp.protocol-module.html#isResultNode
nbxmpp.protocol.NS_RECEIPTS nbxmpp.protocol-module.html#NS_RECEIPTS
nbxmpp.protocol.STREAM_CONNECTION_TIMEOUT nbxmpp.protocol-module.html#STREAM_CONNECTION_TIMEOUT
nbxmpp.protocol.STREAM_IMPROPER_ADDRESSING nbxmpp.protocol-module.html#STREAM_IMPROPER_ADDRESSING
nbxmpp.protocol.STREAM_UNSUPPORTED_STANZA_TYPE nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_STANZA_TYPE
nbxmpp.protocol.NS_PING nbxmpp.protocol-module.html#NS_PING
nbxmpp.protocol.ERR_GONE nbxmpp.protocol-module.html#ERR_GONE
nbxmpp.protocol.NS_PHYSLOC nbxmpp.protocol-module.html#NS_PHYSLOC
nbxmpp.protocol.NS_CHATTING nbxmpp.protocol-module.html#NS_CHATTING
nbxmpp.protocol.ERR_CONFLICT nbxmpp.protocol-module.html#ERR_CONFLICT
nbxmpp.protocol.NS_COMPRESS nbxmpp.protocol-module.html#NS_COMPRESS
nbxmpp.protocol.NS_HASHES_SHA1 nbxmpp.protocol-module.html#NS_HASHES_SHA1
nbxmpp.protocol.NS_AGENTS nbxmpp.protocol-module.html#NS_AGENTS
nbxmpp.protocol.NS_CAPTCHA nbxmpp.protocol-module.html#NS_CAPTCHA
nbxmpp.protocol.NS_MOOD nbxmpp.protocol-module.html#NS_MOOD
nbxmpp.protocol.ERR_NOT_AUTHORIZED nbxmpp.protocol-module.html#ERR_NOT_AUTHORIZED
nbxmpp.protocol.ERR_REGISTRATION_REQUIRED nbxmpp.protocol-module.html#ERR_REGISTRATION_REQUIRED
nbxmpp.protocol.ERR_INTERNAL_SERVER_ERROR nbxmpp.protocol-module.html#ERR_INTERNAL_SERVER_ERROR
nbxmpp.protocol.SASL_INCORRECT_ENCODING nbxmpp.protocol-module.html#SASL_INCORRECT_ENCODING
nbxmpp.protocol.NS_MUC_OWNER nbxmpp.protocol-module.html#NS_MUC_OWNER
nbxmpp.protocol.NS_ACTIVITY nbxmpp.protocol-module.html#NS_ACTIVITY
nbxmpp.protocol.NS_ARCHIVE_MANUAL nbxmpp.protocol-module.html#NS_ARCHIVE_MANUAL
nbxmpp.protocol.NS_JINGLE_RTP_AUDIO nbxmpp.protocol-module.html#NS_JINGLE_RTP_AUDIO
nbxmpp.protocol.NS_PRESENCE nbxmpp.protocol-module.html#NS_PRESENCE
nbxmpp.protocol.STREAM_INTERNAL_SERVER_ERROR nbxmpp.protocol-module.html#STREAM_INTERNAL_SERVER_ERROR
nbxmpp.protocol.NS_CHATSTATES nbxmpp.protocol-module.html#NS_CHATSTATES
nbxmpp.protocol.ERR_REDIRECT nbxmpp.protocol-module.html#ERR_REDIRECT
nbxmpp.protocol.isErrorNode nbxmpp.protocol-module.html#isErrorNode
nbxmpp.protocol.NS_GROUPCHAT nbxmpp.protocol-module.html#NS_GROUPCHAT
nbxmpp.protocol.ERR_FEATURE_NOT_IMPLEMENTED nbxmpp.protocol-module.html#ERR_FEATURE_NOT_IMPLEMENTED
nbxmpp.protocol.NS_GATEWAY nbxmpp.protocol-module.html#NS_GATEWAY
nbxmpp.protocol.NS_DISCO_ITEMS nbxmpp.protocol-module.html#NS_DISCO_ITEMS
nbxmpp.protocol.NS_MUC_CONFIG nbxmpp.protocol-module.html#NS_MUC_CONFIG
nbxmpp.protocol.NS_BIND nbxmpp.protocol-module.html#NS_BIND
nbxmpp.protocol.NS_JINGLE_ERRORS nbxmpp.protocol-module.html#NS_JINGLE_ERRORS
nbxmpp.protocol.NS_XMPP_STREAMS nbxmpp.protocol-module.html#NS_XMPP_STREAMS
nbxmpp.protocol.NS_IQ nbxmpp.protocol-module.html#NS_IQ
nbxmpp.protocol.ERR_RESOURCE_CONSTRAINT nbxmpp.protocol-module.html#ERR_RESOURCE_CONSTRAINT
nbxmpp.protocol.NS_CLIENT nbxmpp.protocol-module.html#NS_CLIENT
nbxmpp.protocol.NS_FORWARD nbxmpp.protocol-module.html#NS_FORWARD
nbxmpp.protocol.SASL_INVALID_AUTHZID nbxmpp.protocol-module.html#SASL_INVALID_AUTHZID
nbxmpp.protocol.NS_EVENT nbxmpp.protocol-module.html#NS_EVENT
nbxmpp.protocol.NS_AVATAR nbxmpp.protocol-module.html#NS_AVATAR
nbxmpp.protocol.NS_JINGLE_IBB nbxmpp.protocol-module.html#NS_JINGLE_IBB
nbxmpp.protocol.NS_DATA_LAYOUT nbxmpp.protocol-module.html#NS_DATA_LAYOUT
nbxmpp.protocol.NS_TUNE nbxmpp.protocol-module.html#NS_TUNE
nbxmpp.protocol.stream_exceptions nbxmpp.protocol-module.html#stream_exceptions
nbxmpp.protocol.NS_HASHES_SHA256 nbxmpp.protocol-module.html#NS_HASHES_SHA256
nbxmpp.protocol.NS_CARBONS nbxmpp.protocol-module.html#NS_CARBONS
nbxmpp.protocol.NS_ROSTER nbxmpp.protocol-module.html#NS_ROSTER
nbxmpp.protocol.NS_STANZAS nbxmpp.protocol-module.html#NS_STANZAS
nbxmpp.protocol.ERR_JID_MALFORMED nbxmpp.protocol-module.html#ERR_JID_MALFORMED
nbxmpp.protocol.NS_ROSTER_VER nbxmpp.protocol-module.html#NS_ROSTER_VER
nbxmpp.protocol.NS_TIME_REVISED nbxmpp.protocol-module.html#NS_TIME_REVISED
nbxmpp.protocol.NS_MUC_UNIQUE nbxmpp.protocol-module.html#NS_MUC_UNIQUE
nbxmpp.protocol.ERR_SERVICE_UNAVAILABLE nbxmpp.protocol-module.html#ERR_SERVICE_UNAVAILABLE
nbxmpp.protocol.NS_PUBKEY_PUBKEY nbxmpp.protocol-module.html#NS_PUBKEY_PUBKEY
nbxmpp.protocol.NS_AMP nbxmpp.protocol-module.html#NS_AMP
nbxmpp.protocol.STREAM_UNDEFINED_CONDITION nbxmpp.protocol-module.html#STREAM_UNDEFINED_CONDITION
nbxmpp.protocol.NS_CONFERENCE nbxmpp.protocol-module.html#NS_CONFERENCE
nbxmpp.protocol.NS_MAM nbxmpp.protocol-module.html#NS_MAM
nbxmpp.protocol.NS_DISCO nbxmpp.protocol-module.html#NS_DISCO
nbxmpp.protocol.NS_RSM nbxmpp.protocol-module.html#NS_RSM
nbxmpp.protocol.NS_BLOCKING nbxmpp.protocol-module.html#NS_BLOCKING
nbxmpp.protocol.ERRORS nbxmpp.protocol-module.html#ERRORS
nbxmpp.protocol.NS_STREAM nbxmpp.protocol-module.html#NS_STREAM
nbxmpp.protocol.NS_ESESSION nbxmpp.protocol-module.html#NS_ESESSION
nbxmpp.protocol.STREAM_BAD_FORMAT nbxmpp.protocol-module.html#STREAM_BAD_FORMAT
nbxmpp.protocol.NS_JINGLE_FILE_TRANSFER nbxmpp.protocol-module.html#NS_JINGLE_FILE_TRANSFER
nbxmpp.protocol.NS_LOCATION nbxmpp.protocol-module.html#NS_LOCATION
nbxmpp.protocol.NS_ARCHIVE_AUTO nbxmpp.protocol-module.html#NS_ARCHIVE_AUTO
nbxmpp.protocol.NS_DIALBACK nbxmpp.protocol-module.html#NS_DIALBACK
nbxmpp.protocol.SASL_ABORTED nbxmpp.protocol-module.html#SASL_ABORTED
nbxmpp.protocol.NS_AUTH nbxmpp.protocol-module.html#NS_AUTH
nbxmpp.protocol.NS_BOOKMARKS nbxmpp.protocol-module.html#NS_BOOKMARKS
nbxmpp.protocol.NS_VCARD nbxmpp.protocol-module.html#NS_VCARD
nbxmpp.protocol.STREAM_HOST_GONE nbxmpp.protocol-module.html#STREAM_HOST_GONE
nbxmpp.protocol.NS_XHTML nbxmpp.protocol-module.html#NS_XHTML
nbxmpp.protocol.NS_JINGLE_RTP nbxmpp.protocol-module.html#NS_JINGLE_RTP
nbxmpp.protocol.NS_SI nbxmpp.protocol-module.html#NS_SI
nbxmpp.protocol.NS_SASL nbxmpp.protocol-module.html#NS_SASL
nbxmpp.protocol.ERR_UNDEFINED_CONDITION nbxmpp.protocol-module.html#ERR_UNDEFINED_CONDITION
nbxmpp.protocol.STREAM_INVALID_FROM nbxmpp.protocol-module.html#STREAM_INVALID_FROM
nbxmpp.protocol.NS_CAPS nbxmpp.protocol-module.html#NS_CAPS
nbxmpp.protocol.NS_PUBSUB_OWNER nbxmpp.protocol-module.html#NS_PUBSUB_OWNER
nbxmpp.protocol.NS_AMP_ERRORS nbxmpp.protocol-module.html#NS_AMP_ERRORS
nbxmpp.protocol.NS_BROWSE nbxmpp.protocol-module.html#NS_BROWSE
nbxmpp.protocol.NS_CORRECT nbxmpp.protocol-module.html#NS_CORRECT
nbxmpp.protocol.NS_ROSTERX nbxmpp.protocol-module.html#NS_ROSTERX
nbxmpp.protocol.NS_JINGLE_RAW_UDP nbxmpp.protocol-module.html#NS_JINGLE_RAW_UDP
nbxmpp.protocol.NS_TLS nbxmpp.protocol-module.html#NS_TLS
nbxmpp.protocol.NS_ATTENTION nbxmpp.protocol-module.html#NS_ATTENTION
nbxmpp.protocol.NS_DATA nbxmpp.protocol-module.html#NS_DATA
nbxmpp.protocol.NS_SERVER nbxmpp.protocol-module.html#NS_SERVER
nbxmpp.protocol.NS_SESSION nbxmpp.protocol-module.html#NS_SESSION
nbxmpp.protocol.ERR_REMOTE_SERVER_TIMEOUT nbxmpp.protocol-module.html#ERR_REMOTE_SERVER_TIMEOUT
nbxmpp.protocol.NS_JINGLE_ICE_UDP nbxmpp.protocol-module.html#NS_JINGLE_ICE_UDP
nbxmpp.protocol.NS_IBB nbxmpp.protocol-module.html#NS_IBB
nbxmpp.protocol.NS_TIME nbxmpp.protocol-module.html#NS_TIME
nbxmpp.protocol.NS_PROFILE nbxmpp.protocol-module.html#NS_PROFILE
nbxmpp.protocol.NS_SECLABEL nbxmpp.protocol-module.html#NS_SECLABEL
nbxmpp.protocol.NS_PRIVACY nbxmpp.protocol-module.html#NS_PRIVACY
nbxmpp.protocol.NS_GMAILNOTIFY nbxmpp.protocol-module.html#NS_GMAILNOTIFY
nbxmpp.protocol.STREAM_INVALID_NAMESPACE nbxmpp.protocol-module.html#STREAM_INVALID_NAMESPACE
nbxmpp.protocol.NS_CONDITIONS nbxmpp.protocol-module.html#NS_CONDITIONS
nbxmpp.protocol.NS_MESSAGE nbxmpp.protocol-module.html#NS_MESSAGE
nbxmpp.protocol.NS_FEATURE nbxmpp.protocol-module.html#NS_FEATURE
nbxmpp.protocol.STREAM_UNSUPPORTED_VERSION nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_VERSION
nbxmpp.protocol.SASL_NOT_AUTHORIZED nbxmpp.protocol-module.html#SASL_NOT_AUTHORIZED
nbxmpp.protocol.ERR_REMOTE_SERVER_NOT_FOUND nbxmpp.protocol-module.html#ERR_REMOTE_SERVER_NOT_FOUND
nbxmpp.protocol.NS_DELAY2 nbxmpp.protocol-module.html#NS_DELAY2
nbxmpp.protocol.NS_WAITINGLIST nbxmpp.protocol-module.html#NS_WAITINGLIST
nbxmpp.protocol.NS_ARCHIVE_MANAGE nbxmpp.protocol-module.html#NS_ARCHIVE_MANAGE
nbxmpp.protocol.NS_VERSION nbxmpp.protocol-module.html#NS_VERSION
nbxmpp.protocol.NS_SSN nbxmpp.protocol-module.html#NS_SSN
nbxmpp.protocol.ERR_SUBSCRIPTION_REQUIRED nbxmpp.protocol-module.html#ERR_SUBSCRIPTION_REQUIRED
nbxmpp.protocol.SASL_MECHANISM_TOO_WEAK nbxmpp.protocol-module.html#SASL_MECHANISM_TOO_WEAK
nbxmpp.protocol.NS_COMPONENT_1 nbxmpp.protocol-module.html#NS_COMPONENT_1
nbxmpp.protocol.NS_ARCHIVE_PREF nbxmpp.protocol-module.html#NS_ARCHIVE_PREF
nbxmpp.protocol.STREAM_SYSTEM_SHUTDOWN nbxmpp.protocol-module.html#STREAM_SYSTEM_SHUTDOWN
nbxmpp.protocol.NS_HTTP_BIND nbxmpp.protocol-module.html#NS_HTTP_BIND
nbxmpp.protocol.STREAM_INVALID_XML nbxmpp.protocol-module.html#STREAM_INVALID_XML
nbxmpp.protocol.NS_INVISIBLE nbxmpp.protocol-module.html#NS_INVISIBLE
nbxmpp.protocol.NS_JINGLE_RTP_VIDEO nbxmpp.protocol-module.html#NS_JINGLE_RTP_VIDEO
nbxmpp.protocol.NS_HASHES nbxmpp.protocol-module.html#NS_HASHES
nbxmpp.protocol.STREAM_UNSUPPORTED_ENCODING nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_ENCODING
nbxmpp.protocol.ERR_NOT_ALLOWED nbxmpp.protocol-module.html#ERR_NOT_ALLOWED
nbxmpp.protocol.STREAM_SEE_OTHER_HOST nbxmpp.protocol-module.html#STREAM_SEE_OTHER_HOST
nbxmpp.protocol.NS_BROWSING nbxmpp.protocol-module.html#NS_BROWSING
nbxmpp.protocol.NS_GAMING nbxmpp.protocol-module.html#NS_GAMING
nbxmpp.protocol.NS_OFFLINE nbxmpp.protocol-module.html#NS_OFFLINE
nbxmpp.protocol.NS_PUBSUB nbxmpp.protocol-module.html#NS_PUBSUB
nbxmpp.protocol.NS_MUC_USER nbxmpp.protocol-module.html#NS_MUC_USER
nbxmpp.protocol.NS_ATOM nbxmpp.protocol-module.html#NS_ATOM
nbxmpp.protocol.ascii_upper nbxmpp.protocol-module.html#ascii_upper
nbxmpp.protocol.NS_STREAMS nbxmpp.protocol-module.html#NS_STREAMS
nbxmpp.protocol.STREAM_HOST_UNKNOWN nbxmpp.protocol-module.html#STREAM_HOST_UNKNOWN
nbxmpp.protocol.ERR_BAD_REQUEST nbxmpp.protocol-module.html#ERR_BAD_REQUEST
nbxmpp.protocol.NS_GTALKSETTING nbxmpp.protocol-module.html#NS_GTALKSETTING
nbxmpp.protocol.NS_DELAY nbxmpp.protocol-module.html#NS_DELAY
nbxmpp.protocol.NS_ENCRYPTED nbxmpp.protocol-module.html#NS_ENCRYPTED
nbxmpp.protocol.NS_RPC nbxmpp.protocol-module.html#NS_RPC
nbxmpp.protocol.NS_SECLABEL_CATALOG nbxmpp.protocol-module.html#NS_SECLABEL_CATALOG
nbxmpp.protocol.NS_SIGNED nbxmpp.protocol-module.html#NS_SIGNED
nbxmpp.protocol.NS_NICK nbxmpp.protocol-module.html#NS_NICK
nbxmpp.protocol._errorcodes nbxmpp.protocol-module.html#_errorcodes
nbxmpp.protocol.NS_PUBKEY_REVOKE nbxmpp.protocol-module.html#NS_PUBKEY_REVOKE
nbxmpp.protocol.NS_JINGLE_XTLS nbxmpp.protocol-module.html#NS_JINGLE_XTLS
nbxmpp.protocol.NS_DATA_MEDIA nbxmpp.protocol-module.html#NS_DATA_MEDIA
nbxmpp.protocol.STREAM_XML_NOT_WELL_FORMED nbxmpp.protocol-module.html#STREAM_XML_NOT_WELL_FORMED
nbxmpp.protocol.STREAM_POLICY_VIOLATION nbxmpp.protocol-module.html#STREAM_POLICY_VIOLATION
nbxmpp.protocol.NS_REGISTER nbxmpp.protocol-module.html#NS_REGISTER
nbxmpp.protocol.NS_BYTESTREAM nbxmpp.protocol-module.html#NS_BYTESTREAM
nbxmpp.protocol.NS_VACATION nbxmpp.protocol-module.html#NS_VACATION
nbxmpp.protocol.NS_PUBSUB_PUBLISH_OPTIONS nbxmpp.protocol-module.html#NS_PUBSUB_PUBLISH_OPTIONS
nbxmpp.protocol.NS_XHTML_IM nbxmpp.protocol-module.html#NS_XHTML_IM
nbxmpp.protocol.__package__ nbxmpp.protocol-module.html#__package__
nbxmpp.protocol.NS_GEOLOC nbxmpp.protocol-module.html#NS_GEOLOC
nbxmpp.protocol.NS_ARCHIVE nbxmpp.protocol-module.html#NS_ARCHIVE
nbxmpp.protocol.NS_ROSTERNOTES nbxmpp.protocol-module.html#NS_ROSTERNOTES
nbxmpp.protocol.ERR_UNEXPECTED_REQUEST nbxmpp.protocol-module.html#ERR_UNEXPECTED_REQUEST
nbxmpp.protocol.NS_DATA_VALIDATE nbxmpp.protocol-module.html#NS_DATA_VALIDATE
nbxmpp.protocol.ERR_RECIPIENT_UNAVAILABLE nbxmpp.protocol-module.html#ERR_RECIPIENT_UNAVAILABLE
nbxmpp.protocol.NS_ESESSION_INIT nbxmpp.protocol-module.html#NS_ESESSION_INIT
nbxmpp.protocol.SASL_TEMPORARY_AUTH_FAILURE nbxmpp.protocol-module.html#SASL_TEMPORARY_AUTH_FAILURE
nbxmpp.protocol.NS_PRIVATE nbxmpp.protocol-module.html#NS_PRIVATE
nbxmpp.protocol.NS_JINGLE_BYTESTREAM nbxmpp.protocol-module.html#NS_JINGLE_BYTESTREAM
nbxmpp.protocol.SASL_INVALID_MECHANISM nbxmpp.protocol-module.html#SASL_INVALID_MECHANISM
nbxmpp.protocol.NS_VIEWING nbxmpp.protocol-module.html#NS_VIEWING
nbxmpp.protocol.NS_COMMANDS nbxmpp.protocol-module.html#NS_COMMANDS
nbxmpp.protocol.ERR_PAYMENT_REQUIRED nbxmpp.protocol-module.html#ERR_PAYMENT_REQUIRED
nbxmpp.protocol.STREAM_CONFLICT nbxmpp.protocol-module.html#STREAM_CONFLICT
nbxmpp.protocol.STREAM_RESOURCE_CONSTRAINT nbxmpp.protocol-module.html#STREAM_RESOURCE_CONSTRAINT
nbxmpp.protocol.NS_STREAM_MGMT nbxmpp.protocol-module.html#NS_STREAM_MGMT
nbxmpp.protocol.NS_SI_PUB nbxmpp.protocol-module.html#NS_SI_PUB
nbxmpp.protocol.NS_MUC nbxmpp.protocol-module.html#NS_MUC
nbxmpp.protocol.NS_X_OOB nbxmpp.protocol-module.html#NS_X_OOB
nbxmpp.protocol.ERR_ITEM_NOT_FOUND nbxmpp.protocol-module.html#ERR_ITEM_NOT_FOUND
nbxmpp.protocol.STREAM_BAD_NAMESPACE_PREFIX nbxmpp.protocol-module.html#STREAM_BAD_NAMESPACE_PREFIX
nbxmpp.protocol.NS_SEARCH nbxmpp.protocol-module.html#NS_SEARCH
nbxmpp.protocol.STREAM_REMOTE_CONNECTION_FAILED nbxmpp.protocol-module.html#STREAM_REMOTE_CONNECTION_FAILED
nbxmpp.protocol.NS_ADDRESS nbxmpp.protocol-module.html#NS_ADDRESS
nbxmpp.protocol.NS_COMPONENT_ACCEPT nbxmpp.protocol-module.html#NS_COMPONENT_ACCEPT
nbxmpp.protocol.STREAM_INVALID_ID nbxmpp.protocol-module.html#STREAM_INVALID_ID
nbxmpp.protocol.STREAM_RESTRICTED_XML nbxmpp.protocol-module.html#STREAM_RESTRICTED_XML
nbxmpp.protocol.NS_DISCO_INFO nbxmpp.protocol-module.html#NS_DISCO_INFO
nbxmpp.protocol.NS_STANZA_CRYPTO nbxmpp.protocol-module.html#NS_STANZA_CRYPTO
nbxmpp.protocol.NS_LAST nbxmpp.protocol-module.html#NS_LAST
nbxmpp.protocol.NS_PUBKEY_ATTEST nbxmpp.protocol-module.html#NS_PUBKEY_ATTEST
nbxmpp.protocol.NS_HASHES_SHA512 nbxmpp.protocol-module.html#NS_HASHES_SHA512
nbxmpp.protocol.ERR_NOT_ACCEPTABLE nbxmpp.protocol-module.html#ERR_NOT_ACCEPTABLE
nbxmpp.protocol.NS_JINGLE nbxmpp.protocol-module.html#NS_JINGLE
nbxmpp.protocol.NS_BOB nbxmpp.protocol-module.html#NS_BOB
nbxmpp.protocol.NS_HASHES_MD5 nbxmpp.protocol-module.html#NS_HASHES_MD5
nbxmpp.protocol.NS_HTTP_AUTH nbxmpp.protocol-module.html#NS_HTTP_AUTH
nbxmpp.protocol.ERR_FORBIDDEN nbxmpp.protocol-module.html#ERR_FORBIDDEN
nbxmpp.proxy_connectors nbxmpp.proxy_connectors-module.html
nbxmpp.proxy_connectors.log nbxmpp.proxy_connectors-module.html#log
nbxmpp.proxy_connectors.__package__ nbxmpp.proxy_connectors-module.html#__package__
nbxmpp.roster_nb nbxmpp.roster_nb-module.html
nbxmpp.roster_nb.log nbxmpp.roster_nb-module.html#log
nbxmpp.roster_nb.__package__ nbxmpp.roster_nb-module.html#__package__
nbxmpp.simplexml nbxmpp.simplexml-module.html
nbxmpp.simplexml.BadXML2Node nbxmpp.simplexml-module.html#BadXML2Node
nbxmpp.simplexml.ustr nbxmpp.simplexml-module.html#ustr
nbxmpp.simplexml.ENCODING nbxmpp.simplexml-module.html#ENCODING
nbxmpp.simplexml.__package__ nbxmpp.simplexml-module.html#__package__
nbxmpp.simplexml.XMLescape nbxmpp.simplexml-module.html#XMLescape
nbxmpp.simplexml.XML2Node nbxmpp.simplexml-module.html#XML2Node
nbxmpp.simplexml.log nbxmpp.simplexml-module.html#log
nbxmpp.smacks nbxmpp.smacks-module.html
nbxmpp.smacks.log nbxmpp.smacks-module.html#log
nbxmpp.smacks.__package__ nbxmpp.smacks-module.html#__package__
nbxmpp.stringprepare nbxmpp.stringprepare-module.html
nbxmpp.stringprepare.nodeprep nbxmpp.stringprepare-module.html#nodeprep
nbxmpp.stringprepare.C_21 nbxmpp.stringprepare-module.html#C_21
nbxmpp.stringprepare.C_22 nbxmpp.stringprepare-module.html#C_22
nbxmpp.stringprepare.C_5 nbxmpp.stringprepare-module.html#C_5
nbxmpp.stringprepare.__package__ nbxmpp.stringprepare-module.html#__package__
nbxmpp.stringprepare.resourceprep nbxmpp.stringprepare-module.html#resourceprep
nbxmpp.stringprepare.C_3 nbxmpp.stringprepare-module.html#C_3
nbxmpp.stringprepare.C_4 nbxmpp.stringprepare-module.html#C_4
nbxmpp.stringprepare.C_7 nbxmpp.stringprepare-module.html#C_7
nbxmpp.stringprepare.C_6 nbxmpp.stringprepare-module.html#C_6
nbxmpp.stringprepare.C_9 nbxmpp.stringprepare-module.html#C_9
nbxmpp.stringprepare.C_8 nbxmpp.stringprepare-module.html#C_8
nbxmpp.stringprepare.B_2 nbxmpp.stringprepare-module.html#B_2
nbxmpp.stringprepare.B_1 nbxmpp.stringprepare-module.html#B_1
nbxmpp.stringprepare.C_11 nbxmpp.stringprepare-module.html#C_11
nbxmpp.stringprepare.C_12 nbxmpp.stringprepare-module.html#C_12
nbxmpp.stringprepare.nameprep nbxmpp.stringprepare-module.html#nameprep
nbxmpp.tls_nb nbxmpp.tls_nb-module.html
nbxmpp.tls_nb.log nbxmpp.tls_nb-module.html#log
nbxmpp.tls_nb.PYOPENSSL nbxmpp.tls_nb-module.html#PYOPENSSL
nbxmpp.tls_nb.USE_PYOPENSSL nbxmpp.tls_nb-module.html#USE_PYOPENSSL
nbxmpp.tls_nb.PYSTDLIB nbxmpp.tls_nb-module.html#PYSTDLIB
nbxmpp.tls_nb.gattr nbxmpp.tls_nb-module.html#gattr
nbxmpp.tls_nb.__package__ nbxmpp.tls_nb-module.html#__package__
nbxmpp.transports_nb nbxmpp.transports_nb-module.html
nbxmpp.transports_nb.DATA_SENT nbxmpp.transports_nb-module.html#DATA_SENT
nbxmpp.transports_nb.STATES nbxmpp.transports_nb-module.html#STATES
nbxmpp.transports_nb.DISCONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb-module.html#DISCONNECT_TIMEOUT_SECONDS
nbxmpp.transports_nb.get_proxy_data_from_dict nbxmpp.transports_nb-module.html#get_proxy_data_from_dict
nbxmpp.transports_nb.DISCONNECTING nbxmpp.transports_nb-module.html#DISCONNECTING
nbxmpp.transports_nb.DISCONNECTED nbxmpp.transports_nb-module.html#DISCONNECTED
nbxmpp.transports_nb.__package__ nbxmpp.transports_nb-module.html#__package__
nbxmpp.transports_nb.DATA_ERROR nbxmpp.transports_nb-module.html#DATA_ERROR
nbxmpp.transports_nb.CONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb-module.html#CONNECT_TIMEOUT_SECONDS
nbxmpp.transports_nb.CONNECTING nbxmpp.transports_nb-module.html#CONNECTING
nbxmpp.transports_nb.ustr nbxmpp.simplexml-module.html#ustr
nbxmpp.transports_nb.RECV_BUFSIZE nbxmpp.transports_nb-module.html#RECV_BUFSIZE
nbxmpp.transports_nb.log nbxmpp.transports_nb-module.html#log
nbxmpp.transports_nb.PROXY_CONNECTING nbxmpp.transports_nb-module.html#PROXY_CONNECTING
nbxmpp.transports_nb.urisplit nbxmpp.transports_nb-module.html#urisplit
nbxmpp.transports_nb.DATA_RECEIVED nbxmpp.transports_nb-module.html#DATA_RECEIVED
nbxmpp.transports_nb.CONNECTED nbxmpp.transports_nb-module.html#CONNECTED
nbxmpp.auth_nb.NonBlockingBind nbxmpp.auth_nb.NonBlockingBind-class.html
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.auth_nb.NonBlockingBind.plugin nbxmpp.auth_nb.NonBlockingBind-class.html#plugin
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.auth_nb.NonBlockingBind.plugout nbxmpp.auth_nb.NonBlockingBind-class.html#plugout
nbxmpp.auth_nb.NonBlockingBind._on_bound nbxmpp.auth_nb.NonBlockingBind-class.html#_on_bound
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.auth_nb.NonBlockingBind.FeaturesHandler nbxmpp.auth_nb.NonBlockingBind-class.html#FeaturesHandler
nbxmpp.auth_nb.NonBlockingBind.__init__ nbxmpp.auth_nb.NonBlockingBind-class.html#__init__
nbxmpp.auth_nb.NonBlockingBind._on_session nbxmpp.auth_nb.NonBlockingBind-class.html#_on_session
nbxmpp.auth_nb.NonBlockingBind.NonBlockingBind nbxmpp.auth_nb.NonBlockingBind-class.html#NonBlockingBind
nbxmpp.auth_nb.NonBlockingNonSASL nbxmpp.auth_nb.NonBlockingNonSASL-class.html
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.auth_nb.NonBlockingNonSASL.plugin nbxmpp.auth_nb.NonBlockingNonSASL-class.html#plugin
nbxmpp.auth_nb.NonBlockingNonSASL._on_username nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_username
nbxmpp.auth_nb.NonBlockingNonSASL._on_password nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_password
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.auth_nb.NonBlockingNonSASL._on_auth nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_auth
nbxmpp.auth_nb.NonBlockingNonSASL.__init__ nbxmpp.auth_nb.NonBlockingNonSASL-class.html#__init__
nbxmpp.auth_nb.SASL nbxmpp.auth_nb.SASL-class.html
nbxmpp.auth_nb.SASL.SASLHandler nbxmpp.auth_nb.SASL-class.html#SASLHandler
nbxmpp.auth_nb.SASL.MechanismHandler nbxmpp.auth_nb.SASL-class.html#MechanismHandler
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.auth_nb.SASL._convert_to_iso88591 nbxmpp.auth_nb.SASL-class.html#_convert_to_iso88591
nbxmpp.auth_nb.SASL.plugin nbxmpp.auth_nb.SASL-class.html#plugin
nbxmpp.auth_nb.SASL.auth nbxmpp.auth_nb.SASL-class.html#auth
nbxmpp.auth_nb.SASL.FeaturesHandler nbxmpp.auth_nb.SASL-class.html#FeaturesHandler
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.auth_nb.SASL.plugout nbxmpp.auth_nb.SASL-class.html#plugout
nbxmpp.auth_nb.SASL.set_password nbxmpp.auth_nb.SASL-class.html#set_password
nbxmpp.auth_nb.SASL.__init__ nbxmpp.auth_nb.SASL-class.html#__init__
nbxmpp.bosh.AckChecker nbxmpp.bosh.AckChecker-class.html
nbxmpp.bosh.AckChecker.get_not_acked_rids nbxmpp.bosh.AckChecker-class.html#get_not_acked_rids
nbxmpp.bosh.AckChecker.process_incoming_ack nbxmpp.bosh.AckChecker-class.html#process_incoming_ack
nbxmpp.bosh.AckChecker.get_rid nbxmpp.bosh.AckChecker-class.html#get_rid
nbxmpp.bosh.AckChecker.__init__ nbxmpp.bosh.AckChecker-class.html#__init__
nbxmpp.bosh.AckChecker.backup_stanza nbxmpp.bosh.AckChecker-class.html#backup_stanza
nbxmpp.bosh.KeyStack nbxmpp.bosh.KeyStack-class.html
nbxmpp.bosh.KeyStack.reset nbxmpp.bosh.KeyStack-class.html#reset
nbxmpp.bosh.KeyStack.__init__ nbxmpp.bosh.KeyStack-class.html#__init__
nbxmpp.bosh.KeyStack.get nbxmpp.bosh.KeyStack-class.html#get
nbxmpp.bosh.NonBlockingBOSH nbxmpp.bosh.NonBlockingBOSH-class.html
nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started
nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state
nbxmpp.bosh.NonBlockingBOSH.get_free_socket nbxmpp.bosh.NonBlockingBOSH-class.html#get_free_socket
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout
nbxmpp.bosh.NonBlockingBOSH._on_connect nbxmpp.bosh.NonBlockingBOSH-class.html#_on_connect
nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state
nbxmpp.bosh.NonBlockingBOSH.on_persistent_fallback nbxmpp.bosh.NonBlockingBOSH-class.html#on_persistent_fallback
nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2
nbxmpp.bosh.NonBlockingBOSH.renew_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#renew_bosh_wait_timeout
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.read_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout
nbxmpp.bosh.NonBlockingBOSH.send_BOSH nbxmpp.bosh.NonBlockingBOSH-class.html#send_BOSH
nbxmpp.bosh.NonBlockingBOSH.start_disconnect nbxmpp.bosh.NonBlockingBOSH-class.html#start_disconnect
nbxmpp.bosh.NonBlockingBOSH.get_new_http_socket nbxmpp.bosh.NonBlockingBOSH-class.html#get_new_http_socket
nbxmpp.bosh.NonBlockingBOSH.on_http_request_possible nbxmpp.bosh.NonBlockingBOSH-class.html#on_http_request_possible
nbxmpp.bosh.NonBlockingBOSH.plug_socket nbxmpp.bosh.NonBlockingBOSH-class.html#plug_socket
nbxmpp.bosh.NonBlockingBOSH.disconnect nbxmpp.bosh.NonBlockingBOSH-class.html#disconnect
nbxmpp.bosh.NonBlockingBOSH.remove_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#remove_bosh_wait_timeout
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.bosh.NonBlockingBOSH.send nbxmpp.bosh.NonBlockingBOSH-class.html#send
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2
nbxmpp.bosh.NonBlockingBOSH.build_stanza nbxmpp.bosh.NonBlockingBOSH-class.html#build_stanza
nbxmpp.bosh.NonBlockingBOSH.__init__ nbxmpp.bosh.NonBlockingBOSH-class.html#__init__
nbxmpp.bosh.NonBlockingBOSH.connect_and_flush nbxmpp.bosh.NonBlockingBOSH-class.html#connect_and_flush
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.bosh.NonBlockingBOSH.onreceive nbxmpp.bosh.NonBlockingBOSH-class.html#onreceive
nbxmpp.bosh.NonBlockingBOSH.send_init nbxmpp.bosh.NonBlockingBOSH-class.html#send_init
nbxmpp.bosh.NonBlockingBOSH.get_socket_in nbxmpp.bosh.NonBlockingBOSH-class.html#get_socket_in
nbxmpp.bosh.NonBlockingBOSH.boshify_stanzas nbxmpp.bosh.NonBlockingBOSH-class.html#boshify_stanzas
nbxmpp.bosh.NonBlockingBOSH.on_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#on_bosh_wait_timeout
nbxmpp.bosh.NonBlockingBOSH.append_stanza nbxmpp.bosh.NonBlockingBOSH-class.html#append_stanza
nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure
nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin
nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2
nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd
nbxmpp.bosh.NonBlockingBOSH.get_current_state nbxmpp.bosh.NonBlockingBOSH-class.html#get_current_state
nbxmpp.transports_nb.NonBlockingTransport.remove_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#remove_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2
nbxmpp.bosh.NonBlockingBOSH.set_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#set_timeout
nbxmpp.bosh.NonBlockingBOSH.handle_body_attrs nbxmpp.bosh.NonBlockingBOSH-class.html#handle_body_attrs
nbxmpp.bosh.NonBlockingBOSH.on_received_http nbxmpp.bosh.NonBlockingBOSH-class.html#on_received_http
nbxmpp.bosh.NonBlockingBOSH.connect nbxmpp.bosh.NonBlockingBOSH-class.html#connect
nbxmpp.client_nb.NonBlockingClient nbxmpp.client_nb.NonBlockingClient-class.html
nbxmpp.client_nb.NonBlockingClient._on_start_sasl nbxmpp.client_nb.NonBlockingClient-class.html#_on_start_sasl
nbxmpp.client_nb.NonBlockingClient._on_connect nbxmpp.client_nb.NonBlockingClient-class.html#_on_connect
nbxmpp.client_nb.NonBlockingClient._on_old_auth nbxmpp.client_nb.NonBlockingClient-class.html#_on_old_auth
nbxmpp.client_nb.NonBlockingClient.sendPresence nbxmpp.client_nb.NonBlockingClient-class.html#sendPresence
nbxmpp.client_nb.NonBlockingClient.connect nbxmpp.client_nb.NonBlockingClient-class.html#connect
nbxmpp.client_nb.NonBlockingClient._on_stream_start nbxmpp.client_nb.NonBlockingClient-class.html#_on_stream_start
nbxmpp.client_nb.NonBlockingClient.incoming_stream_version nbxmpp.client_nb.NonBlockingClient-class.html#incoming_stream_version
nbxmpp.client_nb.NonBlockingClient.__init__ nbxmpp.client_nb.NonBlockingClient-class.html#__init__
nbxmpp.client_nb.NonBlockingClient.get_peerhost nbxmpp.client_nb.NonBlockingClient-class.html#get_peerhost
nbxmpp.client_nb.NonBlockingClient.disconnect nbxmpp.client_nb.NonBlockingClient-class.html#disconnect
nbxmpp.client_nb.NonBlockingClient.raise_event nbxmpp.client_nb.NonBlockingClient-class.html#raise_event
nbxmpp.client_nb.NonBlockingClient.RegisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#RegisterDisconnectHandler
nbxmpp.client_nb.NonBlockingClient._on_sasl_auth nbxmpp.client_nb.NonBlockingClient-class.html#_on_sasl_auth
nbxmpp.client_nb.NonBlockingClient.initRoster nbxmpp.client_nb.NonBlockingClient-class.html#initRoster
nbxmpp.client_nb.NonBlockingClient._xmpp_connect_machine nbxmpp.client_nb.NonBlockingClient-class.html#_xmpp_connect_machine
nbxmpp.client_nb.NonBlockingClient.auth nbxmpp.client_nb.NonBlockingClient-class.html#auth
nbxmpp.client_nb.NonBlockingClient.getRoster nbxmpp.client_nb.NonBlockingClient-class.html#getRoster
nbxmpp.client_nb.NonBlockingClient._on_auth_bind nbxmpp.client_nb.NonBlockingClient-class.html#_on_auth_bind
nbxmpp.client_nb.NonBlockingClient.get_connect_type nbxmpp.client_nb.NonBlockingClient-class.html#get_connect_type
nbxmpp.client_nb.NonBlockingClient._on_doc_attrs nbxmpp.client_nb.NonBlockingClient-class.html#_on_doc_attrs
nbxmpp.client_nb.NonBlockingClient.UnregisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#UnregisterDisconnectHandler
nbxmpp.client_nb.NonBlockingClient._tls_negotiation_handler nbxmpp.client_nb.NonBlockingClient-class.html#_tls_negotiation_handler
nbxmpp.client_nb.NonBlockingClient._try_next_ip nbxmpp.client_nb.NonBlockingClient-class.html#_try_next_ip
nbxmpp.client_nb.NonBlockingClient.DisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#DisconnectHandler
nbxmpp.client_nb.NonBlockingClient._xmpp_connect nbxmpp.client_nb.NonBlockingClient-class.html#_xmpp_connect
nbxmpp.client_nb.NonBlockingClient._resolve_hostname nbxmpp.client_nb.NonBlockingClient-class.html#_resolve_hostname
nbxmpp.dispatcher_nb.BOSHDispatcher nbxmpp.dispatcher_nb.BOSHDispatcher-class.html
nbxmpp.dispatcher_nb.XMPPDispatcher.restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#restoreHandlers
nbxmpp.dispatcher_nb.XMPPDispatcher.plugout nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugout
nbxmpp.dispatcher_nb.XMPPDispatcher._WaitForData nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_WaitForData
nbxmpp.dispatcher_nb.BOSHDispatcher.StreamTerminate nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#StreamTerminate
nbxmpp.dispatcher_nb.XMPPDispatcher._init nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_init
nbxmpp.dispatcher_nb.BOSHDispatcher.dispatch nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#dispatch
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandlerOnce
nbxmpp.dispatcher_nb.XMPPDispatcher.__init__ nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#__init__
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterDefaultHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndCallForResponse
nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespace nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespace
nbxmpp.dispatcher_nb.BOSHDispatcher.PlugIn nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#PlugIn
nbxmpp.dispatcher_nb.XMPPDispatcher.dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dumpHandlers
nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterCycleHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndWaitForResponse
nbxmpp.dispatcher_nb.XMPPDispatcher.send nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#send
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterEventHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterEventHandler
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.dispatcher_nb.BOSHDispatcher.StreamInit nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#StreamInit
nbxmpp.dispatcher_nb.XMPPDispatcher.replace_non_character nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#replace_non_character
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterCycleHandler
nbxmpp.dispatcher_nb.BOSHDispatcher.ProcessNonBlocking nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#ProcessNonBlocking
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespaceHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterProtocol
nbxmpp.dispatcher_nb.XMPPDispatcher._check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_check_stream_start
nbxmpp.dispatcher_nb.XMPPDispatcher.plugin nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugin
nbxmpp.dispatcher_nb.XMPPDispatcher.returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#returnStanzaHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.getAnID nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#getAnID
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.Event nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#Event
nbxmpp.dispatcher_nb.Dispatcher nbxmpp.dispatcher_nb.Dispatcher-class.html
nbxmpp.dispatcher_nb.Dispatcher.get_instance nbxmpp.dispatcher_nb.Dispatcher-class.html#get_instance
nbxmpp.dispatcher_nb.Dispatcher.PlugIn nbxmpp.dispatcher_nb.Dispatcher-class.html#PlugIn
nbxmpp.dispatcher_nb.XMPPDispatcher nbxmpp.dispatcher_nb.XMPPDispatcher-class.html
nbxmpp.dispatcher_nb.XMPPDispatcher.restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#restoreHandlers
nbxmpp.dispatcher_nb.XMPPDispatcher.plugout nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugout
nbxmpp.dispatcher_nb.XMPPDispatcher._WaitForData nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_WaitForData
nbxmpp.dispatcher_nb.XMPPDispatcher._init nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_init
nbxmpp.dispatcher_nb.XMPPDispatcher.dispatch nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dispatch
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandlerOnce
nbxmpp.dispatcher_nb.XMPPDispatcher.__init__ nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#__init__
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterDefaultHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndCallForResponse
nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespace nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespace
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.dispatcher_nb.XMPPDispatcher.dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dumpHandlers
nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterCycleHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndWaitForResponse
nbxmpp.dispatcher_nb.XMPPDispatcher.send nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#send
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterEventHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterEventHandler
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.dispatcher_nb.XMPPDispatcher.StreamInit nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#StreamInit
nbxmpp.dispatcher_nb.XMPPDispatcher.replace_non_character nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#replace_non_character
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterCycleHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.ProcessNonBlocking nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#ProcessNonBlocking
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespaceHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterProtocol
nbxmpp.dispatcher_nb.XMPPDispatcher._check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_check_stream_start
nbxmpp.dispatcher_nb.XMPPDispatcher.plugin nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugin
nbxmpp.dispatcher_nb.XMPPDispatcher.returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#returnStanzaHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.getAnID nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#getAnID
nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandler
nbxmpp.dispatcher_nb.XMPPDispatcher.Event nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#Event
nbxmpp.idlequeue.GlibIdleQueue nbxmpp.idlequeue.GlibIdleQueue-class.html
nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time
nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm
nbxmpp.idlequeue.GlibIdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.GlibIdleQueue-class.html#PROCESS_TIMEOUT
nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events
nbxmpp.idlequeue.GlibIdleQueue._init_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_init_idle
nbxmpp.idlequeue.GlibIdleQueue._process_events nbxmpp.idlequeue.GlibIdleQueue-class.html#_process_events
nbxmpp.idlequeue.GlibIdleQueue._add_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_add_idle
nbxmpp.idlequeue.GlibIdleQueue.process nbxmpp.idlequeue.GlibIdleQueue-class.html#process
nbxmpp.idlequeue.GlibIdleQueue._remove_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_remove_idle
nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout
nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle
nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout
nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle
nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__
nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm
nbxmpp.idlequeue.IdleCommand nbxmpp.idlequeue.IdleCommand-class.html
nbxmpp.idlequeue.IdleCommand._compose_command_args nbxmpp.idlequeue.IdleCommand-class.html#_compose_command_args
nbxmpp.idlequeue.IdleCommand.set_idlequeue nbxmpp.idlequeue.IdleCommand-class.html#set_idlequeue
nbxmpp.idlequeue.IdleCommand.end nbxmpp.idlequeue.IdleCommand-class.html#end
nbxmpp.idlequeue.IdleCommand.start nbxmpp.idlequeue.IdleCommand-class.html#start
nbxmpp.idlequeue.IdleCommand._compose_command_line nbxmpp.idlequeue.IdleCommand-class.html#_compose_command_line
nbxmpp.idlequeue.IdleCommand.pollend nbxmpp.idlequeue.IdleCommand-class.html#pollend
nbxmpp.idlequeue.IdleCommand.pollin nbxmpp.idlequeue.IdleCommand-class.html#pollin
nbxmpp.idlequeue.IdleCommand._start_posix nbxmpp.idlequeue.IdleCommand-class.html#_start_posix
nbxmpp.idlequeue.IdleCommand.read_timeout nbxmpp.idlequeue.IdleCommand-class.html#read_timeout
nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd
nbxmpp.idlequeue.IdleCommand.wait_child nbxmpp.idlequeue.IdleCommand-class.html#wait_child
nbxmpp.idlequeue.IdleCommand._start_nt nbxmpp.idlequeue.IdleCommand-class.html#_start_nt
nbxmpp.idlequeue.IdleObject.pollout nbxmpp.idlequeue.IdleObject-class.html#pollout
nbxmpp.idlequeue.IdleCommand.__init__ nbxmpp.idlequeue.IdleCommand-class.html#__init__
nbxmpp.idlequeue.IdleCommand._return_result nbxmpp.idlequeue.IdleCommand-class.html#_return_result
nbxmpp.idlequeue.IdleObject nbxmpp.idlequeue.IdleObject-class.html
nbxmpp.idlequeue.IdleObject.pollend nbxmpp.idlequeue.IdleObject-class.html#pollend
nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd
nbxmpp.idlequeue.IdleObject.read_timeout nbxmpp.idlequeue.IdleObject-class.html#read_timeout
nbxmpp.idlequeue.IdleObject.pollin nbxmpp.idlequeue.IdleObject-class.html#pollin
nbxmpp.idlequeue.IdleObject.pollout nbxmpp.idlequeue.IdleObject-class.html#pollout
nbxmpp.idlequeue.IdleObject.__init__ nbxmpp.idlequeue.IdleObject-class.html#__init__
nbxmpp.idlequeue.IdleQueue nbxmpp.idlequeue.IdleQueue-class.html
nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time
nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm
nbxmpp.idlequeue.IdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue-class.html#PROCESS_TIMEOUT
nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm
nbxmpp.idlequeue.IdleQueue._init_idle nbxmpp.idlequeue.IdleQueue-class.html#_init_idle
nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle
nbxmpp.idlequeue.IdleQueue._add_idle nbxmpp.idlequeue.IdleQueue-class.html#_add_idle
nbxmpp.idlequeue.IdleQueue.process nbxmpp.idlequeue.IdleQueue-class.html#process
nbxmpp.idlequeue.IdleQueue._remove_idle nbxmpp.idlequeue.IdleQueue-class.html#_remove_idle
nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout
nbxmpp.idlequeue.IdleQueue._process_events nbxmpp.idlequeue.IdleQueue-class.html#_process_events
nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout
nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle
nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__
nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events
nbxmpp.idlequeue.SelectIdleQueue nbxmpp.idlequeue.SelectIdleQueue-class.html
nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time
nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm
nbxmpp.idlequeue.IdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue-class.html#PROCESS_TIMEOUT
nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events
nbxmpp.idlequeue.SelectIdleQueue._init_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_init_idle
nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle
nbxmpp.idlequeue.SelectIdleQueue._add_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_add_idle
nbxmpp.idlequeue.SelectIdleQueue.process nbxmpp.idlequeue.SelectIdleQueue-class.html#process
nbxmpp.idlequeue.SelectIdleQueue._remove_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_remove_idle
nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout
nbxmpp.idlequeue.IdleQueue._process_events nbxmpp.idlequeue.IdleQueue-class.html#_process_events
nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout
nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle
nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__
nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm
nbxmpp.plugin.PlugIn nbxmpp.plugin.PlugIn-class.html
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.plugin.PlugIn.__init__ nbxmpp.plugin.PlugIn-class.html#__init__
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.protocol.Acks nbxmpp.protocol.Acks-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Acks.buildEnable nbxmpp.protocol.Acks-class.html#buildEnable
nbxmpp.protocol.Acks.buildAnswer nbxmpp.protocol.Acks-class.html#buildAnswer
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.protocol.Acks.__init__ nbxmpp.protocol.Acks-class.html#__init__
nbxmpp.protocol.Acks.buildRequest nbxmpp.protocol.Acks-class.html#buildRequest
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.Acks.buildResume nbxmpp.protocol.Acks-class.html#buildResume
nbxmpp.protocol.BOSHBody nbxmpp.protocol.BOSHBody-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.BOSHBody.__init__ nbxmpp.protocol.BOSHBody-class.html#__init__
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.BadFormat nbxmpp.protocol.BadFormat-class.html
nbxmpp.protocol.BadNamespacePrefix nbxmpp.protocol.BadNamespacePrefix-class.html
nbxmpp.protocol.Conflict nbxmpp.protocol.Conflict-class.html
nbxmpp.protocol.ConnectionTimeout nbxmpp.protocol.ConnectionTimeout-class.html
nbxmpp.protocol.DataField nbxmpp.protocol.DataField-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.protocol.DataField.addOption nbxmpp.protocol.DataField-class.html#addOption
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.DataField.getValues nbxmpp.protocol.DataField-class.html#getValues
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.DataField.getOptions nbxmpp.protocol.DataField-class.html#getOptions
nbxmpp.protocol.DataField.setVar nbxmpp.protocol.DataField-class.html#setVar
nbxmpp.protocol.DataField.__init__ nbxmpp.protocol.DataField-class.html#__init__
nbxmpp.protocol.DataField.setType nbxmpp.protocol.DataField-class.html#setType
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.protocol.DataField.getDesc nbxmpp.protocol.DataField-class.html#getDesc
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.protocol.DataField.getVar nbxmpp.protocol.DataField-class.html#getVar
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.protocol.DataField.setDesc nbxmpp.protocol.DataField-class.html#setDesc
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.protocol.DataField.setValue nbxmpp.protocol.DataField-class.html#setValue
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.DataField.setRequired nbxmpp.protocol.DataField-class.html#setRequired
nbxmpp.protocol.DataField.getType nbxmpp.protocol.DataField-class.html#getType
nbxmpp.protocol.DataField.setOptions nbxmpp.protocol.DataField-class.html#setOptions
nbxmpp.protocol.DataField.isRequired nbxmpp.protocol.DataField-class.html#isRequired
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.DataField.setValues nbxmpp.protocol.DataField-class.html#setValues
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.protocol.DataField.getValue nbxmpp.protocol.DataField-class.html#getValue
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.DataField.addValue nbxmpp.protocol.DataField-class.html#addValue
nbxmpp.protocol.DataForm nbxmpp.protocol.DataForm-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.protocol.DataForm.setTitle nbxmpp.protocol.DataForm-class.html#setTitle
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.DataForm.setField nbxmpp.protocol.DataForm-class.html#setField
nbxmpp.protocol.DataForm.__init__ nbxmpp.protocol.DataForm-class.html#__init__
nbxmpp.protocol.DataForm.setType nbxmpp.protocol.DataForm-class.html#setType
nbxmpp.protocol.DataForm.__getitem__ nbxmpp.protocol.DataForm-class.html#__getitem__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.protocol.DataForm.setInstructions nbxmpp.protocol.DataForm-class.html#setInstructions
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.protocol.DataForm.asDict nbxmpp.protocol.DataForm-class.html#asDict
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.DataForm.getType nbxmpp.protocol.DataForm-class.html#getType
nbxmpp.protocol.DataForm.__setitem__ nbxmpp.protocol.DataForm-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.DataForm.getTitle nbxmpp.protocol.DataForm-class.html#getTitle
nbxmpp.protocol.DataForm.getInstructions nbxmpp.protocol.DataForm-class.html#getInstructions
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.protocol.DataForm.getField nbxmpp.protocol.DataForm-class.html#getField
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.protocol.DataForm.addInstructions nbxmpp.protocol.DataForm-class.html#addInstructions
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.Error nbxmpp.protocol.Error-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError
nbxmpp.protocol.Error.__init__ nbxmpp.protocol.Error-class.html#__init__
nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType
nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo
nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom
nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode
nbxmpp.protocol.Error.__dupstr__ nbxmpp.protocol.Error-class.html#__dupstr__
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType
nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__
nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.ErrorNode nbxmpp.protocol.ErrorNode-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.ErrorNode.__init__ nbxmpp.protocol.ErrorNode-class.html#__init__
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.Hashes nbxmpp.protocol.Hashes-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.protocol.Hashes.supported nbxmpp.protocol.Hashes-class.html#supported
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Hashes.__init__ nbxmpp.protocol.Hashes-class.html#__init__
nbxmpp.protocol.Hashes.addHash nbxmpp.protocol.Hashes-class.html#addHash
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Hashes.calculateHash nbxmpp.protocol.Hashes-class.html#calculateHash
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.HostGone nbxmpp.protocol.HostGone-class.html
nbxmpp.protocol.HostUnknown nbxmpp.protocol.HostUnknown-class.html
nbxmpp.protocol.ImproperAddressing nbxmpp.protocol.ImproperAddressing-class.html
nbxmpp.protocol.InternalServerError nbxmpp.protocol.InternalServerError-class.html
nbxmpp.protocol.InvalidFrom nbxmpp.protocol.InvalidFrom-class.html
nbxmpp.protocol.InvalidID nbxmpp.protocol.InvalidID-class.html
nbxmpp.protocol.InvalidNamespace nbxmpp.protocol.InvalidNamespace-class.html
nbxmpp.protocol.InvalidXML nbxmpp.protocol.InvalidXML-class.html
nbxmpp.protocol.Iq nbxmpp.protocol.Iq-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo
nbxmpp.protocol.Iq.getQueryNS nbxmpp.protocol.Iq-class.html#getQueryNS
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError
nbxmpp.protocol.Iq.__init__ nbxmpp.protocol.Iq-class.html#__init__
nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType
nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo
nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom
nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp
nbxmpp.protocol.Iq.getQueryPayload nbxmpp.protocol.Iq-class.html#getQueryPayload
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp
nbxmpp.protocol.Iq.setQueryPayload nbxmpp.protocol.Iq-class.html#setQueryPayload
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.protocol.Iq.getQuery nbxmpp.protocol.Iq-class.html#getQuery
nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.Iq.buildReply nbxmpp.protocol.Iq-class.html#buildReply
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType
nbxmpp.protocol.Iq.getQueryChildren nbxmpp.protocol.Iq-class.html#getQueryChildren
nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__
nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.protocol.Iq.getQuerynode nbxmpp.protocol.Iq-class.html#getQuerynode
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.protocol.Iq.setQuery nbxmpp.protocol.Iq-class.html#setQuery
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties
nbxmpp.protocol.Iq.setQueryNS nbxmpp.protocol.Iq-class.html#setQueryNS
nbxmpp.protocol.Iq.setQuerynode nbxmpp.protocol.Iq-class.html#setQuerynode
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.JID nbxmpp.protocol.JID-class.html
nbxmpp.protocol.JID.getDomain nbxmpp.protocol.JID-class.html#getDomain
nbxmpp.protocol.JID.bareMatch nbxmpp.protocol.JID-class.html#bareMatch
nbxmpp.protocol.JID.setNode nbxmpp.protocol.JID-class.html#setNode
nbxmpp.protocol.JID.getStripped nbxmpp.protocol.JID-class.html#getStripped
nbxmpp.protocol.JID.setResource nbxmpp.protocol.JID-class.html#setResource
nbxmpp.protocol.JID.__str__ nbxmpp.protocol.JID-class.html#__str__
nbxmpp.protocol.JID.getResource nbxmpp.protocol.JID-class.html#getResource
nbxmpp.protocol.JID.setDomain nbxmpp.protocol.JID-class.html#setDomain
nbxmpp.protocol.JID.__hash__ nbxmpp.protocol.JID-class.html#__hash__
nbxmpp.protocol.JID.__ne__ nbxmpp.protocol.JID-class.html#__ne__
nbxmpp.protocol.JID.__eq__ nbxmpp.protocol.JID-class.html#__eq__
nbxmpp.protocol.JID.__init__ nbxmpp.protocol.JID-class.html#__init__
nbxmpp.protocol.JID.getNode nbxmpp.protocol.JID-class.html#getNode
nbxmpp.protocol.Message nbxmpp.protocol.Message-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.protocol.Message.getStatusCode nbxmpp.protocol.Message-class.html#getStatusCode
nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo
nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Message.getSubject nbxmpp.protocol.Message-class.html#getSubject
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError
nbxmpp.protocol.Message.__init__ nbxmpp.protocol.Message-class.html#__init__
nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType
nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo
nbxmpp.protocol.Message.setBody nbxmpp.protocol.Message-class.html#setBody
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom
nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.protocol.Message.buildReply nbxmpp.protocol.Message-class.html#buildReply
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Message.setThread nbxmpp.protocol.Message-class.html#setThread
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType
nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__
nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.Message.setXHTML nbxmpp.protocol.Message-class.html#setXHTML
nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.protocol.Message.getThread nbxmpp.protocol.Message-class.html#getThread
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.protocol.Message.setSubject nbxmpp.protocol.Message-class.html#setSubject
nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties
nbxmpp.protocol.Message.getXHTML nbxmpp.protocol.Message-class.html#getXHTML
nbxmpp.protocol.Message.getBody nbxmpp.protocol.Message-class.html#getBody
nbxmpp.protocol.NodeProcessed nbxmpp.protocol.NodeProcessed-class.html
nbxmpp.protocol.NotAuthorized nbxmpp.protocol.NotAuthorized-class.html
nbxmpp.protocol.PolicyViolation nbxmpp.protocol.PolicyViolation-class.html
nbxmpp.protocol.Presence nbxmpp.protocol.Presence-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom
nbxmpp.protocol.Presence.getStatusCode nbxmpp.protocol.Presence-class.html#getStatusCode
nbxmpp.protocol.Presence.getPriority nbxmpp.protocol.Presence-class.html#getPriority
nbxmpp.protocol.Presence.getAffiliation nbxmpp.protocol.Presence-class.html#getAffiliation
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.protocol.Presence.setPriority nbxmpp.protocol.Presence-class.html#setPriority
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.protocol.Presence.setStatus nbxmpp.protocol.Presence-class.html#setStatus
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError
nbxmpp.protocol.Presence.__init__ nbxmpp.protocol.Presence-class.html#__init__
nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType
nbxmpp.protocol.Presence.getShow nbxmpp.protocol.Presence-class.html#getShow
nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo
nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.protocol.Presence.getStatus nbxmpp.protocol.Presence-class.html#getStatus
nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.protocol.Presence.getActor nbxmpp.protocol.Presence-class.html#getActor
nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp
nbxmpp.protocol.Presence.getRole nbxmpp.protocol.Presence-class.html#getRole
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType
nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__
nbxmpp.protocol.Presence.getJid nbxmpp.protocol.Presence-class.html#getJid
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.protocol.Presence.setShow nbxmpp.protocol.Presence-class.html#setShow
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.protocol.Presence._muc_getSubTagDataAttr nbxmpp.protocol.Presence-class.html#_muc_getSubTagDataAttr
nbxmpp.protocol.Presence.getReason nbxmpp.protocol.Presence-class.html#getReason
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions
nbxmpp.protocol.Presence.getNewNick nbxmpp.protocol.Presence-class.html#getNewNick
nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties
nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom
nbxmpp.protocol.Presence._muc_getItemAttr nbxmpp.protocol.Presence-class.html#_muc_getItemAttr
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.Protocol nbxmpp.protocol.Protocol-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError
nbxmpp.protocol.Protocol.__init__ nbxmpp.protocol.Protocol-class.html#__init__
nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType
nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo
nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom
nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType
nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__
nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.protocol.RemoteConnectionFailed nbxmpp.protocol.RemoteConnectionFailed-class.html
nbxmpp.protocol.ResourceConstraint nbxmpp.protocol.ResourceConstraint-class.html
nbxmpp.protocol.RestrictedXML nbxmpp.protocol.RestrictedXML-class.html
nbxmpp.protocol.SeeOtherHost nbxmpp.protocol.SeeOtherHost-class.html
nbxmpp.protocol.StreamError nbxmpp.protocol.StreamError-class.html
nbxmpp.protocol.SystemShutdown nbxmpp.protocol.SystemShutdown-class.html
nbxmpp.protocol.UndefinedCondition nbxmpp.protocol.UndefinedCondition-class.html
nbxmpp.protocol.UnsupportedEncoding nbxmpp.protocol.UnsupportedEncoding-class.html
nbxmpp.protocol.UnsupportedStanzaType nbxmpp.protocol.UnsupportedStanzaType-class.html
nbxmpp.protocol.UnsupportedVersion nbxmpp.protocol.UnsupportedVersion-class.html
nbxmpp.protocol.XMLNotWellFormed nbxmpp.protocol.XMLNotWellFormed-class.html
nbxmpp.proxy_connectors.HTTPCONNECTConnector nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html
nbxmpp.proxy_connectors.HTTPCONNECTConnector._on_headers_sent nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html#_on_headers_sent
nbxmpp.proxy_connectors.HTTPCONNECTConnector.start_connecting nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html#start_connecting
nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over
nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__
nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance
nbxmpp.proxy_connectors.ProxyConnector nbxmpp.proxy_connectors.ProxyConnector-class.html
nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over
nbxmpp.proxy_connectors.ProxyConnector.start_connecting nbxmpp.proxy_connectors.ProxyConnector-class.html#start_connecting
nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance
nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__
nbxmpp.proxy_connectors.SOCKS5Connector nbxmpp.proxy_connectors.SOCKS5Connector-class.html
nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over
nbxmpp.proxy_connectors.SOCKS5Connector._on_proxy_auth nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_proxy_auth
nbxmpp.proxy_connectors.SOCKS5Connector.start_connecting nbxmpp.proxy_connectors.SOCKS5Connector-class.html#start_connecting
nbxmpp.proxy_connectors.SOCKS5Connector._on_req_sent nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_req_sent
nbxmpp.proxy_connectors.SOCKS5Connector._on_greeting_sent nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_greeting_sent
nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__
nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance
nbxmpp.roster_nb.NonBlockingRoster nbxmpp.roster_nb.NonBlockingRoster-class.html
nbxmpp.roster_nb.NonBlockingRoster.getRaw nbxmpp.roster_nb.NonBlockingRoster-class.html#getRaw
nbxmpp.roster_nb.NonBlockingRoster._getResourceData nbxmpp.roster_nb.NonBlockingRoster-class.html#_getResourceData
nbxmpp.roster_nb.NonBlockingRoster.getGroups nbxmpp.roster_nb.NonBlockingRoster-class.html#getGroups
nbxmpp.roster_nb.NonBlockingRoster.getPriority nbxmpp.roster_nb.NonBlockingRoster-class.html#getPriority
nbxmpp.roster_nb.NonBlockingRoster._on_roster_set nbxmpp.roster_nb.NonBlockingRoster-class.html#_on_roster_set
nbxmpp.roster_nb.NonBlockingRoster.getRawRoster nbxmpp.roster_nb.NonBlockingRoster-class.html#getRawRoster
nbxmpp.roster_nb.NonBlockingRoster.PresenceHandler nbxmpp.roster_nb.NonBlockingRoster-class.html#PresenceHandler
nbxmpp.roster_nb.NonBlockingRoster._getItemData nbxmpp.roster_nb.NonBlockingRoster-class.html#_getItemData
nbxmpp.roster_nb.NonBlockingRoster.__init__ nbxmpp.roster_nb.NonBlockingRoster-class.html#__init__
nbxmpp.roster_nb.NonBlockingRoster.getShow nbxmpp.roster_nb.NonBlockingRoster-class.html#getShow
nbxmpp.roster_nb.NonBlockingRoster.getRoster nbxmpp.roster_nb.NonBlockingRoster-class.html#getRoster
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.roster_nb.NonBlockingRoster.getName nbxmpp.roster_nb.NonBlockingRoster-class.html#getName
nbxmpp.roster_nb.NonBlockingRoster.getStatus nbxmpp.roster_nb.NonBlockingRoster-class.html#getStatus
nbxmpp.roster_nb.NonBlockingRoster.Unauthorize nbxmpp.roster_nb.NonBlockingRoster-class.html#Unauthorize
nbxmpp.roster_nb.NonBlockingRoster.Unsubscribe nbxmpp.roster_nb.NonBlockingRoster-class.html#Unsubscribe
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.roster_nb.NonBlockingRoster.RosterIqHandler nbxmpp.roster_nb.NonBlockingRoster-class.html#RosterIqHandler
nbxmpp.roster_nb.NonBlockingRoster.getRawItem nbxmpp.roster_nb.NonBlockingRoster-class.html#getRawItem
nbxmpp.roster_nb.NonBlockingRoster.getItems nbxmpp.roster_nb.NonBlockingRoster-class.html#getItems
nbxmpp.roster_nb.NonBlockingRoster.__getitem__ nbxmpp.roster_nb.NonBlockingRoster-class.html#__getitem__
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.roster_nb.NonBlockingRoster.keys nbxmpp.roster_nb.NonBlockingRoster-class.html#keys
nbxmpp.roster_nb.NonBlockingRoster.Request nbxmpp.roster_nb.NonBlockingRoster-class.html#Request
nbxmpp.roster_nb.NonBlockingRoster.getAsk nbxmpp.roster_nb.NonBlockingRoster-class.html#getAsk
nbxmpp.roster_nb.NonBlockingRoster.setItem nbxmpp.roster_nb.NonBlockingRoster-class.html#setItem
nbxmpp.roster_nb.NonBlockingRoster.setItemMulti nbxmpp.roster_nb.NonBlockingRoster-class.html#setItemMulti
nbxmpp.roster_nb.NonBlockingRoster.getItem nbxmpp.roster_nb.NonBlockingRoster-class.html#getItem
nbxmpp.roster_nb.NonBlockingRoster.Authorize nbxmpp.roster_nb.NonBlockingRoster-class.html#Authorize
nbxmpp.roster_nb.NonBlockingRoster.plugin nbxmpp.roster_nb.NonBlockingRoster-class.html#plugin
nbxmpp.roster_nb.NonBlockingRoster.Subscribe nbxmpp.roster_nb.NonBlockingRoster-class.html#Subscribe
nbxmpp.roster_nb.NonBlockingRoster.setRaw nbxmpp.roster_nb.NonBlockingRoster-class.html#setRaw
nbxmpp.roster_nb.NonBlockingRoster.delItem nbxmpp.roster_nb.NonBlockingRoster-class.html#delItem
nbxmpp.roster_nb.NonBlockingRoster.getSubscription nbxmpp.roster_nb.NonBlockingRoster-class.html#getSubscription
nbxmpp.roster_nb.NonBlockingRoster.getResources nbxmpp.roster_nb.NonBlockingRoster-class.html#getResources
nbxmpp.simplexml.NT nbxmpp.simplexml.NT-class.html
nbxmpp.simplexml.T.__delattr__ nbxmpp.simplexml.T-class.html#__delattr__
nbxmpp.simplexml.NT.__setattr__ nbxmpp.simplexml.NT-class.html#__setattr__
nbxmpp.simplexml.T.__init__ nbxmpp.simplexml.T-class.html#__init__
nbxmpp.simplexml.NT.__getattr__ nbxmpp.simplexml.NT-class.html#__getattr__
nbxmpp.simplexml.Node nbxmpp.simplexml.Node-class.html
nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild
nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs
nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr
nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace
nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__
nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace
nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren
nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr
nbxmpp.simplexml.Node.__init__ nbxmpp.simplexml.Node-class.html#__init__
nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__
nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData
nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__
nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent
nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName
nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__
nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData
nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp
nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData
nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData
nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName
nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr
nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__
nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload
nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags
nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag
nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr
nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags
nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__
nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData
nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent
nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild
nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr
nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr
nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData
nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload
nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION
nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag
nbxmpp.simplexml.NodeBuilder nbxmpp.simplexml.NodeBuilder-class.html
nbxmpp.simplexml.NodeBuilder.stream_header_received nbxmpp.simplexml.NodeBuilder-class.html#stream_header_received
nbxmpp.simplexml.NodeBuilder._dec_depth nbxmpp.simplexml.NodeBuilder-class.html#_dec_depth
nbxmpp.simplexml.NodeBuilder.starttag nbxmpp.simplexml.NodeBuilder-class.html#starttag
nbxmpp.simplexml.NodeBuilder.endtag nbxmpp.simplexml.NodeBuilder-class.html#endtag
nbxmpp.simplexml.NodeBuilder.check_data_buffer nbxmpp.simplexml.NodeBuilder-class.html#check_data_buffer
nbxmpp.simplexml.NodeBuilder.handle_cdata nbxmpp.simplexml.NodeBuilder-class.html#handle_cdata
nbxmpp.simplexml.NodeBuilder.getDom nbxmpp.simplexml.NodeBuilder-class.html#getDom
nbxmpp.simplexml.NodeBuilder.dispatch nbxmpp.simplexml.NodeBuilder-class.html#dispatch
nbxmpp.simplexml.NodeBuilder.stream_footer_received nbxmpp.simplexml.NodeBuilder-class.html#stream_footer_received
nbxmpp.simplexml.NodeBuilder.has_received_endtag nbxmpp.simplexml.NodeBuilder-class.html#has_received_endtag
nbxmpp.simplexml.NodeBuilder.destroy nbxmpp.simplexml.NodeBuilder-class.html#destroy
nbxmpp.simplexml.NodeBuilder._inc_depth nbxmpp.simplexml.NodeBuilder-class.html#_inc_depth
nbxmpp.simplexml.NodeBuilder.__init__ nbxmpp.simplexml.NodeBuilder-class.html#__init__
nbxmpp.simplexml.NodeBuilder.handle_namespace_start nbxmpp.simplexml.NodeBuilder-class.html#handle_namespace_start
nbxmpp.simplexml.T nbxmpp.simplexml.T-class.html
nbxmpp.simplexml.T.__delattr__ nbxmpp.simplexml.T-class.html#__delattr__
nbxmpp.simplexml.T.__setattr__ nbxmpp.simplexml.T-class.html#__setattr__
nbxmpp.simplexml.T.__init__ nbxmpp.simplexml.T-class.html#__init__
nbxmpp.simplexml.T.__getattr__ nbxmpp.simplexml.T-class.html#__getattr__
nbxmpp.smacks.Smacks nbxmpp.smacks.Smacks-class.html
nbxmpp.smacks.Smacks.resume_request nbxmpp.smacks.Smacks-class.html#resume_request
nbxmpp.smacks.Smacks.send_ack nbxmpp.smacks.Smacks-class.html#send_ack
nbxmpp.smacks.Smacks.check_ack nbxmpp.smacks.Smacks-class.html#check_ack
nbxmpp.smacks.Smacks.negociate nbxmpp.smacks.Smacks-class.html#negociate
nbxmpp.smacks.Smacks.request_ack nbxmpp.smacks.Smacks-class.html#request_ack
nbxmpp.smacks.Smacks._neg_response nbxmpp.smacks.Smacks-class.html#_neg_response
nbxmpp.smacks.Smacks.error_handling nbxmpp.smacks.Smacks-class.html#error_handling
nbxmpp.smacks.Smacks.set_owner nbxmpp.smacks.Smacks-class.html#set_owner
nbxmpp.smacks.Smacks.__init__ nbxmpp.smacks.Smacks-class.html#__init__
nbxmpp.stringprepare.EmptyMappingTable nbxmpp.stringprepare.EmptyMappingTable-class.html
nbxmpp.stringprepare.EmptyMappingTable.__implements__ nbxmpp.stringprepare.IMappingTable-class.html
nbxmpp.stringprepare.EmptyMappingTable.map nbxmpp.stringprepare.EmptyMappingTable-class.html#map
nbxmpp.stringprepare.EmptyMappingTable.__init__ nbxmpp.stringprepare.EmptyMappingTable-class.html#__init__
nbxmpp.stringprepare.ILookupTable nbxmpp.stringprepare.ILookupTable-class.html
nbxmpp.stringprepare.ILookupTable.lookup nbxmpp.stringprepare.ILookupTable-class.html#lookup
nbxmpp.stringprepare.IMappingTable nbxmpp.stringprepare.IMappingTable-class.html
nbxmpp.stringprepare.IMappingTable.map nbxmpp.stringprepare.IMappingTable-class.html#map
nbxmpp.stringprepare.LookupTable nbxmpp.stringprepare.LookupTable-class.html
nbxmpp.stringprepare.LookupTable.__implements__ nbxmpp.stringprepare.ILookupTable-class.html
nbxmpp.stringprepare.LookupTable.lookup nbxmpp.stringprepare.LookupTable-class.html#lookup
nbxmpp.stringprepare.LookupTable.__init__ nbxmpp.stringprepare.LookupTable-class.html#__init__
nbxmpp.stringprepare.LookupTableFromFunction nbxmpp.stringprepare.LookupTableFromFunction-class.html
nbxmpp.stringprepare.LookupTableFromFunction.__implements__ nbxmpp.stringprepare.ILookupTable-class.html
nbxmpp.stringprepare.LookupTableFromFunction.__init__ nbxmpp.stringprepare.LookupTableFromFunction-class.html#__init__
nbxmpp.stringprepare.MappingTableFromFunction nbxmpp.stringprepare.MappingTableFromFunction-class.html
nbxmpp.stringprepare.MappingTableFromFunction.__implements__ nbxmpp.stringprepare.IMappingTable-class.html
nbxmpp.stringprepare.MappingTableFromFunction.__init__ nbxmpp.stringprepare.MappingTableFromFunction-class.html#__init__
nbxmpp.stringprepare.NamePrep nbxmpp.stringprepare.NamePrep-class.html
nbxmpp.stringprepare.NamePrep.prohibiteds nbxmpp.stringprepare.NamePrep-class.html#prohibiteds
nbxmpp.stringprepare.NamePrep.nameprep nbxmpp.stringprepare.NamePrep-class.html#nameprep
nbxmpp.stringprepare.NamePrep.check_prohibiteds nbxmpp.stringprepare.NamePrep-class.html#check_prohibiteds
nbxmpp.stringprepare.NamePrep.prepare nbxmpp.stringprepare.NamePrep-class.html#prepare
nbxmpp.stringprepare.NamePrep.n nbxmpp.stringprepare.NamePrep-class.html#n
nbxmpp.stringprepare.Profile nbxmpp.stringprepare.Profile-class.html
nbxmpp.stringprepare.Profile.check_unassigneds nbxmpp.stringprepare.Profile-class.html#check_unassigneds
nbxmpp.stringprepare.Profile.map nbxmpp.stringprepare.Profile-class.html#map
nbxmpp.stringprepare.Profile.check_prohibiteds nbxmpp.stringprepare.Profile-class.html#check_prohibiteds
nbxmpp.stringprepare.Profile.prepare nbxmpp.stringprepare.Profile-class.html#prepare
nbxmpp.stringprepare.Profile.check_bidirectionals nbxmpp.stringprepare.Profile-class.html#check_bidirectionals
nbxmpp.stringprepare.Profile.__init__ nbxmpp.stringprepare.Profile-class.html#__init__
nbxmpp.tls_nb.NonBlockingTLS nbxmpp.tls_nb.NonBlockingTLS-class.html
nbxmpp.tls_nb.NonBlockingTLS._dumpX509 nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpX509
nbxmpp.tls_nb.NonBlockingTLS.ssl_h_bits nbxmpp.tls_nb.NonBlockingTLS-class.html#ssl_h_bits
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.tls_nb.NonBlockingTLS._startSSL_pyOpenSSL nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL_pyOpenSSL
nbxmpp.tls_nb.NonBlockingTLS.plugin nbxmpp.tls_nb.NonBlockingTLS-class.html#plugin
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.tls_nb.NonBlockingTLS._dumpX509Name nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpX509Name
nbxmpp.tls_nb.NonBlockingTLS._load_cert_file nbxmpp.tls_nb.NonBlockingTLS-class.html#_load_cert_file
nbxmpp.tls_nb.NonBlockingTLS._dumpPKey nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpPKey
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.tls_nb.NonBlockingTLS._startSSL nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL
nbxmpp.tls_nb.NonBlockingTLS._startSSL_stdlib nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL_stdlib
nbxmpp.tls_nb.NonBlockingTLS._ssl_verify_callback nbxmpp.tls_nb.NonBlockingTLS-class.html#_ssl_verify_callback
nbxmpp.tls_nb.NonBlockingTLS.__init__ nbxmpp.tls_nb.NonBlockingTLS-class.html#__init__
nbxmpp.tls_nb.PyOpenSSLWrapper nbxmpp.tls_nb.PyOpenSSLWrapper-class.html
nbxmpp.tls_nb.PyOpenSSLWrapper.recv nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#recv
nbxmpp.tls_nb.PyOpenSSLWrapper.is_numtoolarge nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#is_numtoolarge
nbxmpp.tls_nb.PyOpenSSLWrapper.__init__ nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#__init__
nbxmpp.tls_nb.PyOpenSSLWrapper.send nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#send
nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html
nbxmpp.tls_nb.SSLWrapper nbxmpp.tls_nb.SSLWrapper-class.html
nbxmpp.tls_nb.SSLWrapper.recv nbxmpp.tls_nb.SSLWrapper-class.html#recv
nbxmpp.tls_nb.SSLWrapper.__init__ nbxmpp.tls_nb.SSLWrapper-class.html#__init__
nbxmpp.tls_nb.SSLWrapper.send nbxmpp.tls_nb.SSLWrapper-class.html#send
nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html
nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html
nbxmpp.tls_nb.SSLWrapper.Error.__str__ nbxmpp.tls_nb.SSLWrapper.Error-class.html#__str__
nbxmpp.tls_nb.SSLWrapper.Error.__init__ nbxmpp.tls_nb.SSLWrapper.Error-class.html#__init__
nbxmpp.tls_nb.StdlibSSLWrapper nbxmpp.tls_nb.StdlibSSLWrapper-class.html
nbxmpp.tls_nb.StdlibSSLWrapper.recv nbxmpp.tls_nb.StdlibSSLWrapper-class.html#recv
nbxmpp.tls_nb.StdlibSSLWrapper.__init__ nbxmpp.tls_nb.StdlibSSLWrapper-class.html#__init__
nbxmpp.tls_nb.StdlibSSLWrapper.send nbxmpp.tls_nb.StdlibSSLWrapper-class.html#send
nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html
nbxmpp.transports_nb.NonBlockingHTTP nbxmpp.transports_nb.NonBlockingHTTP-class.html
nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started
nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout
nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect
nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2
nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect
nbxmpp.transports_nb.NonBlockingHTTP.parse_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#parse_http_message
nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout
nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2
nbxmpp.transports_nb.NonBlockingHTTP.__init__ nbxmpp.transports_nb.NonBlockingHTTP-class.html#__init__
nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive
nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect
nbxmpp.transports_nb.NonBlockingHTTP.build_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#build_http_message
nbxmpp.transports_nb.NonBlockingTCP._do_send nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_send
nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send
nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init
nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy
nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.transports_nb.NonBlockingHTTP._on_receive nbxmpp.transports_nb.NonBlockingHTTP-class.html#_on_receive
nbxmpp.transports_nb.NonBlockingHTTP.http_send nbxmpp.transports_nb.NonBlockingHTTP-class.html#http_send
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle
nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive
nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd
nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state
nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout
nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure
nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2
nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend
nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd
nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2
nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout
nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect
nbxmpp.transports_nb.NonBlockingHTTPBOSH nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html
nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started
nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout
nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect
nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2
nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect
nbxmpp.transports_nb.NonBlockingHTTP.parse_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#parse_http_message
nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout
nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2
nbxmpp.transports_nb.NonBlockingHTTP.__init__ nbxmpp.transports_nb.NonBlockingHTTP-class.html#__init__
nbxmpp.transports_nb.NonBlockingHTTPBOSH.set_stanza_build_cb nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html#set_stanza_build_cb
nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive
nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect
nbxmpp.transports_nb.NonBlockingHTTP.build_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#build_http_message
nbxmpp.transports_nb.NonBlockingHTTPBOSH._do_send nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html#_do_send
nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send
nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init
nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy
nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.transports_nb.NonBlockingHTTP._on_receive nbxmpp.transports_nb.NonBlockingHTTP-class.html#_on_receive
nbxmpp.transports_nb.NonBlockingHTTP.http_send nbxmpp.transports_nb.NonBlockingHTTP-class.html#http_send
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle
nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive
nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd
nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state
nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout
nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure
nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2
nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend
nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd
nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2
nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout
nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect
nbxmpp.transports_nb.NonBlockingTCP nbxmpp.transports_nb.NonBlockingTCP-class.html
nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started
nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout
nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect
nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2
nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect
nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout
nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2
nbxmpp.transports_nb.NonBlockingTCP.__init__ nbxmpp.transports_nb.NonBlockingTCP-class.html#__init__
nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive
nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect
nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend
nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send
nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init
nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy
nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.transports_nb.NonBlockingTCP._on_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_receive
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle
nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive
nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd
nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state
nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout
nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure
nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2
nbxmpp.transports_nb.NonBlockingTCP._do_send nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_send
nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd
nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2
nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout
nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect
nbxmpp.transports_nb.NonBlockingTransport nbxmpp.transports_nb.NonBlockingTransport-class.html
nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started
nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout
nbxmpp.transports_nb.NonBlockingTransport._on_connect nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect
nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2
nbxmpp.transports_nb.NonBlockingTransport.connect nbxmpp.transports_nb.NonBlockingTransport-class.html#connect
nbxmpp.transports_nb.NonBlockingTransport.read_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout
nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2
nbxmpp.transports_nb.NonBlockingTransport.__init__ nbxmpp.transports_nb.NonBlockingTransport-class.html#__init__
nbxmpp.transports_nb.NonBlockingTransport.disconnect nbxmpp.transports_nb.NonBlockingTransport-class.html#disconnect
nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn
nbxmpp.transports_nb.NonBlockingTransport.send nbxmpp.transports_nb.NonBlockingTransport-class.html#send
nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance
nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut
nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive
nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state
nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure
nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin
nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2
nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd
nbxmpp.transports_nb.NonBlockingTransport.remove_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#remove_timeout
nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2
nbxmpp.transports_nb.NonBlockingTransport.set_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout
nbxmpp.transports_nb.NonBlockingTransport.start_disconnect nbxmpp.transports_nb.NonBlockingTransport-class.html#start_disconnect
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/class-tree.html 0000664 0000000 0000000 00000055626 13253241774 0030360 0 ustar 00root root 0000000 0000000
Class Hierarchy
nbxmpp.bosh.AckChecker:
Class for generating rids and generating and checking acknowledgements in
BOSH messages
nbxmpp.dispatcher_nb.Dispatcher:
Why is this here - I needed to redefine Dispatcher for BOSH and easiest way
was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble
is that reference used to access dispatcher instance is in Client attribute
named by __class__.__name__ of the dispatcher instance .. long story short:
nbxmpp.idlequeue.IdleCommand:
Can be subclassed to execute commands asynchronously by the idlequeue.
Result will be optained via file descriptor of created pipe
nbxmpp.transports_nb.NonBlockingHTTP:
Socket wrapper that creates HTTP message out of sent data and peels-off HTTP
headers from incoming messages
nbxmpp.transports_nb.NonBlockingHTTPBOSH:
Class for BOSH HTTP connections. Slightly redefines HTTP transport by
calling bosh bodytag generating callback before putting data on wire
nbxmpp.idlequeue.GlibIdleQueue:
Extends IdleQueue to use glib io_add_wath, instead of select/poll In another
'non gui' implementation of Gajim IdleQueue can be used safetly
nbxmpp.simplexml.NodeBuilder:
Builds a Node class minidom from data parsed to it. This class used for two
purposes:
nbxmpp.client_nb.NonBlockingClient:
Client class is XMPP connection mountpoint. Objects for authentication,
network communication, roster, xml parsing ... are plugged to client object.
Client implements the abstract behavior - mostly negotioation and callbacks
handling, whereas underlying modules take care of feature-specific logic
nbxmpp.auth_nb.NonBlockingBind:
Bind some JID to the current connection to allow router know of our
location. Must be plugged after successful SASL auth
nbxmpp.auth_nb.NonBlockingNonSASL:
Implements old Non-SASL (JEP-0078) authentication used in jabberd1.4 and
transport authentication
nbxmpp.roster_nb.NonBlockingRoster:
Defines a plenty of methods that will allow you to manage roster. Also
automatically track presences from remote JIDs taking into account that
every JID can have multiple resources connected. Does not currently support
'error' presences. You can also use mapping interface for access to the
internal representation of contacts in roster
nbxmpp.transports_nb.NonBlockingHTTP:
Socket wrapper that creates HTTP message out of sent data and peels-off HTTP
headers from incoming messages
nbxmpp.transports_nb.NonBlockingHTTPBOSH:
Class for BOSH HTTP connections. Slightly redefines HTTP transport by
calling bosh bodytag generating callback before putting data on wire
nbxmpp.auth_nb.SASL:
Implements SASL authentication. Can be plugged into NonBlockingClient
to start authentication
nbxmpp.proxy_connectors.ProxyConnector:
Interface for proxy-connecting object - when tunnneling XMPP over proxies,
some connecting process usually has to be done before opening stream. Proxy
connectors are used right after TCP connection is estabilished
nbxmpp.smacks.Smacks:
This is Smacks is the Stream Management class. It takes care of requesting
and sending acks. Also, it keeps track of the unhandled outgoing stanzas.
nbxmpp.simplexml.T:
Auxiliary class used to quick access to node's child nodes
nbxmpp.simplexml.NT:
Auxiliary class used to quick create node's child nodes
object:
The most base type
exceptions.BaseException:
Common base class for all exceptions
exceptions.Exception:
Common base class for all non-exit exceptions.
nbxmpp.simplexml.Node:
Node class describes syntax of separate XML Node. It have a constructor that
permits node creation from set of "namespace name", attributes and payload
of text strings and other nodes. It does not natively support building node
from text string and uses NodeBuilder class for that purpose. After
creation node can be mangled in many ways so it can be completely changed.
Also node can be serialised into string in one of two modes: default (where
the textual representation of node describes it exactly) and "fancy" - with
whitespace added to make indentation and thus make result more readable by
human.
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/crarr.png 0000664 0000000 0000000 00000000524 13253241774 0027232 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR
e¢E ,tEXtCreation Time Tue 22 Aug 2006 00:43:10 -0500`X tIMEÖ)Ó}Ö pHYs  ÂnÐu> gAMA ±üa EPLTEÿÿÿÍð×ÏÀ€f4sW áÛЊrD`@ bCÜÕÈéäÜ–X{`,¯Ÿ€lN‡o@õóðª™xdEðí螊dÐÆ´”~TÖwÅv tRNS @æØf MIDATxÚc`@¼ì¼0&+š—Šˆ°»(’ˆ€ ;;/ðEXùØ‘?Ðn ƒª†— b;'ª+˜˜YÐ#œ (r<£" IEND®B`‚ python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/epydoc.css 0000664 0000000 0000000 00000037227 13253241774 0027422 0 ustar 00root root 0000000 0000000
/* Epydoc CSS Stylesheet
*
* This stylesheet can be used to customize the appearance of epydoc's
* HTML output.
*
*/
/* Default Colors & Styles
* - Set the default foreground & background color with 'body'; and
* link colors with 'a:link' and 'a:visited'.
* - Use bold for decision list terms.
* - The heading styles defined here are used for headings *within*
* docstring descriptions. All headings used by epydoc itself use
* either class='epydoc' or class='toc' (CSS styles for both
* defined below).
*/
body { background: #ffffff; color: #000000; }
p { margin-top: 0.5em; margin-bottom: 0.5em; }
a:link { color: #0000ff; }
a:visited { color: #204080; }
dt { font-weight: bold; }
h1 { font-size: +140%; font-style: italic;
font-weight: bold; }
h2 { font-size: +125%; font-style: italic;
font-weight: bold; }
h3 { font-size: +110%; font-style: italic;
font-weight: normal; }
code { font-size: 100%; }
/* N.B.: class, not pseudoclass */
a.link { font-family: monospace; }
/* Page Header & Footer
* - The standard page header consists of a navigation bar (with
* pointers to standard pages such as 'home' and 'trees'); a
* breadcrumbs list, which can be used to navigate to containing
* classes or modules; options links, to show/hide private
* variables and to show/hide frames; and a page title (using
*
). The page title may be followed by a link to the
* corresponding source code (using 'span.codelink').
* - The footer consists of a navigation bar, a timestamp, and a
* pointer to epydoc's homepage.
*/
h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; }
h2.epydoc { font-size: +130%; font-weight: bold; }
h3.epydoc { font-size: +115%; font-weight: bold;
margin-top: 0.2em; }
td h3.epydoc { font-size: +115%; font-weight: bold;
margin-bottom: 0; }
table.navbar { background: #a0c0ff; color: #000000;
border: 2px groove #c0d0d0; }
table.navbar table { color: #000000; }
th.navbar-select { background: #70b0ff;
color: #000000; }
table.navbar a { text-decoration: none; }
table.navbar a:link { color: #0000ff; }
table.navbar a:visited { color: #204080; }
span.breadcrumbs { font-size: 85%; font-weight: bold; }
span.options { font-size: 70%; }
span.codelink { font-size: 85%; }
td.footer { font-size: 85%; }
/* Table Headers
* - Each summary table and details section begins with a 'header'
* row. This row contains a section title (marked by
* 'span.table-header') as well as a show/hide private link
* (marked by 'span.options', defined above).
* - Summary tables that contain user-defined groups mark those
* groups using 'group header' rows.
*/
td.table-header { background: #70b0ff; color: #000000;
border: 1px solid #608090; }
td.table-header table { color: #000000; }
td.table-header table a:link { color: #0000ff; }
td.table-header table a:visited { color: #204080; }
span.table-header { font-size: 120%; font-weight: bold; }
th.group-header { background: #c0e0f8; color: #000000;
text-align: left; font-style: italic;
font-size: 115%;
border: 1px solid #608090; }
/* Summary Tables (functions, variables, etc)
* - Each object is described by a single row of the table with
* two cells. The left cell gives the object's type, and is
* marked with 'code.summary-type'. The right cell gives the
* object's name and a summary description.
* - CSS styles for the table's header and group headers are
* defined above, under 'Table Headers'
*/
table.summary { border-collapse: collapse;
background: #e8f0f8; color: #000000;
border: 1px solid #608090;
margin-bottom: 0.5em; }
td.summary { border: 1px solid #608090; }
code.summary-type { font-size: 85%; }
table.summary a:link { color: #0000ff; }
table.summary a:visited { color: #204080; }
/* Details Tables (functions, variables, etc)
* - Each object is described in its own div.
* - A single-row summary table w/ table-header is used as
* a header for each details section (CSS style for table-header
* is defined above, under 'Table Headers').
*/
table.details { border-collapse: collapse;
background: #e8f0f8; color: #000000;
border: 1px solid #608090;
margin: .2em 0 0 0; }
table.details table { color: #000000; }
table.details a:link { color: #0000ff; }
table.details a:visited { color: #204080; }
/* Fields */
dl.fields { margin-left: 2em; margin-top: 1em;
margin-bottom: 1em; }
dl.fields dd ul { margin-left: 0em; padding-left: 0em; }
dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; }
div.fields { margin-left: 2em; }
div.fields p { margin-bottom: 0.5em; }
/* Index tables (identifier index, term index, etc)
* - link-index is used for indices containing lists of links
* (namely, the identifier index & term index).
* - index-where is used in link indices for the text indicating
* the container/source for each link.
* - metadata-index is used for indices containing metadata
* extracted from fields (namely, the bug index & todo index).
*/
table.link-index { border-collapse: collapse;
background: #e8f0f8; color: #000000;
border: 1px solid #608090; }
td.link-index { border-width: 0px; }
table.link-index a:link { color: #0000ff; }
table.link-index a:visited { color: #204080; }
span.index-where { font-size: 70%; }
table.metadata-index { border-collapse: collapse;
background: #e8f0f8; color: #000000;
border: 1px solid #608090;
margin: .2em 0 0 0; }
td.metadata-index { border-width: 1px; border-style: solid; }
table.metadata-index a:link { color: #0000ff; }
table.metadata-index a:visited { color: #204080; }
/* Function signatures
* - sig* is used for the signature in the details section.
* - .summary-sig* is used for the signature in the summary
* table, and when listing property accessor functions.
* */
.sig-name { color: #006080; }
.sig-arg { color: #008060; }
.sig-default { color: #602000; }
.summary-sig { font-family: monospace; }
.summary-sig-name { color: #006080; font-weight: bold; }
table.summary a.summary-sig-name:link
{ color: #006080; font-weight: bold; }
table.summary a.summary-sig-name:visited
{ color: #006080; font-weight: bold; }
.summary-sig-arg { color: #006040; }
.summary-sig-default { color: #501800; }
/* Subclass list
*/
ul.subclass-list { display: inline; }
ul.subclass-list li { display: inline; }
/* To render variables, classes etc. like functions */
table.summary .summary-name { color: #006080; font-weight: bold;
font-family: monospace; }
table.summary
a.summary-name:link { color: #006080; font-weight: bold;
font-family: monospace; }
table.summary
a.summary-name:visited { color: #006080; font-weight: bold;
font-family: monospace; }
/* Variable values
* - In the 'variable details' sections, each varaible's value is
* listed in a 'pre.variable' box. The width of this box is
* restricted to 80 chars; if the value's repr is longer than
* this it will be wrapped, using a backslash marked with
* class 'variable-linewrap'. If the value's repr is longer
* than 3 lines, the rest will be ellided; and an ellipsis
* marker ('...' marked with 'variable-ellipsis') will be used.
* - If the value is a string, its quote marks will be marked
* with 'variable-quote'.
* - If the variable is a regexp, it is syntax-highlighted using
* the re* CSS classes.
*/
pre.variable { padding: .5em; margin: 0;
background: #dce4ec; color: #000000;
border: 1px solid #708890; }
.variable-linewrap { color: #604000; font-weight: bold; }
.variable-ellipsis { color: #604000; font-weight: bold; }
.variable-quote { color: #604000; font-weight: bold; }
.variable-group { color: #008000; font-weight: bold; }
.variable-op { color: #604000; font-weight: bold; }
.variable-string { color: #006030; }
.variable-unknown { color: #a00000; font-weight: bold; }
.re { color: #000000; }
.re-char { color: #006030; }
.re-op { color: #600000; }
.re-group { color: #003060; }
.re-ref { color: #404040; }
/* Base tree
* - Used by class pages to display the base class hierarchy.
*/
pre.base-tree { font-size: 80%; margin: 0; }
/* Frames-based table of contents headers
* - Consists of two frames: one for selecting modules; and
* the other listing the contents of the selected module.
* - h1.toc is used for each frame's heading
* - h2.toc is used for subheadings within each frame.
*/
h1.toc { text-align: center; font-size: 105%;
margin: 0; font-weight: bold;
padding: 0; }
h2.toc { font-size: 100%; font-weight: bold;
margin: 0.5em 0 0 -0.3em; }
/* Syntax Highlighting for Source Code
* - doctest examples are displayed in a 'pre.py-doctest' block.
* If the example is in a details table entry, then it will use
* the colors specified by the 'table pre.py-doctest' line.
* - Source code listings are displayed in a 'pre.py-src' block.
* Each line is marked with 'span.py-line' (used to draw a line
* down the left margin, separating the code from the line
* numbers). Line numbers are displayed with 'span.py-lineno'.
* The expand/collapse block toggle button is displayed with
* 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
* modify the font size of the text.)
* - If a source code page is opened with an anchor, then the
* corresponding code block will be highlighted. The code
* block's header is highlighted with 'py-highlight-hdr'; and
* the code block's body is highlighted with 'py-highlight'.
* - The remaining py-* classes are used to perform syntax
* highlighting (py-string for string literals, py-name for names,
* etc.)
*/
pre.py-doctest { padding: .5em; margin: 1em;
background: #e8f0f8; color: #000000;
border: 1px solid #708890; }
table pre.py-doctest { background: #dce4ec;
color: #000000; }
pre.py-src { border: 2px solid #000000;
background: #f0f0f0; color: #000000; }
.py-line { border-left: 2px solid #000000;
margin-left: .2em; padding-left: .4em; }
.py-lineno { font-style: italic; font-size: 90%;
padding-left: .5em; }
a.py-toggle { text-decoration: none; }
div.py-highlight-hdr { border-top: 2px solid #000000;
border-bottom: 2px solid #000000;
background: #d8e8e8; }
div.py-highlight { border-bottom: 2px solid #000000;
background: #d0e0e0; }
.py-prompt { color: #005050; font-weight: bold;}
.py-more { color: #005050; font-weight: bold;}
.py-string { color: #006030; }
.py-comment { color: #003060; }
.py-keyword { color: #600000; }
.py-output { color: #404040; }
.py-name { color: #000050; }
.py-name:link { color: #000050 !important; }
.py-name:visited { color: #000050 !important; }
.py-number { color: #005000; }
.py-defname { color: #000060; font-weight: bold; }
.py-def-name { color: #000060; font-weight: bold; }
.py-base-class { color: #000060; }
.py-param { color: #000060; }
.py-docstring { color: #006030; }
.py-decorator { color: #804020; }
/* Use this if you don't want links to names underlined: */
/*a.py-name { text-decoration: none; }*/
/* Graphs & Diagrams
* - These CSS styles are used for graphs & diagrams generated using
* Graphviz dot. 'img.graph-without-title' is used for bare
* diagrams (to remove the border created by making the image
* clickable).
*/
img.graph-without-title { border: none; }
img.graph-with-title { border: 1px solid #000000; }
span.graph-title { font-weight: bold; }
span.graph-caption { }
/* General-purpose classes
* - 'p.indent-wrapped-lines' defines a paragraph whose first line
* is not indented, but whose subsequent lines are.
* - The 'nomargin-top' class is used to remove the top margin (e.g.
* from lists). The 'nomargin' class is used to remove both the
* top and bottom margin (but not the left or right margin --
* for lists, that would cause the bullets to disappear.)
*/
p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em;
margin: 0; }
.nomargin-top { margin-top: 0; }
.nomargin { margin-top: 0; margin-bottom: 0; }
/* HTML Log */
div.log-block { padding: 0; margin: .5em 0 .5em 0;
background: #e8f0f8; color: #000000;
border: 1px solid #000000; }
div.log-error { padding: .1em .3em .1em .3em; margin: 4px;
background: #ffb0b0; color: #000000;
border: 1px solid #000000; }
div.log-warning { padding: .1em .3em .1em .3em; margin: 4px;
background: #ffffb0; color: #000000;
border: 1px solid #000000; }
div.log-info { padding: .1em .3em .1em .3em; margin: 4px;
background: #b0ffb0; color: #000000;
border: 1px solid #000000; }
h2.log-hdr { background: #70b0ff; color: #000000;
margin: 0; padding: 0em 0.5em 0em 0.5em;
border-bottom: 1px solid #000000; font-size: 110%; }
p.log { font-weight: bold; margin: .5em 0 .5em 0; }
tr.opt-changed { color: #000000; font-weight: bold; }
tr.opt-default { color: #606060; }
pre.log { margin: 0; padding: 0; padding-left: 1em; }
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/epydoc.js 0000664 0000000 0000000 00000024525 13253241774 0027243 0 ustar 00root root 0000000 0000000 function toggle_private() {
// Search for any private/public links on this page. Store
// their old text in "cmd," so we will know what action to
// take; and change their text to the opposite action.
var cmd = "?";
var elts = document.getElementsByTagName("a");
for(var i=0; i";
s += " ";
for (var i=0; i... ";
elt.innerHTML = s;
}
}
function toggle(id) {
elt = document.getElementById(id+"-toggle");
if (elt.innerHTML == "-")
collapse(id);
else
expand(id);
return false;
}
function highlight(id) {
var elt = document.getElementById(id+"-def");
if (elt) elt.className = "py-highlight-hdr";
var elt = document.getElementById(id+"-expanded");
if (elt) elt.className = "py-highlight";
var elt = document.getElementById(id+"-collapsed");
if (elt) elt.className = "py-highlight";
}
function num_lines(s) {
var n = 1;
var pos = s.indexOf("\n");
while ( pos > 0) {
n += 1;
pos = s.indexOf("\n", pos+1);
}
return n;
}
// Collapse all blocks that mave more than `min_lines` lines.
function collapse_all(min_lines) {
var elts = document.getElementsByTagName("div");
for (var i=0; i 0)
if (elt.id.substring(split, elt.id.length) == "-expanded")
if (num_lines(elt.innerHTML) > min_lines)
collapse(elt.id.substring(0, split));
}
}
function expandto(href) {
var start = href.indexOf("#")+1;
if (start != 0 && start != href.length) {
if (href.substring(start, href.length) != "-") {
collapse_all(4);
pos = href.indexOf(".", start);
while (pos != -1) {
var id = href.substring(start, pos);
expand(id);
pos = href.indexOf(".", pos+1);
}
var id = href.substring(start, href.length);
expand(id);
highlight(id);
}
}
}
function kill_doclink(id) {
var parent = document.getElementById(id);
parent.removeChild(parent.childNodes.item(0));
}
function auto_kill_doclink(ev) {
if (!ev) var ev = window.event;
if (!this.contains(ev.toElement)) {
var parent = document.getElementById(this.parentID);
parent.removeChild(parent.childNodes.item(0));
}
}
function doclink(id, name, targets_id) {
var elt = document.getElementById(id);
// If we already opened the box, then destroy it.
// (This case should never occur, but leave it in just in case.)
if (elt.childNodes.length > 1) {
elt.removeChild(elt.childNodes.item(0));
}
else {
// The outer box: relative + inline positioning.
var box1 = document.createElement("div");
box1.style.position = "relative";
box1.style.display = "inline";
box1.style.top = 0;
box1.style.left = 0;
// A shadow for fun
var shadow = document.createElement("div");
shadow.style.position = "absolute";
shadow.style.left = "-1.3em";
shadow.style.top = "-1.3em";
shadow.style.background = "#404040";
// The inner box: absolute positioning.
var box2 = document.createElement("div");
box2.style.position = "relative";
box2.style.border = "1px solid #a0a0a0";
box2.style.left = "-.2em";
box2.style.top = "-.2em";
box2.style.background = "white";
box2.style.padding = ".3em .4em .3em .4em";
box2.style.fontStyle = "normal";
box2.onmouseout=auto_kill_doclink;
box2.parentID = id;
// Get the targets
var targets_elt = document.getElementById(targets_id);
var targets = targets_elt.getAttribute("targets");
var links = "";
target_list = targets.split(",");
for (var i=0; i" +
target[0] + "";
}
// Put it all together.
elt.insertBefore(box1, elt.childNodes.item(0));
//box1.appendChild(box2);
box1.appendChild(shadow);
shadow.appendChild(box2);
box2.innerHTML =
"Which "+name+" do you want to see documentation for?" +
"
";
}
return false;
}
function get_anchor() {
var href = location.href;
var start = href.indexOf("#")+1;
if ((start != 0) && (start != href.length))
return href.substring(start, href.length);
}
function redirect_url(dottedName) {
// Scan through each element of the "pages" list, and check
// if "name" matches with any of them.
for (var i=0; i-m" or "-c";
// extract the portion & compare it to dottedName.
var pagename = pages[i].substring(0, pages[i].length-2);
if (pagename == dottedName.substring(0,pagename.length)) {
// We've found a page that matches `dottedName`;
// construct its URL, using leftover `dottedName`
// content to form an anchor.
var pagetype = pages[i].charAt(pages[i].length-1);
var url = pagename + ((pagetype=="m")?"-module.html":
"-class.html");
if (dottedName.length > pagename.length)
url += "#" + dottedName.substring(pagename.length+1,
dottedName.length);
return url;
}
}
}
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/frames.html 0000664 0000000 0000000 00000001110 13253241774 0027546 0 ustar 00root root 0000000 0000000
python-nbxmpp
python-nbxmpp-nbxmpp-0.6.4-ad40cafa84a639a1b63e7b5e6224e82c18143258/doc/apidocs/help.html 0000664 0000000 0000000 00000026006 13253241774 0027234 0 ustar 00root root 0000000 0000000
Help
This document contains the API (Application Programming Interface)
documentation for python-nbxmpp. Documentation for the Python
objects defined by the project is divided into separate pages for each
package, module, and class. The API documentation also includes two
pages containing information about the project as a whole: a trees
page, and an index page.
Object Documentation
Each Package Documentation page contains:
A description of the package.
A list of the modules and sub-packages contained by the
package.
A summary of the classes defined by the package.
A summary of the functions defined by the package.
A summary of the variables defined by the package.
A detailed description of each function defined by the
package.
A detailed description of each variable defined by the
package.
Each Module Documentation page contains:
A description of the module.
A summary of the classes defined by the module.
A summary of the functions defined by the module.
A summary of the variables defined by the module.
A detailed description of each function defined by the
module.
A detailed description of each variable defined by the
module.
Each Class Documentation page contains:
A class inheritance diagram.
A list of known subclasses.
A description of the class.
A summary of the methods defined by the class.
A summary of the instance variables defined by the class.
A summary of the class (static) variables defined by the
class.
A detailed description of each method defined by the
class.
A detailed description of each instance variable defined by the
class.
A detailed description of each class (static) variable defined
by the class.
Project Documentation
The Trees page contains the module and class hierarchies:
The module hierarchy lists every package and module, with
modules grouped into packages. At the top level, and within each
package, modules and sub-packages are listed alphabetically.
The class hierarchy lists every class, grouped by base
class. If a class has more than one base class, then it will be
listed under each base class. At the top level, and under each base
class, classes are listed alphabetically.
The Index page contains indices of terms and
identifiers:
The term index lists every term indexed by any object's
documentation. For each term, the index provides links to each
place where the term is indexed.
The identifier index lists the (short) name of every package,
module, class, method, function, variable, and parameter. For each
identifier, the index provides a short description, and a link to
its documentation.
The Table of Contents
The table of contents occupies the two frames on the left side of
the window. The upper-left frame displays the project
contents, and the lower-left frame displays the module
contents:
Project Contents...
API Documentation Frame
Module Contents ...
The project contents frame contains a list of all packages
and modules that are defined by the project. Clicking on an entry
will display its contents in the module contents frame. Clicking on a
special entry, labeled "Everything," will display the contents of
the entire project.
The module contents frame contains a list of every
submodule, class, type, exception, function, and variable defined by a
module or package. Clicking on an entry will display its
documentation in the API documentation frame. Clicking on the name of
the module, at the top of the frame, will display the documentation
for the module itself.
The "frames" and "no frames" buttons below the top
navigation bar can be used to control whether the table of contents is
displayed or not.
The Navigation Bar
A navigation bar is located at the top and bottom of every page.
It indicates what type of page you are currently viewing, and allows
you to go to related pages. The following table describes the labels
on the navigation bar. Note that not some labels (such as
[Parent]) are not displayed on all pages.
Label
Highlighted when...
Links to...
[Parent]
(never highlighted)
the parent of the current package
[Package]
viewing a package
the package containing the current object
[Module]
viewing a module
the module containing the current object
[Class]
viewing a class
the class containing the current object
[Trees]
viewing the trees page
the trees page
[Index]
viewing the index page
the index page
[Help]
viewing the help page
the help page
The "show private" and "hide private" buttons below
the top navigation bar can be used to control whether documentation
for private objects is displayed. Private objects are usually defined
as objects whose (short) names begin with a single underscore, but do
not end with an underscore. For example, "_x",
"__pprint", and "epydoc.epytext._tokenize"
are private objects; but "re.sub",
"__init__", and "type_" are not. However,
if a module defines the "__all__" variable, then its
contents are used to decide which objects are private.
A timestamp below the bottom navigation bar indicates when each
page was last updated.
nbxmpp: This is a fork of the xmpppy jabber python library. Most of the code is
inherited but has been extended by implementation of non-blocking transports
and new features like BOSH.
nbxmpp.auth_nb: Provides plugs for SASL and NON-SASL authentication mechanisms.
Can be used both for client and transport authentication
nbxmpp.c14n: XML canonicalisation methods (for XEP-0116)
nbxmpp.client_nb: Client class establishs connection to XMPP Server and handles authentication
nbxmpp.dispatcher_nb: Main xmpp decision making logic. Provides library with methods to assign
different handlers to different XMPP stanzas and namespaces
nbxmpp.features_nb: Different stuff that wasn't worth separating it into modules
(Registration, Privacy Lists, ...)
nbxmpp.idlequeue: Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle
objects and be informed about possible IO
nbxmpp.plugin: Provides PlugIn class functionality to develop extentions for xmpppy
nbxmpp.protocol: Protocol module contains tools that are needed for processing of xmpp-related
data structures, including jabber-objects like JID or different stanzas and
sub- stanzas) handling routines
nbxmpp.proxy_connectors: Module containing classes for proxy connecting. So far its HTTP CONNECT and
SOCKS5 proxy
nbxmpp.roster_nb: Simple roster implementation. Can be used though for different tasks like
mass-renaming of contacts.
nbxmpp.simplexml: Simplexml module provides xmpppy library with all needed tools to handle XML
nodes and XML streams. I'm personally using it in many other separate
projects. It is designed to be as standalone as possible
nbxmpp.transports_nb: Transports are objects responsible for connecting to XMPP server and putting
data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy,
for SOCKS5 proxy...)
This is a fork of the xmpppy jabber python library. Most of the code is
inherited but has been extended by implementation of non-blocking transports
and new features like BOSH.
Most of the xmpp classes are ancestors of PlugIn class to share a single set of methods in order to compile a featured and extensible XMPP client.
nbxmpp.c14n: XML canonicalisation methods (for XEP-0116)
nbxmpp.client_nb: Client class establishs connection to XMPP Server and handles authentication
nbxmpp.dispatcher_nb: Main xmpp decision making logic. Provides library with methods to assign
different handlers to different XMPP stanzas and namespaces
nbxmpp.features_nb: Different stuff that wasn't worth separating it into modules
(Registration, Privacy Lists, ...)
nbxmpp.idlequeue: Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle
objects and be informed about possible IO
nbxmpp.plugin: Provides PlugIn class functionality to develop extentions for xmpppy
nbxmpp.protocol: Protocol module contains tools that are needed for processing of xmpp-related
data structures, including jabber-objects like JID or different stanzas and
sub- stanzas) handling routines
nbxmpp.proxy_connectors: Module containing classes for proxy connecting. So far its HTTP CONNECT and
SOCKS5 proxy
nbxmpp.roster_nb: Simple roster implementation. Can be used though for different tasks like
mass-renaming of contacts.
nbxmpp.simplexml: Simplexml module provides xmpppy library with all needed tools to handle XML
nodes and XML streams. I'm personally using it in many other separate
projects. It is designed to be as standalone as possible
nbxmpp.transports_nb: Transports are objects responsible for connecting to XMPP server and putting
data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy,
for SOCKS5 proxy...)
1# $Id: __init__.py,v 1.9 2005/03/07 09:34:51 snakeru Exp $ 2 3""" 4This is a fork of the xmpppy jabber python library. Most of the code is 5inherited but has been extended by implementation of non-blocking transports 6and new features like BOSH. 7 8Most of the xmpp classes are ancestors of PlugIn class to share a single set of methods in order to compile a featured and extensible XMPP client. 910Thanks and credits to the xmpppy developers. See: http://xmpppy.sourceforge.net/11"""1213fromprotocolimport*14importsimplexml,protocol,auth_nb,transports_nb,roster_nb15importdispatcher_nb,features_nb,idlequeue,bosh,tls_nb,proxy_connectors16fromclient_nbimportNonBlockingClient17frompluginimportPlugIn18fromsmacksimportSmacks19
1## auth_nb.py 2## based on auth.py, changes backported up to revision 1.41 3## 4## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 5## modified by Dimitur Kirov <dkirov@gmail.com> 6## 7## This program is free software; you can redistribute it and/or modify 8## it under the terms of the GNU General Public License as published by 9## the Free Software Foundation; either version 2, or (at your option) 10## any later version. 11## 12## This program is distributed in the hope that it will be useful, 13## but WITHOUT ANY WARRANTY; without even the implied warranty of 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15## GNU General Public License for more details. 16 17""" 18Provides plugs for SASL and NON-SASL authentication mechanisms. 19Can be used both for client and transport authentication 20 21See client_nb.py 22""" 23 24fromprotocolimportNS_SASL,NS_SESSION,NS_STREAMS,NS_BIND,NS_AUTH 25fromprotocolimportNS_STREAM_MGMT 26fromprotocolimportNode,NodeProcessed,isResultNode,Iq,Protocol,JID 27frompluginimportPlugIn 28fromsmacksimportSmacks 29importbase64 30importrandom 31importitertools 32importdispatcher_nb 33importhashlib 34importhmac 35importhashlib 36 37importlogging 38log=logging.getLogger('nbxmpp.auth_nb')
131"""132 :param username: XMPP username133 :param password: XMPP password134 :param on_sasl: Callback, will be called after each SASL auth-step.135 """136PlugIn.__init__(self)137self.username=username138self.password=password139self.on_sasl=on_sasl140self.realm=None
172"""173 Start authentication. Result can be obtained via "SASL.startsasl"174 attribute and will be either SASL_SUCCESS or SASL_FAILURE175176 Note that successfull auth will take at least two Dispatcher.Process()177 calls.178 """179ifself.startsasl:180pass181elifself._owner.Dispatcher.Stream.features:182try:183self.FeaturesHandler(self._owner.Dispatcher,184self._owner.Dispatcher.Stream.features)185exceptNodeProcessed:186pass187else:188self._owner.RegisterHandler('features',189self.FeaturesHandler,xmlns=NS_STREAMS)
211if'ANONYMOUS'inself.mecsandself.usernameisNone:212self.mecs.remove('ANONYMOUS')213node=Node('auth',attrs={'xmlns':NS_SASL,214'mechanism':'ANONYMOUS'})215self.mechanism='ANONYMOUS'216self.startsasl=SASL_IN_PROCESS217self._owner.send(str(node))218raiseNodeProcessed219if"EXTERNAL"inself.mecs:220self.mecs.remove('EXTERNAL')221sasl_data=u'%s@%s'%(self.username,self._owner.Server)222sasl_data=sasl_data.encode('utf-8').encode('base64').replace(223'\n','')224node=Node('auth',attrs={'xmlns':NS_SASL,225'mechanism':'EXTERNAL'},payload=[sasl_data])226self.mechanism='EXTERNAL'227self.startsasl=SASL_IN_PROCESS228self._owner.send(str(node))229raiseNodeProcessed230if'GSSAPI'inself.mecsandhave_kerberos:231self.mecs.remove('GSSAPI')232try:233self.gss_vc=kerberos.authGSSClientInit('xmpp@'+ \ 234self._owner.xmpp_hostname)[1]235kerberos.authGSSClientStep(self.gss_vc,'')236response=kerberos.authGSSClientResponse(self.gss_vc)237node=Node('auth',attrs={'xmlns':NS_SASL,238'mechanism':'GSSAPI'},payload=(responseor''))239self.mechanism='GSSAPI'240self.gss_step=GSS_STATE_STEP241self.startsasl=SASL_IN_PROCESS242self._owner.send(str(node))243raiseNodeProcessed244exceptkerberos.GSSError,e:245log.info('GSSAPI authentication failed: %s'%str(e))246if'SCRAM-SHA-1'inself.mecs:247self.mecs.remove('SCRAM-SHA-1')248self.mechanism='SCRAM-SHA-1'249self._owner._caller.get_password(self.set_password,self.mechanism)250self.scram_step=0251self.startsasl=SASL_IN_PROCESS252raiseNodeProcessed253if'DIGEST-MD5'inself.mecs:254self.mecs.remove('DIGEST-MD5')255node=Node('auth',attrs={'xmlns':NS_SASL,256'mechanism':'DIGEST-MD5'})257self.mechanism='DIGEST-MD5'258self.startsasl=SASL_IN_PROCESS259self._owner.send(str(node))260raiseNodeProcessed261if'PLAIN'inself.mecs:262self.mecs.remove('PLAIN')263self.mechanism='PLAIN'264self._owner._caller.get_password(self.set_password,self.mechanism)265self.startsasl=SASL_IN_PROCESS266raiseNodeProcessed267if'X-MESSENGER-OAUTH2'inself.mecs:268self.mecs.remove('X-MESSENGER-OAUTH2')269self.mechanism='X-MESSENGER-OAUTH2'270self._owner._caller.get_password(self.set_password,self.mechanism)271self.startsasl=SASL_IN_PROCESS272raiseNodeProcessed273self.startsasl=SASL_FAILURE274log.info('I can only use EXTERNAL, SCRAM-SHA-1, DIGEST-MD5, GSSAPI and '275'PLAIN mecanisms.')276ifself.on_sasl:277self.on_sasl()278return
281"""282 Perform next SASL auth step. Used internally283 """284ifchallenge.getNamespace()!=NS_SASL:285return286287defscram_base64(s):288return''.join(s.encode('base64').split('\n'))
289290incoming_data=challenge.getData()291data=base64.decodestring(incoming_data)292### Handle Auth result293defon_auth_fail(reason):294log.info('Failed SASL authentification: %s'%reason)295self._owner.send(str(Node('abort',attrs={'xmlns':NS_SASL})))296iflen(self.mecs)>0:297# There are other mechanisms to test, but wait for <failure>298# answer from server299self.startsasl=SASL_FAILURE_IN_PROGRESS300raiseNodeProcessed301ifself.on_sasl:302self.on_sasl()303raiseNodeProcessed
304305ifchallenge.getName()=='failure':306ifself.startsasl==SASL_FAILURE_IN_PROGRESS:307self.MechanismHandler()308raiseNodeProcessed309self.startsasl=SASL_FAILURE310try:311reason=challenge.getChildren()[0]312exceptException:313reason=challenge314on_auth_fail(reason)315elifchallenge.getName()=='success':316ifself.mechanism=='SCRAM-SHA-1':317# check data-with-success318data=scram_parse(data)319ifdata['v']!=scram_base64(self.scram_ServerSignature):320on_auth_fail('ServerSignature is wrong')321322self.startsasl=SASL_SUCCESS323log.info('Successfully authenticated with remote server.')324handlers=self._owner.Dispatcher.dumpHandlers()325326# Bosh specific dispatcher replugging327# save old features. They will be used in case we won't get response328# on stream restart after SASL auth (happens with XMPP over BOSH329# with Openfire)330old_features=self._owner.Dispatcher.Stream.features331self._owner.Dispatcher.PlugOut()332dispatcher_nb.Dispatcher.get_instance().PlugIn(self._owner,333after_SASL=True,old_features=old_features)334self._owner.Dispatcher.restoreHandlers(handlers)335self._owner.User=self.username336337ifself.on_sasl:338self.on_sasl()339raiseNodeProcessed340341### Perform auth step342log.info('Got challenge:'+data)343344ifself.mechanism=='GSSAPI':345ifself.gss_step==GSS_STATE_STEP:346rc=kerberos.authGSSClientStep(self.gss_vc,incoming_data)347ifrc!=kerberos.AUTH_GSS_CONTINUE:348self.gss_step=GSS_STATE_WRAP349elifself.gss_step==GSS_STATE_WRAP:350rc=kerberos.authGSSClientUnwrap(self.gss_vc,incoming_data)351response=kerberos.authGSSClientResponse(self.gss_vc)352rc=kerberos.authGSSClientWrap(self.gss_vc,response,353kerberos.authGSSClientUserName(self.gss_vc))354response=kerberos.authGSSClientResponse(self.gss_vc)355ifnotresponse:356response=''357self._owner.send(Node('response',attrs={'xmlns':NS_SASL},358payload=response).__str__())359raiseNodeProcessed360ifself.mechanism=='SCRAM-SHA-1':361hashfn=hashlib.sha1362363defHMAC(k,s):364returnhmac.HMAC(key=k,msg=s,digestmod=hashfn).digest()365366defXOR(x,y):367r=(chr(ord(px)^ord(py))forpx,pyinzip(x,y))368return''.join(r)369370defHi(s,salt,iters):371ii=1372try:373s=s.encode('utf-8')374except:375pass376ui_1=HMAC(s,salt+'\0\0\0\01')377ui=ui_1378foriinrange(iters-1):379ii+=1380ui_1=HMAC(s,ui_1)381ui=XOR(ui,ui_1)382returnui383384defscram_H(s):385returnhashfn(s).digest()386387ifself.scram_step==0:388self.scram_step=1389self.scram_soup+=','+data+','390data=scram_parse(data)391# TODO: Should check cnonce here.392# TODO: Channel binding data goes in here too.393r='c='+scram_base64(self.scram_gs2)394r+=',r='+data['r']395self.scram_soup+=r396salt=data['s'].decode('base64')397iter=int(data['i'])398SaltedPassword=Hi(self.password,salt,iter)399# TODO: Could cache this, along with salt+iter.400ClientKey=HMAC(SaltedPassword,'Client Key')401StoredKey=scram_H(ClientKey)402ClientSignature=HMAC(StoredKey,self.scram_soup)403ClientProof=XOR(ClientKey,ClientSignature)404r+=',p='+scram_base64(ClientProof)405ServerKey=HMAC(SaltedPassword,'Server Key')406self.scram_ServerSignature=HMAC(ServerKey,self.scram_soup)407sasl_data=scram_base64(r)408node=Node('response',attrs={'xmlns':NS_SASL},409payload=[sasl_data])410self._owner.send(str(node))411raiseNodeProcessed412413ifself.scram_step==1:414data=scram_parse(data)415ifdata['v'].decode('base64')!=self.scram_ServerSignature:416# TODO: Not clear what to do here - need to abort.417raiseException418node=Node('response',attrs={'xmlns':NS_SASL});419self._owner.send(str(node))420raiseNodeProcessed421422# magic foo...423chal=challenge_splitter(data)424ifnotself.realmand'realm'inchal:425self.realm=chal['realm']426if'qop'inchaland((isinstance(chal['qop'],str)and \ 427chal['qop']=='auth')or(isinstance(chal['qop'],list)and'auth'in \ 428chal['qop'])):429self.resp={}430self.resp['username']=self.username431ifself.realm:432self.resp['realm']=self.realm433else:434self.resp['realm']=self._owner.Server435self.resp['nonce']=chal['nonce']436self.resp['cnonce']=''.join("%x"%randint(0,2**28)forrandint \ 437initertools.repeat(random.randint,7))438self.resp['nc']=('00000001')439self.resp['qop']='auth'440self.resp['digest-uri']='xmpp/'+self._owner.Server441self.resp['charset']='utf-8'442# Password is now required443self._owner._caller.get_password(self.set_password,self.mechanism)444elif'rspauth'inchal:445# Check rspauth value446ifchal['rspauth']!=self.digest_rspauth:447on_auth_fail('rspauth is wrong')448self._owner.send(str(Node('response',attrs={'xmlns':NS_SASL})))449else:450self.startsasl=SASL_FAILURE451log.info('Failed SASL authentification: unknown challenge')452ifself.on_sasl:453self.on_sasl()454raiseNodeProcessed455456@staticmethod
520"""521 Caches username, password and resource for auth522 """523PlugIn.__init__(self)524self.user=user525ifpasswordisNone:526self.password=''527else:528self.password=password529self.resource=resource530self.on_auth=on_auth
533"""534 Determine the best auth method (digest/0k/plain) and use it for auth.535 Returns used method name on success. Used internally536 """537log.info('Querying server about possible auth methods')538self.owner=owner539540owner.Dispatcher.SendAndWaitForResponse(541Iq('get',NS_AUTH,payload=[Node('username',payload=[self.user])]),542func=self._on_username)
633"""634 Determine if server supports resource binding and set some internal635 attributes accordingly.636637 It also checks if server supports stream management638 """639640iffeats.getTag('sm',namespace=NS_STREAM_MGMT):641self.supports_sm=True# server supports stream management642ifself.resuming:643self._owner._caller.sm.resume_request()644645ifnotfeats.getTag('bind',namespace=NS_BIND):646log.info('Server does not requested binding.')647# we try to bind resource anyway648#self.bound='failure'649self.bound=[]650return651iffeats.getTag('session',namespace=NS_SESSION):652self.session=1653else:654self.session=-1655self.bound=[]
665"""666 Perform binding. Use provided resource name or random (if not provided).667 """668ifself.resuming:# We don't bind if we resume the stream669return670self.on_bound=on_bound671self._resource=resource672ifself._resource:673self._resource=[Node('resource',payload=[self._resource])]674else:675self._resource=[]676677self._owner.onreceive(None)678self._owner.Dispatcher.SendAndWaitForResponse(679Protocol('iq',typ='set',payload=[Node('bind',680attrs={'xmlns':NS_BIND},payload=self._resource)]),681func=self._on_bound)
684ifisResultNode(resp):685ifresp.getTag('bind')andresp.getTag('bind').getTagData('jid'):686self.bound.append(resp.getTag('bind').getTagData('jid'))687log.info('Successfully bound %s.'%self.bound[-1])688jid=JID(resp.getTag('bind').getTagData('jid'))689self._owner.User=jid.getNode()690self._owner.Resource=jid.getResource()691# Only negociate stream management after bounded692sm=self._owner._caller.sm693ifself.supports_sm:694# starts negociation695sm.supports_sm=True696sm.set_owner(self._owner)697sm.negociate()698self._owner.Dispatcher.sm=sm699700ifhasattr(self,'session')andself.session==-1:701# Server don't want us to initialize a session702log.info('No session required.')703self.on_bound('ok')704else:705self._owner.SendAndWaitForResponse(Protocol('iq',typ='set',706payload=[Node('session',attrs={'xmlns':NS_SESSION})]),707func=self._on_session)708return709ifresp:710log.info('Binding failed: %s.'%resp.getTag('error'))711self.on_bound(None)712else:713log.info('Binding failed: timeout expired.')714self.on_bound(None)
717self._owner.onreceive(None)718ifisResultNode(resp):719log.info('Successfully opened session.')720self.session=1721self.on_bound('ok')722else:723log.error('Session open failed.')724self.session=0725self.on_bound(None)
{'bad-request': 'The format of an HTTP header or binding element received from the client is unacceptable (e.g., syntax error), or Script Syntax is not supported.','host-gone': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is no longer serviced by the connection manager.','host-unknown': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is unknown...
1## bosh.py 2## 3## 4## Copyright (C) 2008 Tomas Karasek <tom.to.the.k@gmail.com> 5## 6## This file is part of Gajim. 7## 8## Gajim is free software; you can redistribute it and/or modify 9## it under the terms of the GNU General Public License as published 10## by the Free Software Foundation; version 3 only. 11## 12## Gajim is distributed in the hope that it will be useful, 13## but WITHOUT ANY WARRANTY; without even the implied warranty of 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15## GNU General Public License for more details. 16## 17## You should have received a copy of the GNU General Public License 18## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 19 20 21importlocale,random 22fromhashlibimportsha1 23fromtransports_nbimportNonBlockingTransport,NonBlockingHTTPBOSH,\ 24CONNECTED,CONNECTING,DISCONNECTED,DISCONNECTING,\ 25urisplit,DISCONNECT_TIMEOUT_SECONDS 26fromprotocolimportBOSHBody,Protocol,NS_CLIENT 27fromsimplexmlimportNode 28 29importlogging 30log=logging.getLogger('nbxmpp.bosh') 31 32KEY_COUNT=10 33 34# Fake file descriptor - it's used for setting read_timeout in idlequeue for 35# BOSH Transport. In TCP-derived transports this is file descriptor of socket. 36FAKE_DESCRIPTOR=-1337 37 38
134"""135 Called when HTTP request it's possible to send a HTTP request. It can be when136 socket is connected or when HTTP response arrived137138 There should be always one pending request to BOSH CM.139 """140log.debug('on_http_req possible, state:\n%s'%self.get_current_state())141ifself.get_state()==DISCONNECTED:return142143#Hack for making the non-secure warning dialog work144ifself._owner.got_features:145if(hasattr(self._owner,'NonBlockingNonSASL')orhasattr(self._owner,'SASL')):146self.send_BOSH(None)147else:148# If we already got features and no auth module was plugged yet, we are149# probably waiting for confirmation of the "not-secure-connection" dialog.150# We don't send HTTP request in that case.151# see http://lists.jabber.ru/pipermail/ejabberd/2008-August/004027.html152return153else:154self.send_BOSH(None)
168"""169 Select and returns socket eligible for sending a data to170 """171ifself.http_pipelining:172returnself.get_socket_in(CONNECTED)173else:174last_recv_time,tmpsock=0,None175forsinself.http_socks:176# we're interested only in CONNECTED socket with no requests pending177ifs.get_state()==CONNECTEDands.pending_requests==0:178# if there's more of them, we want the one with the least recent data receive179# (lowest last_recv_time)180if(last_recv_time==0)or(s.last_recv_time<last_recv_time):181last_recv_time=s.last_recv_time182tmpsock=s183iftmpsock:184returntmpsock185else:186returnNone
190"""191 Tries to send a stanza in payload by appeding it to a buffer and plugging a192 free socket for writing.193 """194total_pending_reqs=sum([s.pending_requestsforsinself.http_socks])195196# when called after HTTP response (Payload=None) and when there are already197# some pending requests and no data to send, or when the socket is198# disconnected, we do nothing199ifpayloadisNoneand \ 200total_pending_reqs>0and \ 201self.stanza_buffer==[]and \ 202self.prio_bosh_stanzas==[]or \ 203self.get_state()==DISCONNECTED:204return205206# Add xmlns to stanza to help ejabberd server207ifpayloadandisinstance(payload,Protocol):208ifnotpayload.getNamespace():209payload.setNamespace(NS_CLIENT)210211# now the payload is put to buffer and will be sent at some point212self.append_stanza(payload)213214# if we're about to make more requests than allowed, we don't send - stanzas will be215# sent after HTTP response from CM, exception is when we're disconnecting - then we216# send anyway217iftotal_pending_reqs>=self.bosh_requestsandself.get_state()!=DISCONNECTING:218log.warn('attemp to make more requests than allowed by Connection Manager:\n%s'%219self.get_current_state())220return221222# when there's free CONNECTED socket, we plug it for write and the data will223# be sent when write is possible224ifself.get_free_socket():225self.plug_socket()226return227228# if there is a connecting socket, we just wait for when it connects,229# payload will be sent in a sec when the socket connects230ifself.get_socket_in(CONNECTING):return231232# being here means there are either DISCONNECTED sockets or all sockets are233# CONNECTED with too many pending requests234s=self.get_socket_in(DISCONNECTED)235236# if we have DISCONNECTED socket, lets connect it and plug for send237ifs:238self.connect_and_flush(s)239else:240# otherwise create and connect a new one241ss=self.get_new_http_socket()242self.http_socks.append(ss)243self.connect_and_flush(ss)244return
247stanza=None248s=self.get_free_socket()249ifs:250s._plug_idle(writable=True,readable=True)251else:252log.error('=====!!!!!!!!====> Couldn\'t get free socket in plug_socket())')
255"""256 Build a BOSH body tag from data in buffers and adds key, rid and ack257 attributes to it258259 This method is called from _do_send() of underlying transport. This is to260 ensure rid and keys will be processed in correct order. If I generate261 them before plugging a socket for write (and did it for two sockets/HTTP262 connections) in parallel, they might be sent in wrong order, which263 results in violating the BOSH session and server-side disconnect.264 """265ifself.prio_bosh_stanzas:266stanza,add_payload=self.prio_bosh_stanzas.pop(0)267ifadd_payload:268stanza.setPayload(self.stanza_buffer)269self.stanza_buffer=[]270else:271stanza=self.boshify_stanzas(self.stanza_buffer)272self.stanza_buffer=[]273274stanza=self.ack_checker.backup_stanza(stanza,socket)275276key,newkey=self.key_stack.get()277ifkey:278stanza.setAttr('key',key)279ifnewkey:280stanza.setAttr('newkey',newkey)281282283log.info('sending msg with rid=%s to sock %s'%(stanza.getAttr('rid'),id(socket)))284self.renew_bosh_wait_timeout(self.bosh_wait+3)285returnstanza
305"""306 Called from underlying transport when server closes TCP connection307308 :param socket: disconnected transport object309 """310ifsocket.http_persistent:311log.warn('Fallback to nonpersistent HTTP (no pipelining as well)')312socket.http_persistent=False313self.http_persistent=False314self.http_pipelining=False315socket.disconnect(do_callback=False)316self.connect_and_flush(socket)317else:318socket.disconnect()
323"""324 Called for each incoming body stanza from dispatcher. Checks body325 attributes.326 """327self.remove_bosh_wait_timeout()328329ifself.after_init:330ifstanza_attrs.has_key('sid'):331# session ID should be only in init response332self.bosh_sid=stanza_attrs['sid']333334ifstanza_attrs.has_key('requests'):335self.bosh_requests=int(stanza_attrs['requests'])336337ifstanza_attrs.has_key('wait'):338self.bosh_wait=int(stanza_attrs['wait'])339self.after_init=False340341ack=None342ifstanza_attrs.has_key('ack'):343ack=stanza_attrs['ack']344self.ack_checker.process_incoming_ack(ack=ack,345socket=self.current_recv_socket)346347ifstanza_attrs.has_key('type'):348ifstanza_attrs['type']in['terminate','terminal']:349condition='n/a'350ifstanza_attrs.has_key('condition'):351condition=stanza_attrs['condition']352ifcondition=='n/a':353log.info('Received sesion-ending terminating stanza')354else:355log.error('Received terminating stanza: %s - %s'%(condition,356bosh_errors[condition]))357self.disconnect()358return359360ifstanza_attrs['type']=='error':361# recoverable error362pass363return
367"""368 Append stanza to a buffer to send369 """370ifstanza:371ifisinstance(stanza,tuple):372# stanza is tuple of BOSH stanza and bool value for whether to add payload373self.prio_bosh_stanzas.append(stanza)374else:375# stanza is XMPP stanza. Will be boshified before send.376self.stanza_buffer.append(stanza)
402"""403 Wraps zero to many stanzas by body tag with xmlns and sid404 """405log.debug('boshify_staza - type is: %s, stanza is %s'%(type(stanzas),stanzas))406tag=BOSHBody(attrs={'sid':self.bosh_sid})407tag.setPayload(stanzas)408returntag
485# with 50-bit random initial rid, session would have to go up486# to 7881299347898368 messages to raise rid over 2**53487# (see http://www.xmpp.org/extensions/xep-0124.html#rids)488# it's also used for sequence key initialization489r=random.Random()490r.seed()491returnr.getrandbits(50)
570571# http://www.xmpp.org/extensions/xep-0124.html#errorstatus-terminal572bosh_errors={573'n/a':'none or unknown condition in terminating body stanza',574'bad-request':'The format of an HTTP header or binding element received from the client is unacceptable (e.g., syntax error), or Script Syntax is not supported.',575'host-gone':'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is no longer serviced by the connection manager.',576'host-unknown':'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is unknown to the connection manager.',577'improper-addressing':'The initialization element lacks a "to" or "route" attribute (or the attribute has no value) but the connection manager requires one.',578'internal-server-error':'The connection manager has experienced an internal error that prevents it from servicing the request.',579'item-not-found':'(1) "sid" is not valid, (2) "stream" is not valid, (3) "rid" is larger than the upper limit of the expected window, (4) connection manager is unable to resend response, (5) "key" sequence is invalid',580'other-request':'Another request being processed at the same time as this request caused the session to terminate.',581'policy-violation':'The client has broken the session rules (polling too frequently, requesting too frequently, too many simultaneous requests).',582'remote-connection-failed':'The connection manager was unable to connect to, or unable to connect securely to, or has lost its connection to, the server.',583'remote-stream-error':'Encapsulates an error in the protocol being transported.',584'see-other-uri':'The connection manager does not operate at this URI (e.g., the connection manager accepts only SSL or TLS connections at some https: URI rather than the http: URI requested by the client). The client may try POSTing to the URI in the content of the <uri/> child element.',585'system-shutdown':'The connection manager is being shut down. All active HTTP sessions are being terminated. No new sessions can be created.',586'undefined-condition':'The error is not one of those defined herein; the connection manager SHOULD include application-specific information in the content of the <body/> wrapper.'587}588
__init__(self,
raise_event,
on_disconnect,
idlequeue,
estabilish_tls,
certs,
xmpp_server,
domain,
bosh_dict,
proxy_creds)
Each trasport class can have different constructor but it has to have at
least all the arguments of NonBlockingTransport constructor
connect(self,
conn_5tuple,
on_connect,
on_connect_failure)
Creates and connects transport to server and port defined in conn_5tuple
which should be item from list returned from getaddrinfo
on_http_request_possible(self)
Called when HTTP request it's possible to send a HTTP request. It can be when
socket is connected or when HTTP response arrived
Build a BOSH body tag from data in buffers and adds key, rid and ack
attributes to it
This method is called from _do_send() of underlying transport. This is to
ensure rid and keys will be processed in correct order. If I generate
them before plugging a socket for write (and did it for two sockets/HTTP
connections) in parallel, they might be sent in wrong order, which
results in violating the BOSH session and server-side disconnect.
onreceive(None) sets callback to Dispatcher.ProcessNonBlocking which is
the default one that will decide what to do with received stanza based on
its tag name and namespace.
Do not confuse it with on_receive() method, which is the callback
itself.
1# -*- coding:utf-8 -*- 2## c14n.py 3## 4## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com> 5## 6## This file is part of Gajim. 7## 8## Gajim is free software; you can redistribute it and/or modify 9## it under the terms of the GNU General Public License as published10## by the Free Software Foundation; version 3 only.11##12## Gajim is distributed in the hope that it will be useful,13## but WITHOUT ANY WARRANTY; without even the implied warranty of14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15## GNU General Public License for more details.16##17## You should have received a copy of the GNU General Public License18## along with Gajim. If not, see <http://www.gnu.org/licenses/>.19##2021"""22XML canonicalisation methods (for XEP-0116)23"""2425fromsimplexmlimportustr26
28s="<"+node.name29ifnode.namespace:30ifnotnode.parentornode.parent.namespace!=node.namespace:31s=s+' xmlns="%s"'%node.namespace3233sorted_attrs=sorted(node.attrs.keys())34forkeyinsorted_attrs:35ifnotis_buggyandkey=='xmlns':36continue37val=ustr(node.attrs[key])38# like XMLescape() but with whitespace and without >39s=s+' %s="%s"'%(key,normalise_attr(val))40s=s+">"41cnt=042ifnode.kids:43forainnode.kids:44if(len(node.data)-1)>=cnt:45s=s+normalise_text(node.data[cnt])46s=s+c14n(a,is_buggy)47cnt=cnt+148if(len(node.data)-1)>=cnt:s=s+normalise_text(node.data[cnt])49ifnotnode.kidsands.endswith('>'):50s=s[:-1]+' />'51else:52s=s+"</"+node.name+">"53returns.encode('utf-8')
NonBlockingClient
Client class is XMPP connection mountpoint. Objects for authentication,
network communication, roster, xml parsing ... are plugged to client object.
Client implements the abstract behavior - mostly negotioation and callbacks
handling, whereas underlying modules take care of feature-specific logic
1## client_nb.py 2## based on client.py, changes backported up to revision 1.60 3## 4## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 5## modified by Dimitur Kirov <dkirov@gmail.com> 6## 7## This program is free software; you can redistribute it and/or modify 8## it under the terms of the GNU General Public License as published by 9## the Free Software Foundation; either version 2, or (at your option) 10## any later version. 11## 12## This program is distributed in the hope that it will be useful, 13## but WITHOUT ANY WARRANTY; without even the implied warranty of 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15## GNU General Public License for more details. 16 17# $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $ 18 19""" 20Client class establishs connection to XMPP Server and handles authentication 21""" 22 23importsocket 24importtransports_nb,dispatcher_nb,auth_nb,roster_nb,protocol,bosh 25fromprotocolimportNS_TLS 26 27importlogging 28log=logging.getLogger('nbxmpp.client_nb') 29 30
32""" 33 Client class is XMPP connection mountpoint. Objects for authentication, 34 network communication, roster, xml parsing ... are plugged to client object. 35 Client implements the abstract behavior - mostly negotioation and callbacks 36 handling, whereas underlying modules take care of feature-specific logic 37 """ 38
40""" 41 Caches connection data 42 43 :param domain: domain - for to: attribute (from account info) 44 :param idlequeue: processing idlequeue 45 :param caller: calling object - it has to implement methods 46 _event_dispatcher which is called from dispatcher instance 47 """ 48self.Namespace=protocol.NS_CLIENT 49self.defaultNamespace=self.Namespace 50 51self.idlequeue=idlequeue 52self.disconnect_handlers=[] 53 54self.Server=domain 55self.xmpp_hostname=None# FQDN hostname to connect to 56 57# caller is who initiated this client, it is in needed to register 58# the EventDispatcher 59self._caller=caller 60self._owner=self 61self._registered_name=None# our full jid, set after successful auth 62self.connected='' 63self.ip_addresses=[] 64self.socket=None 65self.on_connect=None 66self.on_proxy_failure=None 67self.on_connect_failure=None 68self.proxy=None 69self.got_features=False 70self.got_see_other_host=None 71self.stream_started=False 72self.disconnecting=False 73self.protocol_type='XMPP'
76""" 77 Called on disconnection - disconnect callback is picked based on state of 78 the client. 79 """ 80# to avoid recursive calls 81ifself.ip_addresses: 82self._try_next_ip() 83return 84ifself.disconnecting:return 85 86log.info('Disconnecting NBClient: %s'%message) 87 88sasl_failed=False 89if'NonBlockingRoster'inself.__dict__: 90self.NonBlockingRoster.PlugOut() 91if'NonBlockingBind'inself.__dict__: 92self.NonBlockingBind.PlugOut() 93if'NonBlockingNonSASL'inself.__dict__: 94self.NonBlockingNonSASL.PlugOut() 95if'SASL'inself.__dict__: 96if'startsasl'inself.SASL.__dict__and \ 97self.SASL.startsasl=='failure-in-process': 98sasl_failed=True 99self.SASL.startsasl='failure'100self._on_start_sasl()101else:102self.SASL.PlugOut()103if'NonBlockingTCP'inself.__dict__:104self.NonBlockingTCP.PlugOut()105if'NonBlockingHTTP'inself.__dict__:106self.NonBlockingHTTP.PlugOut()107if'NonBlockingBOSH'inself.__dict__:108self.NonBlockingBOSH.PlugOut()109# FIXME: we never unplug dispatcher, only on next connect110# See _xmpp_connect_machine and SASLHandler111112connected=self.connected113stream_started=self.stream_started114115self.connected=''116self.stream_started=False117118self.disconnecting=True119120log.debug('Client disconnected..')121# Don't call any callback when it's a SASL failure.122# SASL handler is already called123ifconnected==''andnotsasl_failed:124# if we're disconnecting before connection to XMPP sever is opened,125# we don't call disconnect handlers but on_connect_failure callback126ifself.proxy:127# with proxy, we have different failure callback128log.debug('calling on_proxy_failure cb')129self.on_proxy_failure(reason=message)130else:131log.debug('calling on_connect_failure cb')132self.on_connect_failure()133elifnotsasl_failed:134# we are connected to XMPP server135ifnotstream_started:136# if error occur before XML stream was opened, e.g. no response on137# init request, we call the on_connect_failure callback because138# proper connection is not established yet and it's not a proxy139# issue140log.debug('calling on_connect_failure cb')141self._caller.streamError=message142self.on_connect_failure()143else:144# with open connection, we are calling the disconnect handlers145foriinreversed(self.disconnect_handlers):146log.debug('Calling disconnect handler %s'%i)147i()148self.disconnecting=False
153"""154 Open XMPP connection (open XML streams in both directions)155156 :param on_connect: called after stream is successfully opened157 :param on_connect_failure: called when error occures during connection158 :param hostname: hostname of XMPP server from SRV request159 :param port: port number of XMPP server160 :param on_proxy_failure: called if error occurres during TCP connection to161 proxy server or during proxy connecting process162 :param proxy: dictionary with proxy data. It should contain at least163 values for keys 'host' and 'port' - connection details for proxy serve164 and optionally keys 'user' and 'pass' as proxy credentials165 :param secure_tuple: tuple of (desired connection type, cacerts, mycerts)166 connection type can be 'ssl' - TLS established after TCP connection,167 'tls' - TLS established after negotiation with starttls, or 'plain'.168 cacerts, mycerts - see tls_nb.NonBlockingTLS constructor for more169 details170 """171self.on_connect=on_connect172self.on_connect_failure=on_connect_failure173self.on_proxy_failure=on_proxy_failure174self.on_stream_error_cb=on_stream_error_cb175self.desired_security,self.cacerts,self.mycerts=secure_tuple176self.Connection=None177self.Port=port178self.proxy=proxy179180ifhostname:181self.xmpp_hostname=hostname182else:183self.xmpp_hostname=self.Server184185# We only check for SSL here as for TLS we will first have to start a186# PLAIN connection and negotiate TLS afterwards.187# establish_tls will instruct transport to start secure connection188# directly189establish_tls=self.desired_security=='ssl'190certs=(self.cacerts,self.mycerts)191192proxy_dict={}193tcp_host=self.xmpp_hostname194tcp_port=self.Port195196ifproxy:197# with proxies, client connects to proxy instead of directly to198# XMPP server ((hostname, port))199# tcp_host is hostname of machine used for socket connection200# (DNS request will be done for proxy or BOSH CM hostname)201tcp_host,tcp_port,proxy_user,proxy_pass= \ 202transports_nb.get_proxy_data_from_dict(proxy)203204ifproxy['type']=='bosh':205# Setup BOSH transport206self.socket=bosh.NonBlockingBOSH.get_instance(207on_disconnect=self.disconnect,208raise_event=self.raise_event,209idlequeue=self.idlequeue,210estabilish_tls=establish_tls,211certs=certs,212proxy_creds=(proxy_user,proxy_pass),213xmpp_server=(self.xmpp_hostname,self.Port),214domain=self.Server,215bosh_dict=proxy)216self.protocol_type='BOSH'217self.wait_for_restart_response= \ 218proxy['bosh_wait_for_restart_response']219else:220# http proxy221proxy_dict['type']=proxy['type']222proxy_dict['xmpp_server']=(self.xmpp_hostname,self.Port)223proxy_dict['credentials']=(proxy_user,proxy_pass)224225ifnotproxyorproxy['type']!='bosh':226# Setup ordinary TCP transport227self.socket=transports_nb.NonBlockingTCP.get_instance(228on_disconnect=self.disconnect,229raise_event=self.raise_event,230idlequeue=self.idlequeue,231estabilish_tls=establish_tls,232certs=certs,233proxy_dict=proxy_dict)234235# plug transport into client as self.Connection236self.socket.PlugIn(self)237238self._resolve_hostname(239hostname=tcp_host,240port=tcp_port,241on_success=self._try_next_ip)
263"""264 Iterate over IP addresses tries to connect to it265 """266iferr_message:267log.debug('While looping over DNS A records: %s'%err_message)268ifself.ip_addresses==[]:269msg='Run out of hosts for name %s:%s.'%(self.Server,self.Port)270msg=msg+' Error for last IP: %s'%err_message271self.disconnect(msg)272else:273self.current_ip=self.ip_addresses.pop(0)274self.socket.connect(275conn_5tuple=self.current_ip,276on_connect=lambda:self._xmpp_connect(),277on_connect_failure=self._try_next_ip)
280"""281 Get version of xml stream282 """283if'version'inself.Dispatcher.Stream._document_attrs:284returnself.Dispatcher.Stream._document_attrs['version']285else:286returnNone
289"""290 Start XMPP connecting process - open the XML stream. Is called after TCP291 connection is established or after switch to TLS when successfully292 negotiated with <starttls>.293 """294# socket_type contains info which transport connection was established295ifnotsocket_type:296ifself.Connection.ssl_lib:297# When ssl_lib is set we connected via SSL298socket_type='ssl'299else:300# PLAIN is default301socket_type='plain'302self.connected=socket_type303self._xmpp_connect_machine()
306"""307 Finite automaton taking care of stream opening and features tag handling.308 Calls _on_stream_start when stream is started, and disconnect() on309 failure.310 """311log.info('-------------xmpp_connect_machine() >> mode: %s, data: %s...'%312(mode,str(data)[:20]))313314defon_next_receive(mode):315"""316 Set desired on_receive callback on transport based on the state of317 connect_machine.318 """319log.info('setting %s on next receive'%mode)320ifmodeisNone:321self.onreceive(None)# switch to Dispatcher.ProcessNonBlocking322else:323self.onreceive(lambda_data:self._xmpp_connect_machine(mode,_data))
324325ifnotmode:326# starting state327ifself.__dict__.has_key('Dispatcher'):328self.Dispatcher.PlugOut()329self.got_features=False330dispatcher_nb.Dispatcher.get_instance().PlugIn(self)331on_next_receive('RECEIVE_DOCUMENT_ATTRIBUTES')332333elifmode=='FAILURE':334self.disconnect('During XMPP connect: %s'%data)335336elifmode=='RECEIVE_DOCUMENT_ATTRIBUTES':337ifdata:338self.Dispatcher.ProcessNonBlocking(data)339self.ip_addresses=[]340ifnothasattr(self,'Dispatcher')or \ 341self.Dispatcher.Stream._document_attrsisNone:342self._xmpp_connect_machine(343mode='FAILURE',344data='Error on stream open')345return346347# if terminating stanza was received after init request then client gets348# disconnected from bosh transport plugin and we have to end the stream349# negotiating process straight away.350# fixes #4657351ifnotself.connected:return352353ifself.incoming_stream_version()=='1.0':354ifnotself.got_features:355on_next_receive('RECEIVE_STREAM_FEATURES')356else:357log.info('got STREAM FEATURES in first recv')358self._xmpp_connect_machine(mode='STREAM_STARTED')359else:360log.info('incoming stream version less than 1.0')361self._xmpp_connect_machine(mode='STREAM_STARTED')362363elifmode=='RECEIVE_STREAM_FEATURES':364ifdata:365# sometimes <features> are received together with document366# attributes and sometimes on next receive...367self.Dispatcher.ProcessNonBlocking(data)368ifself.got_see_other_host:369log.info('got see-other-host')370self.onreceive(None)371self.on_stream_error_cb(self,self.got_see_other_host)372elifnotself.got_features:373self._xmpp_connect_machine(mode='FAILURE',374data='Missing <features> in 1.0 stream')375else:376log.info('got STREAM FEATURES in second recv')377self._xmpp_connect_machine(mode='STREAM_STARTED')378379elifmode=='STREAM_STARTED':380self._on_stream_start()
383"""384 Called after XMPP stream is opened. TLS negotiation may follow if385 supported and desired.386 """387self.stream_started=True388ifnothasattr(self,'onreceive'):389# we may already have been disconnected390return391self.onreceive(None)392393ifself.connected=='plain':394ifself.desired_security=='plain':395# if we want and have plain connection, we're done now396self._on_connect()397else:398# try to negotiate TLS399ifself.incoming_stream_version()!='1.0':400# if stream version is less than 1.0, we can't do more401log.info('While connecting with type = "tls": stream version '+402'is less than 1.0')403self._on_connect()404return405ifself.Dispatcher.Stream.features.getTag('starttls'):406# Server advertises TLS support, start negotiation407self.stream_started=False408log.info('TLS supported by remote server. Requesting TLS start.')409self._tls_negotiation_handler()410else:411log.info('While connecting with type = "tls": TLS unsupported '+412'by remote server')413self._on_connect()414415elifself.connectedin['ssl','tls']:416self._on_connect()417else:418assertFalse,'Stream opened for unsupported connection'
421"""422 Take care of TLS negotioation with <starttls>423 """424log.info('-------------tls_negotiaton_handler() >> tag: %s'%tag)425ifnotconandnottag:426# starting state when we send the <starttls>427self.RegisterHandlerOnce('proceed',self._tls_negotiation_handler,428xmlns=NS_TLS)429self.RegisterHandlerOnce('failure',self._tls_negotiation_handler,430xmlns=NS_TLS)431self.send('<starttls xmlns="%s"/>'%NS_TLS)432else:433# we got <proceed> or <failure>434iftag.getNamespace()!=NS_TLS:435self.disconnect('Unknown namespace: %s'%tag.getNamespace())436return437tagname=tag.getName()438iftagname=='failure':439self.disconnect('TLS <failure> received: %s'%tag)440return441log.info('Got starttls proceed response. Switching to TLS/SSL...')442# following call wouldn't work for BOSH transport but it doesn't matter443# because <starttls> negotiation with BOSH is forbidden444self.Connection.tls_init(445on_succ=lambda:self._xmpp_connect(socket_type='tls'),446on_fail=lambda:self.disconnect('error while etabilishing TLS'))
456"""457 Raise event to connection instance. DATA_SENT and DATA_RECIVED events458 are used in XML console to show XMPP traffic459 """460log.info('raising event from transport: :::::%s::::\n_____________\n%s\n_____________\n'%(event_type,data))461ifhasattr(self,'Dispatcher'):462self.Dispatcher.Event('',event_type,data)
463464###############################################################################465### follows code for authentication, resource bind, session and roster download466###############################################################################467
469"""470 Authenticate connnection and bind resource. If resource is not provided471 random one or library name used472473 :param user: XMPP username474 :param password: XMPP password475 :param resource: resource that shall be used for auth/connecting476 :param sasl: Boolean indicating if SASL shall be used. (default: True)477 :param on_auth: Callback, called after auth. On auth failure, argument478 is None.479 """480self._User,self._Password=user,password481self._Resource,self._sasl=resource,sasl482self.on_auth=on_auth483self._on_doc_attrs()484return
487"""488 Callback used by NON-SASL auth. On auth failure, res is None489 """490ifres:491self.connected+='+old_auth'492self.on_auth(self,'old_auth')493else:494self.on_auth(self,None)
497"""498 Used internally. On auth failure, res is None499 """500self.onreceive(None)501ifres:502self.connected+='+sasl'503self.on_auth(self,'sasl')504else:505self.on_auth(self,None)
526"""527 Callback used by SASL, called on each auth step528 """529ifdata:530self.Dispatcher.ProcessNonBlocking(data)531ifnot'SASL'inself.__dict__:532# SASL is pluged out, possible disconnect533return534ifself.SASL.startsasl=='in-process':535return536self.onreceive(None)537ifself.SASL.startsasl=='failure':538# wrong user/pass, stop auth539if'SASL'inself.__dict__:540self.SASL.PlugOut()541self.connected=None# FIXME: is this intended? We use ''elsewhere542self._on_sasl_auth(None)543elifself.SASL.startsasl=='success':544nb_bind=auth_nb.NonBlockingBind.get_instance()545sm=self._caller.sm546ifsm._ownerandsm.resumption:547nb_bind.resuming=True548sm.set_owner(self)549self.Dispatcher.sm=sm550nb_bind.PlugIn(self)551self.on_auth(self,'sasl')552return553554nb_bind.PlugIn(self)555self.onreceive(self._on_auth_bind)556returnTrue
575"""576 Return the Roster instance, previously plugging it in and requesting577 roster from server if needed578 """579ifself.__dict__.has_key('NonBlockingRoster'):580returnself.NonBlockingRoster.getRoster(on_ready,force)581returnNone
592593###############################################################################594### following methods are moved from blocking client class of xmpppy595###############################################################################596
610"""611 Default disconnect handler. Just raises an IOError. If you choosed to use612 this class in your production client, override this method or at least613 unregister it.614 """615raiseIOError('Disconnected from server.')
624"""625 Gets the ip address of the account, from which is made connection to the626 server (e.g. IP and port of socket)627628 We will create listening socket on the same ip629 """630# FIXME: tuple (ip, port) is expected (and checked for) but port num is631# useless632returnself.socket.peerhost
Client class is XMPP connection mountpoint. Objects for authentication,
network communication, roster, xml parsing ... are plugged to client object.
Client implements the abstract behavior - mostly negotioation and callbacks
handling, whereas underlying modules take care of feature-specific logic
connect(self,
on_connect,
on_connect_failure,
hostname=None,
port=5222,
on_proxy_failure=None,
on_stream_error_cb=None,
proxy=None,
secure_tuple=('plain', None, None))
Open XMPP connection (open XML streams in both directions)
_xmpp_connect(self,
socket_type=None)
Start XMPP connecting process - open the XML stream. Is called after TCP
connection is established or after switch to TLS when successfully
negotiated with <starttls>.
_xmpp_connect_machine(self,
mode=None,
data=None)
Finite automaton taking care of stream opening and features tag handling.
Calls _on_stream_start when stream is started, and disconnect() on
failure.
auth(self,
user,
password,
resource='',
sasl=True,
on_auth=None)
Authenticate connnection and bind resource. If resource is not provided
random one or library name used
sendPresence(self,
jid=None,
typ=None,
requestRoster=0)
Send some specific presence state. Can also request roster from server if
according agrument is set
DisconnectHandler(self)
Default disconnect handler. Just raises an IOError. If you choosed to use
this class in your production client, override this method or at least
unregister it.
Open XMPP connection (open XML streams in both directions)
Parameters:
on_connect - called after stream is successfully opened
on_connect_failure - called when error occures during connection
hostname - hostname of XMPP server from SRV request
port - port number of XMPP server
on_proxy_failure - called if error occurres during TCP connection to
proxy server or during proxy connecting process
proxy - dictionary with proxy data. It should contain at least
values for keys 'host' and 'port' - connection details for proxy serve
and optionally keys 'user' and 'pass' as proxy credentials
secure_tuple - tuple of (desired connection type, cacerts, mycerts)
connection type can be 'ssl' - TLS established after TCP connection,
'tls' - TLS established after negotiation with starttls, or 'plain'.
cacerts, mycerts - see tls_nb.NonBlockingTLS constructor for more
details
Start XMPP connecting process - open the XML stream. Is called after TCP
connection is established or after switch to TLS when successfully
negotiated with <starttls>.
Default disconnect handler. Just raises an IOError. If you choosed to use
this class in your production client, override this method or at least
unregister it.
Dispatcher
Why is this here - I needed to redefine Dispatcher for BOSH and easiest way
was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble
is that reference used to access dispatcher instance is in Client attribute
named by __class__.__name__ of the dispatcher instance .. long story short:
XMPPDispatcher
Handles XMPP stream and is the first who takes control over a fresh stanza
1## dispatcher_nb.py 2## based on dispatcher.py 3## 4## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 5## modified by Dimitur Kirov <dkirov@gmail.com> 6## 7## This program is free software; you can redistribute it and/or modify 8## it under the terms of the GNU General Public License as published by 9## the Free Software Foundation; either version 2, or (at your option) 10## any later version. 11## 12## This program is distributed in the hope that it will be useful, 13## but WITHOUT ANY WARRANTY; without even the implied warranty of 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15## GNU General Public License for more details. 16 17 18""" 19Main xmpp decision making logic. Provides library with methods to assign 20different handlers to different XMPP stanzas and namespaces 21""" 22 23importsimplexml,sys,locale 24importre 25fromxml.parsers.expatimportExpatError 26frompluginimportPlugIn 27fromprotocolimport(NS_STREAMS,NS_XMPP_STREAMS,NS_HTTP_BIND,Iq,Presence, 28Message,Protocol,Node,Error,ERR_FEATURE_NOT_IMPLEMENTED,StreamError) 29importlogging 30log=logging.getLogger('nbxmpp.dispatcher_nb') 31 32#: default timeout to wait for response for our id 33DEFAULT_TIMEOUT_SECONDS=25 34outgoingID=0 35 36XML_DECLARATION='<?xml version=\'1.0\'?>'
40""" 41 Why is this here - I needed to redefine Dispatcher for BOSH and easiest way 42 was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble 43 is that reference used to access dispatcher instance is in Client attribute 44 named by __class__.__name__ of the dispatcher instance .. long story short: 45 46 I wrote following to avoid changing each client.Dispatcher.whatever() in xmpp 47 48 If having two kinds of dispatcher will go well, I will rewrite the dispatcher 49 references in other scripts 50 """ 51
53ifclient_obj.protocol_type=='XMPP': 54XMPPDispatcher().PlugIn(client_obj) 55elifclient_obj.protocol_type=='BOSH': 56BOSHDispatcher().PlugIn(client_obj,after_SASL,old_features) 57else: 58assertFalse# should never be reached
62""" 63 Factory Method for object creation 64 65 Use this instead of directly initializing the class in order to make 66 unit testing much easier. 67 """ 68returncls(*args,**kwargs)
72""" 73 Handles XMPP stream and is the first who takes control over a fresh stanza 74 75 Is plugged into NonBlockingClient but can be replugged to restart handled 76 stream headers (used by SASL f.e.). 77 """ 78
80PlugIn.__init__(self) 81self.handlers={} 82self._expected={} 83self._defaultHandler=None 84self._pendingExceptions=[] 85self._eventHandler=None 86self._cycleHandlers=[] 87self._exported_methods=[self.RegisterHandler,self.RegisterDefaultHandler, 88self.RegisterEventHandler,self.UnregisterCycleHandler, 89self.RegisterCycleHandler,self.RegisterHandlerOnce, 90self.UnregisterHandler,self.RegisterProtocol, 91self.SendAndWaitForResponse,self.SendAndCallForResponse, 92self.getAnID,self.Event,self.send] 93 94# Let the dispatcher know if there is support for stream management 95self.sm=None 96 97# \ufddo -> \ufdef range 98c=u'\ufdd0' 99r=c.encode('utf8')100while(c<u'\ufdef'):101c=unichr(ord(c)+1)102r+='|'+c.encode('utf8')103104# \ufffe-\uffff, \u1fffe-\u1ffff, ..., \u10fffe-\u10ffff105c=u'\ufffe'106r+='|'+c.encode('utf8')107r+='|'+unichr(ord(c)+1).encode('utf8')108while(c<u'\U0010fffe'):109c=unichr(ord(c)+0x10000)110r+='|'+c.encode('utf8')111r+='|'+unichr(ord(c)+1).encode('utf8')112113self.invalid_chars_re=re.compile(r)
121"""122 Return set of user-registered callbacks in it's internal format. Used123 within the library to carry user handlers set over Dispatcher replugins124 """125returnself.handlers
128"""129 Restore user-registered callbacks structure from dump previously obtained130 via dumpHandlers. Used within the library to carry user handlers set over131 Dispatcher replugins.132 """133self.handlers=handlers
152"""153 Plug the Dispatcher instance into Client class instance and send initial154 stream header. Used internally155 """156self._init()157self._owner.lastErrNode=None158self._owner.lastErr=None159self._owner.lastErrCode=None160ifhasattr(self._owner,'StreamInit'):161self._owner.StreamInit()162else:163self.StreamInit()
166"""167 Prepare instance to be destructed168 """169self.Stream.dispatch=None170self.Stream.features=None171self.Stream.destroy()172self._owner=None173self.Stream=None
204"""205 Check incoming stream for data waiting206207 :param data: data received from transports/IO sockets208 :return:209 1) length of processed data if some data were processed;210 2) '0' string if no data were processed but link is alive;211 3) 0 (zero) if underlying connection is closed.212 """213# FIXME:214# When an error occurs we disconnect the transport directly. Client's215# disconnect method will never be called.216# Is this intended?217# also look at transports start_disconnect()218data=self.replace_non_character(data)219forhandlerinself._cycleHandlers:220handler(self)221iflen(self._pendingExceptions)>0:222_pendingException=self._pendingExceptions.pop()223raise_pendingException[0],_pendingException[1],_pendingException[2]224try:225self.Stream.Parse(data)226# end stream:stream tag received227ifself.Streamandself.Stream.has_received_endtag():228self._owner.disconnect(self.Stream.streamError)229return0230exceptExpatError:231log.error('Invalid XML received from server. Forcing disconnect.')232self._owner.Connection.disconnect()233return0234exceptValueError,e:235log.debug('ValueError: %s'%str(e))236self._owner.Connection.pollend()237return0238iflen(self._pendingExceptions)>0:239_pendingException=self._pendingExceptions.pop()240raise_pendingException[0],_pendingException[1],_pendingException[2]241iflen(data)==0:242return'0'243returnlen(data)
246"""247 Create internal structures for newly registered namespace248249 You can register handlers for this namespace afterwards. By default250 one namespace is already registered251 (jabber:client or jabber:component:accept depending on context.252 """253log.debug('Registering namespace "%s"'%xmlns)254self.handlers[xmlns]={}255self.RegisterProtocol('unknown',Protocol,xmlns=xmlns)256self.RegisterProtocol('default',Protocol,xmlns=xmlns)
259"""260 Used to declare some top-level stanza name to dispatcher261262 Needed to start registering handlers for such stanzas. Iq, message and263 presence protocols are registered by default.264 """265ifnotxmlns:266xmlns=self._owner.defaultNamespace267log.debug('Registering protocol "%s" as %s(%s)'%(tag_name,Proto,xmlns))268self.handlers[xmlns][tag_name]={type:Proto,'default':[]}
272"""273 Register handler for processing all stanzas for specified namespace274 """275self.RegisterHandler('default',handler,typ,ns,xmlns,makefirst,276system)
280"""281 Register user callback as stanzas handler of declared type282283 Callback arguments:284 dispatcher instance (for replying), incoming return of previous handlers.285 The callback must raise xmpp.NodeProcessed just before return if it wants286 to prevent other callbacks to be called with the same stanza as argument287 _and_, more importantly library from returning stanza to sender with error set.288289 :param name: name of stanza. F.e. "iq".290 :param handler: user callback.291 :param typ: value of stanza's "type" attribute. If not specified any292 value will match293 :param ns: namespace of child that stanza must contain.294 :param makefirst: insert handler in the beginning of handlers list instead295 of adding it to the end. Note that more common handlers i.e. w/o "typ"296 and " will be called first nevertheless.297 :param system: call handler even if NodeProcessed Exception were raised298 already.299 """300ifnotxmlns:301xmlns=self._owner.defaultNamespace302log.debug('Registering handler %s for "%s" type->%s ns->%s(%s)'%303(handler,name,typ,ns,xmlns))304ifnottypandnotns:305typ='default'306ifxmlnsnotinself.handlers:307self.RegisterNamespace(xmlns,'warn')308ifnamenotinself.handlers[xmlns]:309self.RegisterProtocol(name,Protocol,xmlns,'warn')310iftyp+nsnotinself.handlers[xmlns][name]:311self.handlers[xmlns][name][typ+ns]=[]312ifmakefirst:313self.handlers[xmlns][name][typ+ns].insert(0,{'func':handler,314'system':system})315else:316self.handlers[xmlns][name][typ+ns].append({'func':handler,317'system':system})
321"""322 Unregister handler after first call (not implemented yet)323 """324# FIXME Drop or implement325ifnotxmlns:326xmlns=self._owner.defaultNamespace327self.RegisterHandler(name,handler,typ,ns,xmlns,makefirst,system)
330"""331 Unregister handler. "typ" and "ns" must be specified exactly the same as332 with registering.333 """334ifnotxmlns:335xmlns=self._owner.defaultNamespace336ifnottypandnotns:337typ='default'338ifxmlnsnotinself.handlers:339return340ifnamenotinself.handlers[xmlns]:341return342iftyp+nsnotinself.handlers[xmlns][name]:343return344forpackinself.handlers[xmlns][name][typ+ns]:345ifpack['func']==handler:346try:347self.handlers[xmlns][name][typ+ns].remove(pack)348exceptValueError:349pass
352"""353 Specify the handler that will be used if no NodeProcessed exception were354 raised. This is returnStanzaHandler by default.355 """356self._defaultHandler=handler
359"""360 Register handler that will process events. F.e. "FILERECEIVED" event. See361 common/connection: _event_dispatcher()362 """363self._eventHandler=handler
366"""367 Return stanza back to the sender with <feature-not-implemented/> error368 set369 """370ifstanza.getType()in('get','set'):371conn._owner.send(Error(stanza,ERR_FEATURE_NOT_IMPLEMENTED))
374"""375 Register handler that will be called on every Dispatcher.Process() call376 """377ifhandlernotinself._cycleHandlers:378self._cycleHandlers.append(handler)
381"""382 Unregister handler that will is called on every Dispatcher.Process() call383 """384ifhandlerinself._cycleHandlers:385self._cycleHandlers.remove(handler)
388"""389 Raise some event390391 :param realm: scope of event. Usually a namespace.392 :param event: the event itself. F.e. "SUCCESSFUL SEND".393 :param data: data that comes along with event. Depends on event.394 """395ifself._eventHandler:396self._eventHandler(realm,event,data)397else:398log.warning('Received unhandled event: %s'%event)
401"""402 Main procedure that performs XMPP stanza recognition and calling403 apppropriate handlers for it. Called by simplexml404 """405# FIXME: Where do we set session and direct. Why? What are those intended406# to do?407408#log.info('dispatch called: stanza = %s, session = %s, direct= %s'409# % (stanza, session, direct))410ifnotsession:411session=self412session.Stream._mini_dom=None413name=stanza.getName()414415ifname=='features':416self._owner.got_features=True417session.Stream.features=stanza418elifname=='error':419ifstanza.getTag('see-other-host'):420self._owner.got_see_other_host=stanza421422xmlns=stanza.getNamespace()423424# log.info('in dispatch, getting ns for %s, and the ns is %s'425# % (stanza, xmlns))426ifxmlnsnotinself.handlers:427log.warn("Unknown namespace: "+xmlns)428xmlns='unknown'429# features stanza has been handled before430ifnamenotinself.handlers[xmlns]:431ifname!='features':432log.warn("Unknown stanza: "+name)433else:434log.debug("Got %s/%s stanza"%(xmlns,name))435name='unknown'436else:437log.debug("Got %s/%s stanza"%(xmlns,name))438439ifstanza.__class__.__name__=='Node':440# FIXME: this cannot work441stanza=self.handlers[xmlns][name][type](node=stanza)442443typ=stanza.getType()444ifnottyp:445typ=''446stanza.props=stanza.getProperties()447ID=stanza.getID()448449# If server supports stream management450ifself.smandself.sm.enabledand(stanza.getName()!='r'and451stanza.getName()!='a'andstanza.getName()!='enabled'and452stanza.getName()!='resumed'):453# increments the number of stanzas that has been handled454self.sm.in_h=self.sm.in_h+1455list_=['default']# we will use all handlers:456iftypinself.handlers[xmlns][name]:457list_.append(typ)# from very common...458forpropinstanza.props:459ifpropinself.handlers[xmlns][name]:460list_.append(prop)461iftypandtyp+propinself.handlers[xmlns][name]:462list_.append(typ+prop)# ...to very particular463464chain=self.handlers[xmlns]['default']['default']465forkeyinlist_:466ifkey:467chain=chain+self.handlers[xmlns][name][key]468469ifIDinsession._expected:470user=0471ifisinstance(session._expected[ID],tuple):472cb,args=session._expected[ID]473log.debug("Expected stanza arrived. Callback %s(%s) found!"%474(cb,args))475try:476cb(session,stanza,**args)477exceptException,typ:478iftyp.__class__.__name__!='NodeProcessed':479raise480else:481log.debug("Expected stanza arrived!")482session._expected[ID]=stanza483else:484user=1485forhandlerinchain:486ifuserorhandler['system']:487try:488handler['func'](session,stanza)489exceptException,typ:490iftyp.__class__.__name__!='NodeProcessed':491self._pendingExceptions.insert(0,sys.exc_info())492return493user=0494ifuserandself._defaultHandler:495self._defaultHandler(session,stanza)
498"""499 Internal wrapper around ProcessNonBlocking. Will check for500 """501ifdataisNone:502return503res=self.ProcessNonBlocking(data)504# 0 result indicates that we have closed the connection, e.g.505# we have released dispatcher, so self._owner has no methods506ifnotres:507return508for(_id,_iq)inself._expected.items():509if_iqisNone:510# If the expected Stanza would have arrived, ProcessNonBlocking511# would have placed the reply stanza in there512continue513if_idinself.on_responses:514iflen(self._expected)==1:515self._owner.onreceive(None)516resp,args=self.on_responses[_id]517delself.on_responses[_id]518ifargsisNone:519resp(_iq)520else:521resp(self._owner,_iq,**args)522delself._expected[_id]
525"""526 Send stanza and wait for recipient's response to it. Will call transports527 on_timeout callback if response is not retrieved in time528529 Be aware: Only timeout of latest call of SendAndWait is active.530 """531iftimeoutisNone:532timeout=DEFAULT_TIMEOUT_SECONDS533_waitid=self.send(stanza)534iffunc:535self.on_responses[_waitid]=(func,args)536iftimeout:537self._owner.set_timeout(timeout)538self._owner.onreceive(self._WaitForData)539self._expected[_waitid]=None540return_waitid
543"""544 Put stanza on the wire and call back when recipient replies. Additional545 callback arguments can be specified in args546 """547self.SendAndWaitForResponse(stanza,0,func,args)
550"""551 Wrap transports send method when plugged into NonBlockingClient. Makes552 sure stanzas get ID and from tag.553 """554ID=None555iftype(stanza)notin[type(''),type(u'')]:556ifisinstance(stanza,Protocol):557ID=stanza.getID()558ifIDisNone:559stanza.setID(self.getAnID())560ID=stanza.getID()561ifself._owner._registered_nameandnotstanza.getAttr('from'):562stanza.setAttr('from',self._owner._registered_name)563564# If no ID then it is a whitespace565ifself.smandself.sm.enabledandID:566self.sm.uqueue.append(stanza)567self.sm.out_h=self.sm.out_h+1568iflen(self.sm.uqueue)>self.sm.max_queue:569self.sm.request_ack()570571self._owner.Connection.send(stanza,now)572returnID
620ifstanza.getName()=='body'andstanza.getNamespace()==NS_HTTP_BIND:621622stanza_attrs=stanza.getAttrs()623if'authid'instanza_attrs:624# should be only in init response625# auth module expects id of stream in document attributes626self.Stream._document_attrs['id']=stanza_attrs['authid']627self._owner.Connection.handle_body_attrs(stanza_attrs)628629children=stanza.getChildren()630ifchildren:631forchildinchildren:632# if child doesn't have any ns specified, simplexml (or expat)633# thinks it's of parent's (BOSH body) namespace, so we have to634# rewrite it to jabber:client635ifchild.getNamespace()==NS_HTTP_BIND:636child.setNamespace(self._owner.defaultNamespace)637XMPPDispatcher.dispatch(self,child,session,direct)638else:639XMPPDispatcher.dispatch(self,stanza,session,direct)
PlugIn(self,
owner,
after_SASL=False,
old_features=None)
Attach to owner and register ourself and our _exported_methods in it.
If defined by a subclass, call self.plugin(owner) to execute hook
code after plugging
dispatch(self,
stanza,
session=None,
direct=0)
Main procedure that performs XMPP stanza recognition and calling
apppropriate handlers for it. Called by simplexml
Attach to owner and register ourself and our _exported_methods in it.
If defined by a subclass, call self.plugin(owner) to execute hook
code after plugging
Why is this here - I needed to redefine Dispatcher for BOSH and easiest way
was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble
is that reference used to access dispatcher instance is in Client attribute
named by __class__.__name__ of the dispatcher instance .. long story short:
I wrote following to avoid changing each client.Dispatcher.whatever() in xmpp
If having two kinds of dispatcher will go well, I will rewrite the dispatcher
references in other scripts
dumpHandlers(self)
Return set of user-registered callbacks in it's internal format. Used
within the library to carry user handlers set over Dispatcher replugins
restoreHandlers(self,
handlers)
Restore user-registered callbacks structure from dump previously obtained
via dumpHandlers. Used within the library to carry user handlers set over
Dispatcher replugins.
RegisterHandler(self,
name,
handler,
typ='',
ns='',
xmlns=None,
makefirst=False,
system=False)
Register user callback as stanzas handler of declared type
UnregisterHandler(self,
name,
handler,
typ='',
ns='',
xmlns=None)
Unregister handler. "typ" and "ns" must be specified exactly the same as
with registering.
RegisterDefaultHandler(self,
handler)
Specify the handler that will be used if no NodeProcessed exception were
raised. This is returnStanzaHandler by default.
dispatch(self,
stanza,
session=None,
direct=0)
Main procedure that performs XMPP stanza recognition and calling
apppropriate handlers for it. Called by simplexml
SendAndWaitForResponse(self,
stanza,
timeout=None,
func=None,
args=None)
Send stanza and wait for recipient's response to it. Will call transports
on_timeout callback if response is not retrieved in time
SendAndCallForResponse(self,
stanza,
func=None,
args=None)
Put stanza on the wire and call back when recipient replies. Additional
callback arguments can be specified in args
Restore user-registered callbacks structure from dump previously obtained
via dumpHandlers. Used within the library to carry user handlers set over
Dispatcher replugins.
Create internal structures for newly registered namespace
You can register handlers for this namespace afterwards. By default
one namespace is already registered
(jabber:client or jabber:component:accept depending on context.
RegisterProtocol(self,
tag_name,
Proto,
xmlns=None,
order='info')
Register user callback as stanzas handler of declared type
Callback arguments:
dispatcher instance (for replying), incoming return of previous handlers.
The callback must raise xmpp.NodeProcessed just before return if it wants
to prevent other callbacks to be called with the same stanza as argument
_and_, more importantly library from returning stanza to sender with error set.
Parameters:
name - name of stanza. F.e. "iq".
handler - user callback.
typ - value of stanza's "type" attribute. If not specified any
value will match
ns - namespace of child that stanza must contain.
makefirst - insert handler in the beginning of handlers list instead
of adding it to the end. Note that more common handlers i.e. w/o "typ"
and " will be called first nevertheless.
system - call handler even if NodeProcessed Exception were raised
already.
getRegInfo(disp,
host,
info={},
sync=True)
Get registration form from remote host. Info dict can be prefilled
:param disp: plugged dispatcher instance
:param info: dict, like {'username':'joey'}.
setActivePrivacyList(disp,
listname=None,
typ='active',
cb=None)
Switch privacy list 'listname' to specified type. By default the type is
'active'. Returns true on success.
Get registration form from remote host. Info dict can be prefilled
:param disp: plugged dispatcher instance
:param info: dict, like {'username':'joey'}.
1## features.py 2## 3## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 4## Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com> 5## 6## This program is free software; you can redistribute it and/or modify 7## it under the terms of the GNU General Public License as published by 8## the Free Software Foundation; either version 2, or (at your option) 9## any later version. 10## 11## This program is distributed in the hope that it will be useful, 12## but WITHOUT ANY WARRANTY; without even the implied warranty of 13## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14## GNU General Public License for more details. 15 16# $Id: features.py,v 1.22 2005/09/30 20:13:04 mikealbon Exp $ 17 18""" 19Different stuff that wasn't worth separating it into modules 20(Registration, Privacy Lists, ...) 21""" 22 23fromprotocolimportNS_REGISTER,NS_PRIVACY,NS_DATA,Iq,isResultNode,Node 24
41""" 42 Get registration form from remote host. Info dict can be prefilled 43 :param disp: plugged dispatcher instance 44 :param info: dict, like {'username':'joey'}. 45 46 See JEP-0077 for details. 47 """ 48iq=Iq('get',NS_REGISTER,to=host) 49foriininfo.keys(): 50iq.setTagData(i,info[i]) 51ifsync: 52disp.SendAndCallForResponse(iq,lambdaresp: 53_ReceivedRegInfo(disp.Dispatcher,resp,host)) 54else: 55disp.SendAndCallForResponse(iq,_ReceivedRegInfo,{'agent':host})
81""" 82 Perform registration on remote server with provided info 83 84 If registration fails you can get additional info from the dispatcher's 85 owner attributes lastErrNode, lastErr and lastErrCode. 86 """ 87iq=Iq('set',NS_REGISTER,to=host) 88ifnotisinstance(info,dict): 89info=info.asDict() 90foriininfo.keys(): 91iq.setTag('query').setTagData(i,info[i]) 92disp.SendAndCallForResponse(iq,cb,args)
102"""103 Changes password on specified or current (if not specified) server. Returns104 true on success.105 """106ifnothost:107host=disp._owner.Server108iq=Iq('set',NS_REGISTER,to=host,payload=[Node('username',109payload=[disp._owner.Server]),Node('password',payload=[newpassword])])110_on_default_response(disp,iq,cb)
174"""175 Switch privacy list 'listname' to specified type. By default the type is176 'active'. Returns true on success.177 """178iflistname:179attrs={'name':listname}180else:181attrs={}182iq=Iq('set',NS_PRIVACY,payload=[Node(typ,attrs)])183_on_default_response(disp,iq,cb)
192"""193 Set the ruleset194195 'list' should be the simpleXML node formatted according to RFC 3921196 (XMPP-IM) I.e. Node('list',{'name':listname},payload=[...]).197198 Returns true on success.199 """200iq=Iq('set',NS_PRIVACY,xmlns='')201list_query=iq.getTag('query').setTag('list',{'name':listname})202foritemintags:203if'type'initemand'value'initem:204item_tag=list_query.setTag('item',{'action':item['action'],205'order':item['order'],'type':item['type'],206'value':item['value']})207else:208item_tag=list_query.setTag('item',{'action':item['action'],209'order':item['order']})210if'child'initem:211forchild_taginitem['child']:212item_tag.setTag(child_tag)213_on_default_response(disp,iq,None)
216''' Deletes privacy list 'listname'. Returns true on success. '''217iq=Iq('set',NS_PRIVACY,payload=[Node('list',{'name':listname})])218_on_default_response(disp,iq,cb)
IdleObject
Idle listener interface. Listed methods are called by IdleQueue.
IdleCommand
Can be subclassed to execute commands asynchronously by the idlequeue.
Result will be optained via file descriptor of created pipe
IdleQueue
IdleQueue provide three distinct time based features. Uses select.poll()
SelectIdleQueue
Extends IdleQueue to use select.select() for polling
GlibIdleQueue
Extends IdleQueue to use glib io_add_wath, instead of select/poll In another
'non gui' implementation of Gajim IdleQueue can be used safetly
1## idlequeue.py 2## 3## Copyright (C) 2006 Dimitur Kirov <dkirov@gmail.com> 4## 5## This program is free software; you can redistribute it and/or modify 6## it under the terms of the GNU General Public License as published by 7## the Free Software Foundation; either version 2, or (at your option) 8## any later version. 9## 10## This program is distributed in the hope that it will be useful, 11## but WITHOUT ANY WARRANTY; without even the implied warranty of 12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13## GNU General Public License for more details. 14 15 16""" 17Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle 18objects and be informed about possible IO 19""" 20 21importos 22importselect 23importlogging 24log=logging.getLogger('nbxmpp.idlequeue') 25 26# needed for get_idleqeue 27try: 28importgobject 29HAVE_GOBJECT=True 30exceptImportError: 31HAVE_GOBJECT=False 32 33# needed for idlecommand 34ifos.name=='nt': 35fromsubprocessimport*# python24 only. we ask this for Windows 36elifos.name=='posix': 37importfcntl 38 39FLAG_WRITE=20# write only 40FLAG_READ=19# read only 41FLAG_READ_WRITE=23# read and write 42FLAG_CLOSE=16# wait for close 43 44PENDING_READ=3# waiting read event 45PENDING_WRITE=4# waiting write event 46IS_CLOSED=16# channel closed 47 48
50""" 51 Get an appropriate idlequeue 52 """ 53ifos.name=='nt': 54# gobject.io_add_watch does not work on windows 55returnSelectIdleQueue() 56else: 57ifHAVE_GOBJECT: 58# Gajim's default Idlequeue 59returnGlibIdleQueue() 60else: 61# GUI less implementation 62returnSelectIdleQueue()
99"""100 Can be subclassed to execute commands asynchronously by the idlequeue.101 Result will be optained via file descriptor of created pipe102 """103
105IdleObject.__init__(self)106# how long (sec.) to wait for result ( 0 - forever )107# it is a class var, instead of a constant and we can override it.108self.commandtimeout=0109# when we have some kind of result (valid, ot not) we call this handler110self.result_handler=on_result111# if it is True, we can safetely execute the command112self.canexecute=True113self.idlequeue=None114self.result=''
128"""129 Return one line representation of command and its arguments130 """131returnreduce(lambdaleft,right:left+' '+right,132self._compose_command_args())
135ifself.pipe.poll()isNone:136# result timeout137ifself.endtime<self.idlequeue.current_time():138self._return_result()139self.pipe.stdout.close()140self.pipe.stdin.close()141else:142# child is still active, continue to wait143self.idlequeue.set_alarm(self.wait_child,0.1)144else:145# child has quit146self.result=self.pipe.stdout.read()147self._return_result()148self.pipe.stdout.close()149self.pipe.stdin.close()
162# if program is started from noninteraactive shells stdin is closed and163# cannot be forwarded, so we have to keep it open164self.pipe=Popen(self._compose_command_args(),stdout=PIPE,165bufsize=1024,shell=True,stderr=STDOUT,stdin=PIPE)166ifself.commandtimeout>=0:167self.endtime=self.idlequeue.current_time()+self.commandtimeout168self.idlequeue.set_alarm(self.wait_child,0.1)
206"""207 IdleQueue provide three distinct time based features. Uses select.poll()208209 1. Alarm timeout: Execute a callback after foo seconds210 2. Timeout event: Call read_timeout() of an plugged object if a timeout211 has been set, but not removed in time.212 3. Check file descriptor of plugged objects for read, write and error213 events214215 """216217# (timeout, boolean)218# Boolean is True if timeout is specified in seconds, False means miliseconds219PROCESS_TIMEOUT=(100,False)220
222self.queue={}223224# when there is a timeout it executes obj.read_timeout()225# timeout is not removed automatically!226# {fd1: {timeout1: func1, timeout2: func2}}227# timout are unique (timeout1 must be != timeout2)228# If func1 is None, read_time function is called229self.read_timeouts={}230231# cb, which are executed after XX sec., alarms are removed automatically232self.alarms={}233self._init_idle()
242"""243 Set up a new alarm. alarm_cb will be called after specified seconds.244 """245alarm_time=self.current_time()+seconds246# almost impossible, but in case we have another alarm_cb at this time247ifalarm_timeinself.alarms:248self.alarms[alarm_time].append(alarm_cb)249else:250self.alarms[alarm_time]=[alarm_cb]251returnalarm_time
254"""255 Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if256 it was removed sucessfully, otherwise False257 """258ifnotalarm_timeinself.alarms:259returnFalse260i=-1261foriinrange(len(self.alarms[alarm_time])):262# let's not modify the list inside the loop263ifself.alarms[alarm_time][i]isalarm_cb:264break265ifi!=-1:266delself.alarms[alarm_time][i]267ifself.alarms[alarm_time]==[]:268delself.alarms[alarm_time]269returnTrue270else:271returnFalse
288"""289 Seta a new timeout. If it is not removed after specified seconds,290 func or obj.read_timeout() will be called291292 A filedescriptor fd can have several timeouts.293 """294log_txt='read timeout set for fd %s on %s seconds'%(fd,seconds)295iffunc:296log_txt+=' with function '+str(func)297log.info(log_txt)298timeout=self.current_time()+seconds299iffdinself.read_timeouts:300self.read_timeouts[fd][timeout]=func301else:302self.read_timeouts[fd]={timeout:func}
305"""306 Execute and remove alarm callbacks and execute func() or read_timeout()307 for plugged objects if specified time has ellapsed308 """309current_time=self.current_time()310311forfd,timeoutsinself.read_timeouts.items():312iffdnotinself.queue:313self.remove_timeout(fd)314continue315fortimeout,funcintimeouts.items():316iftimeout>current_time:317continue318iffunc:319log.debug('Calling %s for fd %s'%(func,fd))320func()321else:322log.debug('Calling read_timeout for fd %s'%fd)323self.queue[fd].read_timeout()324self.remove_timeout(fd,timeout)325326times=self.alarms.keys()327foralarm_timeintimes:328ifalarm_time>current_time:329continue330ifalarm_timeinself.alarms:331forcallbackinself.alarms[alarm_time]:332callback()333ifalarm_timeinself.alarms:334del(self.alarms[alarm_time])
337"""338 Plug an IdleObject into idlequeue. Filedescriptor fd must be set339340 :param obj: the IdleObject341 :param writable: True if obj has data to sent342 :param readable: True if obj expects data to be reiceived343 """344ifobj.fd==-1:345return346ifobj.fdinself.queue:347self.unplug_idle(obj.fd)348self.queue[obj.fd]=obj349ifwritable:350ifnotreadable:351flags=FLAG_WRITE352else:353flags=FLAG_READ_WRITE354else:355ifreadable:356flags=FLAG_READ357else:358# when we paused a FT, we expect only a close event359flags=FLAG_CLOSE360self._add_idle(obj.fd,flags)
414"""415 Process idlequeue. Check for any pending timeout or alarm events. Call416 IdleObjects on possible and requested read, write and error events on417 their file descriptors418419 Call this in regular intervals.420 """421ifnotself.queue:422# check for timeouts/alert also when there are no active fds423self._check_time_events()424returnTrue425try:426waiting_descriptors=self.selector.poll(0)427exceptselect.error,e:428waiting_descriptors=[]429ife[0]!=4:# interrupt430raise431forfd,flagsinwaiting_descriptors:432self._process_events(fd,flags)433self._check_time_events()434returnTrue
438"""439 Extends IdleQueue to use select.select() for polling440441 This class exisists for the sake of gtk2.8 on windows, which doesn't seem to442 support io_add_watch properly (yet)443 """444
454"""455 This method is called when we plug a new idle object. Remove descriptor456 to read/write/error lists, according flags457 """458ifflags&3:459self.read_fds[fd]=fd460ifflags&4:461self.write_fds[fd]=fd462self.error_fds[fd]=fd
465"""466 This method is called when we unplug a new idle object. Remove descriptor467 from read/write/error lists468 """469iffdinself.read_fds:470del(self.read_fds[fd])471iffdinself.write_fds:472del(self.write_fds[fd])473iffdinself.error_fds:474del(self.error_fds[fd])
504"""505 Extends IdleQueue to use glib io_add_wath, instead of select/poll In another506 'non gui' implementation of Gajim IdleQueue can be used safetly507 """508509# (timeout, boolean)510# Boolean is True if timeout is specified in seconds, False means miliseconds511PROCESS_TIMEOUT=(2,True)512
514"""515 Creates a dict, which maps file/pipe/sock descriptor to glib event id516 """517self.events={}518# time() is already called in glib, we just get the last value519# overrides IdleQueue.current_time()520self.current_time=gobject.get_current_time
523"""524 This method is called when we plug a new idle object. Start listening for525 events from fd526 """527res=gobject.io_add_watch(fd,flags,self._process_events,528priority=gobject.PRIORITY_LOW)529# store the id of the watch, so that we can remove it on unplug530self.events[fd]=res
541"""542 This method is called when we unplug a new idle object. Stop listening543 for events from fd544 """545ifnotfdinself.events:546return547gobject.source_remove(self.events[fd])548del(self.events[fd])
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
remove_alarm(self,
alarm_cb,
alarm_time)
Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if
it was removed sucessfully, otherwise False
set_read_timeout(self,
fd,
seconds,
func=None)
Seta a new timeout. If it is not removed after specified seconds,
func or obj.read_timeout() will be called
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
Process idlequeue. Check for any pending timeout or alarm events. Call
IdleObjects on possible and requested read, write and error events on
their file descriptors
1## plugin.py 2## 3## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 4## 5## This program is free software; you can redistribute it and/or modify 6## it under the terms of the GNU General Public License as published by 7## the Free Software Foundation; either version 2, or (at your option) 8## any later version. 9##10## This program is distributed in the hope that it will be useful,11## but WITHOUT ANY WARRANTY; without even the implied warranty of12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13## GNU General Public License for more details.1415# $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $1617"""18Provides PlugIn class functionality to develop extentions for xmpppy19"""2021importlogging22log=logging.getLogger('nbxmpp.plugin')
25"""26 Abstract xmpppy plugin infrastructure code, providing plugging in/out and27 debugging functionality2829 Inherit to develop pluggable objects. No code change on the owner class30 required (the object where we plug into)3132 For every instance of PlugIn class the 'owner' is the class in what the plug33 was plugged.34 """35
40"""41 Attach to owner and register ourself and our _exported_methods in it.42 If defined by a subclass, call self.plugin(owner) to execute hook43 code after plugging44 """45self._owner=owner46log.info('Plugging %s __INTO__ %s'%(self,self._owner))47ifself.__class__.__name__inowner.__dict__:48log.debug('Plugging ignored: another instance already plugged.')49return50self._old_owners_methods=[]51formethodinself._exported_methods:52ifmethod.__name__inowner.__dict__:53self._old_owners_methods.append(owner.__dict__[method.__name__])54owner.__dict__[method.__name__]=method55ifself.__class__.__name__.endswith('Dispatcher'):56# FIXME: I need BOSHDispatcher or XMPPDispatcher on .Dispatcher57# there must be a better way..58owner.__dict__['Dispatcher']=self59else:60owner.__dict__[self.__class__.__name__]=self6162# Execute hook63ifhasattr(self,'plugin'):64returnself.plugin(owner)
67"""68 Unregister our _exported_methods from owner and detach from it.69 If defined by a subclass, call self.plugout() after unplugging to execute70 hook code71 """72log.info('Plugging %s __OUT__ of %s.'%(self,self._owner))73formethodinself._exported_methods:74delself._owner.__dict__[method.__name__]75formethodinself._old_owners_methods:76self._owner.__dict__[method.__name__]=method77# FIXME: Dispatcher workaround78ifself.__class__.__name__.endswith('Dispatcher'):79delself._owner.__dict__['Dispatcher']80else:81delself._owner.__dict__[self.__class__.__name__]82# Execute hook83ifhasattr(self,'plugout'):84returnself.plugout()85delself._owner
89"""90 Factory Method for object creation9192 Use this instead of directly initializing the class in order to make93 unit testing easier. For testing, this method can be patched to inject94 mock objects.95 """96returncls(*args,**kwargs)
PlugIn(self,
owner)
Attach to owner and register ourself and our _exported_methods in it.
If defined by a subclass, call self.plugin(owner) to execute hook
code after plugging
PlugOut(self)
Unregister our _exported_methods from owner and detach from it.
If defined by a subclass, call self.plugout() after unplugging to execute
hook code
Attach to owner and register ourself and our _exported_methods in it.
If defined by a subclass, call self.plugin(owner) to execute hook
code after plugging
Unregister our _exported_methods from owner and detach from it.
If defined by a subclass, call self.plugout() after unplugging to execute
hook code
get_instance(cls,
*args,
**kwargs) Class Method
Factory Method for object creation
Use this instead of directly initializing the class in order to make
unit testing easier. For testing, this method can be patched to inject
mock objects.
Protocol module contains tools that are needed for processing of xmpp-related
data structures, including jabber-objects like JID or different stanzas and
sub- stanzas) handling routines
{'urn:ietf:params:xml:ns:xmpp-sasl aborted': ['','','The receiving entity acknowledges an <abort/> element sent by the initiating entity; sent in reply to the <abort/> element.'],'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding': ['','','The data pro...
1## protocol.py 2## 3## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 4## 5## This program is free software; you can redistribute it and/or modify 6## it under the terms of the GNU General Public License as published by 7## the Free Software Foundation; either version 2, or (at your option) 8## any later version. 9## 10## This program is distributed in the hope that it will be useful, 11## but WITHOUT ANY WARRANTY; without even the implied warranty of 12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13## GNU General Public License for more details. 14 15# $Id: protocol.py,v 1.52 2006/01/09 22:08:57 normanr Exp $ 16 17""" 18Protocol module contains tools that are needed for processing of xmpp-related 19data structures, including jabber-objects like JID or different stanzas and 20sub- stanzas) handling routines 21""" 22 23fromsimplexmlimportNode,NodeBuilder 24importtime 25importstring 26importhashlib 27
32 33NS_ACTIVITY='http://jabber.org/protocol/activity'# XEP-0108 34NS_ADDRESS='http://jabber.org/protocol/address'# XEP-0033 35NS_AGENTS='jabber:iq:agents' 36NS_AMP='http://jabber.org/protocol/amp' 37NS_AMP_ERRORS=NS_AMP+'#errors' 38NS_ARCHIVE='urn:xmpp:archive'# XEP-0136 39NS_ARCHIVE_AUTO=NS_ARCHIVE+':auto'# XEP-0136 40NS_ARCHIVE_MANAGE=NS_ARCHIVE+':manage'# XEP-0136 41NS_ARCHIVE_MANUAL=NS_ARCHIVE+':manual'# XEP-0136 42NS_ARCHIVE_PREF=NS_ARCHIVE+':pref' 43NS_ATOM='http://www.w3.org/2005/Atom' 44NS_ATTENTION='urn:xmpp:attention:0'# XEP-0224 45NS_AUTH='jabber:iq:auth' 46NS_AVATAR='http://www.xmpp.org/extensions/xep-0084.html#ns-metadata' 47NS_BIND='urn:ietf:params:xml:ns:xmpp-bind' 48NS_BLOCKING='urn:xmpp:blocking'# XEP-0191 49NS_BOB='urn:xmpp:bob'# XEP-0231 50NS_BOOKMARKS='storage:bookmarks'# XEP-0048 51NS_BROWSE='jabber:iq:browse' 52NS_BROWSING='http://jabber.org/protocol/browsing'# XEP-0195 53NS_BYTESTREAM='http://jabber.org/protocol/bytestreams'# XEP-0065 54NS_CAPS='http://jabber.org/protocol/caps'# XEP-0115 55NS_CAPTCHA='urn:xmpp:captcha'# XEP-0158 56NS_CARBONS='urn:xmpp:carbons:2'# XEP-0280 57NS_CHATSTATES='http://jabber.org/protocol/chatstates'# XEP-0085 58NS_CHATTING='http://jabber.org/protocol/chatting'# XEP-0194 59NS_CLIENT='jabber:client' 60NS_CONDITIONS='urn:xmpp:muc:conditions:0'# XEP-0306 61NS_COMMANDS='http://jabber.org/protocol/commands' 62NS_COMPONENT_ACCEPT='jabber:component:accept' 63NS_COMPONENT_1='http://jabberd.jabberstudio.org/ns/component/1.0' 64NS_COMPRESS='http://jabber.org/protocol/compress'# XEP-0138 65NS_CONFERENCE='jabber:x:conference' 66NS_CORRECT='urn:xmpp:message-correct:0'# XEP-0308 67NS_DATA='jabber:x:data'# XEP-0004 68NS_DATA_MEDIA='urn:xmpp:media-element'# XEP-0221 69NS_DELAY='jabber:x:delay' 70NS_DELAY2='urn:xmpp:delay' 71NS_DIALBACK='jabber:server:dialback' 72NS_DISCO='http://jabber.org/protocol/disco' 73NS_DISCO_INFO=NS_DISCO+'#info' 74NS_DISCO_ITEMS=NS_DISCO+'#items' 75NS_ENCRYPTED='jabber:x:encrypted'# XEP-0027 76NS_ESESSION='http://www.xmpp.org/extensions/xep-0116.html#ns' 77NS_ESESSION_INIT='http://www.xmpp.org/extensions/xep-0116.html#ns-init'# XEP-0116 78NS_EVENT='jabber:x:event'# XEP-0022 79NS_FEATURE='http://jabber.org/protocol/feature-neg' 80NS_FILE='http://jabber.org/protocol/si/profile/file-transfer'# XEP-0096 81NS_FORWARD='urn:xmpp:forward:0'# XEP-0297 82NS_GAMING='http://jabber.org/protocol/gaming'# XEP-0196 83NS_GATEWAY='jabber:iq:gateway'# XEP-0100 84NS_GEOLOC='http://jabber.org/protocol/geoloc'# XEP-0080 85NS_GROUPCHAT='gc-1.0' 86NS_HTTP_AUTH='http://jabber.org/protocol/http-auth'# XEP-0070 87NS_HTTP_BIND='http://jabber.org/protocol/httpbind'# XEP-0124 88NS_IBB='http://jabber.org/protocol/ibb' 89NS_INVISIBLE='presence-invisible'# Jabberd2 90NS_IQ='iq'# Jabberd2 91NS_JINGLE='urn:xmpp:jingle:1'# XEP-0166 92NS_JINGLE_ERRORS='urn:xmpp:jingle:errors:1'# XEP-0166 93NS_JINGLE_RTP='urn:xmpp:jingle:apps:rtp:1'# XEP-0167 94NS_JINGLE_RTP_AUDIO='urn:xmpp:jingle:apps:rtp:audio'# XEP-0167 95NS_JINGLE_RTP_VIDEO='urn:xmpp:jingle:apps:rtp:video'# XEP-0167 96NS_JINGLE_FILE_TRANSFER='urn:xmpp:jingle:apps:file-transfer:3'# XEP-0234 97NS_JINGLE_XTLS='urn:xmpp:jingle:security:xtls:0'# XTLS: EXPERIMENTAL security layer of jingle 98NS_JINGLE_RAW_UDP='urn:xmpp:jingle:transports:raw-udp:1'# XEP-0177 99NS_JINGLE_ICE_UDP='urn:xmpp:jingle:transports:ice-udp:1'# XEP-0176 100NS_JINGLE_BYTESTREAM='urn:xmpp:jingle:transports:s5b:1'# XEP-0260 101NS_JINGLE_IBB='urn:xmpp:jingle:transports:ibb:1'# XEP-0261 102NS_LAST='jabber:iq:last' 103NS_LOCATION='http://jabber.org/protocol/geoloc'# XEP-0080 104NS_MAM='urn:xmpp:mam:tmp'# XEP-0313 105NS_MESSAGE='message'# Jabberd2 106NS_MOOD='http://jabber.org/protocol/mood'# XEP-0107 107NS_MUC='http://jabber.org/protocol/muc' 108NS_MUC_USER=NS_MUC+'#user' 109NS_MUC_ADMIN=NS_MUC+'#admin' 110NS_MUC_OWNER=NS_MUC+'#owner' 111NS_MUC_UNIQUE=NS_MUC+'#unique' 112NS_MUC_CONFIG=NS_MUC+'#roomconfig' 113NS_NICK='http://jabber.org/protocol/nick'# XEP-0172 114NS_OFFLINE='http://www.jabber.org/jeps/jep-0030.html'# XEP-0013 115NS_PHYSLOC='http://jabber.org/protocol/physloc'# XEP-0112 116NS_PING='urn:xmpp:ping'# XEP-0199 117NS_PRESENCE='presence'# Jabberd2 118NS_PRIVACY='jabber:iq:privacy' 119NS_PRIVATE='jabber:iq:private' 120NS_PROFILE='http://jabber.org/protocol/profile'# XEP-0154 121NS_PUBSUB='http://jabber.org/protocol/pubsub'# XEP-0060 122NS_PUBSUB_EVENT='http://jabber.org/protocol/pubsub#event' 123NS_PUBSUB_PUBLISH_OPTIONS=NS_PUBSUB+'#publish-options'# XEP-0060 124NS_PUBSUB_OWNER='http://jabber.org/protocol/pubsub#owner'# XEP-0060 125NS_REGISTER='jabber:iq:register' 126NS_ROSTER='jabber:iq:roster' 127NS_ROSTERNOTES='storage:rosternotes' 128NS_ROSTERX='http://jabber.org/protocol/rosterx'# XEP-0144 129NS_ROSTER_VER='urn:xmpp:features:rosterver'# XEP-0273 130NS_RPC='jabber:iq:rpc'# XEP-0009 131NS_RSM='http://jabber.org/protocol/rsm' 132NS_SASL='urn:ietf:params:xml:ns:xmpp-sasl' 133NS_SECLABEL='urn:xmpp:sec-label:0' 134NS_SECLABEL_CATALOG='urn:xmpp:sec-label:catalog:2' 135NS_SEARCH='jabber:iq:search' 136NS_SERVER='jabber:server' 137NS_SESSION='urn:ietf:params:xml:ns:xmpp-session' 138NS_SI='http://jabber.org/protocol/si'# XEP-0096 139NS_SI_PUB='http://jabber.org/protocol/sipub'# XEP-0137 140NS_SIGNED='jabber:x:signed'# XEP-0027 141NS_SSN='urn:xmpp:ssn'# XEP-0155 142NS_STANZA_CRYPTO='http://www.xmpp.org/extensions/xep-0200.html#ns'# XEP-0200 143NS_STANZAS='urn:ietf:params:xml:ns:xmpp-stanzas' 144NS_STREAM='http://affinix.com/jabber/stream' 145NS_STREAMS='http://etherx.jabber.org/streams' 146NS_TIME='jabber:iq:time'# XEP-0900 147NS_TIME_REVISED='urn:xmpp:time'# XEP-0202 148NS_TLS='urn:ietf:params:xml:ns:xmpp-tls' 149NS_TUNE='http://jabber.org/protocol/tune'# XEP-0118 150NS_VACATION='http://jabber.org/protocol/vacation' 151NS_VCARD='vcard-temp' 152NS_GMAILNOTIFY='google:mail:notify' 153NS_GTALKSETTING='google:setting' 154NS_VCARD_UPDATE=NS_VCARD+':x:update' 155NS_VERSION='jabber:iq:version' 156NS_VIEWING='http://jabber.org/protocol/viewing'# XEP--197 157NS_WAITINGLIST='http://jabber.org/protocol/waitinglist'# XEP-0130 158NS_XHTML_IM='http://jabber.org/protocol/xhtml-im'# XEP-0071 159NS_XHTML='http://www.w3.org/1999/xhtml'# " 160NS_X_OOB='jabber:x:oob'# XEP-0066 161NS_DATA_LAYOUT='http://jabber.org/protocol/xdata-layout'# XEP-0141 162NS_DATA_VALIDATE='http://jabber.org/protocol/xdata-validate'# XEP-0122 163NS_XMPP_STREAMS='urn:ietf:params:xml:ns:xmpp-streams' 164NS_RECEIPTS='urn:xmpp:receipts' 165NS_PUBKEY_PUBKEY='urn:xmpp:pubkey:2'# XEP-0189 166NS_PUBKEY_REVOKE='urn:xmpp:revoke:2' 167NS_PUBKEY_ATTEST='urn:xmpp:attest:2' 168NS_STREAM_MGMT='urn:xmpp:sm:2'# XEP-198 169NS_HASHES='urn:xmpp:hashes:1'# XEP-300 170NS_HASHES_MD5='urn:xmpp:hash-function-textual-names:md5' 171NS_HASHES_SHA1='urn:xmpp:hash-function-textual-names:sha-1' 172NS_HASHES_SHA256='urn:xmpp:hash-function-textual-names:sha-256' 173NS_HASHES_SHA512='urn:xmpp:hash-function-textual-names:sha-512' 174 175#xmpp_stream_error_conditions = ''' 176#bad-format -- -- -- The entity has sent XML that cannot be processed. 177#bad-namespace-prefix -- -- -- The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix. 178#conflict -- -- -- The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream. 179#connection-timeout -- -- -- The entity has not generated any traffic over the stream for some period of time. 180#host-gone -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server. 181#host-unknown -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server. 182#improper-addressing -- -- -- A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value). 183#internal-server-error -- -- -- The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream. 184#invalid-from -- cancel -- -- The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization. 185#invalid-id -- -- -- The stream ID or dialback ID is invalid or does not match an ID previously provided. 186#invalid-namespace -- -- -- The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback". 187#invalid-xml -- -- -- The entity has sent invalid XML over the stream to a server that performs validation. 188#not-authorized -- -- -- The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation. 189#policy-violation -- -- -- The entity has violated some local service policy. 190#remote-connection-failed -- -- -- The server is unable to properly connect to a remote resource that is required for authentication or authorization. 191#resource-constraint -- -- -- The server lacks the system resources necessary to service the stream. 192#restricted-xml -- -- -- The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character. 193#see-other-host -- -- -- The server will not provide service to the initiating entity but is redirecting traffic to another host. 194#system-shutdown -- -- -- The server is being shut down and all active streams are being closed. 195#undefined-condition -- -- -- The error condition is not one of those defined by the other conditions in this list. 196#unsupported-encoding -- -- -- The initiating entity has encoded the stream in an encoding that is not supported by the server. 197#unsupported-stanza-type -- -- -- The initiating entity has sent a first-level child of the stream that is not supported by the server. 198#unsupported-version -- -- -- The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server. 199#xml-not-well-formed -- -- -- The initiating entity has sent XML that is not well-formed.''' 200 201#xmpp_stanza_error_conditions = ''' 202#bad-request -- 400 -- modify -- The sender has sent XML that is malformed or that cannot be processed. 203#conflict -- 409 -- cancel -- Access cannot be granted because an existing resource or session exists with the same name or address. 204#feature-not-implemented -- 501 -- cancel -- The feature requested is not implemented by the recipient or server and therefore cannot be processed. 205#forbidden -- 403 -- auth -- The requesting entity does not possess the required permissions to perform the action. 206#gone -- 302 -- modify -- The recipient or server can no longer be contacted at this address. 207#internal-server-error -- 500 -- wait -- The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error. 208#item-not-found -- 404 -- cancel -- The addressed JID or item requested cannot be found. 209#jid-malformed -- 400 -- modify -- The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme. 210#not-acceptable -- 406 -- cancel -- The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server. 211#not-allowed -- 405 -- cancel -- The recipient or server does not allow any entity to perform the action. 212#not-authorized -- 401 -- auth -- The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials. 213#payment-required -- 402 -- auth -- The requesting entity is not authorized to access the requested service because payment is required. 214#recipient-unavailable -- 404 -- wait -- The intended recipient is temporarily unavailable. 215#redirect -- 302 -- modify -- The recipient or server is redirecting requests for this information to another entity. 216#registration-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because registration is required. 217#remote-server-not-found -- 404 -- cancel -- A remote server or service specified as part or all of the JID of the intended recipient does not exist. 218#remote-server-timeout -- 504 -- wait -- A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time. 219#resource-constraint -- 500 -- wait -- The server or recipient lacks the system resources necessary to service the request. 220#service-unavailable -- 503 -- cancel -- The server or recipient does not currently provide the requested service. 221#subscription-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because a subscription is required. 222#undefined-condition -- 500 -- -- Undefined Condition 223#unexpected-request -- 400 -- wait -- The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).''' 224 225#sasl_error_conditions = ''' 226#aborted -- -- -- The receiving entity acknowledges an <abort/> element sent by the initiating entity; sent in reply to the <abort/> element. 227#incorrect-encoding -- -- -- The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a <response/> element or an <auth/> element with initial response data. 228#invalid-authzid -- -- -- The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a <response/> element or an <auth/> element with initial response data. 229#invalid-mechanism -- -- -- The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an <auth/> element. 230#mechanism-too-weak -- -- -- The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a <response/> element or an <auth/> element with initial response data. 231#not-authorized -- -- -- The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a <response/> element or an <auth/> element with initial response data. 232#temporary-auth-failure -- -- -- The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an <auth/> element or <response/> element.''' 233 234#ERRORS, _errorcodes, loc = {}, {}, {} 235#for ns, errname, errpool in ((NS_XMPP_STREAMS, 'STREAM', 236#xmpp_stream_error_conditions), (NS_STANZAS, 'ERR', xmpp_stanza_error_conditions), 237#(NS_SASL, 'SASL', sasl_error_conditions)): 238#for err in errpool.split('\n')[1:]: 239#cond, code, typ, text = err.split(' -- ') 240#name = errname + '_' + ascii_upper(cond).replace('-', '_') 241#locals()[name] = ns + ' ' + cond 242#loc[name] = ns + ' ' + cond 243#ERRORS[ns + ' ' + cond] = [code, typ, text] 244#if code: 245#_errorcodes[code] = cond 246#del ns, errname, errpool, err, cond, code, typ, text 247#import pprint 248#pprint.pprint(ERRORS) 249#pprint.pprint(_errorcodes) 250#for (k, v) in loc.items(): 251#print('%s = \'%s\'' % (k, v)) 252 253ERRORS={ 254'urn:ietf:params:xml:ns:xmpp-sasl aborted':['', 255'', 256'The receiving entity acknowledges an <abort/> element sent by the initiating entity; sent in reply to the <abort/> element.'], 257'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding':['', 258'', 259'The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a <response/> element or an <auth/> element with initial response data.'], 260'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid':['', 261'', 262'The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a <response/> element or an <auth/> element with initial response data.'], 263'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism':['', 264'', 265'The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an <auth/> element.'], 266'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak':['', 267'', 268'The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a <response/> element or an <auth/> element with initial response data.'], 269'urn:ietf:params:xml:ns:xmpp-sasl not-authorized':['', 270'', 271'The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a <response/> element or an <auth/> element with initial response data.'], 272'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure':['', 273'', 274'The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an <auth/> element or <response/> element.'], 275'urn:ietf:params:xml:ns:xmpp-stanzas bad-request':['400', 276'modify', 277'The sender has sent XML that is malformed or that cannot be processed.'], 278'urn:ietf:params:xml:ns:xmpp-stanzas conflict':['409', 279'cancel', 280'Access cannot be granted because an existing resource or session exists with the same name or address.'], 281'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented':['501', 282'cancel', 283'The feature requested is not implemented by the recipient or server and therefore cannot be processed.'], 284'urn:ietf:params:xml:ns:xmpp-stanzas forbidden':['403', 285'auth', 286'The requesting entity does not possess the required permissions to perform the action.'], 287'urn:ietf:params:xml:ns:xmpp-stanzas gone':['302', 288'modify', 289'The recipient or server can no longer be contacted at this address.'], 290'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error':['500', 291'wait', 292'The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error.'], 293'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found':['404', 294'cancel', 295'The addressed JID or item requested cannot be found.'], 296'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed':['400', 297'modify', 298"The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme."], 299'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable':['406', 300'cancel', 301'The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server.'], 302'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed':['405', 303'cancel', 304'The recipient or server does not allow any entity to perform the action.'], 305'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized':['401', 306'auth', 307'The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials.'], 308'urn:ietf:params:xml:ns:xmpp-stanzas payment-required':['402', 309'auth', 310'The requesting entity is not authorized to access the requested service because payment is required.'], 311'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable':['404', 312'wait', 313'The intended recipient is temporarily unavailable.'], 314'urn:ietf:params:xml:ns:xmpp-stanzas redirect':['302', 315'modify', 316'The recipient or server is redirecting requests for this information to another entity.'], 317'urn:ietf:params:xml:ns:xmpp-stanzas registration-required':['407', 318'auth', 319'The requesting entity is not authorized to access the requested service because registration is required.'], 320'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found':['404', 321'cancel', 322'A remote server or service specified as part or all of the JID of the intended recipient does not exist.'], 323'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout':['504', 324'wait', 325'A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time.'], 326'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint':['500', 327'wait', 328'The server or recipient lacks the system resources necessary to service the request.'], 329'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable':['503', 330'cancel', 331'The server or recipient does not currently provide the requested service.'], 332'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required':['407', 333'auth', 334'The requesting entity is not authorized to access the requested service because a subscription is required.'], 335'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition':['500', 336'', 337'Undefined Condition'], 338'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request':['400', 339'wait', 340'The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).'], 341'urn:ietf:params:xml:ns:xmpp-streams bad-format':['', 342'', 343'The entity has sent XML that cannot be processed.'], 344'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix':['', 345'', 346'The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix.'], 347'urn:ietf:params:xml:ns:xmpp-streams conflict':['', 348'', 349'The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream.'], 350'urn:ietf:params:xml:ns:xmpp-streams connection-timeout':['', 351'', 352'The entity has not generated any traffic over the stream for some period of time.'], 353'urn:ietf:params:xml:ns:xmpp-streams host-gone':['', 354'', 355"The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server."], 356'urn:ietf:params:xml:ns:xmpp-streams host-unknown':['', 357'', 358"The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server."], 359'urn:ietf:params:xml:ns:xmpp-streams improper-addressing':['', 360'', 361"A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value)."], 362'urn:ietf:params:xml:ns:xmpp-streams internal-server-error':['', 363'', 364'The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream.'], 365'urn:ietf:params:xml:ns:xmpp-streams invalid-from':['cancel', 366'', 367"The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization."], 368'urn:ietf:params:xml:ns:xmpp-streams invalid-id':['', 369'', 370'The stream ID or dialback ID is invalid or does not match an ID previously provided.'], 371'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace':['', 372'', 373'The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback".'], 374'urn:ietf:params:xml:ns:xmpp-streams invalid-xml':['', 375'', 376'The entity has sent invalid XML over the stream to a server that performs validation.'], 377'urn:ietf:params:xml:ns:xmpp-streams not-authorized':['', 378'', 379'The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation.'], 380'urn:ietf:params:xml:ns:xmpp-streams policy-violation':['', 381'', 382'The entity has violated some local service policy.'], 383'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed':['', 384'', 385'The server is unable to properly connect to a remote resource that is required for authentication or authorization.'], 386'urn:ietf:params:xml:ns:xmpp-streams resource-constraint':['', 387'', 388'The server lacks the system resources necessary to service the stream.'], 389'urn:ietf:params:xml:ns:xmpp-streams restricted-xml':['', 390'', 391'The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character.'], 392'urn:ietf:params:xml:ns:xmpp-streams see-other-host':['', 393'', 394'The server will not provide service to the initiating entity but is redirecting traffic to another host.'], 395'urn:ietf:params:xml:ns:xmpp-streams system-shutdown':['', 396'', 397'The server is being shut down and all active streams are being closed.'], 398'urn:ietf:params:xml:ns:xmpp-streams undefined-condition':['', 399'', 400'The error condition is not one of those defined by the other conditions in this list.'], 401'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding':['', 402'', 403'The initiating entity has encoded the stream in an encoding that is not supported by the server.'], 404'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type':['', 405'', 406'The initiating entity has sent a first-level child of the stream that is not supported by the server.'], 407'urn:ietf:params:xml:ns:xmpp-streams unsupported-version':['', 408'', 409"The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server."], 410'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed':['', 411'', 412'The initiating entity has sent XML that is not well-formed.'] 413} 414 415_errorcodes={ 416'302':'redirect', 417'400':'unexpected-request', 418'401':'not-authorized', 419'402':'payment-required', 420'403':'forbidden', 421'404':'remote-server-not-found', 422'405':'not-allowed', 423'406':'not-acceptable', 424'407':'subscription-required', 425'409':'conflict', 426'500':'undefined-condition', 427'501':'feature-not-implemented', 428'503':'service-unavailable', 429'504':'remote-server-timeout', 430'cancel':'invalid-from' 431} 432 433STREAM_NOT_AUTHORIZED='urn:ietf:params:xml:ns:xmpp-streams not-authorized' 434STREAM_REMOTE_CONNECTION_FAILED='urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed' 435SASL_MECHANISM_TOO_WEAK='urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak' 436STREAM_XML_NOT_WELL_FORMED='urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed' 437ERR_JID_MALFORMED='urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed' 438STREAM_SEE_OTHER_HOST='urn:ietf:params:xml:ns:xmpp-streams see-other-host' 439STREAM_BAD_NAMESPACE_PREFIX='urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix' 440ERR_SERVICE_UNAVAILABLE='urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable' 441STREAM_CONNECTION_TIMEOUT='urn:ietf:params:xml:ns:xmpp-streams connection-timeout' 442STREAM_UNSUPPORTED_VERSION='urn:ietf:params:xml:ns:xmpp-streams unsupported-version' 443STREAM_IMPROPER_ADDRESSING='urn:ietf:params:xml:ns:xmpp-streams improper-addressing' 444STREAM_UNDEFINED_CONDITION='urn:ietf:params:xml:ns:xmpp-streams undefined-condition' 445SASL_NOT_AUTHORIZED='urn:ietf:params:xml:ns:xmpp-sasl not-authorized' 446ERR_GONE='urn:ietf:params:xml:ns:xmpp-stanzas gone' 447SASL_TEMPORARY_AUTH_FAILURE='urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure' 448ERR_REMOTE_SERVER_NOT_FOUND='urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found' 449ERR_UNEXPECTED_REQUEST='urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request' 450ERR_RECIPIENT_UNAVAILABLE='urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable' 451ERR_CONFLICT='urn:ietf:params:xml:ns:xmpp-stanzas conflict' 452STREAM_SYSTEM_SHUTDOWN='urn:ietf:params:xml:ns:xmpp-streams system-shutdown' 453STREAM_BAD_FORMAT='urn:ietf:params:xml:ns:xmpp-streams bad-format' 454ERR_SUBSCRIPTION_REQUIRED='urn:ietf:params:xml:ns:xmpp-stanzas subscription-required' 455STREAM_INTERNAL_SERVER_ERROR='urn:ietf:params:xml:ns:xmpp-streams internal-server-error' 456ERR_NOT_AUTHORIZED='urn:ietf:params:xml:ns:xmpp-stanzas not-authorized' 457SASL_ABORTED='urn:ietf:params:xml:ns:xmpp-sasl aborted' 458ERR_REGISTRATION_REQUIRED='urn:ietf:params:xml:ns:xmpp-stanzas registration-required' 459ERR_INTERNAL_SERVER_ERROR='urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error' 460SASL_INCORRECT_ENCODING='urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding' 461STREAM_HOST_GONE='urn:ietf:params:xml:ns:xmpp-streams host-gone' 462STREAM_POLICY_VIOLATION='urn:ietf:params:xml:ns:xmpp-streams policy-violation' 463STREAM_INVALID_XML='urn:ietf:params:xml:ns:xmpp-streams invalid-xml' 464STREAM_CONFLICT='urn:ietf:params:xml:ns:xmpp-streams conflict' 465STREAM_RESOURCE_CONSTRAINT='urn:ietf:params:xml:ns:xmpp-streams resource-constraint' 466STREAM_UNSUPPORTED_ENCODING='urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding' 467ERR_NOT_ALLOWED='urn:ietf:params:xml:ns:xmpp-stanzas not-allowed' 468ERR_ITEM_NOT_FOUND='urn:ietf:params:xml:ns:xmpp-stanzas item-not-found' 469ERR_NOT_ACCEPTABLE='urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable' 470STREAM_INVALID_FROM='urn:ietf:params:xml:ns:xmpp-streams invalid-from' 471ERR_FEATURE_NOT_IMPLEMENTED='urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented' 472ERR_BAD_REQUEST='urn:ietf:params:xml:ns:xmpp-stanzas bad-request' 473STREAM_INVALID_ID='urn:ietf:params:xml:ns:xmpp-streams invalid-id' 474STREAM_HOST_UNKNOWN='urn:ietf:params:xml:ns:xmpp-streams host-unknown' 475ERR_UNDEFINED_CONDITION='urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition' 476SASL_INVALID_MECHANISM='urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism' 477STREAM_RESTRICTED_XML='urn:ietf:params:xml:ns:xmpp-streams restricted-xml' 478ERR_RESOURCE_CONSTRAINT='urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint' 479ERR_REMOTE_SERVER_TIMEOUT='urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout' 480SASL_INVALID_AUTHZID='urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid' 481ERR_PAYMENT_REQUIRED='urn:ietf:params:xml:ns:xmpp-stanzas payment-required' 482STREAM_INVALID_NAMESPACE='urn:ietf:params:xml:ns:xmpp-streams invalid-namespace' 483ERR_REDIRECT='urn:ietf:params:xml:ns:xmpp-stanzas redirect' 484STREAM_UNSUPPORTED_STANZA_TYPE='urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type' 485ERR_FORBIDDEN='urn:ietf:params:xml:ns:xmpp-stanzas forbidden' 486
615""" 616 JID can be specified as string (jid argument) or as separate parts 617 618 Examples: 619 JID('node@domain/resource') 620 JID(node='node',domain='domain.org') 621 """ 622ifnotjidandnotdomain: 623raiseValueError('JID must contain at least domain name') 624eliftype(jid)==type(self): 625self.node,self.domain=jid.node,jid.domain 626self.resource=jid.resource 627elifdomain: 628self.node,self.domain,self.resource=node,domain,resource 629else: 630ifjid.find('@')+1: 631self.node,jid=jid.split('@',1) 632else: 633self.node='' 634ifjid.find('/')+1: 635self.domain,self.resource=jid.split('/',1) 636else: 637self.domain,self.resource=jid,''
684""" 685 Compare the JID to another instance or to string for equality 686 """ 687try: 688other=JID(other) 689exceptValueError: 690return0 691returnself.resource==other.resourceand \ 692self.__str__(0)==other.__str__(0)
743""" 744 Constructor, name is the name of the stanza 745 i.e. 'message' or 'presence'or 'iq' 746 747 to is the value of 'to' attribure, 'typ' - 'type' attribute 748 frn - from attribure, attrs - other attributes mapping, 749 payload - same meaning as for simplexml payload definition 750 timestamp - the time value that needs to be stamped over stanza 751 xmlns - namespace of top stanza node 752 node - parsed or unparsed stana to be taken as prototype. 753 """ 754ifnotattrs: 755attrs={} 756ifto: 757attrs['to']=to 758iffrm: 759attrs['from']=frm 760iftyp: 761attrs['type']=typ 762Node.__init__(self,tag=name,attrs=attrs,payload=payload,node=node) 763ifnotnodeandxmlns: 764self.setNamespace(xmlns) 765ifself['to']: 766self.setTo(self['to']) 767ifself['from']: 768self.setFrom(self['from']) 769ifnodeandtype(self)==type(node)and \ 770self.__class__==node.__class__andself.attrs.has_key('id'): 771delself.attrs['id'] 772self.timestamp=None 773fordinself.getTags('delay',namespace=NS_DELAY2): 774try: 775ifd.getAttr('stamp')<self.getTimestamp2(): 776self.setTimestamp(d.getAttr('stamp')) 777exceptException: 778pass 779ifnotself.timestamp: 780forxinself.getTags('x',namespace=NS_DELAY): 781try: 782ifx.getAttr('stamp')<self.getTimestamp(): 783self.setTimestamp(x.getAttr('stamp')) 784exceptException: 785pass 786iftimestampisnotNone: 787self.setTimestamp(timestamp)# To auto-timestamp stanza just pass timestamp=''
808""" 809 Return the timestamp in the 'yyyymmddThhmmss' format 810 """ 811ifself.timestamp: 812returnself.timestamp 813returntime.strftime('%Y%m%dT%H:%M:%S',time.gmtime())
816""" 817 Return the timestamp in the 'yyyymmddThhmmss' format 818 """ 819ifself.timestamp: 820returnself.timestamp 821returntime.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
860""" 861 Return the error-condition (if present) or the textual description 862 of the error (otherwise) 863 """ 864errtag=self.getTag('error') 865iferrtag: 866fortaginerrtag.getChildren(): 867iftag.getName()!='text': 868returntag.getName() 869returnerrtag.getData()
872""" 873 Return the textual description of the error (if present) 874 or the error condition 875 """ 876errtag=self.getTag('error') 877iferrtag: 878fortaginerrtag.getChildren(): 879iftag.getName()=='text': 880returntag.getData() 881returnself.getError()
890""" 891 Return the status conditions list as defined in XEP-0306. 892 """ 893conds=[] 894condtag=self.getTag('conditions',namespace=NS_CONDITIONS) 895ifcondtag: 896fortagincondtag.getChildren(): 897conds.append(tag.getName()) 898returnconds
916""" 917 Set the timestamp. timestamp should be the yyyymmddThhmmss string 918 """ 919ifnotval: 920val=time.strftime('%Y%m%dT%H:%M:%S',time.gmtime()) 921self.timestamp=val 922self.setTag('x',{'stamp':self.timestamp},namespace=NS_DELAY)
925""" 926 Return the list of namespaces to which belongs the direct childs of element 927 """ 928props=[] 929forchildinself.getChildren(): 930prop=child.getNamespace() 931ifpropnotinprops: 932props.append(prop) 933returnprops
952""" 953 You can specify recipient, text of message, type of message any 954 additional attributes, sender of the message, any additional payload 955 (f.e. jabber:x:delay element) and namespace in one go. 956 957 Alternatively you can pass in the other XML object as the 'node' 958 parameted to replicate it as message 959 """ 960Protocol.__init__(self,'message',to=to,typ=typ,attrs=attrs,frm=frm, 961payload=payload,timestamp=timestamp,xmlns=xmlns,node=node) 962ifbody: 963self.setBody(body) 964ifxhtml: 965self.setXHTML(xhtml) 966ifsubjectisnotNone: 967self.setSubject(subject)
976""" 977 Return serialized xhtml-im element text of the message 978 979 TODO: Returning a DOM could make rendering faster. 980 """ 981xhtml=self.getTag('html') 982ifxhtml: 983ifxmllang: 984body=xhtml.getTag('body',attrs={'xml:lang':xmllang}) 985else: 986body=xhtml.getTag('body') 987returnstr(body) 988returnNone
1008"""1009 Sets the xhtml text of the message (XEP-0071). The parameter is the1010 "inner html" to the body.1011 """1012try:1013ifxmllang:1014dom=NodeBuilder('<body xmlns="%s" xml:lang="%s">%s</body>' \ 1015%(NS_XHTML,xmllang,val)).getDom()1016else:1017dom=NodeBuilder('<body xmlns="%s">%s</body>'%(NS_XHTML,1018val),0).getDom()1019ifself.getTag('html'):1020self.getTag('html').addChild(node=dom)1021else:1022self.setTag('html',namespace=NS_XHTML_IM).addChild(node=dom)1023exceptException,e:1024print"Error",e
1025# FIXME: log. we could not set xhtml (parse error, whatever)1026
1040"""1041 Builds and returns another message object with specified text. The to,1042 from, thread and type properties of new message are pre-set as reply to1043 this message1044 """1045m=Message(to=self.getFrom(),frm=self.getTo(),body=text,1046typ=self.getType())1047th=self.getThread()1048ifth:1049m.setThread(th)1050returnm
1053"""1054 Return the status code of the message (for groupchat config change)1055 """1056attrs=[]1057forxtaginself.getTags('x'):1058forchildinxtag.getTags('status'):1059attrs.append(child.getAttr('code'))1060returnattrs
1067"""1068 You can specify recipient, type of message, priority, show and status1069 values any additional attributes, sender of the presence, timestamp, any1070 additional payload (f.e. jabber:x:delay element) and namespace in one go.1071 Alternatively you can pass in the other XML object as the 'node'1072 parameted to replicate it as presence1073 """1074Protocol.__init__(self,'presence',to=to,typ=typ,attrs=attrs,frm=frm,1075payload=payload,timestamp=timestamp,xmlns=xmlns,node=node)1076ifpriority:1077self.setPriority(priority)1078ifshow:1079self.setShow(show)1080ifstatus:1081self.setStatus(status)
1172"""1173 Return the status code of the presence (for groupchat)1174 """1175attrs=[]1176forxtaginself.getTags('x'):1177forchildinxtag.getTags('status'):1178attrs.append(child.getAttr('code'))1179returnattrs
1188"""1189 You can specify type, query namespace any additional attributes,1190 recipient of the iq, sender of the iq, any additional payload (f.e.1191 jabber:x:data node) and namespace in one go.11921193 Alternatively you can pass in the other XML object as the 'node'1194 parameted to replicate it as an iq1195 """1196Protocol.__init__(self,'iq',to=to,typ=typ,attrs=attrs,frm=frm,1197xmlns=xmlns,node=node)1198ifpayload:1199self.setQueryPayload(payload)1200ifqueryNS:1201self.setQueryNS(queryNS)
1204"""1205 Return the IQ's child element if it exists, None otherwise.1206 """1207children=self.getChildren()1208ifchildrenandself.getType()!='error'and \ 1209children[0].getName()!='error':1210returnchildren[0]
1245"""1246 Change the name of the query node, creating it if needed. Keep the1247 existing name if none is given (use 'query' if it's a creation).1248 Return the query node.1249 """1250query=self.getQuery()1251ifqueryisNone:1252query=self.addChild('query')1253ifnameisnotNone:1254query.setName(name)1255returnquery
1276"""1277 Build and return another Iq object of specified type. The to, from and1278 query child node of new Iq are pre-set as reply to this Iq.1279 """1280iq=Iq(typ,to=self.getFrom(),frm=self.getTo(),1281attrs={'id':self.getID()})1282iq.setQuery(self.getQuery().getName()).setNamespace(self.getQueryNS())1283returniq
1286"""1287 Hash elements for various XEPs as defined in XEP-3001288 """12891290"""1291 RECOMENDED HASH USE:1292 Algorithm Support1293 MD2 MUST NOT1294 MD4 MUST NOT1295 MD5 MAY1296 SHA-1 MUST1297 SHA-256 MUST1298 SHA-512 SHOULD1299 """13001301supported=('md5','sha-1','sha-256','sha-512')1302
1309"""1310 Calculate the hash and add it. It is preferable doing it here1311 instead of doing it all over the place in Gajim.1312 """1313hl=None1314hash_=None1315# file_string can be a string or a file1316iftype(file_string)==str:# if it is a string1317ifalgo=='sha-1':1318hl=hashlib.sha1()1319elifalgo=='md5':1320hl=hashlib.md5()1321elifalgo=='sha-256':1322hl=hashlib.sha256()1323elifalgo=='sha-512':1324hl=hashlib.sha512()1325ifhl:1326hl.update(file_string)1327hash_=hl.hexdigest()1328else:# if it is a file1329ifalgo=='sha-1':1330hl=hashlib.sha1()1331elifalgo=='md5':1332hl=hashlib.md5()1333elifalgo=='sha-256':1334hl=hashlib.sha256()1335elifalgo=='sha-512':1336hl=hashlib.sha512()1337ifhl:1338forlineinfile_string:1339hl.update(line)1340hash_=hl.hexdigest()1341returnhash_
1376"""1377 XMPP-style error element13781379 In the case of stanza error should be attached to XMPP stanza.1380 In the case of stream-level errors should be used separately.1381 """1382
1384"""1385 Mandatory parameter: name - name of error condition.1386 Optional parameters: code, typ, text.1387 Used for backwards compartibility with older jabber protocol.1388 """1389ifnameinERRORS:1390cod,type_,txt=ERRORS[name]1391ns=name.split()[0]1392else:1393cod,ns,type_,txt='500',NS_STANZAS,'cancel',''1394iftyp:1395type_=typ1396ifcode:1397cod=code1398iftext:1399txt=text1400Node.__init__(self,'error',{},[Node(name)])1401iftype_:1402self.setAttr('type',type_)1403ifnotcod:1404self.setName('stream:error')1405iftxt:1406self.addChild(node=Node(ns+' text',{},[txt]))1407ifcod:1408self.setAttr('code',cod)
1416"""1417 Create error reply basing on the received 'node' stanza and the 'error'1418 error condition14191420 If the 'node' is not the received stanza but locally created ('to' and1421 'from' fields needs not swapping) specify the 'reply' argument as false.1422 """1423ifreply:1424Protocol.__init__(self,to=node.getFrom(),frm=node.getTo(),node=node)1425else:1426Protocol.__init__(self,node=node)1427self.setError(error)1428ifnode.getType()=='error':1429self.__str__=self.__dupstr__
1432"""1433 Dummy function used as preventor of creating error node in reply to error1434 node. I.e. you will not be able to serialise "double" error into string.1435 """1436return''
1439"""1440 This class is used in the DataForm class to describe the single data item14411442 If you are working with jabber:x:data (XEP-0004, XEP-0068, XEP-0122) then1443 you will need to work with instances of this class.1444 """1445
1448"""1449 Create new data field of specified name,value and type14501451 Also 'required','desc' and 'options' fields can be set. Alternatively1452 other XML object can be passed in as the 'node' parameted1453 to replicate it as a new datafiled.1454 """1455Node.__init__(self,'field',node=node)1456ifname:1457self.setVar(name)1458ifisinstance(value,(list,tuple)):1459self.setValues(value)1460elifvalue:1461self.setValue(value)1462iftyp:1463self.setType(typ)1464elifnottypandnotnode:1465self.setType('text-single')1466ifrequired:1467self.setRequired(required)1468ifdesc:1469self.setDesc(desc)1470ifoptions:1471self.setOptions(options)
1474"""1475 Change the state of the 'required' flag1476 """1477ifreq:1478self.setTag('required')1479else:1480try:1481self.delChild('required')1482exceptValueError:1483return
1513"""1514 Set the values of this field as values-list. Replaces all previous filed1515 values! If you need to just add a value - use addValue method1516 """1517whileself.getTag('value'):1518self.delChild('value')1519forvalinlst:1520self.addValue(val)
1529"""1530 Return the list of values associated with this field1531 """1532ret=[]1533fortaginself.getTags('value'):1534ret.append(tag.getData())1535returnret
1538"""1539 Return label-option pairs list associated with this field1540 """1541ret=[]1542fortaginself.getTags('option'):1543ret.append([tag.getAttr('label'),tag.getTagData('value')])1544returnret
1547"""1548 Set label-option pairs list associated with this field1549 """1550whileself.getTag('option'):1551self.delChild('option')1552foroptinlst:1553self.addOption(opt)
1556"""1557 Add one more label-option pair to this field1558 """1559ifisinstance(opt,basestring):1560self.addChild('option').setTagData('value',opt)1561else:1562self.addChild('option',{'label':opt[0]}).setTagData('value',1563opt[1])
1590"""1591 Used for manipulating dataforms in XMPP15921593 Relevant XEPs: 0004, 0068, 0122. Can be used in disco, pub-sub and many1594 other applications.1595 """
1597"""1598 Create new dataform of type 'typ'. 'data' is the list of DataField1599 instances that this dataform contains, 'title' - the title string. You1600 can specify the 'node' argument as the other node to be used as base for1601 constructing this dataform16021603 title and instructions is optional and SHOULD NOT contain newlines.1604 Several instructions MAY be present.1605 'typ' can be one of ('form' | 'submit' | 'cancel' | 'result' )1606 'typ' of reply iq can be ( 'result' | 'set' | 'set' | 'result' ) respectively.1607 'cancel' form can not contain any fields. All other forms contains AT LEAST one field.1608 'title' MAY be included in forms of type "form" and "result"1609 """1610Node.__init__(self,'x',node=node)1611ifnode:1612newkids=[]1613forninself.getChildren():1614ifn.getName()=='field':1615newkids.append(DataField(node=n))1616else:1617newkids.append(n)1618self.kids=newkids1619iftyp:1620self.setType(typ)1621self.setNamespace(NS_DATA)1622iftitle:1623self.setTitle(title)1624ifisinstance(data,dict):1625newdata=[]1626fornameindata.keys():1627newdata.append(DataField(name,data[name]))1628data=newdata1629forchildindata:1630ifisinstance(child,basestring):1631self.addInstructions(child)1632elifchild.__class__.__name__=='DataField':1633self.kids.append(child)1634else:1635self.kids.append(DataField(node=child))
1686"""1687 Create if nessessary or get the existing datafield object with name1688 'name' and return it1689 """1690f=self.getField(name)1691iff:1692returnf1693returnself.addChild(node=DataField(name))
1696"""1697 Represent dataform as simple dictionary mapping of datafield names to1698 their values1699 """1700ret={}1701forfieldinself.getTags('field'):1702name=field.getAttr('var')1703typ=field.getType()1704ifisinstance(typ,basestring)andtyp.endswith('-multi'):1705val=[]1706foriinfield.getTags('value'):1707val.append(i.getData())1708else:1709val=field.getTagData('value')1710ret[name]=val1711ifself.getTag('instructions'):1712ret['instructions']=self.getInstructions()1713returnret
1716"""1717 Simple dictionary interface for getting datafields values by their names1718 """1719item=self.getField(name)1720ifitem:1721returnitem.getValue()1722raiseIndexError('No such field')
__init__(self,
nsp='urn:xmpp:sm:2')
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
__init__(self,
attrs={},
payload=[],
node=None)
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
setValues(self,
lst)
Set the values of this field as values-list. Replaces all previous filed
values! If you need to just add a value - use addValue method
Create new data field of specified name,value and type
Also 'required','desc' and 'options' fields can be set. Alternatively
other XML object can be passed in as the 'node' parameted
to replicate it as a new datafiled.
__init__(self,
typ=None,
data=[],
title=None,
node=None)
Create new dataform of type 'typ'. 'data' is the list of DataField
instances that this dataform contains, 'title' - the title string. You
can specify the 'node' argument as the other node to be used as base for
constructing this dataform
Create new dataform of type 'typ'. 'data' is the list of DataField
instances that this dataform contains, 'title' - the title string. You
can specify the 'node' argument as the other node to be used as base for
constructing this dataform
title and instructions is optional and SHOULD NOT contain newlines.
Several instructions MAY be present.
'typ' can be one of ('form' | 'submit' | 'cancel' | 'result' )
'typ' of reply iq can be ( 'result' | 'set' | 'set' | 'result' ) respectively.
'cancel' form can not contain any fields. All other forms contains AT LEAST one field.
'title' MAY be included in forms of type "form" and "result"
__dupstr__(self,
dup1=None,
dup2=None)
Dummy function used as preventor of creating error node in reply to error
node. I.e. you will not be able to serialise "double" error into string.
__init__(self,
name,
code=None,
typ=None,
text=None)
Mandatory parameter: name - name of error condition.
Optional parameters: code, typ, text.
Used for backwards compartibility with older jabber protocol.
Mandatory parameter: name - name of error condition.
Optional parameters: code, typ, text.
Used for backwards compartibility with older jabber protocol.
__init__(self,
nsp='urn:xmpp:hashes:1')
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
__init__(self,
typ=None,
queryNS=None,
attrs={},
to=None,
frm=None,
payload=[],
xmlns='jabber:client',
node=None)
You can specify type, query namespace any additional attributes,
recipient of the iq, sender of the iq, any additional payload (f.e.
jabber:x:data node) and namespace in one go.
setQuery(self,
name=None)
Change the name of the query node, creating it if needed. Keep the
existing name if none is given (use 'query' if it's a creation).
Return the query node.
buildReply(self,
typ)
Build and return another Iq object of specified type. The to, from and
query child node of new Iq are pre-set as reply to this Iq.
You can specify type, query namespace any additional attributes,
recipient of the iq, sender of the iq, any additional payload (f.e.
jabber:x:data node) and namespace in one go.
Alternatively you can pass in the other XML object as the 'node'
parameted to replicate it as an iq
Change the name of the query node, creating it if needed. Keep the
existing name if none is given (use 'query' if it's a creation).
Return the query node.
__init__(self,
to=None,
body=None,
xhtml=None,
typ=None,
subject=None,
attrs={},
frm=None,
payload=[],
timestamp=None,
xmlns='jabber:client',
node=None)
You can specify recipient, text of message, type of message any
additional attributes, sender of the message, any additional payload
(f.e. jabber:x:delay element) and namespace in one go.
buildReply(self,
text=None)
Builds and returns another message object with specified text. The to,
from, thread and type properties of new message are pre-set as reply to
this message
You can specify recipient, text of message, type of message any
additional attributes, sender of the message, any additional payload
(f.e. jabber:x:delay element) and namespace in one go.
Alternatively you can pass in the other XML object as the 'node'
parameted to replicate it as message
Builds and returns another message object with specified text. The to,
from, thread and type properties of new message are pre-set as reply to
this message
__init__(self,
to=None,
typ=None,
priority=None,
show=None,
status=None,
attrs={},
frm=None,
timestamp=None,
payload=[],
xmlns='jabber:client',
node=None)
You can specify recipient, type of message, priority, show and status
values any additional attributes, sender of the presence, timestamp, any
additional payload (f.e. jabber:x:delay element) and namespace in one go.
Alternatively you can pass in the other XML object as the 'node'
parameted to replicate it as presence
You can specify recipient, type of message, priority, show and status
values any additional attributes, sender of the presence, timestamp, any
additional payload (f.e. jabber:x:delay element) and namespace in one go.
Alternatively you can pass in the other XML object as the 'node'
parameted to replicate it as presence
__init__(self,
name=None,
to=None,
typ=None,
frm=None,
attrs={},
payload=[],
timestamp=None,
xmlns=None,
node=None)
Constructor, name is the name of the stanza
i.e. 'message' or 'presence'or 'iq'
Constructor, name is the name of the stanza
i.e. 'message' or 'presence'or 'iq'
to is the value of 'to' attribure, 'typ' - 'type' attribute
frn - from attribure, attrs - other attributes mapping,
payload - same meaning as for simplexml payload definition
timestamp - the time value that needs to be stamped over stanza
xmlns - namespace of top stanza node
node - parsed or unparsed stana to be taken as prototype.
ProxyConnector
Interface for proxy-connecting object - when tunnneling XMPP over proxies,
some connecting process usually has to be done before opening stream. Proxy
connectors are used right after TCP connection is estabilished
1## proxy_connectors.py 2## based on transports_nb.py 3## 4## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 5## modified by Dimitur Kirov <dkirov@gmail.com> 6## modified by Tomas Karasek <tom.to.the.k@gmail.com> 7## 8## This program is free software; you can redistribute it and/or modify 9## it under the terms of the GNU General Public License as published by 10## the Free Software Foundation; either version 2, or (at your option) 11## any later version. 12## 13## This program is distributed in the hope that it will be useful, 14## but WITHOUT ANY WARRANTY; without even the implied warranty of 15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16## GNU General Public License for more details. 17 18""" 19Module containing classes for proxy connecting. So far its HTTP CONNECT and 20SOCKS5 proxy 21 22Authentication to NTLM (Microsoft implementation) proxies can be next. 23""" 24 25importstruct,socket,base64 26importlogging 27log=logging.getLogger('nbxmpp.proxy_connectors')
30""" 31 Interface for proxy-connecting object - when tunnneling XMPP over proxies, 32 some connecting process usually has to be done before opening stream. Proxy 33 connectors are used right after TCP connection is estabilished 34 """ 35
38""" 39 Creates proxy connector, starts connecting immediately and gives control 40 back to transport afterwards 41 42 :param send_method: transport send method 43 :param onreceive: method to set on_receive callbacks 44 :param old_on_receive: on_receive callback that should be set when 45 proxy connection was successful 46 :param on_success: called after proxy connection was successfully opened 47 :param on_failure: called when errors occured while connecting 48 :param xmpp_server: tuple of (hostname, port) 49 :param proxy_creds: tuple of (proxy_user, proxy_credentials) 50 """ 51self.send=send_method 52self.onreceive=onreceive 53self.old_on_receive=old_on_receive 54self.on_success=on_success 55self.on_failure=on_failure 56self.xmpp_server=xmpp_server 57self.proxy_user,self.proxy_pass=proxy_creds 58self.old_on_receive=old_on_receive 59 60self.start_connecting()
64""" 65 Factory Method for object creation 66 67 Use this instead of directly initializing the class in order to make unit 68 testing much easier. 69 """ 70returncls(*args,**kwargs)
81""" 82 Connect to a proxy, supply login and password to it (if were specified 83 while creating instance). Instruct proxy to make connection to the target 84 server. 85 """ 86log.info('Proxy server contacted, performing authentification') 87connector=['CONNECT %s:%s HTTP/1.1'%self.xmpp_server, 88'Proxy-Connection: Keep-Alive', 89'Pragma: no-cache', 90'Host: %s:%s'%self.xmpp_server, 91'User-Agent: Gajim'] 92ifself.proxy_userandself.proxy_pass: 93credentials='%s:%s'%(self.proxy_user,self.proxy_pass) 94credentials=base64.encodestring(credentials).strip() 95connector.append('Proxy-Authorization: Basic '+credentials) 96connector.append('\r\n') 97self.onreceive(self._on_headers_sent) 98self.send('\r\n'.join(connector))
127log.info('Proxy server contacted, performing authentification')128ifself.proxy_userandself.proxy_pass:129to_send='\x05\x02\x00\x02'130else:131to_send='\x05\x01\x00'132self.onreceive(self._on_greeting_sent)133self.send(to_send)
164ifreplyisNone:165return166iflen(reply)!=2:167log.error('Invalid proxy reply')168self.on_failure('Invalid proxy reply')169return170ifreply[0]!='\x01':171log.error('Invalid proxy reply')172self.on_failure('Invalid proxy reply')173return174ifreply[1]!='\x00':175log.error('Authentification to proxy failed')176self.on_failure('Authentification to proxy failed')177return178log.info('Authentification successfull. Jabber server contacted.')179# Request connection180req="\x05\x01\x00"181# If the given destination address is an IP address, we'll182# use the IPv4 address request even if remote resolving was specified.183try:184self.ipaddr=socket.inet_aton(self.xmpp_server[0])185req=req+"\x01"+self.ipaddr186exceptsocket.error:187# Well it's not an IP number, so it's probably a DNS name.188# if self.__proxy[3]==True:189# Resolve remotely190self.ipaddr=None191req=req+"\x03"+chr(len(self.xmpp_server[0]))+self.xmpp_server[0]192# else:193# # Resolve locally194# self.ipaddr = socket.inet_aton(socket.gethostbyname(self.xmpp_server[0]))195# req = req + "\x01" + ipaddr196req=req+struct.pack(">H",self.xmpp_server[1])197self.onreceive(self._on_req_sent)198self.send(req)
201ifreplyisNone:202return203iflen(reply)<10:204log.error('Invalid proxy reply')205self.on_failure('Invalid proxy reply')206return207ifreply[0]!='\x05':208log.error('Invalid proxy reply')209self.on_failure('Invalid proxy reply')210return211ifreply[1]!="\x00":212# Connection failed213iford(reply[1])<9:214errors=['general SOCKS server failure',215'connection not allowed by ruleset',216'Network unreachable',217'Host unreachable',218'Connection refused',219'TTL expired',220'Command not supported',221'Address type not supported'222]223txt=errors[ord(reply[1])-1]224else:225txt='Invalid proxy reply'226log.error(txt)227self.on_failure(txt)228return229# Get the bound address/port230elifreply[3]=="\x01":231begin,end=3,7232elifreply[3]=="\x03":233begin,end=4,4+reply[4]234else:235log.error('Invalid proxy reply')236self.on_failure('Invalid proxy reply')237return238self.connecting_over()
start_connecting(self)
Connect to a proxy, supply login and password to it (if were specified
while creating instance). Instruct proxy to make connection to the target
server.
Connect to a proxy, supply login and password to it (if were specified
while creating instance). Instruct proxy to make connection to the target
server.
Interface for proxy-connecting object - when tunnneling XMPP over proxies,
some connecting process usually has to be done before opening stream. Proxy
connectors are used right after TCP connection is estabilished
__init__(self,
send_method,
onreceive,
old_on_receive,
on_success,
on_failure,
xmpp_server,
proxy_creds=(None, None))
Creates proxy connector, starts connecting immediately and gives control
back to transport afterwards
NonBlockingRoster
Defines a plenty of methods that will allow you to manage roster. Also
automatically track presences from remote JIDs taking into account that
every JID can have multiple resources connected. Does not currently support
'error' presences. You can also use mapping interface for access to the
internal representation of contacts in roster
1## roster_nb.py 2## based on roster.py 3## 4## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 5## modified by Dimitur Kirov <dkirov@gmail.com> 6## 7## This program is free software; you can redistribute it and/or modify 8## it under the terms of the GNU General Public License as published by 9## the Free Software Foundation; either version 2, or (at your option) 10## any later version. 11## 12## This program is distributed in the hope that it will be useful, 13## but WITHOUT ANY WARRANTY; without even the implied warranty of 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15## GNU General Public License for more details. 16 17# $Id: roster.py,v 1.17 2005/05/02 08:38:49 snakeru Exp $ 18 19 20""" 21Simple roster implementation. Can be used though for different tasks like 22mass-renaming of contacts. 23""" 24 25fromprotocolimportJID,Iq,Presence,Node,NodeProcessed,NS_MUC_USER,NS_ROSTER 26frompluginimportPlugIn 27 28importlogging 29log=logging.getLogger('nbxmpp.roster_nb') 30 31
33""" 34 Defines a plenty of methods that will allow you to manage roster. Also 35 automatically track presences from remote JIDs taking into account that 36 every JID can have multiple resources connected. Does not currently support 37 'error' presences. You can also use mapping interface for access to the 38 internal representation of contacts in roster 39 """ 40
53""" 54 Request roster from server if it were not yet requested (or if the 55 'force' argument is set) 56 """ 57ifself._setisNone: 58self._set=0 59elifnotforce: 60return 61 62iq=Iq('get',NS_ROSTER) 63ifself.versionisnotNone: 64iq.setTagAttr('query','ver',self.version) 65id_=self._owner.getAnID() 66iq.setID(id_) 67self._owner.send(iq) 68log.info('Roster requested from server') 69returnid_
108"""109 Presence tracker. Used internally for setting items' resources state in110 internal roster representation111 """112ifpres.getTag('x',namespace=NS_MUC_USER):113return114jid=pres.getFrom()115ifnotjid:116# If no from attribue, it's from server117jid=self._owner.Server118jid=JID(jid)119ifnotself._data.has_key(jid.getStripped()):self._data[jid.getStripped()]={'name':None,'ask':None,'subscription':'none','groups':['Not in roster'],'resources':{}}120iftype(self._data[jid.getStripped()]['resources'])!=type(dict()):121self._data[jid.getStripped()]['resources']={}122item=self._data[jid.getStripped()]123typ=pres.getType()124125ifnottyp:126log.info('Setting roster item %s for resource %s...'%(jid.getStripped(),jid.getResource()))127item['resources'][jid.getResource()]=res={'show':None,'status':None,'priority':'0','timestamp':None}128ifpres.getTag('show'):res['show']=pres.getShow()129ifpres.getTag('status'):res['status']=pres.getStatus()130ifpres.getTag('priority'):res['priority']=pres.getPriority()131ifnotpres.getTimestamp():pres.setTimestamp()132res['timestamp']=pres.getTimestamp()133eliftyp=='unavailable'anditem['resources'].has_key(jid.getResource()):delitem['resources'][jid.getResource()]
137"""138 Return specific jid's representation in internal format. Used internally139 """140jid=jid[:(jid+'/').find('/')]141returnself._data[jid][dataname]
228"""229 Rename contact 'jid' and sets the groups list that it now belongs to230 """231iq=Iq('set',NS_ROSTER)232query=iq.getTag('query')233attrs={'jid':jid}234ifname:235attrs['name']=name236item=query.setTag('item',attrs)237forgroupingroups:238item.addChild(node=Node('group',payload=[group]))239self._owner.send(iq)
242"""243 Rename multiple contacts and sets their group lists244 """245iq=Iq('set',NS_ROSTER)246query=iq.getTag('query')247foriinitems:248attrs={'jid':i['jid']}249ifi['name']:250attrs['name']=i['name']251item=query.setTag('item',attrs)252forgroupini['groups']:253item.addChild(node=Node('group',payload=[group]))254self._owner.send(iq)
276"""277 Get the contact in the internal format (or None if JID 'item' is not in278 roster)279 """280ifself._data.has_key(item):281returnself._data[item]
302"""303 Unauthorise JID 'jid'. Use for declining authorisation request or for304 removing existing authorization305 """306self._owner.send(Presence(jid,'unsubscribed'))
315"""316 Return the internal data representation of the roster317 """318self._data=data319self._data[self._owner.User+'@'+self._owner.Server]={320'resources':{},321'name':None,322'ask':None,323'subscription':None,324'groups':None325}326self._set=1
341ifdata:342self._owner.Dispatcher.ProcessNonBlocking(data)343ifnotself._set:344return345ifnothasattr(self,'_owner')ornotself._owner:346# Connection has been closed by receiving a <stream:error> for ex,347return348self._owner.onreceive(None)349ifself.on_ready:350self.on_ready(self)351self.on_ready=None352returnTrue
355"""356 Request roster from server if neccessary and returns self357 """358return_self=True359ifnotself._set:360self.on_ready=on_ready361self._owner.onreceive(self._on_roster_set)362return_self=False363elifon_ready:364on_ready(self)365return_self=False366ifreturn_selforforce:367returnself368returnNone
Defines a plenty of methods that will allow you to manage roster. Also
automatically track presences from remote JIDs taking into account that
every JID can have multiple resources connected. Does not currently support
'error' presences. You can also use mapping interface for access to the
internal representation of contacts in roster
plugin(self,
owner,
request=1)
Register presence and subscription trackers in the owner's dispatcher.
Also request roster from server if the 'request' argument is set. Used
internally
Register presence and subscription trackers in the owner's dispatcher.
Also request roster from server if the 'request' argument is set. Used
internally
Simplexml module provides xmpppy library with all needed tools to handle XML
nodes and XML streams. I'm personally using it in many other separate
projects. It is designed to be as standalone as possible
Node
Node class describes syntax of separate XML Node. It have a constructor that
permits node creation from set of "namespace name", attributes and payload
of text strings and other nodes. It does not natively support building node
from text string and uses NodeBuilder class for that purpose. After
creation node can be mangled in many ways so it can be completely changed.
Also node can be serialised into string in one of two modes: default (where
the textual representation of node describes it exactly) and "fancy" - with
whitespace added to make indentation and thus make result more readable by
human.
T
Auxiliary class used to quick access to node's child nodes
NT
Auxiliary class used to quick create node's child nodes
NodeBuilder
Builds a Node class minidom from data parsed to it. This class used for two
purposes:
XML2Node(xml)
Convert supplied textual string into XML node. Handy f.e. for reading
configuration file. Raises xml.parser.expat.parsererror if provided string
is not well-formed XML
BadXML2Node(xml)
Convert supplied textual string into XML node. Survives if xml data is
cutted half way round. I.e. "<html>some text <br>some more text". Will raise
xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text
<br>some more text</b>" will not work
Convert supplied textual string into XML node. Handy f.e. for reading
configuration file. Raises xml.parser.expat.parsererror if provided string
is not well-formed XML
Convert supplied textual string into XML node. Survives if xml data is
cutted half way round. I.e. "<html>some text <br>some more text". Will raise
xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text
<br>some more text</b>" will not work
1## simplexml.py based on Mattew Allum's xmlstream.py 2## 3## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 4## 5## This program is free software; you can redistribute it and/or modify 6## it under the terms of the GNU General Public License as published by 7## the Free Software Foundation; either version 2, or (at your option) 8## any later version. 9## 10## This program is distributed in the hope that it will be useful, 11## but WITHOUT ANY WARRANTY; without even the implied warranty of 12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13## GNU General Public License for more details. 14 15# $Id: simplexml.py,v 1.27 2005/04/30 07:20:27 snakeru Exp $ 16 17""" 18Simplexml module provides xmpppy library with all needed tools to handle XML 19nodes and XML streams. I'm personally using it in many other separate 20projects. It is designed to be as standalone as possible 21""" 22 23importxml.parsers.expat 24importlogging 25log=logging.getLogger('nbxmpp.simplexml') 26
28""" 29 Return provided string with symbols & < > " replaced by their respective XML 30 entities 31 """ 32# replace also FORM FEED and ESC, because they are not valid XML chars 33returntxt.replace("&","&").replace("<","<").replace(">",">").replace('"',""").replace(u'\x0C',"").replace(u'\x1B',"")
53""" 54 Node class describes syntax of separate XML Node. It have a constructor that 55 permits node creation from set of "namespace name", attributes and payload 56 of text strings and other nodes. It does not natively support building node 57 from text string and uses NodeBuilder class for that purpose. After 58 creation node can be mangled in many ways so it can be completely changed. 59 Also node can be serialised into string in one of two modes: default (where 60 the textual representation of node describes it exactly) and "fancy" - with 61 whitespace added to make indentation and thus make result more readable by 62 human. 63 64 Node class have attribute FORCE_NODE_RECREATION that is defaults to False 65 thus enabling fast node replication from the some other node. The drawback 66 of the fast way is that new node shares some info with the "original" node 67 that is changing the one node may influence the other. Though it is rarely 68 needed (in xmpppy it is never needed at all since I'm usually never using 69 original node after replication (and using replication only to move upwards 70 on the classes tree). 71 """ 72 73FORCE_NODE_RECREATION=0 74
77""" 78 Takes "tag" argument as the name of node (prepended by namespace, if 79 needed and separated from it by a space), attrs dictionary as the set of 80 arguments, payload list as the set of textual strings and child nodes 81 that this node carries within itself and "parent" argument that is 82 another node that this one will be the child of. Also the __init__ can be 83 provided with "node" argument that is either a text string containing 84 exactly one node or another Node instance to begin with. If both "node" 85 and other arguments is provided then the node initially created as 86 replica of "node" provided and then modified to be compliant with other 87 arguments. 88 """ 89ifnode: 90ifself.FORCE_NODE_RECREATIONandisinstance(node,Node): 91node=str(node) 92ifnotisinstance(node,Node): 93node=NodeBuilder(node,self) 94node_built=True 95else: 96self.name,self.namespace,self.attrs,self.data,self.kids,self.parent,self.nsd=node.name,node.namespace,{},[],[],node.parent,{} 97forkeyinnode.attrs.keys(): 98self.attrs[key]=node.attrs[key] 99fordatainnode.data:100self.data.append(data)101forkidinnode.kids:102self.kids.append(kid)103fork,vinnode.nsd.items():104self.nsd[k]=v105else:106self.name,self.namespace,self.attrs,self.data,self.kids,self.parent,self.nsd='tag','',{},[],[],None,{}107ifparent:108self.parent=parent109self.nsp_cache={}110ifnsp:111fork,vinnsp.items():self.nsp_cache[k]=v112forattr,valinattrs.items():113ifattr=='xmlns':114self.nsd[u'']=val115elifattr.startswith('xmlns:'):116self.nsd[attr[6:]]=val117self.attrs[attr]=attrs[attr]118iftag:119ifnode_built:120pfx,self.name=(['']+tag.split(':'))[-2:]121self.namespace=self.lookup_nsp(pfx)122else:123if' 'intag:124self.namespace,self.name=tag.split()125else:126self.name=tag127ifisinstance(payload,basestring):payload=[payload]128foriinpayload:129ifisinstance(i,Node):130self.addChild(node=i)131else:132self.data.append(ustr(i))
147"""148 Method used to dump node into textual representation. If "fancy" argument149 is set to True produces indented output for readability150 """151s=(fancy-1)*2*' '+"<"+self.name152ifself.namespace:153ifnotself.parentorself.parent.namespace!=self.namespace:154if'xmlns'notinself.attrs:155s=s+' xmlns="%s"'%self.namespace156forkeyinself.attrs.keys():157val=ustr(self.attrs[key])158s=s+' %s="%s"'%(key,XMLescape(val))159s=s+">"160cnt=0161ifself.kids:162iffancy:s=s+"\n"163forainself.kids:164ifnotfancyand(len(self.data)-1)>=cnt:s=s+XMLescape(self.data[cnt])165elif(len(self.data)-1)>=cnt:s=s+XMLescape(self.data[cnt].strip())166ifisinstance(a,str)orisinstance(a,unicode):167s=s+a.__str__()168else:169s=s+a.__str__(fancyandfancy+1)170cnt=cnt+1171ifnotfancyand(len(self.data)-1)>=cnt:s=s+XMLescape(self.data[cnt])172elif(len(self.data)-1)>=cnt:s=s+XMLescape(self.data[cnt].strip())173ifnotself.kidsands.endswith('>'):174s=s[:-1]+' />'175iffancy:s=s+"\n"176else:177iffancyandnotself.data:s=s+(fancy-1)*2*' '178s=s+"</"+self.name+">"179iffancy:s=s+"\n"180returns
183"""184 If "node" argument is provided, adds it as child node. Else creates new185 node from the other arguments' values and adds it as well186 """187if'xmlns'inattrs:188raiseAttributeError("Use namespace=x instead of attrs={'xmlns':x}")189ifnode:190newnode=node191node.parent=self192else:newnode=Node(tag=name,parent=self,attrs=attrs,payload=payload)193ifnamespace:194newnode.setNamespace(namespace)195self.kids.append(newnode)196returnnewnode
217"""218 Delete the "node" from the node's childs list, if "node" is an instance.219 Else delete the first node that have specified name and (optionally)220 attributes221 """222ifnotisinstance(node,Node):223node=self.getTag(node,attrs)224self.kids.remove(node)225returnnode
270"""271 Return the payload of node i.e. list of child nodes and CDATA entries.272 F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned273 list: ['text1', <nodea instance>, <nodeb instance>, ' text2']274 """275ret=[]276foriinrange(len(self.kids)+len(self.data)+1):277try:278ifself.data[i]:279ret.append(self.data[i])280exceptIndexError:281pass282try:283ret.append(self.kids[i])284exceptIndexError:285pass286returnret
289"""290 Filter all child nodes using specified arguments as filter. Return the291 first found or None if not found292 """293returnself.getTags(name,attrs,namespace,one=1)
296"""297 Return attribute value of the child with specified name (or None if no298 such attribute)299 """300try:301returnself.getTag(tag).attrs[attr]302except:303returnNone
315"""316 Filter all child nodes using specified arguments as filter. Returns the317 list of nodes found318 """319nodes=[]320fornodeinself.kids:321ifnamespaceandnamespace!=node.getNamespace():322continue323ifnode.getName()==name:324forkeyinattrs.keys():325ifkeynotinnode.attrsornode.attrs[key]!=attrs[key]:326break327else:328nodes.append(node)329ifoneandnodes:330returnnodes[0]331ifnotone:332returnnodes
335"""336 Iterate over all children using specified arguments as filter337 """338fornodeinself.kids:339ifnamespaceisnotNoneandnamespace!=node.getNamespace():340continue341ifnode.getName()==name:342forkeyinattrs.keys():343ifkeynotinnode.attrsor \ 344node.attrs[key]!=attrs[key]:345break346else:347yieldnode
374"""375 Set node's parent to "node". WARNING: do not checks if the parent already376 present and not removes the node from the list of childs of previous377 parent378 """379self.parent=node
382"""383 Set node payload according to the list specified. WARNING: completely384 replaces all node's previous content. If you wish just to add child or385 CDATA - use addData or addChild methods386 """387ifisinstance(payload,basestring):388payload=[payload]389ifadd:390self.kids+=payload391else:392self.kids=payload
395"""396 Same as getTag but if the node with specified namespace/attributes not397 found, creates such node and returns it398 """399node=self.getTags(name,attrs,namespace=namespace,one=1)400ifnode:401returnnode402else:403returnself.addChild(name,attrs,namespace=namespace)
406"""407 Create new node (if not already present) with name "tag" and set it's408 attribute "attr" to value "val"409 """410try:411self.getTag(tag).attrs[attr]=val412exceptException:413self.addChild(tag,attrs={attr:val})
416"""417 Creates new node (if not already present) with name "tag" and418 (optionally) attributes "attrs" and sets it's CDATA to string "val"419 """420try:421self.getTag(tag,attrs).setData(ustr(val))422exceptException:423self.addChild(tag,attrs,payload=[ustr(val)])
456"""457 Reduce memory usage caused by T/NT classes - use memory only when needed458 """459ifattr=='T':460self.T=T(self)461returnself.T462ifattr=='NT':463self.NT=NT(self)464returnself.NT465raiseAttributeError
502"""503 Builds a Node class minidom from data parsed to it. This class used for two504 purposes:505506 1. Creation an XML Node from a textual representation. F.e. reading a507 config file. See an XML2Node method.508 2. Handling an incoming XML stream. This is done by mangling the509 __dispatch_depth parameter and redefining the dispatch method.510511 You do not need to use this class directly if you do not designing your own512 XML handler513 """514
516"""517 Take two optional parameters: "data" and "initial_node"518519 By default class initialised with empty Node class instance. Though, if520 "initial_node" is provided it used as "starting point". You can think521 about it as of "node upgrade". "data" (if provided) feeded to parser522 immidiatedly after instance init.523 """524log.debug("Preparing to handle incoming XML stream.")525self._parser=xml.parsers.expat.ParserCreate()526self._parser.StartElementHandler=self.starttag527self._parser.EndElementHandler=self.endtag528self._parser.StartNamespaceDeclHandler=self.handle_namespace_start529self._parser.CharacterDataHandler=self.handle_cdata530self._parser.buffer_text=True531self.Parse=self._parser.Parse532533self.__depth=0534self.__last_depth=0535self.__max_depth=0536self._dispatch_depth=1537self._document_attrs=None538self._document_nsp=None539self._mini_dom=initial_node540self.last_is_data=1541self._ptr=None542self.data_buffer=None543self.streamError=''544ifdata:545self._parser.Parse(data,1)
554"""555 Method used to allow class instance to be garbage-collected556 """557self.check_data_buffer()558self._parser.StartElementHandler=None559self._parser.EndElementHandler=None560self._parser.CharacterDataHandler=None561self._parser.StartNamespaceDeclHandler=None
601"""602 XML Parser callback. Used internally603 """604log.info("DEPTH -> %i , tag -> %s"%(self.__depth,tag))605self.check_data_buffer()606ifself.__depth==self._dispatch_depth:607ifself._mini_dom.getName()=='error':608children=self._mini_dom.getChildren()609ifchildren:610self.streamError=children[0].getName()611else:612self.streamError=self._mini_dom.getData()613self.dispatch(self._mini_dom)614elifself.__depth>self._dispatch_depth:615self._ptr=self._ptr.parent616else:617log.info("Got higher than dispatch level. Stream terminated?")618self._dec_depth()619self.last_is_data=0620ifself.__depth==0:self.stream_footer_received()
644"""645 Get called when the NodeBuilder reaches some level of depth on it's way646 up with the built node as argument. Can be redefined to convert incoming647 XML stanzas to program events648 """649pass
679"""680 Convert supplied textual string into XML node. Handy f.e. for reading681 configuration file. Raises xml.parser.expat.parsererror if provided string682 is not well-formed XML683 """684returnNodeBuilder(xml).getDom()
687"""688 Convert supplied textual string into XML node. Survives if xml data is689 cutted half way round. I.e. "<html>some text <br>some more text". Will raise690 xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text691 <br>some more text</b>" will not work692 """693returnNodeBuilder(xml).getDom()
Node class describes syntax of separate XML Node. It have a constructor that
permits node creation from set of "namespace name", attributes and payload
of text strings and other nodes. It does not natively support building node
from text string and uses NodeBuilder class for that purpose. After
creation node can be mangled in many ways so it can be completely changed.
Also node can be serialised into string in one of two modes: default (where
the textual representation of node describes it exactly) and "fancy" - with
whitespace added to make indentation and thus make result more readable by
human.
Node class have attribute FORCE_NODE_RECREATION that is defaults to False
thus enabling fast node replication from the some other node. The drawback
of the fast way is that new node shares some info with the "original" node
that is changing the one node may influence the other. Though it is rarely
needed (in xmpppy it is never needed at all since I'm usually never using
original node after replication (and using replication only to move upwards
on the classes tree).
__init__(self,
tag=None,
attrs={},
payload=[],
parent=None,
nsp=None,
node_built=False,
node=None)
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
__str__(self,
fancy=0)
Method used to dump node into textual representation. If "fancy" argument
is set to True produces indented output for readability
addChild(self,
name=None,
attrs={},
payload=[],
namespace=None,
node=None)
If "node" argument is provided, adds it as child node. Else creates new
node from the other arguments' values and adds it as well
delChild(self,
node,
attrs={})
Delete the "node" from the node's childs list, if "node" is an instance.
Else delete the first node that have specified name and (optionally)
attributes
getPayload(self)
Return the payload of node i.e. list of child nodes and CDATA entries.
F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned
list: ['text1', <nodea instance>, <nodeb instance>, ' text2']
setParent(self,
node)
Set node's parent to "node". WARNING: do not checks if the parent already
present and not removes the node from the list of childs of previous
parent
setPayload(self,
payload,
add=0)
Set node payload according to the list specified. WARNING: completely
replaces all node's previous content. If you wish just to add child or
CDATA - use addData or addChild methods
setTag(self,
name,
attrs={},
namespace=None)
Same as getTag but if the node with specified namespace/attributes not
found, creates such node and returns it
setTagData(self,
tag,
val,
attrs={})
Creates new node (if not already present) with name "tag" and
(optionally) attributes "attrs" and sets it's CDATA to string "val"
Takes "tag" argument as the name of node (prepended by namespace, if
needed and separated from it by a space), attrs dictionary as the set of
arguments, payload list as the set of textual strings and child nodes
that this node carries within itself and "parent" argument that is
another node that this one will be the child of. Also the __init__ can be
provided with "node" argument that is either a text string containing
exactly one node or another Node instance to begin with. If both "node"
and other arguments is provided then the node initially created as
replica of "node" provided and then modified to be compliant with other
arguments.
Delete the "node" from the node's childs list, if "node" is an instance.
Else delete the first node that have specified name and (optionally)
attributes
Return the payload of node i.e. list of child nodes and CDATA entries.
F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned
list: ['text1', <nodea instance>, <nodeb instance>, ' text2']
Set node payload according to the list specified. WARNING: completely
replaces all node's previous content. If you wish just to add child or
CDATA - use addData or addChild methods
dispatch(self,
stanza)
Get called when the NodeBuilder reaches some level of depth on it's way
up with the built node as argument. Can be redefined to convert incoming
XML stanzas to program events
Take two optional parameters: "data" and "initial_node"
By default class initialised with empty Node class instance. Though, if
"initial_node" is provided it used as "starting point". You can think
about it as of "node upgrade". "data" (if provided) feeded to parser
immidiatedly after instance init.
Get called when the NodeBuilder reaches some level of depth on it's way
up with the built node as argument. Can be redefined to convert incoming
XML stanzas to program events
Smacks
This is Smacks is the Stream Management class. It takes care of requesting
and sending acks. Also, it keeps track of the unhandled outgoing stanzas.
7''' 8 This is Smacks is the Stream Management class. It takes care of requesting 9 and sending acks. Also, it keeps track of the unhandled outgoing stanzas. 10 11 The dispatcher has to be able to access this class to increment the 12 number of handled stanzas 13 ''' 14
16self.con=con# Connection object 17self.out_h=0# Outgoing stanzas handled 18self.in_h=0# Incoming stanzas handled 19self.uqueue=[]# Unhandled stanzas queue 20self.session_id=None 21self.resumption=False# If server supports resume 22# Max number of stanzas in queue before making a request 23self.max_queue=5 24self._owner=None 25self.resuming=False 26self.enabled=False# If SM is enabled 27self.location=None 28self.failed_resume=False# If last resuming attempt failed 29self.supports_sm=False# If server supports sm
61# Every time we attempt to negociate, we must erase all previous info 62# about any previous session 63self.uqueue=[] 64self.in_h=0 65self.out_h=0 66self.session_id=None 67self.enabled=True 68 69stanza=Acks() 70stanza.buildEnable(resume) 71self._owner.Connection.send(stanza,now=True)
74ifnotself.session_id: 75self.resuming=False 76log.error('Attempted to resume without a valid session id ') 77return 78resume=Acks() 79resume.buildResume(self.in_h,self.session_id) 80self._owner.Connection.send(resume,False)
93''' 94 Checks if the number of stanzas sent are the same as the 95 number of stanzas received by the server. Pops stanzas that were 96 handled by the server from the queue. 97 ''' 98h=int(stanza.getAttr('h')) 99diff=self.out_h-h100101iflen(self.uqueue)<diffordiff<0:102log.error('Server and client number of stanzas handled mismatch ')103else:104while(len(self.uqueue)>diff):105self.uqueue.pop(0)106107ifstanza.getName()=='resumed':108self.enabled=True109self.resuming=True110self.con.set_oldst()111ifself.uqueue!=[]:112foriinself.uqueue:113self._owner.Connection.send(i,False)
116# If the server doesn't recognize previd, forget about resuming117# Ask for service discovery, etc..118ifstanza.getTag('item-not-found'):119self.resuming=False120self.enabled=False121# we need to bind a resource122self._owner.NonBlockingBind.resuming=False123self._owner._on_auth_bind(None)124self.failed_resume=True125return126127# Doesn't support resumption128ifstanza.getTag('feature-not-implemented'):129self.negociate(False)130return131132ifstanza.getTag('unexpected-request'):133self.enabled=False134log.error('Gajim failed to negociate Stream Management')135return
check_ack(self,
disp,
stanza)
Checks if the number of stanzas sent are the same as the
number of stanzas received by the server. Pops stanzas that were
handled by the server from the queue.
Checks if the number of stanzas sent are the same as the
number of stanzas received by the server. Pops stanzas that were
handled by the server from the queue.
1# -*- coding:utf-8 -*- 2## src/common/xmpp/stringprepare.py 3## 4## Copyright (C) 2001-2005 Twisted Matrix Laboratories 5## Copyright (C) 2005-2012 Yann Leboulanger <asterix AT lagaule.org> 6## Copyright (C) 2006 Stefan Bethge <stefan AT lanpartei.de> 7## Copyright (C) 2007 Jean-Marie Traissard <jim AT lapin.org> 8## 9## This file is part of Gajim. 10## 11## Gajim is free software; you can redistribute it and/or modify 12## it under the terms of the GNU General Public License as published 13## by the Free Software Foundation; version 3 only. 14## 15## Gajim is distributed in the hope that it will be useful, 16## but WITHOUT ANY WARRANTY; without even the implied warranty of 17## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18## GNU General Public License for more details. 19## 20## You should have received a copy of the GNU General Public License 21## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 22## 23 24importstringprep 25importunicodedata 26fromencodingsimportidna 27
135found_LCat=False136found_RandALCat=False137138forcinstring:139ifstringprep.in_table_d1(c):140found_RandALCat=True141ifstringprep.in_table_d2(c):142found_LCat=True143144iffound_LCatandfound_RandALCat:145raiseUnicodeError,"Violation of BIDI Requirement 2"146147iffound_RandALCatandnot(stringprep.in_table_d1(string[0])and148stringprep.in_table_d1(string[-1])):149raiseUnicodeError,"Violation of BIDI Requirement 3"
153"""154 Implements preparation of internationalized domain names155156 This class implements preparing internationalized domain names using the157 rules defined in RFC 3491, section 4 (Conversion operations).158159 We do not perform step 4 since we deal with unicode representations of160 domain names and do not convert from or to ASCII representations using161 punycode encoding. When such a conversion is needed, the L{idna} standard162 library provides the C{ToUnicode()} and C{ToASCII()} functions. Note that163 L{idna} itself assumes UseSTD3ASCIIRules to be false.164165 The following steps are performed by C{prepare()}:166167 * Split the domain name in labels at the dots (RFC 3490, 3.1)168 * Apply nameprep proper on each label (RFC 3491)169 * Enforce the restrictions on ASCII characters in host names by170 assuming STD3ASCIIRules to be true. (STD 3)171 * Rejoin the labels using the label separator U+002E (full stop).172 """173174# Prohibited characters.175prohibiteds=[unichr(n)forninrange(0x00,0x2c+1)+176range(0x2e,0x2f+1)+177range(0x3a,0x40+1)+178range(0x5b,0x60+1)+179range(0x7b,0x7f+1)]180
Implements preparation of internationalized domain names
This class implements preparing internationalized domain names using the
rules defined in RFC 3491, section 4 (Conversion operations).
We do not perform step 4 since we deal with unicode representations of
domain names and do not convert from or to ASCII representations using
punycode encoding. When such a conversion is needed, the L{idna} standard
library provides the C{ToUnicode()} and C{ToASCII()} functions. Note that
L{idna} itself assumes UseSTD3ASCIIRules to be false.
The following steps are performed by C{prepare()}:
Split the domain name in labels at the dots (RFC 3490, 3.1)
Apply nameprep proper on each label (RFC 3491)
Enforce the restrictions on ASCII characters in host names by
assuming STD3ASCIIRules to be true. (STD 3)
Rejoin the labels using the label separator U+002E (full stop).