Commit fba6817b4490d3b2c7fa1db70e617af03d2f5773

Authored by Rodrigo Souto
2 parents 368d30de 64e7e543

Merge branch 'chat-updates' into 'master'

Chat updates

This MR includes several chat fixes and updates in order to make it work properly on rails 4 Noosfero.

See merge request !1006
app/controllers/public/account_controller.rb
... ... @@ -156,6 +156,7 @@ class AccountController < ApplicationController
156 156 def logout
157 157 if logged_in?
158 158 self.current_user.forget_me
  159 + current_user.update({:chat_status_at => DateTime.now}.merge({:last_chat_status => current_user.chat_status, :chat_status => 'offline'}))
159 160 end
160 161 reset_session
161 162 session[:notice] = _("You have been logged out.")
... ...
app/controllers/public/chat_controller.rb
... ... @@ -113,8 +113,20 @@ class ChatController < PublicController
113 113 end
114 114  
115 115 #TODO Ideally this is done through roster table on ejabberd.
116   - def roster_groups
117   - render :text => user.memberships.map {|m| {:jid => m.jid, :name => m.name}}.to_json
  116 + def rosters
  117 + rooms = user.memberships.map {|m| {:jid => m.jid, :name => m.name}}
  118 + friends = user.friends.map {|f| {:jid => f.jid, :name => f.name}}
  119 + rosters = {:rooms => rooms, :friends => friends}
  120 + render :text => rosters.to_json
  121 + end
  122 +
  123 + def availabilities
  124 + availabilities = user.friends.map do |friend|
  125 + status = friend.user.chat_status
  126 + status = 'offline' if status.blank?
  127 + {:jid => friend.jid, :status => status}
  128 + end
  129 + render :text => availabilities.to_json
118 130 end
119 131  
120 132 protected
... ...
debian/control
... ... @@ -107,7 +107,7 @@ Description: free web-based platform for social networks (apache frontend)
107 107  
108 108 Package: noosfero-chat
109 109 Architecture: all
110   -Depends: noosfero (>= 1.2), ejabberd, odbc-postgresql, pidgin-data
  110 +Depends: noosfero (>= 1.5.1), ejabberd (>= 16.06), odbc-postgresql, pidgin-data
111 111 Description: free web-based platform for social networks (ejabberd based chat)
112 112 Noosfero is a web platform for social and solidarity economy networks with
113 113 blog, e-Porfolios, CMS, RSS, thematic discussion, events agenda and collective
... ...
debian/noosfero-chat.config 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +#!/bin/sh
  2 +
  3 +set -e
  4 +
  5 +. /usr/share/debconf/confmodule
  6 +if [ -f /usr/share/dbconfig-common/dpkg/config ]; then
  7 + # comma-separated, e.g. "mysql, pgsql, sqlite3"
  8 + dbc_dbtypes="pgsql"
  9 +
  10 + . /usr/share/dbconfig-common/dpkg/config
  11 +fi
  12 +
  13 +db_input high noosfero-chat/environment || true
  14 +db_go
  15 +
  16 +db_input high noosfero-chat/admin || true
  17 +db_go
  18 +
... ...
debian/noosfero-chat.install
1 1 debian/default/noosfero-chat etc/default
2   -util/chat/ejabberd.cfg etc/ejabberd
  2 +util/chat/ejabberd.yml etc/ejabberd
3 3 debian/update-noosfero-odbc usr/sbin
4 4 etc/security/limits.d/noosfero-chat.conf etc/security/limits.d
5 5 etc/pam.d/noosfero-chat etc/pam.d
... ...
debian/noosfero-chat.postinst
... ... @@ -4,18 +4,32 @@ set -e
4 4  
5 5 . /usr/share/debconf/confmodule
6 6  
7   -echo -n "Fetching noosfero domain ..."
8   -domain=$(noosfero-runner 'puts Environment.default.default_hostname(true)')
  7 +db_get noosfero-chat/environment
  8 +if [ ! -z "$RET" ]; then
  9 + environment="${RET}_production"
  10 +else
  11 + environment="production"
  12 +fi
  13 +
  14 +domain=$(noosfero-runner 'puts Environment.default.default_hostname(true)' $environment)
9 15 echo " [domain = $domain]"
10 16  
11   -ejabberd_config='/etc/ejabberd/ejabberd.cfg'
  17 +db_get noosfero-chat/admin
  18 +if [ ! -z "$RET" ]; then
  19 + admin="$RET@$domain"
  20 +else
  21 + admin="admin@$domain"
  22 +fi
  23 +echo " [admin = $admin]"
  24 +
  25 +ejabberd_config='/etc/ejabberd/ejabberd.yml'
12 26 if test -f $ejabberd_config; then
13   - sed -i "s/acl, *\([^,]*\), *{user, *\([^,]*\), *[^}]*/acl, \1, {user, \2, \"$domain\"/" /etc/ejabberd/ejabberd.cfg
14   - sed -i "s/hosts, *\[[^]]*/hosts, [\"$domain\"/" /etc/ejabberd/ejabberd.cfg
  27 + sed -i "s/HOST_DOMAIN/$domain/" /etc/ejabberd/ejabberd.yml
  28 + sed -i "s/ACL_ADMIN_ACCOUNT/$admin/" /etc/ejabberd/ejabberd.yml
