diff --git a/conf/metronome/domain.tpl.cfg.lua b/conf/metronome/domain.tpl.cfg.lua index e5e169791..7391479dc 100644 --- a/conf/metronome/domain.tpl.cfg.lua +++ b/conf/metronome/domain.tpl.cfg.lua @@ -1,28 +1,28 @@ VirtualHost "{{ domain }}" - enable = true - ssl = { - key = "/etc/yunohost/certs/{{ domain }}/key.pem"; - certificate = "/etc/yunohost/certs/{{ domain }}/crt.pem"; - } - authentication = "ldap2" - ldap = { - hostname = "localhost", - user = { - basedn = "ou=users,dc=yunohost,dc=org", - filter = "(&(objectClass=posixAccount)(mail=*@{{ domain }})(permission=cn=xmpp.main,ou=permission,dc=yunohost,dc=org))", - usernamefield = "mail", - namefield = "cn", - }, - } + enable = true + ssl = { + key = "/etc/yunohost/certs/{{ domain }}/key.pem"; + certificate = "/etc/yunohost/certs/{{ domain }}/crt.pem"; + } + authentication = "ldap2" + ldap = { + hostname = "localhost", + user = { + basedn = "ou=users,dc=yunohost,dc=org", + filter = "(&(objectClass=posixAccount)(mail=*@{{ domain }})(permission=cn=xmpp.main,ou=permission,dc=yunohost,dc=org))", + usernamefield = "mail", + namefield = "cn", + }, + } - -- Discovery items - disco_items = { - { "muc.{{ domain }}" }, - { "pubsub.{{ domain }}" }, - { "jabber.{{ domain }}" }, - { "vjud.{{ domain }}" }, - { "xmpp-upload.{{ domain }}" }, - }; + -- Discovery items + disco_items = { + { "muc.{{ domain }}" }, + { "pubsub.{{ domain }}" }, + { "jabber.{{ domain }}" }, + { "vjud.{{ domain }}" }, + { "xmpp-upload.{{ domain }}" }, + }; -- contact_info = { -- abuse = { "mailto:abuse@{{ domain }}", "xmpp:admin@{{ domain }}" }; @@ -35,41 +35,41 @@ VirtualHost "{{ domain }}" ---Set up a MUC (multi-user chat) room server Component "muc.{{ domain }}" "muc" - name = "{{ domain }} Chatrooms" + name = "{{ domain }} Chatrooms" - modules_enabled = { - "muc_limits"; - "muc_log"; - "muc_log_mam"; - "muc_log_http"; - "muc_vcard"; - } + modules_enabled = { + "muc_limits"; + "muc_log"; + "muc_log_mam"; + "muc_log_http"; + "muc_vcard"; + } - muc_event_rate = 0.5 - muc_burst_factor = 10 - room_default_config = { - logging = true, - persistent = true - }; + muc_event_rate = 0.5 + muc_burst_factor = 10 + room_default_config = { + logging = true, + persistent = true + }; ---Set up a PubSub server Component "pubsub.{{ domain }}" "pubsub" - name = "{{ domain }} Publish/Subscribe" + name = "{{ domain }} Publish/Subscribe" - unrestricted_node_creation = true -- Anyone can create a PubSub node (from any server) + unrestricted_node_creation = true -- Anyone can create a PubSub node (from any server) ---Set up a HTTP Upload service Component "xmpp-upload.{{ domain }}" "http_upload" - name = "{{ domain }} Sharing Service" + name = "{{ domain }} Sharing Service" - http_file_path = "/var/xmpp-upload/{{ domain }}/upload" - http_external_url = "https://xmpp-upload.{{ domain }}:443" - http_file_base_path = "/upload" - http_file_size_limit = 6*1024*1024 - http_file_quota = 60*1024*1024 - http_upload_file_size_limit = 100 * 1024 * 1024 -- bytes - http_upload_quota = 10 * 1024 * 1024 * 1024 -- bytes + http_file_path = "/var/xmpp-upload/{{ domain }}/upload" + http_external_url = "https://xmpp-upload.{{ domain }}:443" + http_file_base_path = "/upload" + http_file_size_limit = 6*1024*1024 + http_file_quota = 60*1024*1024 + http_upload_file_size_limit = 100 * 1024 * 1024 -- bytes + http_upload_quota = 10 * 1024 * 1024 * 1024 -- bytes ---Set up a VJUD service Component "vjud.{{ domain }}" "vjud" - vjud_disco_name = "{{ domain }} User Directory" + vjud_disco_name = "{{ domain }} User Directory" diff --git a/conf/metronome/metronome.cfg.lua b/conf/metronome/metronome.cfg.lua index 9e21016d9..0e2a62f01 100644 --- a/conf/metronome/metronome.cfg.lua +++ b/conf/metronome/metronome.cfg.lua @@ -1,72 +1,72 @@ -- ** Metronome's config file example ** --- +-- -- The format is exactly equal to Prosody's: -- --- Lists are written { "like", "this", "one" } --- Lists can also be of { 1, 2, 3 } numbers, etc. +-- 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 +-- A table is a list of values, except each value has a name. An -- example would be: -- -- ssl = { key = "keyfile.key", certificate = "certificate.cert" } -- -- Tip: You can check that the syntax of this file is correct when you have finished -- by running: luac -p metronome.cfg.lua --- If there are any errors, it will let you know what and where they are, otherwise it +-- If there are any errors, it will let you know what and where they are, otherwise it -- will keep quiet. -- Global settings go in this section - + -- This is the list of modules Metronome will load on startup. -- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too. modules_enabled = { - -- Generally required - "roster"; -- Allow users to have a roster. Recommended. - "saslauth"; -- Authentication for clients. Recommended if you want to log in. - "tls"; -- Add support for secure TLS on c2s/s2s connections - "disco"; -- Service discovery - - -- Not essential, but recommended - "private"; -- Private XML storage (for room bookmarks, etc.) - "vcard"; -- Allow users to set vCards - "pep"; -- Allows setting of mood, tune, etc. - "pubsub"; -- Publish-subscribe XEP-0060 - "posix"; -- POSIX functionality, sends server to background, enables syslog, etc. - "bidi"; -- Enables Bidirectional Server-to-Server Streams. - - -- Nice to have - "version"; -- Replies to server version requests - "uptime"; -- Report how long server has been running - "time"; -- Let others know the time here on this server - "ping"; -- Replies to XMPP pings with pongs - "register"; -- Allow users to register on this server using a client and change passwords - "stream_management"; -- Allows clients and servers to use Stream Management - "stanza_optimizations"; -- Allows clients to use Client State Indication and SIFT - "message_carbons"; -- Allows clients to enable carbon copies of messages - "mam"; -- Enable server-side message archives using Message Archive Management - "push"; -- Enable Push Notifications via PubSub using XEP-0357 - "lastactivity"; -- Enables clients to know the last presence status of an user - "adhoc_cm"; -- Allow to set client certificates to login through SASL External via adhoc - "admin_adhoc"; -- administration adhoc commands - "bookmarks"; -- XEP-0048 Bookmarks synchronization between PEP and Private Storage - "sec_labels"; -- Allows to use a simplified version XEP-0258 Security Labels and related ACDFs. - "privacy"; -- Add privacy lists and simple blocking command support + -- Generally required + "roster"; -- Allow users to have a roster. Recommended. + "saslauth"; -- Authentication for clients. Recommended if you want to log in. + "tls"; -- Add support for secure TLS on c2s/s2s connections + "disco"; -- Service discovery - -- Other specific functionality - --"admin_telnet"; -- administration console, telnet to port 5582 - --"admin_web"; -- administration web interface - "bosh"; -- Enable support for BOSH clients, aka "XMPP over Bidirectional Streams over Synchronous HTTP" - --"compression"; -- Allow clients to enable Stream Compression - --"spim_block"; -- Require authorization via OOB form for messages from non-contacts and block unsollicited messages - --"gate_guard"; -- Enable config-based blacklisting and hit-based auto-banning features - --"incidents_handling"; -- Enable Incidents Handling support (can be administered via adhoc commands) - --"server_presence"; -- Enables Server Buddies extension support - --"service_directory"; -- Enables Service Directories extension support - --"public_service"; -- Enables Server vCard support for public services in directories and advertises in features - --"register_api"; -- Provides secure API for both Out-Of-Band and In-Band registration for E-Mail verification - "websocket"; -- Enable support for WebSocket clients, aka "XMPP over WebSockets" + -- Not essential, but recommended + "private"; -- Private XML storage (for room bookmarks, etc.) + "vcard"; -- Allow users to set vCards + "pep"; -- Allows setting of mood, tune, etc. + "pubsub"; -- Publish-subscribe XEP-0060 + "posix"; -- POSIX functionality, sends server to background, enables syslog, etc. + "bidi"; -- Enables Bidirectional Server-to-Server Streams. + + -- Nice to have + "version"; -- Replies to server version requests + "uptime"; -- Report how long server has been running + "time"; -- Let others know the time here on this server + "ping"; -- Replies to XMPP pings with pongs + "register"; -- Allow users to register on this server using a client and change passwords + "stream_management"; -- Allows clients and servers to use Stream Management + "stanza_optimizations"; -- Allows clients to use Client State Indication and SIFT + "message_carbons"; -- Allows clients to enable carbon copies of messages + "mam"; -- Enable server-side message archives using Message Archive Management + "push"; -- Enable Push Notifications via PubSub using XEP-0357 + "lastactivity"; -- Enables clients to know the last presence status of an user + "adhoc_cm"; -- Allow to set client certificates to login through SASL External via adhoc + "admin_adhoc"; -- administration adhoc commands + "bookmarks"; -- XEP-0048 Bookmarks synchronization between PEP and Private Storage + "sec_labels"; -- Allows to use a simplified version XEP-0258 Security Labels and related ACDFs. + "privacy"; -- Add privacy lists and simple blocking command support + + -- Other specific functionality + --"admin_telnet"; -- administration console, telnet to port 5582 + --"admin_web"; -- administration web interface + "bosh"; -- Enable support for BOSH clients, aka "XMPP over Bidirectional Streams over Synchronous HTTP" + --"compression"; -- Allow clients to enable Stream Compression + --"spim_block"; -- Require authorization via OOB form for messages from non-contacts and block unsollicited messages + --"gate_guard"; -- Enable config-based blacklisting and hit-based auto-banning features + --"incidents_handling"; -- Enable Incidents Handling support (can be administered via adhoc commands) + --"server_presence"; -- Enables Server Buddies extension support + --"service_directory"; -- Enables Service Directories extension support + --"public_service"; -- Enables Server vCard support for public services in directories and advertises in features + --"register_api"; -- Provides secure API for both Out-Of-Band and In-Band registration for E-Mail verification + "websocket"; -- Enable support for WebSocket clients, aka "XMPP over WebSockets" }; -- Server PID @@ -102,10 +102,10 @@ csi_config_queue_all_muc_messages_but_mentions = false; -- Logging configuration log = { - info = "/var/log/metronome/metronome.log"; -- Change 'info' to 'debug' for verbose logging - error = "/var/log/metronome/metronome.err"; - -- "*syslog"; -- Uncomment this for logging to syslog - -- "*console"; -- Log to the console, useful for debugging with daemonize=false + info = "/var/log/metronome/metronome.log"; -- Change 'info' to 'debug' for verbose logging + error = "/var/log/metronome/metronome.err"; + -- "*syslog"; -- Uncomment this for logging to syslog + -- "*console"; -- Log to the console, useful for debugging with daemonize=false } ------ Components ------ @@ -114,7 +114,7 @@ log = { ---Set up a local BOSH service Component "localhost" "http" - modules_enabled = { "bosh" } + modules_enabled = { "bosh" } ----------- Virtual hosts ----------- -- You need to add a VirtualHost entry for each domain you wish Metronome to serve. diff --git a/conf/metronome/modules/mod_auth_ldap2.lua b/conf/metronome/modules/mod_auth_ldap2.lua index f961885da..f127e4357 100644 --- a/conf/metronome/modules/mod_auth_ldap2.lua +++ b/conf/metronome/modules/mod_auth_ldap2.lua @@ -23,68 +23,68 @@ if not ldap then end function new_default_provider(host) - local provider = { name = "ldap2" }; - log("debug", "initializing ldap2 authentication provider for host '%s'", host); + local provider = { name = "ldap2" }; + log("debug", "initializing ldap2 authentication provider for host '%s'", host); - function provider.test_password(username, password) - return ldap.bind(username, password); - end + function provider.test_password(username, password) + return ldap.bind(username, password); + end - function provider.user_exists(username) - local params = ldap.getparams() + function provider.user_exists(username) + local params = ldap.getparams() - local filter = ldap.filter.combine_and(params.user.filter, params.user.usernamefield .. '=' .. username); - if params.user.usernamefield == 'mail' then - filter = ldap.filter.combine_and(params.user.filter, 'mail=' .. username .. '@*'); - end + local filter = ldap.filter.combine_and(params.user.filter, params.user.usernamefield .. '=' .. username); + if params.user.usernamefield == 'mail' then + filter = ldap.filter.combine_and(params.user.filter, 'mail=' .. username .. '@*'); + end - return ldap.singlematch { - base = params.user.basedn, - filter = filter, - }; - end + return ldap.singlematch { + base = params.user.basedn, + filter = filter, + }; + end - function provider.get_password(username) - return nil, "Passwords unavailable for LDAP."; - end + function provider.get_password(username) + return nil, "Passwords unavailable for LDAP."; + end - function provider.set_password(username, password) - return nil, "Passwords unavailable for LDAP."; - end + function provider.set_password(username, password) + return nil, "Passwords unavailable for LDAP."; + end - function provider.create_user(username, password) - return nil, "Account creation/modification not available with LDAP."; - end + function provider.create_user(username, password) + return nil, "Account creation/modification not available with LDAP."; + end - function provider.get_sasl_handler(session) - local testpass_authentication_profile = { - session = session, - plain_test = function(sasl, username, password, realm) - return provider.test_password(username, password), true; - end, - order = { "plain_test" }, - }; - return new_sasl(module.host, testpass_authentication_profile); - end + function provider.get_sasl_handler(session) + local testpass_authentication_profile = { + session = session, + plain_test = function(sasl, username, password, realm) + return provider.test_password(username, password), true; + end, + order = { "plain_test" }, + }; + return new_sasl(module.host, testpass_authentication_profile); + end - function provider.is_admin(jid) - local admin_config = ldap.getparams().admin; + function provider.is_admin(jid) + local admin_config = ldap.getparams().admin; - if not admin_config then - return; - end + if not admin_config then + return; + end - local ld = ldap:getconnection(); - local username = jsplit(jid); - local filter = ldap.filter.combine_and(admin_config.filter, admin_config.namefield .. '=' .. username); + local ld = ldap:getconnection(); + local username = jsplit(jid); + local filter = ldap.filter.combine_and(admin_config.filter, admin_config.namefield .. '=' .. username); - return ldap.singlematch { - base = admin_config.basedn, - filter = filter, - }; - end + return ldap.singlematch { + base = admin_config.basedn, + filter = filter, + }; + end - return provider; + return provider; end module:add_item("auth-provider", new_default_provider(module.host)); diff --git a/conf/metronome/modules/mod_legacyauth.lua b/conf/metronome/modules/mod_legacyauth.lua index 3ee8b978b..ae90f72d6 100644 --- a/conf/metronome/modules/mod_legacyauth.lua +++ b/conf/metronome/modules/mod_legacyauth.lua @@ -1,7 +1,7 @@ -- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain --- +-- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- @@ -12,8 +12,8 @@ local st = require "util.stanza"; local t_concat = table.concat; local secure_auth_only = module:get_option("c2s_require_encryption") - or module:get_option("require_encryption") - or not(module:get_option("allow_unencrypted_plain_auth")); + or module:get_option("require_encryption") + or not(module:get_option("allow_unencrypted_plain_auth")); local sessionmanager = require "core.sessionmanager"; local usermanager = require "core.usermanager"; @@ -22,66 +22,65 @@ local resourceprep = require "util.encodings".stringprep.resourceprep; module:add_feature("jabber:iq:auth"); module:hook("stream-features", function(event) - local origin, features = event.origin, event.features; - if secure_auth_only and not origin.secure then - -- Sorry, not offering to insecure streams! - return; - elseif not origin.username then - features:tag("auth", {xmlns='http://jabber.org/features/iq-auth'}):up(); - end + local origin, features = event.origin, event.features; + if secure_auth_only and not origin.secure then + -- Sorry, not offering to insecure streams! + return; + elseif not origin.username then + features:tag("auth", {xmlns='http://jabber.org/features/iq-auth'}):up(); + end end); module:hook("stanza/iq/jabber:iq:auth:query", function(event) - local session, stanza = event.origin, event.stanza; + local session, stanza = event.origin, event.stanza; - if session.type ~= "c2s_unauthed" then - (session.sends2s or session.send)(st.error_reply(stanza, "cancel", "service-unavailable", "Legacy authentication is only allowed for unauthenticated client connections.")); - return true; - end + if session.type ~= "c2s_unauthed" then + (session.sends2s or session.send)(st.error_reply(stanza, "cancel", "service-unavailable", "Legacy authentication is only allowed for unauthenticated client connections.")); + return true; + end - if secure_auth_only and not session.secure then - session.send(st.error_reply(stanza, "modify", "not-acceptable", "Encryption (SSL or TLS) is required to connect to this server")); - return true; - end - - local username = stanza.tags[1]:child_with_name("username"); - local password = stanza.tags[1]:child_with_name("password"); - local resource = stanza.tags[1]:child_with_name("resource"); - if not (username and password and resource) then - local reply = st.reply(stanza); - session.send(reply:query("jabber:iq:auth") - :tag("username"):up() - :tag("password"):up() - :tag("resource"):up()); - else - username, password, resource = t_concat(username), t_concat(password), t_concat(resource); - username = nodeprep(username); - resource = resourceprep(resource) - if not (username and resource) then - session.send(st.error_reply(stanza, "modify", "bad-request")); - return true; - end - if usermanager.test_password(username, session.host, password) then - -- Authentication successful! - local success, err = sessionmanager.make_authenticated(session, username); - if success then - local err_type, err_msg; - success, err_type, err, err_msg = sessionmanager.bind_resource(session, resource); - if not success then - session.send(st.error_reply(stanza, err_type, err, err_msg)); - session.username, session.type = nil, "c2s_unauthed"; -- FIXME should this be placed in sessionmanager? - return true; - elseif resource ~= session.resource then -- server changed resource, not supported by legacy auth - session.send(st.error_reply(stanza, "cancel", "conflict", "The requested resource could not be assigned to this session.")); - session:close(); -- FIXME undo resource bind and auth instead of closing the session? - return true; - end - end - session.send(st.reply(stanza)); - else - session.send(st.error_reply(stanza, "auth", "not-authorized")); - end - end - return true; + if secure_auth_only and not session.secure then + session.send(st.error_reply(stanza, "modify", "not-acceptable", "Encryption (SSL or TLS) is required to connect to this server")); + return true; + end + + local username = stanza.tags[1]:child_with_name("username"); + local password = stanza.tags[1]:child_with_name("password"); + local resource = stanza.tags[1]:child_with_name("resource"); + if not (username and password and resource) then + local reply = st.reply(stanza); + session.send(reply:query("jabber:iq:auth") + :tag("username"):up() + :tag("password"):up() + :tag("resource"):up()); + else + username, password, resource = t_concat(username), t_concat(password), t_concat(resource); + username = nodeprep(username); + resource = resourceprep(resource) + if not (username and resource) then + session.send(st.error_reply(stanza, "modify", "bad-request")); + return true; + end + if usermanager.test_password(username, session.host, password) then + -- Authentication successful! + local success, err = sessionmanager.make_authenticated(session, username); + if success then + local err_type, err_msg; + success, err_type, err, err_msg = sessionmanager.bind_resource(session, resource); + if not success then + session.send(st.error_reply(stanza, err_type, err, err_msg)); + session.username, session.type = nil, "c2s_unauthed"; -- FIXME should this be placed in sessionmanager? + return true; + elseif resource ~= session.resource then -- server changed resource, not supported by legacy auth + session.send(st.error_reply(stanza, "cancel", "conflict", "The requested resource could not be assigned to this session.")); + session:close(); -- FIXME undo resource bind and auth instead of closing the session? + return true; + end + end + session.send(st.reply(stanza)); + else + session.send(st.error_reply(stanza, "auth", "not-authorized")); + end + end + return true; end); - diff --git a/conf/metronome/modules/mod_storage_ldap.lua b/conf/metronome/modules/mod_storage_ldap.lua index 87092382c..6f1cac4cd 100644 --- a/conf/metronome/modules/mod_storage_ldap.lua +++ b/conf/metronome/modules/mod_storage_ldap.lua @@ -43,35 +43,35 @@ end local get_alias_for_user; do - local user_cache; - local last_fetch_time; + local user_cache; + local last_fetch_time; - local function populate_user_cache() - local user_c = get_config(module.host, 'ldap').user; - if not user_c then return; end + local function populate_user_cache() + local user_c = get_config(module.host, 'ldap').user; + if not user_c then return; end - local ld = ldap.getconnection(); + local ld = ldap.getconnection(); - local usernamefield = user_c.usernamefield; - local namefield = user_c.namefield; + local usernamefield = user_c.usernamefield; + local namefield = user_c.namefield; - user_cache = {}; + user_cache = {}; - for _, attrs in ld:search { base = user_c.basedn, scope = 'onelevel', filter = user_c.filter } do - user_cache[attrs[usernamefield]] = attrs[namefield]; - end - last_fetch_time = gettime(); - end + for _, attrs in ld:search { base = user_c.basedn, scope = 'onelevel', filter = user_c.filter } do + user_cache[attrs[usernamefield]] = attrs[namefield]; + end + last_fetch_time = gettime(); + end - function get_alias_for_user(user) - if last_fetch_time and last_fetch_time + CACHE_EXPIRY < gettime() then - user_cache = nil; - end - if not user_cache then - populate_user_cache(); - end - return user_cache[user]; - end + function get_alias_for_user(user) + if last_fetch_time and last_fetch_time + CACHE_EXPIRY < gettime() then + user_cache = nil; + end + if not user_cache then + populate_user_cache(); + end + return user_cache[user]; + end end ---------------------------------------- @@ -79,18 +79,18 @@ end ---------------------------------------- local function ldap_store(config) - local self = {}; - local config = config; + local self = {}; + local config = config; - function self:get(username) - return nil, "Data getting is not available for this storage backend"; - end + function self:get(username) + return nil, "Data getting is not available for this storage backend"; + end - function self:set(username, data) - return nil, "Data setting is not available for this storage backend"; - end + function self:set(username, data) + return nil, "Data setting is not available for this storage backend"; + end - return self; + return self; end local adapters = {}; @@ -100,60 +100,60 @@ local adapters = {}; ---------------------------------------- adapters.roster = function (config) - -- Validate configuration requirements - if not config.groups then return nil; end + -- Validate configuration requirements + if not config.groups then return nil; end - local self = ldap_store(config) + local self = ldap_store(config) - function self:get(username) - local ld = ldap.getconnection(); - local contacts = {}; + function self:get(username) + local ld = ldap.getconnection(); + local contacts = {}; - local memberfield = config.groups.memberfield; - local namefield = config.groups.namefield; - local filter = memberfield .. '=' .. tostring(username); + local memberfield = config.groups.memberfield; + local namefield = config.groups.namefield; + local filter = memberfield .. '=' .. tostring(username); - local groups = {}; - for _, config in ipairs(config.groups) do - groups[ config[namefield] ] = config.name; - end + local groups = {}; + for _, config in ipairs(config.groups) do + groups[ config[namefield] ] = config.name; + end - log("debug", "Found %d group(s) for user %s", select('#', groups), username) + log("debug", "Found %d group(s) for user %s", select('#', groups), username) - -- XXX this kind of relies on the way we do groups at INOC - for _, attrs in ld:search { base = config.groups.basedn, scope = 'onelevel', filter = filter } do - if groups[ attrs[namefield] ] then - local members = attrs[memberfield]; + -- XXX this kind of relies on the way we do groups at INOC + for _, attrs in ld:search { base = config.groups.basedn, scope = 'onelevel', filter = filter } do + if groups[ attrs[namefield] ] then + local members = attrs[memberfield]; - for _, user in ipairs(members) do - if user ~= username then - local jid = user .. '@' .. module.host; - local record = contacts[jid]; + for _, user in ipairs(members) do + if user ~= username then + local jid = user .. '@' .. module.host; + local record = contacts[jid]; - if not record then - record = { - subscription = 'both', - groups = {}, - name = get_alias_for_user(user), - }; - contacts[jid] = record; - end + if not record then + record = { + subscription = 'both', + groups = {}, + name = get_alias_for_user(user), + }; + contacts[jid] = record; + end - record.groups[ groups[ attrs[namefield] ] ] = true; - end - end - end - end + record.groups[ groups[ attrs[namefield] ] ] = true; + end + end + end + end - return contacts; - end + return contacts; + end - function self:set(username, data) - log("warn", "Setting data in Roster LDAP storage is not supported yet") - return nil, "not supported"; - end + function self:set(username, data) + log("warn", "Setting data in Roster LDAP storage is not supported yet") + return nil, "not supported"; + end - return self; + return self; end ---------------------------------------- @@ -161,35 +161,35 @@ end ---------------------------------------- adapters.vcard = function (config) - -- Validate configuration requirements - if not config.vcard_format or not config.user then return nil; end + -- Validate configuration requirements + if not config.vcard_format or not config.user then return nil; end - local self = ldap_store(config) + local self = ldap_store(config) - function self:get(username) - local ld = ldap.getconnection(); - local filter = config.user.usernamefield .. '=' .. tostring(username); + function self:get(username) + local ld = ldap.getconnection(); + local filter = config.user.usernamefield .. '=' .. tostring(username); - log("debug", "Retrieving vCard for user '%s'", username); + log("debug", "Retrieving vCard for user '%s'", username); - local match = ldap.singlematch { - base = config.user.basedn, - filter = filter, - }; - if match then - match.jid = username .. '@' .. module.host - return st.preserialize(ldap_record_to_vcard(match, config.vcard_format)); - else - return nil, "username not found"; - end - end + local match = ldap.singlematch { + base = config.user.basedn, + filter = filter, + }; + if match then + match.jid = username .. '@' .. module.host + return st.preserialize(ldap_record_to_vcard(match, config.vcard_format)); + else + return nil, "username not found"; + end + end - function self:set(username, data) - log("warn", "Setting data in vCard LDAP storage is not supported yet") - return nil, "not supported"; - end + function self:set(username, data) + log("warn", "Setting data in vCard LDAP storage is not supported yet") + return nil, "not supported"; + end - return self; + return self; end ---------------------------------------- diff --git a/conf/metronome/modules/vcard.lib.lua b/conf/metronome/modules/vcard.lib.lua index dcbd0106a..de2f78923 100644 --- a/conf/metronome/modules/vcard.lib.lua +++ b/conf/metronome/modules/vcard.lib.lua @@ -135,28 +135,28 @@ function builder_methods:build() end local function new_builder(params) - local vcard_tag = st.stanza('vCard', { xmlns = VCARD_NS }); + local vcard_tag = st.stanza('vCard', { xmlns = VCARD_NS }); - local object = { - vcard = vcard_tag, - __index = builder_methods, - }; + local object = { + vcard = vcard_tag, + __index = builder_methods, + }; - for k, v in pairs(params) do - object[k] = v; - end + for k, v in pairs(params) do + object[k] = v; + end - setmetatable(object, object); + setmetatable(object, object); - return object; + return object; end local _M = {}; function _M.create(params) - local builder = new_builder(params); + local builder = new_builder(params); - return builder:build(); + return builder:build(); end return _M;