From c1debbd48b92fc16d369a339eea6786baf55fcfe Mon Sep 17 00:00:00 2001 From: Badlop Date: Wed, 21 May 2014 18:51:09 +0200 Subject: [PATCH] mod_xmlrpc was superseded by ejabberd_xmlrpc, and that is included with ejabberd 13.12 (#34) --- mod_xmlrpc/COPYING | 343 ------------------------ mod_xmlrpc/ChangeLog | 98 ------- mod_xmlrpc/Emakefile | 2 - mod_xmlrpc/README.txt | 296 --------------------- mod_xmlrpc/build.bat | 1 - mod_xmlrpc/build.sh | 2 - mod_xmlrpc/ebin/.keepme | 0 mod_xmlrpc/src/mod_xmlrpc.erl | 488 ---------------------------------- 8 files changed, 1230 deletions(-) delete mode 100644 mod_xmlrpc/COPYING delete mode 100644 mod_xmlrpc/ChangeLog delete mode 100644 mod_xmlrpc/Emakefile delete mode 100644 mod_xmlrpc/README.txt delete mode 100644 mod_xmlrpc/build.bat delete mode 100755 mod_xmlrpc/build.sh delete mode 100644 mod_xmlrpc/ebin/.keepme delete mode 100644 mod_xmlrpc/src/mod_xmlrpc.erl diff --git a/mod_xmlrpc/COPYING b/mod_xmlrpc/COPYING deleted file mode 100644 index 8b325f5..0000000 --- a/mod_xmlrpc/COPYING +++ /dev/null @@ -1,343 +0,0 @@ -As a special exception, the authors give permission to link this program -with the OpenSSL library and distribute the resulting binary. - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) 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 -this service 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 make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the 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 a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. - - 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 -convey 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This 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 Library General -Public License instead of this License. diff --git a/mod_xmlrpc/ChangeLog b/mod_xmlrpc/ChangeLog deleted file mode 100644 index 248e141..0000000 --- a/mod_xmlrpc/ChangeLog +++ /dev/null @@ -1,98 +0,0 @@ -2008-10-12 Badlop - - * README.txt: Add a note about ejabberd_xmlrpc existence for newer - ejabberd trunk SVN 1635 - -2008-08-31 Badlop - - * README.txt: Added Java example client and fixed the PHP - example (thanks to Calder) - -2008-07-24 Badlop - - * src/mod_xmlrpc.erl: Fixed typo in get_roster - -2008-07-08 Badlop - - * src/mod_xmlrpc.erl: Detect if mod_roster or mod_roster_odbc is - enabled. New call send_message (thanks to Darren Ferguson) - * README.txt: Likewise - -2008-05-20 Badlop - - * src/mod_xmlrpc.erl: New call get_roster; works only with - mod_roster_odbc - * README.txt: Likewise - -2008-05-19 Badlop - - * src/mod_xmlrpc.erl: New function check_account (thanks to - Zbyszek Żółkiewski) - * README.txt: Likewise - -2008-05-18 Badlop - - * README.txt: Added example client in PHP (thanks to Zbyszek - Żółkiewski) - - * src/mod_xmlrpc.erl: Convert from DOS to Unix line format - * README.txt: Likewise - * ChangeLog: Likewise - -2008-05-16 Badlop - - * src/mod_xmlrpc.erl: New calls muc_room_change_option and - muc_room_set_affiliation. Improved calls add_rosteritem and - delete_rosteritem: they push the changed roster item to connected - resources (thanks to Darren Ferguson). New call check_password. - * README.txt: Likewise - -2008-05-06 Badlop - - * src/mod_xmlrpc.erl: Added new calls delete_account, - delete_rosteritem, create_muc_room and destroy_muc_room (thanks to - Darren Ferguson) - * README.txt: Likewise - -2008-02-29 Badlop - - * src/mod_xmlrpc.erl: Added module options: maxsessions, timeout - * README.txt: Likewise - -2007-08-24 Badlop - - * README.txt: Removed requirement of Xmerl 0.20, since it is - included in Erlang/OTP. Instead, require updated XMLRPC-Erlang. - -2007-08-21 Badlop - - * README.txt: New Ruby example (thanks to Diddek). Patched xmlrpc - Erlang library for Ruby compatibility (thanks to Cstar). - - * mod_xmlrpc/*: Initial commit. - -Old Changelog: - -0.2.4 - 7 November 2006 - * Fixed a bug that required clients to provide attributes in a fixed order - -0.2.3 - 22 September 2006 - * New feature: bind to a specific IP address, requires the patched XML-RPC-Erlang-1.13-IP (thanks to Zeank) - -0.2.2 - 15 August 2006 - * Fixed small bug on resource_num (thanks to Flipkick) - -0.2.1 - 20 July 2006 - * Fixed small bug on add_rosteritem (thanks to Leonexis) - -0.2.0 - 16 April 2006 - * Added two new calls: num_resources and resouce_num - * Added support for vhosts - -0.1.2 - 28 December 2005 - * Now compatible with ejabberd 1.0.0 - * The XMLRPC server is started only once, not once for every virtual host - * Added comments for handlers. Every available handler must be explained - -0.1.0 - 4 April 2005 - * Initial version diff --git a/mod_xmlrpc/Emakefile b/mod_xmlrpc/Emakefile deleted file mode 100644 index 9174d4f..0000000 --- a/mod_xmlrpc/Emakefile +++ /dev/null @@ -1,2 +0,0 @@ -{'../ejabberd-dev/src/gen_mod', [{outdir, "../ejabberd-dev/ebin"},{i,"../ejabberd-dev/include"}]}. -{'src/mod_xmlrpc', [{outdir, "ebin"},{i,"../ejabberd-dev/include"}]}. diff --git a/mod_xmlrpc/README.txt b/mod_xmlrpc/README.txt deleted file mode 100644 index 04810df..0000000 --- a/mod_xmlrpc/README.txt +++ /dev/null @@ -1,296 +0,0 @@ - - mod_xmlrpc - XML-RPC server - - Homepage: http://www.ejabberd.im/mod_xmlrpc - Author: Badlop - - Note: this module will only receive bugfixes. - If you are using ejabberd trunk SVN 1635 or newer, you will probably - prefer to install ejabberd_xmlrpc. - - - DESCRIPTION - ----------- - -mod_xmlrpc is a module for ejabberd, a XMPP/Jabber server written in Erlang. -It starts a XML-RPC server and waits for external requests. Implemented calls -include statistics and user administration. This allows external programs written -in any language like websites or administrative tools to communicate with -ejabberd to get information or to make changes without the need to know ejabberd -internals. - -One example usage is a corporate site in PHP that creates a Jabber user every time -a new user is created on the website. - -Some benefits of interfacing with the Jabber server by XML-RPC instead of modifying -directly the database are: - - external programs are more simple and easy to develop and debug - - can communicate with a server in a different machine, and even on Internet - - - REQUIREMENTS - ------------ - - ejabberd 1.1.2 or newer - XMLRPC-Erlang 1.13 with IP, Ruby and Xmerl 1.x patches - Optional: mod_muc_admin for MUC-related calls - Optional: ejabberd SVN trunk r1329 or newer is required for muc_room_set_affiliation - - - - Install XMLRPC-Erlang - -wget http://ejabberd.jabber.ru/files/contributions/xmlrpc-1.13-ipr2.tgz -tar -xzvf xmlrpc-1.13-ipr2.tgz -cd xmlrpc-1.13/src -make -cd ../../ - - - - CONFIGURE EJABBERD - ------------------ - -1. Add an option like this to the ejabberd start script: - -$ erl -pa '/home/jabber/xmlrpc-1.13/ebin' ... - -2. Configure ejabberd to start this module at startup: -edit ejabberd.cfg and add on 'modules' section: - - {mod_xmlrpc, []}, - -3. Now start ejabberd. If everything went ok, no mention to mod_xmlrpc -will be shown on the error log. - - - CONFIGURE - --------- - -Configuration is done in 'modules' section in ejabberd.cfg. Available options: - port: port where the XML-RPC server will listen. Default: 4560 - ip: IP address to listen, in Erlang format. Set to 'all' to listen on all IP address. Default: all - maxsessions: Number of concurrent connections allowed. Default: 10 - timeout: Timeout of the connections, expressed in milliseconds. Default: 5000 - -Example configurations: - {mod_xmlrpc, [{port, 4560}]} - - {mod_xmlrpc, [{port, 4560}, {ip, all}, {maxsessions, 10}, {timeout, 5000}]} - - {mod_xmlrpc, [{port, 4560}, {ip, {81, 202, 202, 79}}]} - - - - USAGE - ----- - -You can send calls to http://host:4560/ - -Call: Arguments: Returns: - - -- debug -echothis String String -multhis struct[{a, Integer}, {b, Integer}] Integer - - -- statistics -tellme_title String String -tellme_value String String -tellme String struct[{title, String}, {value. String}] - - -- user administration -create_account struct[{user, String}, {host, String}, {password, String}] Integer -delete_account struct[{user, String}, {host, String}, {password, String}] Integer -check_account struct[{user, String}, {host, String}] Integer -check_password struct[{user, String}, {host, String}, {password, String}] Integer -change_password struct[{user, String}, {host, String}, {newpass, String}] Integer -num_resources struct[{user, String}, {host, String}] Integer -resource_num struct[{user, String}, {host, String}, {num, Integer}] String -set_nickname struct[{user, String}, {host, String}, {nickname, String}] Integer -add_rosteritem struct[{localuser, String}, {localserver, String}, - {user, String}, {server, String}, - {nick, String}, {group, String}, {subs, String}] String -delete_rosteritem struct[{localuser, String}, {localserver, String}, - {user, String}, {server, String}] String -get_roster struct[{user, String}, {server, String}] - array[struct[{jid, String}, {nick, String}, {Group, String}]] -send_message struct[{from, String}, {to, String}, {subject, String}, - {body, String}] Integer - - -- MUC administration -create_muc_room struct[{name, String}, {service, String}, {server, String}] Integer -delete_muc_room struct[{name, String}, {service, String}, {server, String}] Integer -muc_room_change_option struct[{name, String}, {service, String}, - {option, String}, {value, String}] Integer -muc_room_set_affiliation struct[{name, String}, {service, String}, - {jid, String}, {affiliation, Affiliation}] Integer - - - TEST - ---- - - - You can easily try the XML-RPC server starting a new Erlang Virtual Machine - and making calls to ejabberd's XML-RPC: - -1. Start Erlang with this option: -$ erl -pa '/home/jabber/xmlrpc-1.13/ebin' - -2. Now on the Erlang console, write commands and check the results: - -1> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, echothis, [800]}). -{ok,{response,[800]}} - -2> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, echothis, ["blot cloc 557.889 kg"]}). -{ok,{response,["blot cloc 557.889 kg"]}} - -3> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, multhis, [{struct,[{a, 83}, {b, 689}]}]}). -{ok,{response,[57187]}} - -4> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, create_account, -[{struct, [{user, "ggeo"}, {host, "example.com"}, {password, "gogo11"}]}]}). -{ok,{response,[0]}} - -5> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, create_account, -[{struct, [{user, "ggeo"}, {host, "example.com"}, {password, "gogo11"}]}]}). -{ok,{response,[409]}} - -6> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, muc_room_change_option, -[{struct, [{name, "test"}, {service, "conference.localhost"}, - {option, "title"}, {value, "Test Room"}]}]}). - -7> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, muc_room_set_affiliation, -[{struct, [{name, "test"}, {service, "conference.example.com"}, -{jid, "ex@example.com"}, {affiliation, "member"}]}]}). - -8> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, muc_room_set_affiliation, -[{struct, [{name, "test"}, {service, "conference.example.com"}, -{jid, "ex@example.com"}, {affiliation, "none"}]}]}). - - - - Some possible XML-RPC error messages: - - + Client: connection refused: wrong IP, wrong port, the server is not started... - -2> xmlrpc:call({127, 0, 0, 1}, 44444, "/", {call, echothis, [800]}). -{error,econnrefused} - - + Client: bad value: a800 is a string, so it must be put into "" - -7> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, echothis, [a800]}). -{error,{bad_value,a800}} - - + Server: unknown call: you sent a call that the server does not implement - -3> xmlrpc:call({127, 0, 0, 1}, 4560, "/", {call, bububu, [800]}). -{ok,{response,{fault,-1,"Unknown call: {call,bububu,[800]}"}}} - - - EXAMPLE IN PYTHON - ----------------- - -This is an example XML-RPC client in Python, thanks to Diddek: -------- -import xmlrpclib - -server_url = 'http://127.0.0.1:4560'; -server = xmlrpclib.Server(server_url); - -params = {} -params["user"] = "ggeo" -params["host"] = "localhost" -params["password"] = "gogo11" - -result = server.create_account(params) -print result -------- - - - EXAMPLE IN RUBY - --------------- - -This is an example XML-RPC client in Ruby, thanks to Diddek: -------- -require 'xmlrpc/client' - -host = "172.16.29.6:4560" -timeout = 3000000 -client = XMLRPC::Client.new2("http://#{host}", "#{host}", timeout) -result = client.call("echothis", "800") -puts result -------- - - - EXAMPLE IN PHP - -------------- - -This is an XML-RPC client in PHP, thanks to Zbyszek Żółkiewski and Calder. -It requires "allow_url_fopen = On" in your php.ini. - -------- -"test_user","host"=>"example.com","password"=>"some_password"); -$request = xmlrpc_encode_request('check_password', $param, (array('encoding' => 'utf-8'))); - -$context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "User-Agent: XMLRPC::Client mod_xmlrpc\r\n" . - "Content-Type: text/xml\r\n" . - "Content-Length: ".strlen($request), - 'content' => $request -))); - -$file = file_get_contents("http://127.0.0.1:4560/RPC2", false, $context); - -$response = xmlrpc_decode($file); - -if (xmlrpc_is_fault($response)) { - trigger_error("xmlrpc: $response[faultString] ($response[faultCode])"); -} else { - print_r($response); -} - -?> -------- - - - EXAMPLE IN JAVA - --------------- - -This is an XML-RPC client in Java, thanks to Calder. -It requires Apache XML-RPC available at http://ws.apache.org/xmlrpc/ - -------- -import java.net.URL; -import java.util.HashMap; -import java.util.Map; - -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; - -public class Test { - - public static void main(String[] args) { - try { - XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); - config.setServerURL(new URL("http://127.0.0.1:4560/RPC2")); - XmlRpcClient client = new XmlRpcClient(); - client.setConfig(config); - - /* Command string */ - String command = "check_password"; - - /* Parameters as struct */ - Map struct = new HashMap(); - struct.put("user", "test1"); - struct.put("host", "localhost"); - struct.put("password", "test"); - - Object[] params = new Object[]{struct}; - Integer result = (Integer) client.execute(command, params); - System.out.println(result); - } catch (Exception e) { - System.out.println(e); - } - } - -} -------- diff --git a/mod_xmlrpc/build.bat b/mod_xmlrpc/build.bat deleted file mode 100644 index fff9b3b..0000000 --- a/mod_xmlrpc/build.bat +++ /dev/null @@ -1 +0,0 @@ -erl -pa ../../ejabberd-dev/trunk/ebin -pa ebin -make diff --git a/mod_xmlrpc/build.sh b/mod_xmlrpc/build.sh deleted file mode 100755 index f0a0cfa..0000000 --- a/mod_xmlrpc/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -erl -pa ../ejabberd-dev/ebin -pz ebin -make diff --git a/mod_xmlrpc/ebin/.keepme b/mod_xmlrpc/ebin/.keepme deleted file mode 100644 index e69de29..0000000 diff --git a/mod_xmlrpc/src/mod_xmlrpc.erl b/mod_xmlrpc/src/mod_xmlrpc.erl deleted file mode 100644 index a469ceb..0000000 --- a/mod_xmlrpc/src/mod_xmlrpc.erl +++ /dev/null @@ -1,488 +0,0 @@ -%%%---------------------------------------------------------------------- -%%% File : mod_xmlrpc.erl -%%% Author : Badlop -%%% Purpose : XML-RPC server -%%% Created : 21 Aug 2007 by Badlop -%%% Id : $Id: mod_xmlrpc.erl 1061 2010-02-19 14:17:13Z badlop $ -%%%---------------------------------------------------------------------- - --module(mod_xmlrpc). --author('badlop@ono.com'). - --behaviour(gen_mod). - --export([start/2, - handler/2, - loop/1, - stop/1]). - --include("ejabberd.hrl"). --include("mod_roster.hrl"). --include("jlib.hrl"). - --define(PROCNAME, ejabberd_mod_xmlrpc). - -%% ----------------------------- -%% Module interface -%% ----------------------------- - -start(_Host, Opts) -> - case whereis(?PROCNAME) of - undefined -> - %% get options - Port = gen_mod:get_opt(port, Opts, 4560), - MaxSessions = gen_mod:get_opt(maxsessions, Opts, 10), - Timeout = gen_mod:get_opt(timeout, Opts, 5000), - Handler = {mod_xmlrpc, handler}, - State = started, - - Ip = gen_mod:get_opt(ip, Opts, all), - - %% start the XML-RPC server - {ok, Pid} = xmlrpc:start_link(Ip, Port, MaxSessions, Timeout, Handler, State), - - %% start the loop process - register(?PROCNAME, spawn(?MODULE, loop, [Pid])); - _ -> - ok - end. - -loop(Pid) -> - receive - stop -> - xmlrpc:stop(Pid) - end. - -stop(_Host) -> - ?PROCNAME ! stop. - - -%% ----------------------------- -%% Handlers -%% ----------------------------- - -%% Call: Arguments: Returns: - -%% ............................. -%% Debug - -%% echothis String String -handler(_State, {call, echothis, [A]}) -> - {false, {response, [A]}}; - -%% multhis struct[{a, Integer}, {b, Integer}] Integer -handler(_State, {call, multhis, [{struct, [{a, A}, {b, B}]}]}) -> - {false, {response, [A*B]}}; - -%% ............................. -%% Statistics - -%% tellme_title String String -handler(_State, {call, tellme_title, [A]}) -> - {false, {response, [get_title(A)]}}; - -%% tellme_value String String -handler(_State, {call, tellme_value, [A]}) -> - N = node(), - {false, {response, [get_value(N, A)]}}; - -%% tellme String struct[{title, String}, {value. String}] -handler(_State, {call, tellme, [A]}) -> - N = node(), - T = {title, get_title(A)}, - V = {value, get_value(N, A)}, - R = {struct, [T, V]}, - {false, {response, [R]}}; - -%% ............................. -%% User administration - -%% create_account struct[{user, String}, {host, String}, {password, String}] Integer -handler(_State, {call, create_account, [{struct, AttrL}]}) -> - [U, H, P] = get_attrs([user, host, password], AttrL), - R = case jlib:nodeprep(U) of - error -> - error; - "" -> - error; - _ -> - ejabberd_auth:try_register(U, H, P) - end, - case R of - {atomic, ok} -> - {false, {response, [0]}}; - {atomic, exists} -> - {false, {response, [409]}}; - _E -> - {false, {response, [1]}} - end; - -%% delete_account struct[{user, String}, {host, String}, {password, String}] Integer -handler(_State, {call, delete_account, [{struct, AttrL}]}) -> - [U, H, P] = get_attrs([user, host, password], AttrL), - case jlib:nodeprep(U) of - error -> - error; - "" -> - error; - _ -> - ejabberd_auth:remove_user(U, H, P) - end, - {false, {response, [0]}}; - -%% check_account struct[{user, String}, {host, String}] Integer -handler(_State, {call, check_account, [{struct, AttrL}]}) -> - [U, H] = get_attrs([user, host], AttrL), - case ejabberd_auth:is_user_exists(U, H) of - true -> - {false, {response, [0]}}; - false -> - {false, {response, [1]}} - end; - -%% check_password struct[{user, String}, {host, String}, {password, String}] Integer -handler(_State, {call, check_password, [{struct, AttrL}]}) -> - [U, H, P] = get_attrs([user, host, password], AttrL), - case ejabberd_auth:check_password(U, H, P) of - true -> - {false, {response, [0]}}; - false -> - {false, {response, [1]}} - end; - -%% change_password struct[{user, String}, {host, String}, {newpass, String}] Integer -handler(_State, {call, change_password, [{struct, AttrL}]}) -> - [U, H, P] = get_attrs([user, host, newpass], AttrL), - case ejabberd_auth:set_password(U, H, P) of - ok -> - {false, {response, [0]}}; - _ -> - {false, {response, [1]}} - end; - -%% num_resources struct[{user, String}, {host, String}] Integer -handler(_State, {call, num_resources, [{struct, AttrL}]}) -> - [U, H] = get_attrs([user, host], AttrL), - R = length(ejabberd_sm:get_user_resources(U, H)), - {false, {response, [R]}}; - -%% resource_num struct[{user, String}, {host, String}, {num, Integer}] String -handler(_State, {call, resource_num, [{struct, AttrL}]}) -> - [U, H, N] = get_attrs([user, host, num], AttrL), - Resources = ejabberd_sm:get_user_resources(U, H), - case (0 - R = lists:nth(N, Resources), - {false, {response, [R]}}; - false -> - FaultString = lists:flatten(io_lib:format("Wrong resource number: ~p", [N])), - {false, {response, {fault, -1, FaultString}}} - end; - -%%% set_nickname struct[{user, String}, {host, String}, {nickname, String}] Integer -handler(_State, {call, set_nickname, [{struct, AttrL}]}) -> - [U, H, N] = get_attrs([user, host, nickname], AttrL), - R = mod_vcard:process_sm_iq( - {jid, U, H, "", U, H, ""}, - {jid, U, H, "", U, H, ""}, - {iq, "", set, "", "en", - {xmlelement, "vCard", - [{"xmlns", "vcard-temp"}], [ - {xmlelement, "NICKNAME", [], [{xmlcdata, N}]} - ] - }}), - case R of - {iq, [], result, [], _L, []} -> - {false, {response, [0]}}; - _ -> - {false, {response, [1]}} - end; - -%% add_rosteritem struct[{localuser, String}, {localserver, String}, -%% {user, String}, {server, String}, -%% {nick, String}, {group, String}, -%% {subs, String}] String -handler(_State, {call, add_rosteritem, [{struct, AttrL}]}) -> - [LocalUser, LocalServer, User, Server, Nick, Group, Subs] = - get_attrs([localuser, localserver, user, server, nick, group, subs], AttrL), - Node = node(), - R = case add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, list_to_atom(Subs), []) of - {atomic, ok} -> - push_roster_item(LocalUser, LocalServer, User, Server, {add, Nick, Subs, Group}), - 0; - {error, Reason} -> - io:format("Can't add roster item to user ~p@~p on node ~p: ~p~n", - [LocalUser, LocalServer, Node, Reason]), - 1; - {badrpc, Reason} -> - io:format("Can't add roster item to user ~p@~p on node ~p: ~p~n", - [LocalUser, LocalServer, Node, Reason]), - 1 - end, - {false, {response, [R]}}; - - -%% delete_rosteritem struct[{localuser, String}, {localserver, String}, -%% {user, String}, {server, String}] String -handler(_State, {call, delete_rosteritem, [{struct, AttrL}]}) -> - [LocalUser, LocalServer, User, Server] = get_attrs([localuser, localserver, user, server], AttrL), - Node = node(), - R = case delete_rosteritem(LocalUser, LocalServer, User, Server) of - {atomic, ok} -> - push_roster_item(LocalUser, LocalServer, User, Server, remove), - 0; - {error, Reason} -> - io:format("Can't remove roster item from user ~p@~p on node ~p: ~p~n", - [LocalUser, LocalServer, Node, Reason]), - 1; - {badrpc, Reason} -> - io:format("Can't remove roster item from user ~p@~p on node ~p: ~p~n", - [LocalUser, LocalServer, Node, Reason]), - 1 - end, - {false, {response, [R]}}; - -%% get_roster struct[{user, String}, {server, String}] -%% array[struct[{jid, String}, {nick, String}, {Group, String}]] -handler(_State, {call, get_roster, [{struct, AttrL}]}) -> - [User, Server] = get_attrs([user, server], AttrL), - Node = node(), - R = case get_roster(User, Server) of - {ok, Roster} -> - RosterXMLRPC = make_roster_xmlrpc(Roster), - {array, RosterXMLRPC}; - {error, Reason} -> - io:format("Can't get roster of user ~p@~p on node ~p: ~p~n", - [User, Server, Node, Reason]), - 1; - {badrpc, Reason} -> - io:format("Can't get roster of user ~p@~p on node ~p: ~p~n", - [User, Server, Node, Reason]), - 1 - end, - {false, {response, [R]}}; - -%% create_muc_room struct[{name, String}, {service, String}, {server, String}] Integer -handler(_State, {call, create_muc_room, [{struct, AttrL}]}) -> - [Name, Service, Server] = get_attrs([name, service, server], AttrL), - R = case mod_muc_admin:create_room(Name, Service, Server) of - ok -> - 0; - {error, room_already_exists} -> - 1 - end, - {false, {response, [R]}}; - -%% delete_muc_room struct[{name, String}, {service, String}, {server, String}] Integer -handler(_State, {call, delete_muc_room, [{struct, AttrL}]}) -> - [Name, Service, Server] = get_attrs([name, service, server], AttrL), - R = case mod_muc_admin:destroy_room(Name, Service, Server) of - ok -> - 0; - {error, room_not_exists} -> - ?INFO_MSG("~n MUC: ~p does not exist on service ~p ~n", [Name, Service]), - 1 - end, - {false, {response, [R]}}; - -%% muc_room_change_option struct[{name, String}, {service, String}, {option, String}, {value String}] Integer -handler(_State, {call, muc_room_change_option, [{struct, AttrL}]}) -> - [Name, Service, OptionString, Value] = get_attrs([name, service, option, value], AttrL), - Option = list_to_atom(OptionString), - mod_muc_admin:change_room_option(Name, Service, Option, Value), - {false, {response, [0]}}; - -%% muc_room_set_affiliation struct[{name, String}, {service, String}, {jid, String}, {affiliation, String}] Integer -handler(_State, {call, muc_room_set_affiliation, [{struct, AttrL}]}) -> - [Name, Service, JID, Affiliation] = get_attrs([name, service, jid, affiliation], AttrL), - R = case mod_muc_admin:set_affiliation(Name, Service, JID, list_to_atom(Affiliation)) of - ok -> - 0; - {error, room_not_exists} -> - ?INFO_MSG("~n MUC: ~p does not exist on service ~p ~n", [Name, Service]), - 1 - end, - {false, {response, [R]}}; - -%% send_message struct[{from, String}, {to, String}, {subject, String}, {body, String}] Integer -handler(_State, {call, send_message, [{struct, AttrL}]}) -> - [FromJIDString, ToJIDString, Subject, Body] = get_attrs([from, to, subject, body], AttrL), - FromJID = jlib:string_to_jid(FromJIDString), - ToJID = jlib:string_to_jid(ToJIDString), - send_message(FromJID, ToJID, Subject, Body), - {false, {response, [0]}}; - -%% If no other guard matches -handler(_State, Payload) -> - FaultString = lists:flatten(io_lib:format("Unknown call: ~p", [Payload])), - ?INFO_MSG("Unknown call: ~p", [Payload]), - {false, {response, {fault, -1, FaultString}}}. - - -%% ----------------------------- -%% Roster items -%% ----------------------------- - -add_rosteritem(LU, LS, User, Server, Nick, Group, Subscription, Xattrs) -> - subscribe(LU, LS, User, Server, Nick, Group, Subscription, Xattrs). - -subscribe(LU, LS, User, Server, Nick, Group, Subscription, Xattrs) -> - mnesia:transaction( - fun() -> - mnesia:write({roster, - {LU,LS,{User,Server,[]}}, % uj - {LU,LS}, % user - {User,Server,[]}, % jid - Nick, % name: "Mom", [] - Subscription, % subscription: none, to=you see him, from=he sees you, both - none, % ask: out=send request, in=somebody requests you, none - [Group], % groups: ["Family"] - Xattrs, % xattrs: [{"category","conference"}] - [] % xs: [] - }) - end). - -delete_rosteritem(LU, LS, User, Server) -> - unsubscribe(LU, LS, User, Server). - -unsubscribe(LU, LS, User, Server) -> - mnesia:transaction( - fun() -> - mnesia:delete({roster, {LU, LS, {User, Server, []}}}) - end). - -%% @spec(LU, LS, U, S, Action) -> ok -%% Action = {add, Nick, Subs, Group} | remove -%% @doc Push to the roster of account LU@LS the contact U@S. -%% The specific action to perform is defined in Action. -push_roster_item(LU, LS, U, S, Action) -> - lists:foreach(fun(R) -> - push_roster_item(LU, LS, R, U, S, Action) - end, ejabberd_sm:get_user_resources(LU, LS)). - -push_roster_item(LU, LS, R, U, S, Action) -> - Item = build_roster_item(U, S, Action), - ResIQ = build_iq_roster_push(Item), - LJID = jlib:make_jid(LU, LS, R), - ejabberd_router:route(LJID, LJID, ResIQ). - -build_roster_item(U, S, {add, Nick, Subs, Group}) -> - {xmlelement, "item", - [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))}, - {"name", Nick}, - {"subscription", Subs}], - [{xmlelement, "group", [], [{xmlcdata, Group}]}] - }; -build_roster_item(U, S, remove) -> - {xmlelement, "item", - [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))}, - {"subscription", "remove"}], - [] - }. - -build_iq_roster_push(Item) -> - {xmlelement, "iq", - [{"type", "set"}, {"id", "push"}], - [{xmlelement, "query", - [{"xmlns", ?NS_ROSTER}], - [Item] - } - ] - }. - - -%% ----------------------------- -%% Get Roster -%% ----------------------------- - -get_roster(User, Server) -> - LUser = jlib:nodeprep(User), - LServer = jlib:nameprep(Server), - Roster = ejabberd_hooks:run_fold(roster_get, LServer, [], [{LUser, LServer}]), - {ok, Roster}. - -%% Note: if a contact is in several groups, the contact is returned -%% several times, each one in a different group. -make_roster_xmlrpc(Roster) -> - lists:foldl( - fun(Item, Res) -> - JIDS = jlib:jid_to_string(Item#roster.jid), - Nick = Item#roster.name, - Groups = case Item#roster.groups of - [] -> [""]; - Gs -> Gs - end, - ItemsX = [{struct, [{jid, JIDS}, {nick, Nick}, {group, Group}]} - || Group <- Groups], - ItemsX ++ Res - end, - [], - Roster). - - -%% ----------------------------- -%% Sending messages to the user -%% ----------------------------- - -%% @doc Send a message to a Jabber account. -%% If a resource was specified in the JID, -%% the message is sent only to that specific resource. -%% If no resource was specified in the JID, -%% and the user is remote or local but offline, -%% the message is sent to the bare JID. -%% If the user is local and is online in several resources, -%% the message is sent to all its resources. -send_message(FromJID, ToJID, Subject, Body) -> - ToUser = ToJID#jid.user, - ToServer = ToJID#jid.server, - case ToJID#jid.resource of - "" -> - send_message(FromJID, ToUser, ToServer, Subject, Body); - Resource -> - send_message(FromJID, ToUser, ToServer, Resource, Subject, Body) - end. - -send_message(FromJID, ToUser, ToServer, Subject, Body) -> - case ejabberd_sm:get_user_resources(ToUser, ToServer) of - [] -> - send_message(FromJID, ToUser, ToServer, "", Subject, Body); - ToResources -> - lists:foreach( - fun(ToResource) -> - send_message(FromJID, ToUser, ToServer, ToResource, Subject, Body) - end, - ToResources) - end. - -send_message(FromJID, ToU, ToS, ToR, Subject, Body) -> - MPacket = build_send_message(Subject, Body), - ToJID = jlib:make_jid(ToU, ToS, ToR), - ejabberd_router:route(FromJID, ToJID, MPacket). - -build_send_message(Subject, Body) -> - {xmlelement, "message", - [{"type", "headline"}], - [{xmlelement, "subject", [], [{xmlcdata, Subject}]}, - {xmlelement, "body", [], [{xmlcdata, Body}]} - ] - }. - - -%% ----------------------------- -%% Internal -%% ----------------------------- - -get_title(A) -> mod_statsdx:get_title(A). -get_value(N, A) -> mod_statsdx:get(N, [A]). - -get_attrs(Attribute_names, L) -> - [get_attr(A, L) || A <- Attribute_names]. -get_attr(A, L) -> - case lists:keysearch(A, 1, L) of - {value, {A, Value}} -> Value; - false -> - %% Report the error and then force a crash - ?ERROR_MSG("Attribute '~p' not found on the list of attributes provided on the call:~n ~p", [A, L]), - attribute_not_found = A - end. -