xmpp4r 0.3.2 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/{ChangeLog → CHANGELOG} +33 -0
- data/LICENSE +9 -9
- data/README.rdoc +110 -0
- data/README_ruby19.txt +43 -0
- data/Rakefile +235 -74
- data/data/doc/xmpp4r/examples/advanced/adventure/README +0 -1
- data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +1 -1
- data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +12 -12
- data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +10 -11
- data/data/doc/xmpp4r/examples/advanced/fileserve.rb +11 -11
- data/data/doc/xmpp4r/examples/advanced/getonline.rb +7 -7
- data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +3 -3
- data/data/doc/xmpp4r/examples/advanced/migrate.rb +21 -22
- data/data/doc/xmpp4r/examples/advanced/minimuc.rb +22 -22
- data/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
- data/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
- data/data/doc/xmpp4r/examples/advanced/recvfile.rb +0 -1
- data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +2 -3
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +3 -3
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +10 -10
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +2 -2
- data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +12 -12
- data/data/doc/xmpp4r/examples/advanced/xmpping.rb +2 -3
- data/data/doc/xmpp4r/examples/basic/change_password.rb +3 -3
- data/data/doc/xmpp4r/examples/basic/client.rb +5 -3
- data/data/doc/xmpp4r/examples/basic/component.rb +1 -1
- data/data/doc/xmpp4r/examples/basic/{echo_threaded.rb → echo.rb} +8 -7
- data/data/doc/xmpp4r/examples/basic/jabbersend.rb +5 -5
- data/data/doc/xmpp4r/examples/basic/mass_sender.rb +11 -11
- data/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +0 -1
- data/data/doc/xmpp4r/examples/basic/mucinfo.rb +3 -1
- data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +0 -1
- data/data/doc/xmpp4r/examples/basic/register.rb +21 -4
- data/data/doc/xmpp4r/examples/basic/roster.rb +7 -5
- data/data/doc/xmpp4r/examples/basic/rosterprint.rb +0 -0
- data/data/doc/xmpp4r/examples/basic/rosterrename.rb +2 -2
- data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +6 -7
- data/data/doc/xmpp4r/examples/basic/send_vcard.rb +3 -4
- data/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
- data/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
- data/data/doc/xmpp4r/examples/basic/versionbot.rb +1 -1
- data/lib/xmpp4r.rb +4 -4
- data/lib/xmpp4r/base64.rb +32 -0
- data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +10 -11
- data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +6 -8
- data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +3 -6
- data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +0 -1
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +8 -11
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +4 -7
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +7 -3
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +10 -5
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +14 -4
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
- data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +0 -1
- data/lib/xmpp4r/callbacks.rb +5 -5
- data/lib/xmpp4r/caps.rb +1 -0
- data/lib/xmpp4r/caps/c.rb +53 -0
- data/lib/xmpp4r/caps/helper/generator.rb +160 -0
- data/lib/xmpp4r/caps/helper/helper.rb +87 -0
- data/lib/xmpp4r/client.rb +111 -40
- data/lib/xmpp4r/command/iq/command.rb +1 -1
- data/lib/xmpp4r/component.rb +8 -8
- data/lib/xmpp4r/connection.rb +25 -9
- data/lib/xmpp4r/dataforms/x/data.rb +17 -5
- data/lib/xmpp4r/debuglog.rb +13 -5
- data/lib/xmpp4r/delay/x/delay.rb +1 -1
- data/lib/xmpp4r/discovery.rb +3 -2
- data/lib/xmpp4r/discovery/helper/responder.rb +165 -0
- data/lib/xmpp4r/discovery/iq/discoinfo.rb +11 -12
- data/lib/xmpp4r/discovery/iq/discoitems.rb +12 -4
- data/lib/xmpp4r/{error.rb → errors.rb} +66 -10
- data/lib/xmpp4r/framework/base.rb +55 -0
- data/lib/xmpp4r/framework/bot.rb +148 -0
- data/lib/xmpp4r/httpbinding/client.rb +1 -1
- data/lib/xmpp4r/idgenerator.rb +1 -1
- data/lib/xmpp4r/iq.rb +34 -23
- data/lib/xmpp4r/jid.rb +2 -2
- data/lib/xmpp4r/message.rb +1 -1
- data/lib/xmpp4r/muc.rb +2 -0
- data/lib/xmpp4r/muc/helper/mucbrowser.rb +4 -19
- data/lib/xmpp4r/muc/helper/mucclient.rb +54 -23
- data/lib/xmpp4r/muc/helper/simplemucclient.rb +107 -1
- data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
- data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
- data/lib/xmpp4r/muc/iq/mucowner.rb +5 -1
- data/lib/xmpp4r/muc/item.rb +143 -0
- data/lib/xmpp4r/muc/x/mucuserinvite.rb +2 -2
- data/lib/xmpp4r/muc/x/mucuseritem.rb +3 -117
- data/lib/xmpp4r/presence.rb +2 -1
- data/lib/xmpp4r/pubsub.rb +7 -0
- data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
- data/lib/xmpp4r/pubsub/{stanzas → children}/event.rb +13 -13
- data/lib/xmpp4r/pubsub/{stanzas → children}/item.rb +9 -1
- data/lib/xmpp4r/pubsub/{stanzas → children}/items.rb +10 -1
- data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
- data/lib/xmpp4r/pubsub/children/publish.rb +24 -0
- data/lib/xmpp4r/pubsub/{stanzas → children}/subscription.rb +16 -12
- data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
- data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
- data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +49 -93
- data/lib/xmpp4r/pubsub/helper/nodehelper.rb +39 -36
- data/lib/xmpp4r/pubsub/helper/servicehelper.rb +253 -162
- data/lib/xmpp4r/pubsub/iq/pubsub.rb +1 -1
- data/lib/xmpp4r/rexmladdons.rb +56 -28
- data/lib/xmpp4r/roster.rb +0 -1
- data/lib/xmpp4r/roster/helper/roster.rb +26 -15
- data/lib/xmpp4r/roster/iq/roster.rb +19 -19
- data/lib/xmpp4r/roster/x/roster.rb +10 -10
- data/lib/xmpp4r/rpc/helper/client.rb +17 -8
- data/lib/xmpp4r/rpc/helper/server.rb +1 -2
- data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +14 -4
- data/lib/xmpp4r/rpc/iq/rpc.rb +0 -1
- data/lib/xmpp4r/sasl.rb +27 -6
- data/lib/xmpp4r/stream.rb +39 -44
- data/lib/xmpp4r/streamparser.rb +4 -4
- data/lib/xmpp4r/tune.rb +2 -0
- data/lib/xmpp4r/tune/helper/helper.rb +58 -0
- data/lib/xmpp4r/tune/tune.rb +113 -0
- data/lib/xmpp4r/vcard.rb +0 -1
- data/lib/xmpp4r/vcard/helper/vcard.rb +1 -3
- data/lib/xmpp4r/vcard/iq/vcard.rb +14 -0
- data/lib/xmpp4r/version/iq/version.rb +0 -1
- data/lib/xmpp4r/x.rb +1 -1
- data/lib/xmpp4r/xhtml.rb +1 -0
- data/lib/xmpp4r/xhtml/html.rb +115 -0
- data/lib/xmpp4r/xmpp4r.rb +7 -5
- data/lib/xmpp4r/xmppelement.rb +21 -5
- data/lib/xmpp4r/xmppstanza.rb +6 -6
- data/setup.rb +4 -4
- data/test/bytestreams/tc_ibb.rb +2 -2
- data/test/bytestreams/tc_socks5bytestreams.rb +12 -2
- data/test/caps/tc_helper.rb +156 -0
- data/test/dataforms/tc_data.rb +0 -0
- data/test/delay/tc_xdelay.rb +2 -2
- data/test/discovery/tc_responder.rb +91 -0
- data/test/lib/assert_equal_xml.rb +14 -0
- data/test/lib/clienttester.rb +31 -24
- data/test/muc/tc_muc_mucclient.rb +249 -13
- data/test/muc/tc_muc_simplemucclient.rb +41 -2
- data/test/muc/tc_mucowner.rb +0 -0
- data/test/pubsub/tc_helper.rb +486 -51
- data/test/pubsub/tc_nodeconfig.rb +54 -0
- data/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/test/roster/tc_helper.rb +6 -7
- data/test/roster/tc_iqqueryroster.rb +16 -16
- data/test/roster/tc_xroster.rb +1 -1
- data/test/rpc/tc_helper.rb +15 -3
- data/test/tc_callbacks.rb +7 -7
- data/test/tc_class_names.rb +15 -6
- data/test/tc_client.rb +3 -3
- data/test/{tc_error.rb → tc_errors.rb} +54 -12
- data/test/tc_idgenerator.rb +0 -0
- data/test/tc_iq.rb +32 -29
- data/test/tc_iqquery.rb +2 -2
- data/test/tc_jid.rb +44 -42
- data/test/tc_message.rb +13 -12
- data/test/tc_presence.rb +25 -24
- data/test/tc_rexml.rb +81 -2
- data/test/tc_stream.rb +15 -13
- data/test/tc_streamComponent.rb +6 -5
- data/test/tc_streamError.rb +21 -15
- data/test/tc_streamSend.rb +9 -9
- data/test/tc_streamparser.rb +112 -0
- data/test/tc_xmppstanza.rb +19 -9
- data/test/ts_xmpp4r.rb +10 -1
- data/test/tune/tc_helper_recv.rb +84 -0
- data/test/tune/tc_helper_send.rb +74 -0
- data/test/tune/tc_tune.rb +79 -0
- data/test/vcard/tc_helper.rb +2 -2
- data/test/vcard/tc_iqvcard.rb +13 -3
- data/test/version/tc_helper.rb +2 -2
- data/test/version/tc_iqqueryversion.rb +10 -10
- data/test/xhtml/tc_html.rb +41 -0
- data/tools/gen_requires.bash +29 -8
- data/tools/xmpp4r-gemspec-test.rb +11 -0
- data/xmpp4r.gemspec +291 -0
- metadata +277 -218
- data/README +0 -28
- data/UPDATING +0 -40
- data/data/doc/xmpp4r/examples/buggy/jabber2jabber/jabber2jabber.rb +0 -18
- data/data/doc/xmpp4r/examples/buggy/miniedgarr_cgi.rb +0 -192
- data/data/doc/xmpp4r/examples/buggy/miniedgarr_watch.rb +0 -82
- data/lib/xmpp4r/authenticationfailure.rb +0 -13
- data/lib/xmpp4r/errorexception.rb +0 -32
- data/tools/doctoweb.bash +0 -30
@@ -0,0 +1,235 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<xsl:stylesheet version="1.0"
|
3
|
+
xmlns="http://www.w3.org/1999/xhtml"
|
4
|
+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
5
|
+
xmlns:j="jabber:client"
|
6
|
+
xmlns:p="http://jabber.org/protocol/pubsub"
|
7
|
+
xmlns:tune="http://jabber.org/protocol/tune"
|
8
|
+
xmlns:mood="http://jabber.org/protocol/mood"
|
9
|
+
xmlns:activity="http://jabber.org/protocol/activity"
|
10
|
+
xmlns:chatting="http://www.xmpp.org/extensions/xep-0194.html#ns"
|
11
|
+
xmlns:browsing="http://www.xmpp.org/extensions/xep-0195.html#ns"
|
12
|
+
xmlns:gaming="http://www.xmpp.org/extensions/xep-0196.html#ns"
|
13
|
+
xmlns:watching="http://www.xmpp.org/extensions/xep-0197.html#ns"
|
14
|
+
exclude-result-prefixes="xsl j p
|
15
|
+
tune mood activity chatting
|
16
|
+
browsing gaming watching">
|
17
|
+
|
18
|
+
<xsl:output method="xml"
|
19
|
+
version="1.0"
|
20
|
+
encoding="utf-8"
|
21
|
+
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
|
22
|
+
doctype-system="DTD/xhtml1-strict.dtd"
|
23
|
+
indent="yes"/>
|
24
|
+
|
25
|
+
<xsl:template match="/items">
|
26
|
+
<html>
|
27
|
+
<head>
|
28
|
+
<title>PEP aggregator</title>
|
29
|
+
<style type="text/css">
|
30
|
+
<![CDATA[
|
31
|
+
body { font-family: sans-serif; }
|
32
|
+
h1 { text-align: center; font-weight: bold; font-family: fantasy;
|
33
|
+
font-style: italic; }
|
34
|
+
h2 { margin-top: 2em; padding: 0.5em 8em; color: black; background:
|
35
|
+
#bfbfff; }
|
36
|
+
h2 a { color: black; font-decoration: none; }
|
37
|
+
p { margin: 0.5em 4em; }
|
38
|
+
p.footnote { margin-top: 16em; font-size: 90%; }
|
39
|
+
img.avatar { max-width: 10%; clear: left; float: left; padding: 4px; }
|
40
|
+
]]>
|
41
|
+
</style>
|
42
|
+
</head>
|
43
|
+
|
44
|
+
<body>
|
45
|
+
<h1>PEP aggregator</h1>
|
46
|
+
|
47
|
+
<xsl:apply-templates/>
|
48
|
+
|
49
|
+
<p class="footnote">
|
50
|
+
This aggregator consumes events by
|
51
|
+
the <a href="http://www.xmpp.org/">XMPP</a>
|
52
|
+
extension <a href="http://www.xmpp.org/extensions/xep-0163.html">Personal
|
53
|
+
Eventing via Pubsub</a>. If you want to participate you'll
|
54
|
+
need a PEP-enabled server
|
55
|
+
(<a href="http://www.ejabberd.im/">ejabberd</a>), client
|
56
|
+
(<a href="http://www.gajim.org/">Gajim</a>
|
57
|
+
or <a href="http://psi-im.org/">Psi</a>)
|
58
|
+
and <a href="xmpp:{@j:to}?subscribe"><xsl:value-of select="@j:to"/></a>
|
59
|
+
in your Jabber roster. The source code can
|
60
|
+
be <a href="http://svn.gna.org/viewcvs/xmpp4r/trunk/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/">viewed
|
61
|
+
online</a>.
|
62
|
+
</p>
|
63
|
+
</body>
|
64
|
+
</html>
|
65
|
+
</xsl:template>
|
66
|
+
|
67
|
+
<xsl:template match="p:item[@j:from]">
|
68
|
+
<xsl:if test="@j:has-avatar = 'true'">
|
69
|
+
<img class="avatar" src="/avatar/{@j:from}"/>
|
70
|
+
</xsl:if>
|
71
|
+
|
72
|
+
<h2>
|
73
|
+
<a href="xmpp:{@j:from}">
|
74
|
+
<xsl:value-of select="@j:from-name"/>
|
75
|
+
</a>
|
76
|
+
</h2>
|
77
|
+
|
78
|
+
<xsl:apply-templates/>
|
79
|
+
|
80
|
+
</xsl:template>
|
81
|
+
|
82
|
+
<xsl:template match="tune:tune[count(*) = 0]">
|
83
|
+
<p>Stopped listening</p>
|
84
|
+
</xsl:template>
|
85
|
+
|
86
|
+
<xsl:template match="tune:tune">
|
87
|
+
<p>
|
88
|
+
♫ Listening
|
89
|
+
<xsl:value-of select="tune:artist"/>
|
90
|
+
—
|
91
|
+
<xsl:value-of select="tune:source"/>
|
92
|
+
—
|
93
|
+
<xsl:value-of select="tune:title"/>
|
94
|
+
</p>
|
95
|
+
</xsl:template>
|
96
|
+
|
97
|
+
<xsl:template match="mood:mood">
|
98
|
+
<p>
|
99
|
+
☻ Feeling
|
100
|
+
<xsl:text> </xsl:text>
|
101
|
+
<xsl:value-of select="name(*[1])"/>
|
102
|
+
<xsl:if test="*[1]/*[1]">
|
103
|
+
<xsl:text> </xsl:text>
|
104
|
+
(<xsl:value-of select="name(*[1]/*[1])"/>)
|
105
|
+
</xsl:if>
|
106
|
+
<xsl:if test="mood:text">
|
107
|
+
<xsl:text> </xsl:text>
|
108
|
+
<i><xsl:value-of select="mood:text"/></i>
|
109
|
+
</xsl:if>
|
110
|
+
</p>
|
111
|
+
</xsl:template>
|
112
|
+
|
113
|
+
<xsl:template match="activity:activity">
|
114
|
+
<p>
|
115
|
+
↻ Doing
|
116
|
+
<xsl:text> </xsl:text>
|
117
|
+
<xsl:value-of select="name(*[1])"/>
|
118
|
+
<xsl:if test="*[1]/*[1]">
|
119
|
+
<xsl:text> </xsl:text>
|
120
|
+
(<xsl:value-of select="name(*[1]/*[1])"/>)
|
121
|
+
</xsl:if>
|
122
|
+
<xsl:if test="activity:text">
|
123
|
+
<xsl:text> </xsl:text>
|
124
|
+
<i><xsl:value-of select="activity:text"/></i>
|
125
|
+
</xsl:if>
|
126
|
+
</p>
|
127
|
+
</xsl:template>
|
128
|
+
|
129
|
+
<xsl:template match="chatting:room[count(*) = 0]">
|
130
|
+
<p>Stopped chatting</p>
|
131
|
+
</xsl:template>
|
132
|
+
|
133
|
+
<xsl:template match="chatting:room">
|
134
|
+
<p>
|
135
|
+
Chatting at
|
136
|
+
<a href="{chatting:uri}">
|
137
|
+
<xsl:choose>
|
138
|
+
<xsl:when test="chatting:name"><xsl:value-of select="chatting:name"/></xsl:when>
|
139
|
+
<xsl:otherwise><xsl:value-of select="chatting:uri"/></xsl:otherwise>
|
140
|
+
</xsl:choose>
|
141
|
+
</a>
|
142
|
+
<xsl:if test="chatting:topic">
|
143
|
+
<i><xsl:value-of select="chatting:topic"/></i>
|
144
|
+
</xsl:if>
|
145
|
+
</p>
|
146
|
+
</xsl:template>
|
147
|
+
|
148
|
+
<xsl:template match="browsing:page[count(*) = 0]">
|
149
|
+
<p>Stopped browsing</p>
|
150
|
+
</xsl:template>
|
151
|
+
|
152
|
+
<xsl:template match="browsing:page">
|
153
|
+
<p>
|
154
|
+
Browsing
|
155
|
+
<a href="{browsing:uri}">
|
156
|
+
<xsl:choose>
|
157
|
+
<xsl:when test="browsing:title"><xsl:value-of select="browsing:title"/></xsl:when>
|
158
|
+
<xsl:otherwise><xsl:value-of select="browsing:uri"/></xsl:otherwise>
|
159
|
+
</xsl:choose>
|
160
|
+
</a>
|
161
|
+
<xsl:if test="browsing:description">
|
162
|
+
<i><xsl:value-of select="browsing:description"/></i>
|
163
|
+
</xsl:if>
|
164
|
+
</p>
|
165
|
+
</xsl:template>
|
166
|
+
|
167
|
+
<xsl:template match="gaming:game[count(*) = 0]">
|
168
|
+
<p>Stopped gaming</p>
|
169
|
+
</xsl:template>
|
170
|
+
|
171
|
+
<xsl:template match="gaming:game">
|
172
|
+
<p>
|
173
|
+
|
174
|
+
Playing
|
175
|
+
<xsl:choose>
|
176
|
+
<xsl:when test="gaming:uri">
|
177
|
+
<a href="{gaming:uri}">
|
178
|
+
<xsl:value-of select="gaming:name"/>
|
179
|
+
</a>
|
180
|
+
</xsl:when>
|
181
|
+
<xsl:otherwise>
|
182
|
+
<xsl:value-of select="gaming:name"/>
|
183
|
+
</xsl:otherwise>
|
184
|
+
</xsl:choose>
|
185
|
+
|
186
|
+
<xsl:if test="gaming:character_name">
|
187
|
+
as
|
188
|
+
<xsl:choose>
|
189
|
+
<xsl:when test="gaming:character_profile">
|
190
|
+
<a href="{gaming:character_profile}">
|
191
|
+
<xsl:value-of select="gaming:character_name"/>
|
192
|
+
</a>
|
193
|
+
</xsl:when>
|
194
|
+
<xsl:otherwise>
|
195
|
+
<xsl:value-of select="gaming:character_name"/>
|
196
|
+
</xsl:otherwise>
|
197
|
+
</xsl:choose>
|
198
|
+
</xsl:if>
|
199
|
+
|
200
|
+
<xsl:if test="gaming:server_address">
|
201
|
+
on
|
202
|
+
<a href="{gaming:server_address}">
|
203
|
+
<xsl:choose>
|
204
|
+
<xsl:when test="gaming:server_name"><xsl:value-of select="gaming:server_name"/></xsl:when>
|
205
|
+
<xsl:otherwise><xsl:value-of select="gaming:server_name"/></xsl:otherwise>
|
206
|
+
</xsl:choose>
|
207
|
+
</a>
|
208
|
+
</xsl:if>
|
209
|
+
|
210
|
+
</p>
|
211
|
+
</xsl:template>
|
212
|
+
|
213
|
+
<xsl:template match="watching:video[count(*) = 0]">
|
214
|
+
<p>Stopped watching a video</p>
|
215
|
+
</xsl:template>
|
216
|
+
|
217
|
+
<xsl:template match="watching:video">
|
218
|
+
<xsl:if test="watching:program_name">
|
219
|
+
<p>
|
220
|
+
✇ Watching
|
221
|
+
<xsl:choose>
|
222
|
+
<xsl:when test="watching:uri">
|
223
|
+
<a href="{watching:uri}">
|
224
|
+
<xsl:value-of select="watching:program_name"/>
|
225
|
+
</a>
|
226
|
+
</xsl:when>
|
227
|
+
<xsl:otherwise>
|
228
|
+
<xsl:value-of select="watching:program_name"/>
|
229
|
+
</xsl:otherwise>
|
230
|
+
</xsl:choose>
|
231
|
+
</p>
|
232
|
+
</xsl:if>
|
233
|
+
</xsl:template>
|
234
|
+
|
235
|
+
</xsl:stylesheet>
|
@@ -0,0 +1,147 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'xmpp4r/framework/bot'
|
4
|
+
require 'xmpp4r/pubsub'
|
5
|
+
require 'xmpp4r/vcard'
|
6
|
+
require 'ramaze'
|
7
|
+
|
8
|
+
if ARGV.size < 3
|
9
|
+
puts "Usage: #{$0} <HTTP port> <JID> <Password> [Status message]"
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
HTTP_PORT = ARGV.shift.to_i
|
13
|
+
JID = ARGV.shift
|
14
|
+
PASSWORD = ARGV.shift
|
15
|
+
STATUS_MESSAGE = ARGV.shift
|
16
|
+
|
17
|
+
def xml_namespaces(filename, excludes=[])
|
18
|
+
namespaces_recursive = nil
|
19
|
+
namespaces_recursive = lambda { |element|
|
20
|
+
namespaces = element.namespaces
|
21
|
+
element.each_element { |child|
|
22
|
+
namespaces.merge!(namespaces_recursive.call(child))
|
23
|
+
}
|
24
|
+
namespaces
|
25
|
+
}
|
26
|
+
|
27
|
+
root = REXML::Document.new(File.new(filename)).root
|
28
|
+
all = namespaces_recursive.call(root)
|
29
|
+
res = {}
|
30
|
+
all.each { |prefix,uri|
|
31
|
+
res[prefix] = uri unless excludes.include? prefix
|
32
|
+
}
|
33
|
+
res
|
34
|
+
end
|
35
|
+
|
36
|
+
Jabber::debug = true
|
37
|
+
|
38
|
+
class VcardCache < Jabber::Vcard::Helper
|
39
|
+
attr_reader :vcards
|
40
|
+
|
41
|
+
def initialize(stream)
|
42
|
+
super
|
43
|
+
@vcards = {}
|
44
|
+
end
|
45
|
+
|
46
|
+
def get(jid)
|
47
|
+
unless @vcards[jid]
|
48
|
+
begin
|
49
|
+
@vcards[jid] = super
|
50
|
+
rescue Jabber::ServerError
|
51
|
+
@vcards[jid] = :error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
@vcards[jid]
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_until(jid, timeout=10)
|
59
|
+
begin
|
60
|
+
Timeout::timeout(timeout) {
|
61
|
+
get(jid)
|
62
|
+
}
|
63
|
+
rescue Timeout::Error
|
64
|
+
@vcards[jid] = :timeout
|
65
|
+
end
|
66
|
+
|
67
|
+
@vcards[jid]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
MAX_ITEMS = 50
|
72
|
+
$jid_items = []
|
73
|
+
|
74
|
+
$bot = Jabber::Framework::Bot.new(JID, PASSWORD)
|
75
|
+
class << $bot
|
76
|
+
def accept_subscription_from?(jid)
|
77
|
+
roster.add(jid, nil, true)
|
78
|
+
true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
$vcards = VcardCache.new($bot.stream)
|
82
|
+
xml_namespaces('index.xsl', %w(xmlns xsl pa j p)).each { |prefix,node|
|
83
|
+
$bot.add_pep_notification(node) do |from,item|
|
84
|
+
from.strip!
|
85
|
+
item.add_namespace(Jabber::PubSub::NS_PUBSUB)
|
86
|
+
item.attributes['node'] = node
|
87
|
+
is_duplicate = false
|
88
|
+
$jid_items.each { |jid1,item1|
|
89
|
+
if jid1.to_s == from.to_s and node == item1.attributes['node']
|
90
|
+
is_duplicate = (item.to_s == item1.to_s)
|
91
|
+
break
|
92
|
+
end
|
93
|
+
}
|
94
|
+
unless is_duplicate
|
95
|
+
$jid_items.unshift([from, item])
|
96
|
+
$jid_items = $jid_items[0..(MAX_ITEMS-1)]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
}
|
100
|
+
|
101
|
+
$bot.set_presence(nil, STATUS_MESSAGE || "Busy aggregating PEP events...")
|
102
|
+
|
103
|
+
class WebController < Ramaze::Controller
|
104
|
+
map '/'
|
105
|
+
template_root __DIR__
|
106
|
+
engine :XSLT
|
107
|
+
|
108
|
+
def index
|
109
|
+
"<?xml version='1.0' encoding='UTF-8'?>" +
|
110
|
+
"<items xmlns:jabber='jabber:client' jabber:to='#{Jabber::JID.new(JID).strip}'>" +
|
111
|
+
$jid_items.collect do |jid,item_orig|
|
112
|
+
item = item_orig.deep_clone
|
113
|
+
item.attributes['jabber:from'] = jid.to_s
|
114
|
+
vcard = $vcards.get_until(jid)
|
115
|
+
if vcard.kind_of? Jabber::Vcard::IqVcard
|
116
|
+
item.attributes['jabber:from-name'] = vcard['NICKNAME'] || vcard['FN'] || jid.node
|
117
|
+
item.attributes['jabber:has-avatar'] = (vcard['PHOTO/TYPE'] and
|
118
|
+
vcard['PHOTO/BINVAL']) ? 'true' : 'false'
|
119
|
+
else
|
120
|
+
item.attributes['jabber:from-name'] = jid.node
|
121
|
+
item.attributes['jabber:has-avatar'] = 'false'
|
122
|
+
end
|
123
|
+
item
|
124
|
+
end.join +
|
125
|
+
"</items>"
|
126
|
+
end
|
127
|
+
|
128
|
+
def avatar(jid)
|
129
|
+
trait :engine => :None
|
130
|
+
|
131
|
+
vcard = $vcards.get_until(jid)
|
132
|
+
if vcard.kind_of? Jabber::Vcard::IqVcard
|
133
|
+
if vcard['PHOTO/TYPE'] and vcard.photo_binval
|
134
|
+
response['Content-Type'] = vcard['PHOTO/TYPE']
|
135
|
+
response.body = vcard.photo_binval
|
136
|
+
else
|
137
|
+
response['Status'] = 404
|
138
|
+
end
|
139
|
+
else
|
140
|
+
response['Status'] = 404
|
141
|
+
end
|
142
|
+
|
143
|
+
throw :respond
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
Ramaze::start(:port => HTTP_PORT)
|
@@ -84,11 +84,11 @@ cl.add_iq_callback { |iq|
|
|
84
84
|
if iq.query.node.nil?
|
85
85
|
# Make items from group names
|
86
86
|
groups = []
|
87
|
-
|
87
|
+
|
88
88
|
roster.items.each { |jid,item|
|
89
89
|
groups += item.groups
|
90
90
|
}
|
91
|
-
|
91
|
+
|
92
92
|
groups.uniq.each { |group|
|
93
93
|
iq.query.add(Jabber::DiscoItem.new(cl.jid, group, group))
|
94
94
|
}
|
@@ -127,4 +127,3 @@ loop do
|
|
127
127
|
end
|
128
128
|
|
129
129
|
cl.close
|
130
|
-
|
@@ -19,14 +19,14 @@ class Shell
|
|
19
19
|
exec("/bin/bash")
|
20
20
|
end
|
21
21
|
buffer = ""
|
22
|
-
semaphore = Mutex
|
23
|
-
Thread
|
22
|
+
semaphore = Mutex.new
|
23
|
+
Thread.new do
|
24
24
|
while true
|
25
25
|
c = @child_to_parent_read.read(1)
|
26
26
|
semaphore.synchronize { buffer += c }
|
27
27
|
end
|
28
28
|
end
|
29
|
-
Thread
|
29
|
+
Thread.new do
|
30
30
|
ch = ""
|
31
31
|
while true do
|
32
32
|
sleep @delay
|
@@ -10,24 +10,24 @@ if ARGV.length != 3
|
|
10
10
|
exit(1)
|
11
11
|
end
|
12
12
|
|
13
|
-
myjid = JID
|
13
|
+
myjid = JID.new(ARGV[0])
|
14
14
|
mypassword = ARGV[1]
|
15
|
-
authjid = JID
|
15
|
+
authjid = JID.new(ARGV[2])
|
16
16
|
|
17
|
-
myjid = JID
|
18
|
-
cl = Client
|
17
|
+
myjid = JID.new(myjid.node, myjid.domain, 'RSM')
|
18
|
+
cl = Client.new(myjid)
|
19
19
|
cl.connect
|
20
20
|
cl.auth(mypassword)
|
21
21
|
mainthread = Thread.current
|
22
|
-
sh = Shell
|
22
|
+
sh = Shell.new { |str|
|
23
23
|
puts "-----RECEIVING-----\n#{str}"
|
24
|
-
cl.send(Message
|
24
|
+
cl.send(Message.new(authjid, str)) }
|
25
25
|
cl.add_message_callback do |m|
|
26
|
-
if JID
|
26
|
+
if JID.new(m.from).strip.to_s != authjid.strip.to_s
|
27
27
|
puts "Received message from non-authorized user #{m.from}"
|
28
28
|
else
|
29
29
|
if m.body == "killshell"
|
30
|
-
cl.send(Message
|
30
|
+
cl.send(Message.new(authjid, "Exiting..."))
|
31
31
|
mainthread.wakeup
|
32
32
|
else
|
33
33
|
puts "-----EXECUTING-----\n#{m.body}"
|
@@ -35,9 +35,9 @@ cl.add_message_callback do |m|
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
cl.send(Presence
|
38
|
+
cl.send(Presence.new)
|
39
39
|
puts "Connected ! Ask #{authjid.to_s} to send commands to #{myjid.to_s}"
|
40
|
-
cl.send(Message
|
40
|
+
cl.send(Message.new(authjid, "I'm ready to receive commands from you."))
|
41
41
|
Thread.stop
|
42
42
|
cl.close
|
43
43
|
sh.kill
|