diff --git a/debian/control b/debian/control index 561a742..68d9e80 100644 --- a/debian/control +++ b/debian/control @@ -35,4 +35,5 @@ Description: ngcp modules for the prosody Jabber/XMPP server * mod_websocket.lua: XMPP over websocket, (c) 2012 Florian Zeitz * mod_sipwise_admin_telnet: admin_telnet with inteface selection * 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 diff --git a/plugins/mod_sipwise_pushd.lua b/plugins/mod_sipwise_pushd.lua new file mode 100644 index 0000000..85e41db --- /dev/null +++ b/plugins/mod_sipwise_pushd.lua @@ -0,0 +1,101 @@ +-- +-- Copyright (C) 2014 Sipwise GmbH +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + +local mod_sql = module:require("sql"); +local format = string.format; +local jid_split = require "util.jid".split; + +local pushd_config = { + url = "https://127.0.0.1:8080/push", + query = "caller=%s@%s&callee=%s&domain=%s", +}; +local sql_config = { + driver = "MySQL", + database = "provisioning", + username = "prosody", + password = "PW_PROSODY", + host = "localhost" +}; + +local push_usr_query = [[ +SELECT vp.attribute, vup.value FROM provisioning.voip_preferences vp + LEFT JOIN provisioning.voip_usr_preferences vup ON vup.attribute_id = vp.id + LEFT JOIN provisioning.voip_subscribers vs ON vs.id = vup.subscriber_id + LEFT JOIN provisioning.voip_domains vd ON vd.id = vs.domain_id +WHERE vp.attribute = 'mobile_push_enable' + AND vs.username = ? + AND vd.domain = ?; +]]; + +local push_dom_query = [[ +SELECT vp.attribute, vup.value FROM provisioning.voip_preferences vp + LEFT JOIN provisioning.voip_dom_preferences vup ON vup.attribute_id = vp.id + LEFT JOIN provisioning.voip_domains vd ON vd.id = vs.domain_id +WHERE vp.attribute = 'mobile_push_enable' + AND vd.domain = ?; +]]; +local engine; + +local function process_response(response, code, request) + if code >= 200 and code < 299 then + module:log("debug", "pushd response OK[%s] %s", + tostring(code), response); + else + module:log("error", "pushd response KO[%s] %s", + tostring(code), response); + end +end + +local function push_enable(username, domain) + local row + -- Reconnect to DB if necessary + if not engine.conn:ping() then + engine.conn = nil; + engine:connect(); + end + for row in engine:select(push_usr_query, username, domain) do + if row[2] == "1" then return true; end + end + for row in engine:select(push_usr_query, username, domain) do + if row[2] == "1" then return true; end + end + return false; +end + +local function handle_offline(event) + module:log("debug", "handle_offline"); + local origin, stanza = event.origin, event.stanza; + local to = stanza.attr.to; + local node, host; + local http_options = { + method = "POST", + body = "", + } + + if to then + node, host = jid_split(to); + if push_enable(node, host) then + http_options.body = format(pushd_config.query, + origin.username, origin.host, node, host); + module:log("debug", "Sending http pushd request: %s data: %s", + pushd_config.url, http_options.body); + http.request(pushd_config.url, http_options, process_response); + else + module:log("debug", "no mobile_push_enable pref set for %s", to); + end + end +end + +module:hook("message/offline/handle", handle_offline, 20); + +function module.load() + pushd_config = module:get_option("pushd_config", pushd_config); + sql_config = module:get_option("auth_sql", sql_config); + engine = mod_sql:create_engine(sql_config); + engine:execute("SET NAMES 'utf8' COLLATE 'utf8_bin';"); + module:log("info", "load OK"); +end