Software /
code /
prosody
Changeset
486:34c84134585d
Automated merge.
author | Tobias Markmann <tm@ayena.de> |
---|---|
date | Sat, 29 Nov 2008 20:30:35 +0100 |
parents | 470:2f9d42fdeffa (diff) 476:4744735a0a5e (current diff) |
children | 487:86e77b6ba579 |
files | |
diffstat | 11 files changed, 221 insertions(+), 162 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Sat Nov 29 12:17:21 2008 +0100 +++ b/Makefile Sat Nov 29 20:30:35 2008 +0100 @@ -4,18 +4,32 @@ BIN = $(DESTDIR)$(PREFIX)/bin CONFIG = $(DESTDIR)$(SYSCONFDIR) MODULES = $(DESTDIR)$(PREFIX)/lib/prosody/modules - -SOURCEDIR = $(DESTDIR)$(PREFIX)/lib/prosody +SOURCE = $(DESTDIR)$(PREFIX)/lib/prosody all: $(MAKE) all -C util-src -install: prosody - install -d $(BIN) $(CONFIG) $(MODULES) - install ./prosody $(BIN) +install: prosody.install util/encodings.so util/encodings.so + install -d $(BIN) $(CONFIG) $(MODULES) $(SOURCE) + install -d $(SOURCE)/core $(SOURCE)/net $(SOURCE)/util + install ./prosody.install $(BIN)/prosody + install -m644 core/* $(SOURCE)/core + install -m644 net/* $(SOURCE)/net + install -m644 util/* $(SOURCE)/util install -m644 plugins/* $(MODULES) - install -m644 prosody.cfg.lua $(CONFIG) + install -m644 prosody.cfg.lua.dist $(CONFIG)/prosody.cfg.lua $(MAKE) install -C util-src clean: + rm -f prosody.install $(MAKE) clean -C util-src + +util/encodings.so: + $(MAKE) install -C util-src + +util/hashes.so: + $(MAKE) install -C util-src + +prosody.install: prosody + sed "s|^CFG_SOURCEDIR=.*;$$|CFG_SOURCEDIR='$(SOURCE)';|;s|^CFG_CONFIGDIR=.*;$$|CFG_CONFIGDIR='$(CONFIG)';|;s|^CFG_PLUGINDIR=.*;$$|CFG_PLUGINDIR='$(MODULES)/';|;" prosody > prosody.install +
--- a/configure Sat Nov 29 12:17:21 2008 +0100 +++ b/configure Sat Nov 29 20:30:35 2008 +0100 @@ -125,7 +125,7 @@ if [ "$LUA_SUFFIX_SET" != "yes" ] then - for suffix in "" "5.1" "51" "" + for suffix in "5.1" "51" "" do LUA_SUFFIX="$suffix" if [ "$LUA_DIR_SET" = "yes" ]
--- a/core/configmanager.lua Sat Nov 29 12:17:21 2008 +0100 +++ b/core/configmanager.lua Sat Nov 29 20:30:35 2008 +0100 @@ -2,6 +2,7 @@ local _G = _G; local setmetatable, loadfile, pcall, rawget, rawset, io = setmetatable, loadfile, pcall, rawget, rawset, io; + module "configmanager" local parsers = {}; @@ -52,18 +53,21 @@ function load(filename, format) format = format or filename:match("%w+$"); + if parsers[format] and parsers[format].load then - local f = io.open(filename); + local f, err = io.open(filename); if f then local ok, err = parsers[format].load(f:read("*a")); f:close(); return ok, err; end + return f, err; end + if not format then return nil, "no parser specified"; else - return false, "no parser"; + return nil, "no parser for "..(format); end end @@ -118,4 +122,4 @@ end -return _M; \ No newline at end of file +return _M;
--- a/core/modulemanager.lua Sat Nov 29 12:17:21 2008 +0100 +++ b/core/modulemanager.lua Sat Nov 29 20:30:35 2008 +0100 @@ -1,4 +1,5 @@ +local plugin_dir = CFG_PLUGINDIR or "./plugins/"; local logger = require "util.logger"; local log = logger.init("modulemanager") @@ -11,8 +12,8 @@ local tostring, print = tostring, print; +-- We need this to let modules access the real global namespace local _G = _G; -local debug = debug; module "modulemanager" @@ -30,7 +31,7 @@ if not (host and module_name) then return nil, "insufficient-parameters"; end - local mod, err = loadfile("plugins/mod_"..module_name..".lua"); + local mod, err = loadfile(plugin_dir.."mod_"..module_name..".lua"); if not mod then log("error", "Unable to load module '%s': %s", module_name or "nil", err or "nil"); return nil, err;
--- a/core/presencemanager.lua Sat Nov 29 12:17:21 2008 +0100 +++ b/core/presencemanager.lua Sat Nov 29 20:30:35 2008 +0100 @@ -2,7 +2,10 @@ local log = require "util.logger".init("presencemanager") local require = require; -local pairs = pairs; +local pairs, ipairs = pairs, ipairs; +local t_concat = table.concat; +local s_find = string.find; +local tonumber = tonumber; local st = require "util.stanza"; local jid_split = require "util.jid".split; @@ -10,9 +13,96 @@ local rostermanager = require "core.rostermanager"; local sessionmanager = require "core.sessionmanager"; +local offlinemanager = require "core.offlinemanager"; module "presencemanager" +function handle_presence(origin, stanza, from_bare, to_bare, core_route_stanza, inbound) + local type = stanza.attr.type; + if type and type ~= "unavailable" then + if inbound then + handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); + else + handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); + end + elseif not inbound and not stanza.attr.to then + handle_normal_presence(origin, stanza, core_route_stanza); + else + core_route_stanza(origin, stanza); + end +end + +function handle_normal_presence(origin, stanza, core_route_stanza) + if origin.roster then + for jid in pairs(origin.roster) do -- broadcast to all interested contacts + local subscription = origin.roster[jid].subscription; + if subscription == "both" or subscription == "from" then + stanza.attr.to = jid; + core_route_stanza(origin, stanza); + end + end + local node, host = jid_split(stanza.attr.from); + for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources + if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence + stanza.attr.to = res.full_jid; + core_route_stanza(origin, stanza); + end + end + if stanza.attr.type == nil and not origin.presence then -- initial presence + local probe = st.presence({from = origin.full_jid, type = "probe"}); + for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to + local subscription = origin.roster[jid].subscription; + if subscription == "both" or subscription == "to" then + probe.attr.to = jid; + core_route_stanza(origin, probe); + end + end + for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all available resources + if res ~= origin and res.presence then + res.presence.attr.to = origin.full_jid; + core_route_stanza(res, res.presence); + res.presence.attr.to = nil; + end + end + if origin.roster.pending then -- resend incoming subscription requests + for jid in pairs(origin.roster.pending) do + origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original? + end + end + local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host}); + for jid, item in pairs(origin.roster) do -- resend outgoing subscription requests + if item.ask then + request.attr.to = jid; + core_route_stanza(origin, request); + end + end + for _, msg in ipairs(offlinemanager.load(node, host) or {}) do + origin.send(msg); -- FIXME do we need to modify to/from in any way? + end + offlinemanager.deleteAll(node, host); + end + origin.priority = 0; + if stanza.attr.type == "unavailable" then + origin.presence = nil; + else + origin.presence = stanza; + local priority = stanza:child_with_name("priority"); + if priority and #priority > 0 then + priority = t_concat(priority); + if s_find(priority, "^[+-]?[0-9]+$") then + priority = tonumber(priority); + if priority < -128 then priority = -128 end + if priority > 127 then priority = 127 end + origin.priority = priority; + end + end + end + stanza.attr.to = nil; -- reset it + else + log("error", "presence recieved from client with no roster"); + end +end + function send_presence_of_available_resources(user, host, jid, recipient_session, core_route_stanza) local h = hosts[host]; local count = 0;
--- a/core/stanza_router.lua Sat Nov 29 12:17:21 2008 +0100 +++ b/core/stanza_router.lua Sat Nov 29 20:30:35 2008 +0100 @@ -17,6 +17,7 @@ local handle_outbound_presence_subscriptions_and_probes = require "core.presencemanager".handle_outbound_presence_subscriptions_and_probes; local handle_inbound_presence_subscriptions_and_probes = require "core.presencemanager".handle_inbound_presence_subscriptions_and_probes; +local handle_normal_presence = require "core.presencemanager".handle_normal_presence; local format = string.format; local tostring = tostring; @@ -105,70 +106,7 @@ if stanza.name == "presence" and origin.roster then if stanza.attr.type == nil or stanza.attr.type == "unavailable" then - for jid in pairs(origin.roster) do -- broadcast to all interested contacts - local subscription = origin.roster[jid].subscription; - if subscription == "both" or subscription == "from" then - stanza.attr.to = jid; - core_route_stanza(origin, stanza); - end - end - local node, host = jid_split(stanza.attr.from); - for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources - if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence - stanza.attr.to = res.full_jid; - core_route_stanza(origin, stanza); - end - end - if stanza.attr.type == nil and not origin.presence then -- initial presence - local probe = st.presence({from = origin.full_jid, type = "probe"}); - for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to - local subscription = origin.roster[jid].subscription; - if subscription == "both" or subscription == "to" then - probe.attr.to = jid; - core_route_stanza(origin, probe); - end - end - for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all available resources - if res ~= origin and res.presence then - res.presence.attr.to = origin.full_jid; - core_route_stanza(res, res.presence); - res.presence.attr.to = nil; - end - end - if origin.roster.pending then -- resend incoming subscription requests - for jid in pairs(origin.roster.pending) do - origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original? - end - end - local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host}); - for jid, item in pairs(origin.roster) do -- resend outgoing subscription requests - if item.ask then - request.attr.to = jid; - core_route_stanza(origin, request); - end - end - for _, msg in ipairs(offlinemanager.load(node, host) or {}) do - origin.send(msg); -- FIXME do we need to modify to/from in any way? - end - offlinemanager.deleteAll(node, host); - end - origin.priority = 0; - if stanza.attr.type == "unavailable" then - origin.presence = nil; - else - origin.presence = stanza; - local priority = stanza:child_with_name("priority"); - if priority and #priority > 0 then - priority = t_concat(priority); - if s_find(priority, "^[+-]?[0-9]+$") then - priority = tonumber(priority); - if priority < -128 then priority = -128 end - if priority > 127 then priority = 127 end - origin.priority = priority; - end - end - end - stanza.attr.to = nil; -- reset it + handle_normal_presence(origin, stanza, core_route_stanza); else log("warn", "Unhandled c2s presence: %s", tostring(stanza)); if (stanza.attr.xmlns == "jabber:client" or stanza.attr.xmlns == "jabber:server") and stanza.attr.type ~= "error" then @@ -304,9 +242,3 @@ end stanza.attr.to = to; -- reset end - -function handle_stanza_toremote(stanza) - log("error", "Stanza bound for remote host, but s2s is not implemented"); -end - -
--- a/lxmppd.cfg.lua.dist Sat Nov 29 12:17:21 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ --- lxmppd Example Configuration File --- --- If it wasn't already obvious, -- starts a comment, and all --- text after it is ignored by lxmppd. --- --- The config is split into sections, a global section, and one --- for each defined host that we serve. You can add as many host --- sections as you like. --- --- Lists are written { "like", "this", "one" } --- Lists can also be of { 1, 2, 3 } numbers, etc. --- Either commas, or semi-colons; may be used --- as seperators. --- --- A table is a list of values, except each value has a name. An --- example would be: --- --- logging = { type = "html", directory = "/var/logs", rotate = "daily" } --- --- Whitespace (that is tabs, spaces, line breaks) is insignificant, so can --- be placed anywhere --- that you deem fitting. Youcouldalsoremoveitentirely,butforobviousrea ---sonsIdon'trecommendit. --- --- Tip: You can check that the syntax of this file is correct when you have finished --- by running: luac -p lxmppd.cfg.lua --- If there are any errors, it will let you know what and where they are, otherwise it --- will keep quiet. --- --- The only thing left to do is rename this file to remove the .dist ending, and fill in the --- blanks. Good luck, and happy Jabbering! - --- Global settings go in this section -Host "*" - - -- This is the list of modules lxmppd will load on startup. - -- It looks for plugins/mod_modulename.lua, so make sure that exists too. - modules_enabled = { - "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in. - "legacyauth"; -- Legacy authentication. Only used by some old clients and bots. - "roster"; -- Allow users to have a roster. Recommended ;) - "register"; -- Allow users to register on this server using a client - "tls"; -- Add support for secure TLS on c2s/s2s connections - "vcard"; -- Allow users to set vCards - "private"; -- Private XML storage (for room bookmarks, etc.) - "version"; -- Replies to server version requests - "dialback"; -- s2s dialback support - }; - - -- These are the SSL/TLS-related settings. If you don't want - -- to use SSL/TLS, you may comment or remove this - ssl = { - key = "certs/server.key"; - certificate = "certs/server.crt"; - } - --- This allows clients to connect to localhost. No harm in it. -Host "localhost" - --- Section for example.com --- (replace example.com with your domain name) -Host "example.com" - -- Assign this host a certificate for TLS, otherwise it would use the one - -- set in the global section (if any). - -- Note that old-style SSL on port 5223 only supports one certificate, and will always - -- use the global one. - ssl = { - key = "certs/example.com.key"; - certificate = "certs/example.com.crt"; - } - -Host "example.org" - enabled = false -- This will disable the host, preserving the config, but denying connections -
--- a/net/connlisteners.lua Sat Nov 29 12:17:21 2008 +0100 +++ b/net/connlisteners.lua Sat Nov 29 20:30:35 2008 +0100 @@ -1,4 +1,5 @@ +local listeners_dir = (CFG_SOURCEDIR or "").."/net/"; local server_add = require "net.server".add; local log = require "util.logger".init("connlisteners"); @@ -26,7 +27,7 @@ function get(name) local h = listeners[name]; if not h then - pcall(dofile, "net/"..name:gsub("[^%w%-]", "_").."_listener.lua"); + pcall(dofile, listeners_dir..name:gsub("[^%w%-]", "_").."_listener.lua"); h = listeners[name]; end return h; @@ -42,4 +43,4 @@ (udata and udata.interface) or "*", (udata and udata.mode) or h.default_mode or 1, (udata and udata.ssl) or nil ); end -return _M; \ No newline at end of file +return _M;
--- a/prosody Sat Nov 29 12:17:21 2008 +0100 +++ b/prosody Sat Nov 29 20:30:35 2008 +0100 @@ -2,15 +2,32 @@ -- Config here -- - +CFG_SOURCEDIR=nil; +CFG_CONFIGDIR=nil; +CFG_PLUGINDIR=nil; -- -- -- -- -- -- if CFG_SOURCEDIR then + if os.getenv("HOME") then + CFG_SOURCEDIR = CFG_SOURCEDIR:gsub("^~", os.getenv("HOME")); + end package.path = CFG_SOURCEDIR.."/?.lua;"..package.path - package.cpath = CFG_SOURCEDIR.."/?.lua;"..package.cpath + package.cpath = CFG_SOURCEDIR.."/?.so;"..package.cpath end +if CFG_CONFIGDIR then + if os.getenv("HOME") then + CFG_CONFIGDIR = CFG_CONFIGDIR:gsub("^~", os.getenv("HOME")); + end +end + +if CFG_PLUGINDIR then + if os.getenv("HOME") then + CFG_PLUGINDIR = CFG_PLUGINDIR:gsub("^~", os.getenv("HOME")); + end +end + -- Required to be able to find packages installed with luarocks pcall(require, "luarocks.require") @@ -21,7 +38,7 @@ do -- TODO: Check for other formats when we add support for them -- Use lfs? Make a new conf/ dir? - local ok, err = config.load("lxmppd.cfg.lua"); + local ok, err = config.load((CFG_CONFIGDIR or ".").."/prosody.cfg.lua"); if not ok then log("error", "Couldn't load config file: %s", err); log("info", "Falling back to old config file format...")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prosody.cfg.lua.dist Sat Nov 29 20:30:35 2008 +0100 @@ -0,0 +1,73 @@ +-- Prosody Example Configuration File +-- +-- If it wasn't already obvious, -- starts a comment, and all +-- text after it is ignored by Prosody. +-- +-- The config is split into sections, a global section, and one +-- for each defined host that we serve. You can add as many host +-- sections as you like. +-- +-- Lists are written { "like", "this", "one" } +-- Lists can also be of { 1, 2, 3 } numbers, etc. +-- Either commas, or semi-colons; may be used +-- as seperators. +-- +-- A table is a list of values, except each value has a name. An +-- example would be: +-- +-- logging = { type = "html", directory = "/var/logs", rotate = "daily" } +-- +-- Whitespace (that is tabs, spaces, line breaks) is insignificant, so can +-- be placed anywhere +-- that you deem fitting. Youcouldalsoremoveitentirely,butforobviousrea +--sonsIdon'trecommendit. +-- +-- Tip: You can check that the syntax of this file is correct when you have finished +-- by running: luac -p prosody.cfg.lua +-- If there are any errors, it will let you know what and where they are, otherwise it +-- will keep quiet. +-- +-- The only thing left to do is rename this file to remove the .dist ending, and fill in the +-- blanks. Good luck, and happy Jabbering! + +-- Global settings go in this section +Host "*" + + -- This is the list of modules Prosody will load on startup. + -- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too. + modules_enabled = { + "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in. + "legacyauth"; -- Legacy authentication. Only used by some old clients and bots. + "roster"; -- Allow users to have a roster. Recommended ;) + "register"; -- Allow users to register on this server using a client + "tls"; -- Add support for secure TLS on c2s/s2s connections + "vcard"; -- Allow users to set vCards + "private"; -- Private XML storage (for room bookmarks, etc.) + "version"; -- Replies to server version requests + "dialback"; -- s2s dialback support + }; + + -- These are the SSL/TLS-related settings. If you don't want + -- to use SSL/TLS, you may comment or remove this + ssl = { + key = "certs/server.key"; + certificate = "certs/server.crt"; + } + +-- This allows clients to connect to localhost. No harm in it. +Host "localhost" + +-- Section for example.com +-- (replace example.com with your domain name) +Host "example.com" + -- Assign this host a certificate for TLS, otherwise it would use the one + -- set in the global section (if any). + -- Note that old-style SSL on port 5223 only supports one certificate, and will always + -- use the global one. + ssl = { + key = "certs/example.com.key"; + certificate = "certs/example.com.crt"; + } + + enabled = false -- This will disable the host, preserving the config, but denying connections +