From a017dbf4a47430f37951fba69e3be8da05667b4a Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Wed, 18 Feb 2015 11:00:52 +0100 Subject: [PATCH] MT#11583 add our own lastactivity module mod_lastactivity is not doing the work. Implemented as last activity is last change of presence or last message sent MT#11387 while at it move ngcp-system-tools Pre-Depends to Depends to make piuparts happy Change-Id: Ic2f29017c27b3ef3e4f4f9377f17d050de218b90 --- debian/control | 3 +- debian/ngcp-prosody-modules.install | 2 +- plugins/mod_sipwise_lastactivity.lua | 68 ++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 plugins/mod_sipwise_lastactivity.lua diff --git a/debian/control b/debian/control index 4c85363..c0a4459 100644 --- a/debian/control +++ b/debian/control @@ -8,13 +8,13 @@ Homepage: http://sipwise.com/ Package: ngcp-prosody-modules Architecture: amd64 -Pre-Depends: ngcp-system-tools Depends: lua-bitop, lua-dbi-common, lua-dbi-mysql, lua-redis, lua-rex-pcre, lua-sec, + ngcp-system-tools-ce | ngcp-system-tools, ${misc:Depends}, ${shlibs:Depends} Description: ngcp modules for the prosody Jabber/XMPP server @@ -37,3 +37,4 @@ Description: ngcp modules for the prosody Jabber/XMPP server * mod_sipwise_redis_sessions: keep server's session info on redis * mod_sipwise_pushd: push notification to mobile users * mod_log_auth: logs IP address in a failed authentication attempt + * mod_sipwise_lastactivity: XEP-0012 diff --git a/debian/ngcp-prosody-modules.install b/debian/ngcp-prosody-modules.install index 1413ebd..53a26e9 100644 --- a/debian/ngcp-prosody-modules.install +++ b/debian/ngcp-prosody-modules.install @@ -1,3 +1,3 @@ +core/* /usr/lib/prosody/core/ plugins/* /usr/lib/prosody/modules/ util/* /usr/lib/prosody/util/ -core/* /usr/lib/prosody/core/ diff --git a/plugins/mod_sipwise_lastactivity.lua b/plugins/mod_sipwise_lastactivity.lua new file mode 100644 index 0000000..a7157b0 --- /dev/null +++ b/plugins/mod_sipwise_lastactivity.lua @@ -0,0 +1,68 @@ +-- Prosody IM +-- Copyright (C) 2008-2010 Matthew Wild +-- Copyright (C) 2008-2010 Waqas Hussain +-- Copyright (C) 2015 Sipwise GmbH +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + +-- TODO: permanent storage +local st = require "util.stanza"; +local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; +local jid_bare = require "util.jid".bare; +local jid_split = require "util.jid".split; +local sessions = module:shared("sessions"); + +module:add_feature("jabber:iq:last"); + +local map = {}; + +-- lastactivity: any change of presence +module:hook("pre-presence/bare", function(event) + local stanza = event.stanza; + if not(stanza.attr.to) then + local t = os.time(); + local s = stanza:child_with_name("status"); + s = s and #s.tags == 0 and s[1] or ""; + map[event.origin.username] = {s = s, t = t}; + module:log("debug", "change of presence:%s from:%s", + s, event.origin.username) + end +end, 10); + +local function msg_handler(event) + local origin, stanza = event.origin, event.stanza; + local username = jid_split(stanza.attr.from) or origin.username; + map[username] = {s = "online", t = os.time()}; + module:log("debug", "%s from: %s", stanza.attr.type, username); +end + +-- lastactivity: any message sent +module:hook("pre-message/bare", msg_handler); +module:hook("pre-message/full", msg_handler); + +module:hook("iq/bare/jabber:iq:last:query", function(event) + local origin, stanza = event.origin, event.stanza; + if stanza.attr.type == "get" then + local username = jid_split(stanza.attr.to) or origin.username; + if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then + local seconds, text = nil, ""; + if not sessions[origin.conn] and map[username] then + seconds = tostring(os.difftime(os.time(), map[username].t)); + text = map[username].s; + end + origin.send(st.reply(stanza):tag('query', {xmlns='jabber:iq:last', seconds=seconds}):text(text)); + else + origin.send(st.error_reply(stanza, 'auth', 'forbidden')); + end + return true; + end +end); + +module.save = function() + return {map = map}; +end +module.restore = function(data) + map = data.map or {}; +end