Commit fba6817b4490d3b2c7fa1db70e617af03d2f5773
Exists in
staging
and in
3 other branches
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
Showing
13 changed files
with
847 additions
and
135 deletions
Show diff stats
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 | ... | ... |
... | ... | @@ -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
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 ...' | ... | ... |
... | ... | @@ -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: |
... | ... | @@ -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