15 29 fi
16 30  
17 31 echo -n 'Fetching noosfero database name ...'
18   -noosfero_database=$(noosfero-runner 'puts Environment.connection_config[:database]')
  32 +noosfero_database=$(noosfero-runner 'puts Environment.connection_config[:database]' $environment)
19 33 echo " [database = $noosfero_database]"
20 34  
21 35 echo 'Creating ejabberd schema ...'
... ... @@ -29,7 +43,7 @@ else
29 43 echo " => GRANT CREATE ON DATABASE $noosfero_database TO $noosfero_user;"
30 44 fi
31 45  
32   -su - $noosfero_user -c 'rails dbconsole production < /usr/share/noosfero/util/chat/postgresql/ejabberd.sql > /dev/null'
  46 +su - $noosfero_user -c "rails dbconsole $environment < /usr/share/noosfero/util/chat/postgresql/ejabberd.sql > /dev/null"
33 47  
34 48 if which update-noosfero-odbc &> /dev/null ; then
35 49 update-noosfero-odbc
... ... @@ -37,6 +51,7 @@ fi
37 51  
38 52 ejabberd_default='/etc/default/ejabberd'
39 53 noosfero_chat_default='/etc/default/noosfero-chat'
  54 +
40 55 if test -f $ejabberd_default; then
41 56 if ! cat $ejabberd_default | grep "^\. $noosfero_chat_default" > /dev/null ; then
42 57 echo 'Extending ejabberd defaults with noosfero-chat defaults ...'
... ...
debian/noosfero-chat.templates 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +Template: noosfero-chat/environment
  2 +Type: string
  3 +Description: Choose the environment in which the chat will be installed
  4 + Noosfero Chat currently does not support multitenancy environments. If your
  5 + system is using a multitenancy setup with multiple environments, you will need
  6 + to fill below the environment in which you want the chat installed
  7 + uses. For example, if your environment is 'social_production', you should
  8 + enter below 'social'.
  9 + .
  10 + If you are not using a multitenancy setup, you may leave this option blank, in
  11 + which case the used environment will be 'production'.
  12 +
  13 +Template: noosfero-chat/admin
  14 +Type: string
  15 +Description: Choose the admin of the chat
  16 + Enter the user identifier to define the user that will have administrator
  17 + privileges on the chat.
  18 + .
  19 + If you leave this option blank the user defined will be 'admin'.
