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,6 +156,7 @@ class AccountController < ApplicationController | ||
| 156 | def logout | 156 | def logout |
| 157 | if logged_in? | 157 | if logged_in? |
| 158 | self.current_user.forget_me | 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 | end | 160 | end |
| 160 | reset_session | 161 | reset_session |
| 161 | session[:notice] = _("You have been logged out.") | 162 | session[:notice] = _("You have been logged out.") |
app/controllers/public/chat_controller.rb
| @@ -113,8 +113,20 @@ class ChatController < PublicController | @@ -113,8 +113,20 @@ class ChatController < PublicController | ||
| 113 | end | 113 | end |
| 114 | 114 | ||
| 115 | #TODO Ideally this is done through roster table on ejabberd. | 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 | end | 130 | end |
| 119 | 131 | ||
| 120 | protected | 132 | protected |
debian/control
| @@ -107,7 +107,7 @@ Description: free web-based platform for social networks (apache frontend) | @@ -107,7 +107,7 @@ Description: free web-based platform for social networks (apache frontend) | ||
| 107 | 107 | ||
| 108 | Package: noosfero-chat | 108 | Package: noosfero-chat |
| 109 | Architecture: all | 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 | Description: free web-based platform for social networks (ejabberd based chat) | 111 | Description: free web-based platform for social networks (ejabberd based chat) |
| 112 | Noosfero is a web platform for social and solidarity economy networks with | 112 | Noosfero is a web platform for social and solidarity economy networks with |
| 113 | blog, e-Porfolios, CMS, RSS, thematic discussion, events agenda and collective | 113 | blog, e-Porfolios, CMS, RSS, thematic discussion, events agenda and collective |
| @@ -0,0 +1,18 @@ | @@ -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 | debian/default/noosfero-chat etc/default | 1 | debian/default/noosfero-chat etc/default |
| 2 | -util/chat/ejabberd.cfg etc/ejabberd | 2 | +util/chat/ejabberd.yml etc/ejabberd |
| 3 | debian/update-noosfero-odbc usr/sbin | 3 | debian/update-noosfero-odbc usr/sbin |
| 4 | etc/security/limits.d/noosfero-chat.conf etc/security/limits.d | 4 | etc/security/limits.d/noosfero-chat.conf etc/security/limits.d |
| 5 | etc/pam.d/noosfero-chat etc/pam.d | 5 | etc/pam.d/noosfero-chat etc/pam.d |
debian/noosfero-chat.postinst
| @@ -4,18 +4,32 @@ set -e | @@ -4,18 +4,32 @@ set -e | ||
| 4 | 4 | ||
| 5 | . /usr/share/debconf/confmodule | 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 | echo " [domain = $domain]" | 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 | if test -f $ejabberd_config; then | 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 | fi | 29 | fi |
| 16 | 30 | ||
| 17 | echo -n 'Fetching noosfero database name ...' | 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 | echo " [database = $noosfero_database]" | 33 | echo " [database = $noosfero_database]" |
| 20 | 34 | ||
| 21 | echo 'Creating ejabberd schema ...' | 35 | echo 'Creating ejabberd schema ...' |
| @@ -29,7 +43,7 @@ else | @@ -29,7 +43,7 @@ else | ||
| 29 | echo " => GRANT CREATE ON DATABASE $noosfero_database TO $noosfero_user;" | 43 | echo " => GRANT CREATE ON DATABASE $noosfero_database TO $noosfero_user;" |
| 30 | fi | 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 | if which update-noosfero-odbc &> /dev/null ; then | 48 | if which update-noosfero-odbc &> /dev/null ; then |
| 35 | update-noosfero-odbc | 49 | update-noosfero-odbc |
| @@ -37,6 +51,7 @@ fi | @@ -37,6 +51,7 @@ fi | ||
| 37 | 51 | ||
| 38 | ejabberd_default='/etc/default/ejabberd' | 52 | ejabberd_default='/etc/default/ejabberd' |
| 39 | noosfero_chat_default='/etc/default/noosfero-chat' | 53 | noosfero_chat_default='/etc/default/noosfero-chat' |
| 54 | + | ||
| 40 | if test -f $ejabberd_default; then | 55 | if test -f $ejabberd_default; then |
| 41 | if ! cat $ejabberd_default | grep "^\. $noosfero_chat_default" > /dev/null ; then | 56 | if ! cat $ejabberd_default | grep "^\. $noosfero_chat_default" > /dev/null ; then |
| 42 | echo 'Extending ejabberd defaults with noosfero-chat defaults ...' | 57 | echo 'Extending ejabberd defaults with noosfero-chat defaults ...' |
| @@ -0,0 +1,19 @@ | @@ -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,7 +40,7 @@ var emoticons = { | ||
| 40 | } | 40 | } |
| 41 | }, | 41 | }, |
| 42 | "::bigSmile": { | 42 | "::bigSmile": { |
| 43 | - "image": "smile-big.png", | 43 | + "image": "excited.png", |
| 44 | "emotes": { | 44 | "emotes": { |
| 45 | ":D": "", | 45 | ":D": "", |
| 46 | "=D": "", | 46 | "=D": "", |
| @@ -48,7 +48,7 @@ var emoticons = { | @@ -48,7 +48,7 @@ var emoticons = { | ||
| 48 | } | 48 | } |
| 49 | }, | 49 | }, |
| 50 | "::shock": { | 50 | "::shock": { |
| 51 | - "image": "shock.png", | 51 | + "image": "shocked.png", |
| 52 | "emotes": { | 52 | "emotes": { |
| 53 | ":O": "", | 53 | ":O": "", |
| 54 | ":0": "", | 54 | ":0": "", |
public/javascripts/chat.js
| @@ -147,22 +147,18 @@ jQuery(function($) { | @@ -147,22 +147,18 @@ jQuery(function($) { | ||
| 147 | if(offset_container.length == 0) | 147 | if(offset_container.length == 0) |
| 148 | offset_container = $('<div class="chat-offset-container-'+offset+'"></div>').prependTo(history); | 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 | if(offset == 0) history.scrollTo({top:'100%', left:'0%'}); | 162 | if(offset == 0) history.scrollTo({top:'100%', left:'0%'}); |
| 167 | else history.scrollTo(offset_container.height()); | 163 | else history.scrollTo(offset_container.height()); |
| 168 | if (who != "self") { | 164 | if (who != "self") { |
| @@ -271,28 +267,36 @@ jQuery(function($) { | @@ -271,28 +267,36 @@ jQuery(function($) { | ||
| 271 | var contacts_to_insert = {}; | 267 | var contacts_to_insert = {}; |
| 272 | var groups_to_insert = []; | 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 | $.ajax({ | 279 | $.ajax({ |
| 284 | - url: '/chat/roster_groups', | 280 | + url: '/chat/rosters', |
| 285 | dataType: 'json', | 281 | dataType: 'json', |
| 286 | success: function(data){ | 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 | profiles.push(getIdentifier(room.jid)); | 292 | profiles.push(getIdentifier(room.jid)); |
| 289 | var jid_id = Jabber.jid_to_id(room.jid); | 293 | var jid_id = Jabber.jid_to_id(room.jid); |
| 290 | Jabber.jids[jid_id] = {jid: room.jid, name: room.name, type: 'groupchat'}; | 294 | Jabber.jids[jid_id] = {jid: room.jid, name: room.name, type: 'groupchat'}; |
| 291 | //FIXME This must check on session if the user is inside the room... | 295 | //FIXME This must check on session if the user is inside the room... |
| 292 | groups_to_insert.push(room.jid); | 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 | for(identifier in data) | 300 | for(identifier in data) |
| 297 | Jabber.avatars[identifier] = data[identifier]; | 301 | Jabber.avatars[identifier] = data[identifier]; |
| 298 | 302 | ||
| @@ -313,13 +317,13 @@ jQuery(function($) { | @@ -313,13 +317,13 @@ jQuery(function($) { | ||
| 313 | Jabber.connection.addHandler(Jabber.on_presence, null, "presence"); | 317 | Jabber.connection.addHandler(Jabber.on_presence, null, "presence"); |
| 314 | Jabber.send_availability_status(Jabber.presence_status); | 318 | Jabber.send_availability_status(Jabber.presence_status); |
| 315 | load_defaults(); | 319 | load_defaults(); |
| 316 | - }); | 320 | + updateAvailabilities(); |
| 321 | + }, 'json'); | ||
| 317 | }, | 322 | }, |
| 318 | error: function(data, textStatus, jqXHR){ | 323 | error: function(data, textStatus, jqXHR){ |
| 319 | console.log(data); | 324 | console.log(data); |
| 320 | }, | 325 | }, |
| 321 | }); | 326 | }); |
| 322 | - | ||
| 323 | }, | 327 | }, |
| 324 | 328 | ||
| 325 | // NOTE: cause Noosfero store's rosters in database based on friendship relation between people | 329 | // NOTE: cause Noosfero store's rosters in database based on friendship relation between people |
| @@ -405,21 +409,7 @@ jQuery(function($) { | @@ -405,21 +409,7 @@ jQuery(function($) { | ||
| 405 | else { | 409 | else { |
| 406 | log('receiving contact presence from ' + presence.from + ' as ' + presence.show); | 410 | log('receiving contact presence from ' + presence.from + ' as ' + presence.show); |
| 407 | var jid = Strophe.getBareJidFromJid(presence.from); | 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 | return true; | 415 | return true; |
| @@ -898,6 +888,24 @@ jQuery(function($) { | @@ -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 | $('.title-bar a').click(function() { | 909 | $('.title-bar a').click(function() { |
| 902 | $(this).parents('.status-group').find('.buddies').toggle('fast'); | 910 | $(this).parents('.status-group').find('.buddies').toggle('fast'); |
| 903 | return false; | 911 | return false; |
| @@ -967,4 +975,23 @@ jQuery(function($) { | @@ -967,4 +975,23 @@ jQuery(function($) { | ||
| 967 | 975 | ||
| 968 | window.onfocus = function() {Jabber.window_visibility = true}; | 976 | window.onfocus = function() {Jabber.window_visibility = true}; |
| 969 | window.onblur = function() {Jabber.window_visibility = false}; | 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,12 +242,12 @@ | ||
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | #chat-window .history .message .time { | 244 | #chat-window .history .message .time { |
| 245 | - float: right; | ||
| 246 | color: white; | 245 | color: white; |
| 247 | font-style: italic; | 246 | font-style: italic; |
| 248 | font-size: 10px; | 247 | font-size: 10px; |
| 249 | border-bottom: 1px solid #d3d7cf; | 248 | border-bottom: 1px solid #d3d7cf; |
| 250 | - width: 100%; | 249 | + width: 245px; |
| 250 | + display: inline-block; | ||
| 251 | text-align: right; | 251 | text-align: right; |
| 252 | margin-bottom: 5px; | 252 | margin-bottom: 5px; |
| 253 | } | 253 | } |
util/chat/ejabberd.cfg
| @@ -1,74 +0,0 @@ | @@ -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 @@ | @@ -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 | [PostgreSQL Unicode] | 1 | [PostgreSQL Unicode] |
| 2 | Description = PostgreSQL ODBC driver (Unicode version) | 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 | Debug = 0 | 5 | Debug = 0 |
| 6 | CommLog = 1 | 6 | CommLog = 1 |
| 7 | UsageCount = 3 | 7 | UsageCount = 3 |