... ...
public/designs/icons/pidgin/emoticons.js
... ... @@ -40,7 +40,7 @@ var emoticons = {
40 40 }
41 41 },
42 42 "::bigSmile": {
43   - "image": "smile-big.png",
  43 + "image": "excited.png",
44 44 "emotes": {
45 45 ":D": "",
46 46 "=D": "",
... ... @@ -48,7 +48,7 @@ var emoticons = {
48 48 }
49 49 },
50 50 "::shock": {
51   - "image": "shock.png",
  51 + "image": "shocked.png",
52 52 "emotes": {
53 53 ":O": "",
54 54 ":0": "",
... ...
public/javascripts/chat.js
... ... @@ -147,22 +147,18 @@ jQuery(function($) {
147 147 if(offset_container.length == 0)
148 148 offset_container = $('<div class="chat-offset-container-'+offset+'"></div>').prependTo(history);
149 149  
150   - if (offset_container.find('.message:last').attr('data-who') == who) {
151   - offset_container.find('.message:last .content').append('<p>' + body + '</p>');
152   - }
153   - else {
154   - if (time==undefined) {
155   - time = new Date().toISOString();
156   - }
157   - var message_html = Jabber.template('.message')
158   - .replace('%{message}', body)
159   - .replace(/%{who}/g, who)
160   - .replace('%{time}', time)
161   - .replace('%{name}', name)
162   - .replace('%{avatar}', getAvatar(identifier));
163   - offset_container.append(message_html);
164   - $(".message span.time").timeago();
  150 + if (time==undefined) {
  151 + time = new Date().toISOString();
165 152 }
  153 + var message_html = Jabber.template('.message')
  154 + .replace('%{message}', body)
  155 + .replace(/%{who}/g, who)
  156 + .replace('%{time}', time)
  157 + .replace('%{name}', name)
  158 + .replace('%{avatar}', getAvatar(identifier));
  159 + offset_container.append(message_html);
  160 + $(".message span.time").timeago();
  161 +
166 162 if(offset == 0) history.scrollTo({top:'100%', left:'0%'});
167 163 else history.scrollTo(offset_container.height());
168 164 if (who != "self") {
... ... @@ -271,28 +267,36 @@ jQuery(function($) {
271 267 var contacts_to_insert = {};
272 268 var groups_to_insert = [];
273 269  
274   - $(iq).find('item').each(function () {
275   - var jid = $(this).attr('jid');
276   - profiles.push(getIdentifier(jid));
277   - var name = $(this).attr('name') || jid;
278   - var jid_id = Jabber.jid_to_id(jid);
279   - contacts_to_insert[jid] = name;
280   - });
  270 + //FIXME User ejabberd roster when the username length limit bug is solved.
  271 + // $(iq).find('item').each(function () {
  272 + // var jid = $(this).attr('jid');
  273 + // profiles.push(getIdentifier(jid));
  274 + // var name = $(this).attr('name') || jid;
  275 + // var jid_id = Jabber.jid_to_id(jid);
  276 + // contacts_to_insert[jid] = name;
  277 + // });
281 278  
282   - //TODO Add groups through roster too...
283 279 $.ajax({
284   - url: '/chat/roster_groups',
  280 + url: '/chat/rosters',
285 281 dataType: 'json',
286 282 success: function(data){
287   - $(data).each(function(index, room){
  283 + $(data.friends).each(function(index, friend){
  284 + var jid = friend.jid;
  285 + profiles.push(getIdentifier(jid));
  286 + var name = friend.name;
  287 + var jid_id = Jabber.jid_to_id(jid);
  288 + contacts_to_insert[jid] = name;
  289 + });
  290 +
  291 + $(data.rooms).each(function(index, room){
288 292 profiles.push(getIdentifier(room.jid));
289 293 var jid_id = Jabber.jid_to_id(room.jid);
290 294 Jabber.jids[jid_id] = {jid: room.jid, name: room.name, type: 'groupchat'};
291 295 //FIXME This must check on session if the user is inside the room...
292 296 groups_to_insert.push(room.jid);
293   -
294 297 });
295   - $.getJSON('/chat/avatars', {profiles: profiles}, function(data) {
  298 +
  299 + $.post('/chat/avatars', {profiles: profiles}, function(data) {
296 300 for(identifier in data)
297 301 Jabber.avatars[identifier] = data[identifier];
298 302  
... ... @@ -313,13 +317,13 @@ jQuery(function($) {
313 317 Jabber.connection.addHandler(Jabber.on_presence, null, "presence");
314 318 Jabber.send_availability_status(Jabber.presence_status);
315 319 load_defaults();
316   - });
  320 + updateAvailabilities();
  321 + }, 'json');
317 322 },
318 323 error: function(data, textStatus, jqXHR){
319 324 console.log(data);
320 325 },
321 326 });
322   -
323 327 },
324 328  
325 329 // NOTE: cause Noosfero store's rosters in database based on friendship relation between people
... ... @@ -405,21 +409,7 @@ jQuery(function($) {
405 409 else {
406 410 log('receiving contact presence from ' + presence.from + ' as ' + presence.show);
407 411 var jid = Strophe.getBareJidFromJid(presence.from);
408   - if (jid != Jabber.connection.jid) {
409   - var jid_id = Jabber.jid_to_id(jid);
410   - var name = Jabber.name_of(jid_id);
411   - if(presence.show == 'chat')
412   - Jabber.remove_notice(jid_id);
413   - Jabber.insert_or_update_contact(jid, name, presence.show);
414   - Jabber.update_chat_title();
415   - }
416   - else {
417   - // why server sends presence from myself to me?
418   - log('ignoring presence from myself');
419   - if(presence.show=='offline') {
420   - Jabber.send_availability_status(Jabber.presence_status);
421   - }
422   - }
  412 + setFriendStatus(jid, presence.show);
423 413 }
424 414 }
425 415 return true;
... ... @@ -898,6 +888,24 @@ jQuery(function($) {
898 888 }
899 889 }
900 890  
  891 + function setFriendStatus(jid, status) {
  892 + if (jid != Jabber.connection.jid) {
  893 + var jid_id = Jabber.jid_to_id(jid);
  894 + var name = Jabber.name_of(jid_id);
  895 + if(status == 'chat')
  896 + Jabber.remove_notice(jid_id);
  897 + Jabber.insert_or_update_contact(jid, name, status);
  898 + Jabber.update_chat_title();
  899 + }
  900 + else {
  901 + // why server sends presence from myself to me?
  902 + log('ignoring presence from myself');
  903 + if(status=='offline') {
  904 + Jabber.send_availability_status(Jabber.presence_status);
  905 + }
  906 + }
  907 + }
  908 +
901 909 $('.title-bar a').click(function() {
902 910 $(this).parents('.status-group').find('.buddies').toggle('fast');
903 911 return false;
... ... @@ -967,4 +975,23 @@ jQuery(function($) {
967 975  
968 976 window.onfocus = function() {Jabber.window_visibility = true};
969 977 window.onblur = function() {Jabber.window_visibility = false};
  978 +
  979 + //FIXME Workaround to solve availability problems
  980 + function updateAvailabilities() {
  981 + $.ajax({
  982 + url: '/chat/availabilities',
  983 + dataType: 'json',
  984 + success: function(data){
  985 + $(data).each(function(index, friend){
  986 + var jid_id = Jabber.jid_to_id(friend.jid);
  987 + if (Jabber.jids[jid_id].presence != friend.status)
  988 + setFriendStatus(friend.jid, friend.status)
  989 + });
  990 + },
  991 + complete: function(data){ setTimeout(updateAvailabilities, 10000) },
  992 + error: function(data, textStatus, jqXHR){
  993 + console.log(data);
  994 + },
  995 + });
  996 + }
970 997 });
... ...
public/stylesheets/chat.scss
... ... @@ -242,12 +242,12 @@
242 242 }
243 243  
244 244 #chat-window .history .message .time {
245   - float: right;
246 245 color: white;
247 246 font-style: italic;
248 247 font-size: 10px;
249 248 border-bottom: 1px solid #d3d7cf;
250   - width: 100%;
  249 + width: 245px;
  250 + display: inline-block;
251 251 text-align: right;
252 252 margin-bottom: 5px;
253 253 }
... ...
util/chat/ejabberd.cfg
... ... @@ -1,74 +0,0 @@
1   -%%%
2   -%%% Noosfero ejabberd configuration file
3   -%%% This config must be in UTF-8 encoding
4   -%%%
5   -
6   -{acl, admin, {user, "admin", "mydomain.example.com"}}.
7   -{hosts, ["mydomain.example.com"]}.
8   -
9   -{loglevel, 4}.
10   -{listen,
11   - [
12   - {5222, ejabberd_c2s, [
13   - {access, c2s},
14   - {shaper, c2s_shaper},
15   - {max_stanza_size, 65536},
16   - starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
17   - ]},
18   - {5280, ejabberd_http, [
19   - http_bind,
20   - http_poll
21   - ]}
22   - ]}.
23   -{max_fsm_queue, 1000}.
24   -{auth_method, odbc}.
25   -{odbc_server, "DSN=PostgreSQLEjabberdNoosfero"}.
26   -{shaper, normal, {maxrate, 10000000}}.
27   -{shaper, fast, {maxrate, 50000}}.
28   -{acl, local, {user_regexp, ""}}.
29   -{access, max_user_sessions, [{10, all}]}.
30   -{access, local, [{allow, local}]}.
31   -{access, c2s, [{deny, blocked},
32   - {allow, all}]}.
33   -{access, c2s_shaper, [{none, admin},
34   - {normal, all}]}.
35   -{access, announce, [{allow, admin}]}.
36   -{access, configure, [{allow, admin}]}.
37   -{access, muc_admin, [{allow, admin}]}.
38   -{access, muc, [{allow, all}]}.
39   -{access, pubsub_createnode, [{allow, all}]}.
40   -{language, "pt"}.
41   -{modules,
42   - [
43   - {mod_adhoc, []},
44   - {mod_announce, [{access, announce}]}, % requires mod_adhoc
45   - {mod_caps, []},
46   - {mod_configure,[]}, % requires mod_adhoc
47   - {mod_disco, []},
48   - {mod_last, []},
49   - {mod_muc, [
50   - {access, muc},
51   - {access_create, muc},
52   - {access_persistent, muc},
53   - {access_admin, muc_admin},
54   - {max_users, 500},
55   - {default_room_options, [{anonymous, false}]}
56   - ]},
57   - {mod_privacy_odbc, []},
58   - {mod_private_odbc, []},
59   - {mod_proxy65, [
60   - {access, local},
61   - {shaper, c2s_shaper}
62   - ]},
63   - {mod_roster_odbc, []},
64   - {mod_stats, []},
65   - {mod_time, []},
66   - {mod_vcard, []},
67   - {mod_http_bind, []},
68   - {mod_version, []}
69   - ]}.
70   -
71   -%%% Local Variables:
72   -%%% mode: erlang
73   -%%% End:
74   -%%% vim: set filetype=erlang tabstop=8:
util/chat/ejabberd.yml 0 → 100644
... ... @@ -0,0 +1,694 @@
  1 +###
  2 +###' ejabberd configuration file
  3 +###
  4 +###
  5 +
  6 +### The parameters used in this configuration file are explained in more detail
  7 +### in the ejabberd Installation and Operation Guide.
  8 +### Please consult the Guide in case of doubts, it is included with
  9 +### your copy of ejabberd, and is also available online at
  10 +### http://www.process-one.net/en/ejabberd/docs/
  11 +
  12 +### The configuration file is written in YAML.
  13 +### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
  14 +### However, ejabberd treats different literals as different types:
  15 +###
  16 +### - unquoted or single-quoted strings. They are called "atoms".
  17 +### Example: dog, 'Jupiter', '3.14159', YELLOW
  18 +###
  19 +### - numeric literals. Example: 3, -45.0, .0
  20 +###
  21 +### - quoted or folded strings.
  22 +### Examples of quoted string: "Lizzard", "orange".
  23 +### Example of folded string:
  24 +### > Art thou not Romeo,
  25 +### and a Montague?
  26 +
  27 +###. =======
  28 +###' LOGGING
  29 +
  30 +##
  31 +## loglevel: Verbosity of log files generated by ejabberd.
  32 +## 0: No ejabberd log at all (not recommended)
  33 +## 1: Critical
  34 +## 2: Error
  35 +## 3: Warning
  36 +## 4: Info
  37 +## 5: Debug
  38 +##
  39 +loglevel: 4
  40 +
  41 +##
  42 +## rotation: Disable ejabberd's internal log rotation, as the Debian package
  43 +## uses logrotate(8).
  44 +log_rotate_size: 0
  45 +log_rotate_date: ""
  46 +
  47 +##
  48 +## overload protection: If you want to limit the number of messages per second
  49 +## allowed from error_logger, which is a good idea if you want to avoid a flood
  50 +## of messages when system is overloaded, you can set a limit.
  51 +## 100 is ejabberd's default.
  52 +log_rate_limit: 100
  53 +
  54 +##
  55 +## watchdog_admins: Only useful for developers: if an ejabberd process
  56 +## consumes a lot of memory, send live notifications to these XMPP
  57 +## accounts.
  58 +##
  59 +## watchdog_admins:
  60 +## - "bob@example.com"
  61 +
  62 +###. ===============
  63 +###' NODE PARAMETERS
  64 +
  65 +##
  66 +## net_ticktime: Specifies net_kernel tick time in seconds. This options must have
  67 +## identical value on all nodes, and in most cases shouldn't be changed at all from
  68 +## default value.
  69 +##
  70 +## net_ticktime: 60
  71 +
  72 +###. ================
  73 +###' SERVED HOSTNAMES
  74 +
  75 +##
  76 +## hosts: Domains served by ejabberd.
  77 +## You can define one or several, for example:
  78 +## hosts:
  79 +## - "example.net"
  80 +## - "example.com"
  81 +## - "example.org"
  82 +##
  83 +hosts:
  84 + - "HOST_DOMAIN"
  85 +
  86 +##
  87 +## route_subdomains: Delegate subdomains to other XMPP servers.
  88 +## For example, if this ejabberd serves example.org and you want
  89 +## to allow communication with an XMPP server called im.example.org.
  90 +##
  91 +## route_subdomains: s2s
  92 +
  93 +###. ===============
  94 +###' LISTENING PORTS
  95 +
  96 +##
  97 +## listen: The ports ejabberd will listen on, which service each is handled
  98 +## by and what options to start it with.
  99 +##
  100 +listen:
  101 + -
  102 + port: 5222
  103 + ip: "::"
  104 + module: ejabberd_c2s
  105 + ##
  106 + ## If TLS is compiled in and you installed a SSL
  107 + ## certificate, specify the full path to the
  108 + ## file and uncomment these lines:
  109 + ##
  110 + certfile: "/etc/ejabberd/ejabberd.pem"
  111 + starttls: true
  112 + ##
  113 + ## To enforce TLS encryption for client connections,
  114 + ## use this instead of the "starttls" option:
  115 + ##
  116 + ## starttls_required: true
  117 + ##
  118 + ## Custom OpenSSL options
  119 + ##
  120 + protocol_options:
  121 + - "no_sslv3"
  122 + ## - "no_tlsv1"
  123 + max_stanza_size: 65536
  124 + shaper: c2s_shaper
  125 + access: c2s
  126 + zlib: true
  127 + resend_on_timeout: if_offline
  128 + -
  129 + port: 5269
  130 + ip: "::"
  131 + module: ejabberd_s2s_in
  132 + ##
  133 + ## ejabberd_service: Interact with external components (transports, ...)
  134 + ##
  135 + ## -
  136 + ## port: 8888
  137 + ## module: ejabberd_service
  138 + ## access: all
  139 + ## shaper_rule: fast
  140 + ## ip: "127.0.0.1"
  141 + ## hosts:
  142 + ## "icq.example.org":
  143 + ## password: "secret"
  144 + ## "sms.example.org":
  145 + ## password: "secret"
  146 +
  147 + ##
  148 + ## ejabberd_stun: Handles STUN Binding requests
  149 + ##
  150 + ## -
  151 + ## port: 3478
  152 + ## transport: udp
  153 + ## module: ejabberd_stun
  154 +
  155 + ##
  156 + ## To handle XML-RPC requests that provide admin credentials:
  157 + ##
  158 + ## -
  159 + ## port: 4560
  160 + ## module: ejabberd_xmlrpc
  161 + ## access_commands: {}
  162 + -
  163 + port: 5280
  164 + ip: "::"
  165 + module: ejabberd_http
  166 + request_handlers:
  167 + "/websocket": ejabberd_http_ws
  168 + ## "/pub/archive": mod_http_fileserver
  169 + web_admin: true
  170 + http_bind: true
  171 + http_poll: true
  172 + ## register: true
  173 + ## captcha: true
  174 + ## tls: true
  175 + ## certfile: "/etc/ejabberd/ejabberd.pem"
  176 +
  177 +## Disabling digest-md5 SASL authentication. digest-md5 requires plain-text
  178 +## password storage (see auth_password_format option).
  179 +disable_sasl_mechanisms: "digest-md5"
  180 +
  181 +###. ==================
  182 +###' S2S GLOBAL OPTIONS
  183 +
  184 +##
  185 +## s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
  186 +## Allowed values are: false optional required required_trusted
  187 +## You must specify a certificate file.
  188 +##
  189 +s2s_use_starttls: optional
  190 +
  191 +##
  192 +## s2s_certfile: Specify a certificate file.
  193 +##
  194 +s2s_certfile: "/etc/ejabberd/ejabberd.pem"
  195 +
  196 +## Custom OpenSSL options
  197 +##
  198 +s2s_protocol_options:
  199 + - "no_sslv3"
  200 +## - "no_tlsv1"
  201 +
  202 +##
  203 +## domain_certfile: Specify a different certificate for each served hostname.
  204 +##
  205 +## host_config:
  206 +## "example.org":
  207 +## domain_certfile: "/path/to/example_org.pem"
  208 +## "example.com":
  209 +## domain_certfile: "/path/to/example_com.pem"
  210 +
  211 +##
  212 +## S2S whitelist or blacklist
  213 +##
  214 +## Default s2s policy for undefined hosts.
  215 +##
  216 +## s2s_access: s2s
  217 +
  218 +##
  219 +## Outgoing S2S options
  220 +##
  221 +## Preferred address families (which to try first) and connect timeout
  222 +## in milliseconds.
  223 +##
  224 +## outgoing_s2s_families:
  225 +## - ipv4
  226 +## - ipv6
  227 +## outgoing_s2s_timeout: 10000
  228 +
  229 +###. ==============
  230 +###' AUTHENTICATION
  231 +
  232 +##
  233 +## auth_method: Method used to authenticate the users.
  234 +## The default method is the internal.
  235 +## If you want to use a different method,
  236 +## comment this line and enable the correct ones.
  237 +##
  238 +#auth_method: internal
  239 +
  240 +##
  241 +## Store the plain passwords or hashed for SCRAM:
  242 +## auth_password_format: plain
  243 +## auth_password_format: scram
  244 +##
  245 +## Define the FQDN if ejabberd doesn't detect it:
  246 +## fqdn: "server3.example.com"
  247 +
  248 +##
  249 +## Authentication using external script
  250 +## Make sure the script is executable by ejabberd.
  251 +##
  252 +## auth_method: external
  253 +## extauth_program: "/path/to/authentication/script"
  254 +
  255 +##
  256 +## Authentication using SQL
  257 +## Remember to setup a database in the next section.
  258 +##
  259 +auth_method: sql
  260 +
  261 +##
  262 +## Authentication using PAM
  263 +##
  264 +## auth_method: pam
  265 +## pam_service: "pamservicename"
  266 +
  267 +##
  268 +## Authentication using LDAP
  269 +##
  270 +## auth_method: ldap
  271 +##
  272 +## List of LDAP servers:
  273 +## ldap_servers:
  274 +## - "localhost"
  275 +##
  276 +## Encryption of connection to LDAP servers:
  277 +## ldap_encrypt: none
  278 +## ldap_encrypt: tls
  279 +##
  280 +## Port to connect to on LDAP servers:
  281 +## ldap_port: 389
  282 +## ldap_port: 636
  283 +##
  284 +## LDAP manager:
  285 +## ldap_rootdn: "dc=example,dc=com"
  286 +##
  287 +## Password of LDAP manager:
  288 +## ldap_password: "******"
  289 +##
  290 +## Search base of LDAP directory:
  291 +## ldap_base: "dc=example,dc=com"
  292 +##
  293 +## LDAP attribute that holds user ID:
  294 +## ldap_uids:
  295 +## - "mail": "%u@mail.example.org"
  296 +##
  297 +## LDAP filter:
  298 +## ldap_filter: "(objectClass=shadowAccount)"
  299 +
  300 +##
  301 +## Anonymous login support:
  302 +## auth_method: anonymous
  303 +## anonymous_protocol: sasl_anon | login_anon | both
  304 +## allow_multiple_connections: true | false
  305 +##
  306 +## host_config:
  307 +## "public.example.org":
  308 +## auth_method: anonymous
  309 +## allow_multiple_connections: false
  310 +## anonymous_protocol: sasl_anon
  311 +##
  312 +## To use both anonymous and internal authentication:
  313 +##
  314 +## host_config:
  315 +## "public.example.org":
  316 +## auth_method:
  317 +## - internal
  318 +## - anonymous
  319 +
  320 +###. ==============
  321 +###' DATABASE SETUP
  322 +
  323 +## ejabberd by default uses the internal Mnesia database,
  324 +## so you do not necessarily need this section.
  325 +## This section provides configuration examples in case
  326 +## you want to use other database backends.
  327 +## Please consult the ejabberd Guide for details on database creation.
  328 +
  329 +##
  330 +## MySQL server:
  331 +##
  332 +## sql_type: mysql
  333 +## sql_server: "server"
  334 +## sql_database: "database"
  335 +## sql_username: "username"
  336 +## sql_password: "password"
  337 +##
  338 +## If you want to specify the port:
  339 +## sql_port: 1234
  340 +
  341 +##
  342 +## PostgreSQL server:
  343 +##
  344 +## sql_type: pgsql
  345 +## sql_server: "server"
  346 +## sql_database: "database"
  347 +## sql_username: "username"
  348 +## sql_password: "password"
  349 +##
  350 +## If you want to specify the port:
  351 +## sql_port: 1234
  352 +##
  353 +## If you use PostgreSQL, have a large database, and need a
  354 +## faster but inexact replacement for "select count(*) from users"
  355 +##
  356 +## pgsql_users_number_estimate: true
  357 +
  358 +##
  359 +## SQLite:
  360 +##
  361 +## sql_type: sqlite
  362 +## sql_database: "/path/to/database.db"
  363 +
  364 +##
  365 +## ODBC compatible or MSSQL server:
  366 +##
  367 +sql_type: odbc
  368 +sql_server: "DSN=PostgreSQLEjabberdNoosfero"
  369 +
  370 +##
  371 +## Number of connections to open to the database for each virtual host
  372 +##
  373 +## sql_pool_size: 10
  374 +
  375 +##
  376 +## Interval to make a dummy SQL request to keep the connections to the
  377 +## database alive. Specify in seconds: for example 28800 means 8 hours
  378 +##
  379 +## sql_keepalive_interval: undefined
  380 +
  381 +###. ===============
  382 +###' TRAFFIC SHAPERS
  383 +
  384 +shaper:
  385 + ##
  386 + ## The "normal" shaper limits traffic speed to 1000 B/s
  387 + ##
  388 + normal: 1000
  389 +
  390 + ##
  391 + ## The "fast" shaper limits traffic speed to 50000 B/s
  392 + ##
  393 + fast: 50000
  394 +
  395 +##
  396 +## This option specifies the maximum number of elements in the queue
  397 +## of the FSM. Refer to the documentation for details.
  398 +##
  399 +max_fsm_queue: 1000
  400 +
  401 +###. ====================
  402 +###' ACCESS CONTROL LISTS
  403 +acl:
  404 + ##
  405 + ## The 'admin' ACL grants administrative privileges to XMPP accounts.
  406 + ## You can put here as many accounts as you want.
  407 + ##
  408 + admin:
  409 + user:
  410 + - "ACL_ADMIN_ACCOUNT"
  411 +
  412 + ##
  413 + ## Blocked users
  414 + ##
  415 + ## blocked:
  416 + ## user:
  417 + ## - "baduser@example.org"
  418 + ## - "test"
  419 +
  420 + ## Local users: don't modify this.
  421 + ##
  422 + local:
  423 + user_regexp: ""
  424 +
  425 + ##
  426 + ## More examples of ACLs
  427 + ##
  428 + ## jabberorg:
  429 + ## server:
  430 + ## - "jabber.org"
  431 + ## aleksey:
  432 + ## user:
  433 + ## - "aleksey@jabber.ru"
  434 + ## test:
  435 + ## user_regexp: "^test"
  436 + ## user_glob: "test*"
  437 +
  438 + ##
  439 + ## Loopback network
  440 + ##
  441 + loopback:
  442 + ip:
  443 + - "127.0.0.0/8"
  444 +
  445 + ##
  446 + ## Bad XMPP servers
  447 + ##
  448 + ## bad_servers:
  449 + ## server:
  450 + ## - "xmpp.zombie.org"
  451 + ## - "xmpp.spam.com"
  452 +
  453 +##
  454 +## Define specific ACLs in a virtual host.
  455 +##
  456 +## host_config:
  457 +## "localhost":
  458 +## acl:
  459 +## admin:
  460 +## user:
  461 +## - "bob-local@localhost"
  462 +
  463 +###. ============
  464 +###' SHAPER RULES
  465 +
  466 +shaper_rules:
  467 + ## Maximum number of simultaneous sessions allowed for a single user:
  468 + max_user_sessions: 10
  469 + ## Maximum number of offline messages that users can have:
  470 + max_user_offline_messages:
  471 + - 5000: admin
  472 + - 100
  473 + ## For C2S connections, all users except admins use the "normal" shaper
  474 + c2s_shaper:
  475 + - none: admin
  476 + - normal
  477 + ## All S2S connections use the "fast" shaper
  478 + s2s_shaper: fast
  479 +
  480 +###. ============
  481 +###' ACCESS RULES
  482 +access_rules:
  483 + ## This rule allows access only for local users:
  484 + local:
  485 + - allow: local
  486 + ## Only non-blocked users can use c2s connections:
  487 + c2s:
  488 + - deny: blocked
  489 + - allow
  490 + ## Only admins can send announcement messages:
  491 + announce:
  492 + - allow: admin
  493 + ## Only admins can use the configuration interface:
  494 + configure:
  495 + - allow: admin
  496 + muc_admin:
  497 + - allow: admin
  498 + ## Only accounts of the local ejabberd server can create rooms:
  499 + muc_create:
  500 + - allow: local
  501 + muc:
  502 + - allow
  503 + ## Only accounts on the local ejabberd server can create Pubsub nodes:
  504 + pubsub_createnode:
  505 + - allow: local
  506 + ## In-band registration allows registration of any possible username.
  507 + ## To disable in-band registration, replace 'allow' with 'deny'.
  508 + register:
  509 + - allow
  510 + ## Only allow to register from localhost
  511 + trusted_network:
  512 + - allow: loopback
  513 + ## Do not establish S2S connections with bad servers
  514 + ## s2s:
  515 + ## - deny:
  516 + ## - ip: "XXX.XXX.XXX.XXX/32"
  517 + ## - deny:
  518 + ## - ip: "XXX.XXX.XXX.XXX/32"
  519 + ## - allow
  520 +
  521 +## By default the frequency of account registrations from the same IP
  522 +## is limited to 1 account every 10 minutes. To disable, specify: infinity
  523 +## registration_timeout: 600
  524 +
  525 +##
  526 +## Define specific Access Rules in a virtual host.
  527 +##
  528 +## host_config:
  529 +## "localhost":
  530 +## access:
  531 +## c2s:
  532 +## - allow: admin
  533 +## - deny
  534 +## register:
  535 +## - deny
  536 +
  537 +###. ================
  538 +###' DEFAULT LANGUAGE
  539 +
  540 +##
  541 +## language: Default language used for server messages.
  542 +##
  543 +language: "pt"
  544 +
  545 +##
  546 +## Set a different default language in a virtual host.
  547 +##
  548 +## host_config:
  549 +## "localhost":
  550 +## language: "ru"
  551 +
  552 +###. =======
  553 +###' CAPTCHA
  554 +
  555 +##
  556 +## Full path to a script that generates the image.
  557 +##
  558 +## captcha_cmd: "/usr/share/ejabberd/captcha.sh"
  559 +
  560 +##
  561 +## Host for the URL and port where ejabberd listens for CAPTCHA requests.
  562 +##
  563 +## captcha_host: "example.org:5280"
  564 +
  565 +##
  566 +## Limit CAPTCHA calls per minute for JID/IP to avoid DoS.
  567 +##
  568 +## captcha_limit: 5
  569 +
  570 +###. =======
  571 +###' MODULES
  572 +
  573 +##
  574 +## Modules enabled in all ejabberd virtual hosts.
  575 +##
  576 +modules:
  577 + mod_adhoc: {}
  578 + mod_admin_extra: {}
  579 + mod_announce: # recommends mod_adhoc
  580 + access: announce
  581 + mod_blocking: {} # requires mod_privacy
  582 + mod_caps: {}
  583 + mod_carboncopy: {}
  584 + mod_client_state: {}
  585 + mod_configure: {} # requires mod_adhoc
  586 + mod_disco: {}
  587 + mod_echo: {}
  588 + mod_irc: {}
  589 + mod_http_bind: {}
  590 + ## mod_http_fileserver:
  591 + ## docroot: "/var/www"
  592 + ## accesslog: "/var/log/ejabberd/access.log"
  593 + mod_last: {}
  594 + mod_muc:
  595 + ## host: "conference.@HOST@"
  596 + access:
  597 + - allow
  598 + access_create: muc_create
  599 + access_persistent: muc_create
  600 + access_admin: muc_admin
  601 + default_room_options:
  602 + anonymous: false
  603 + ## mod_muc_log: {}
  604 + mod_muc_admin: {}
  605 + ## mod_multicast: {}
  606 + mod_offline:
  607 + access_max_user_messages: max_user_offline_messages
  608 + mod_ping: {}
  609 + ## mod_pres_counter:
  610 + ## count: 5
  611 + ## interval: 60
  612 + mod_privacy:
  613 + db_type: sql
  614 + mod_private:
  615 + db_type: sql
  616 + mod_proxy65:
  617 + access: local
  618 + shaper: c2s_shaper
  619 + mod_pubsub:
  620 + access_createnode: pubsub_createnode
  621 + ## reduces resource comsumption, but XEP incompliant
  622 + ignore_pep_from_offline: true
  623 + ## XEP compliant, but increases resource comsumption
  624 + ## ignore_pep_from_offline: false
  625 + last_item_cache: false
  626 + plugins:
  627 + - "flat"
  628 + - "hometree"
  629 + - "pep" # pep requires mod_caps
  630 + ## mod_register:
  631 + ##
  632 + ## Protect In-Band account registrations with CAPTCHA.
  633 + ##
  634 + ## captcha_protected: true
  635 + ##
  636 + ## Set the minimum informational entropy for passwords.
  637 + ##
  638 + ## password_strength: 32
  639 + ##
  640 + ## After successful registration, the user receives
  641 + ## a message with this subject and body.
  642 + ##
  643 + ## welcome_message:
  644 + ## subject: "Welcome!"
  645 + ## body: |-
  646 + ## Hi.
  647 + ## Welcome to this XMPP server.
  648 + ##
  649 + ## When a user registers, send a notification to
  650 + ## these XMPP accounts.
  651 + ##
  652 + ## registration_watchers:
  653 + ## - "admin1@example.org"
  654 + ##
  655 + ## Only clients in the server machine can register accounts
  656 + ##
  657 + ## ip_access: trusted_network
  658 + ##
  659 + ## Local c2s or remote s2s users cannot register accounts
  660 + ##
  661 + ## access_from: deny
  662 + ## access: register
  663 + mod_roster:
  664 + db_type: odbc
  665 + mod_shared_roster: {}
  666 + mod_stats: {}
  667 + mod_time: {}
  668 + mod_vcard:
  669 + search: false
  670 + mod_version: {}
  671 +
  672 +##
  673 +## Enable modules with custom options in a specific virtual host
  674 +##
  675 +## host_config:
  676 +## "localhost":
  677 +## modules:
  678 +## mod_echo:
  679 +## host: "mirror.localhost"
  680 +
  681 +##
  682 +## Enable modules management via ejabberdctl for installation and
  683 +## uninstallation of public/private contributed modules
  684 +## (enabled by default)
  685 +##
  686 +
  687 +allow_contrib_modules: true
  688 +
  689 +###.
  690 +###'
  691 +### Local Variables:
  692 +### mode: yaml
  693 +### End:
  694 +### vim: set filetype=yaml tabstop=8 foldmarker=###',###. foldmethod=marker:
... ...
util/chat/odbcinst.ini
1 1 [PostgreSQL Unicode]
2 2 Description = PostgreSQL ODBC driver (Unicode version)
3   -Driver = /usr/lib/odbc/psqlodbcw.so
4   -Setup = /usr/lib/odbc/libodbcpsqlS.so
  3 +Driver = psqlodbcw.so
  4 +Setup = libodbcpsqlS.so
5 5 Debug = 0
6 6 CommLog = 1
7 7 UsageCount = 3
... ...