Commit 1a342b984abf692a5cc392eacc78d60b34314ee4
Exists in
staging
and in
1 other branch
Merge branch 'master' into staging
Showing
17 changed files
with
870 additions
and
139 deletions
Show diff stats
Gemfile
| ... | ... | @@ -35,7 +35,7 @@ gem 'activerecord-session_store', ('1.0.0.pre' if RUBY_VERSION >= '2.3.0') |
| 35 | 35 | |
| 36 | 36 | # API dependencies |
| 37 | 37 | gem 'grape', '~> 0.12' |
| 38 | -gem 'grape-entity', '0.4.8' | |
| 38 | +gem 'grape-entity', '~>0.4.8' | |
| 39 | 39 | gem 'grape_logging' |
| 40 | 40 | gem 'grape-swagger' |
| 41 | 41 | gem 'swagger-ui_rails' |
| ... | ... | @@ -45,7 +45,7 @@ gem 'rack-contrib' |
| 45 | 45 | gem 'liquid', '~> 3.0.3' |
| 46 | 46 | |
| 47 | 47 | gem 'api-pagination', '>= 4.1.1' |
| 48 | -gem 'liquid', '~> 3.0.3' | |
| 48 | +gem 'liquid', '>= 3.0.3' | |
| 49 | 49 | |
| 50 | 50 | # asset pipeline |
| 51 | 51 | gem 'uglifier', '>= 1.0.3' | ... | ... |
app/controllers/my_profile/cms_controller.rb
| ... | ... | @@ -146,6 +146,8 @@ class CmsController < MyProfileController |
| 146 | 146 | parent = check_parent(params[:parent_id]) |
| 147 | 147 | if parent |
| 148 | 148 | @article.parent = parent |
| 149 | + @article.published = parent.published | |
| 150 | + @article.show_to_followers = parent.show_to_followers | |
| 149 | 151 | @parent_id = parent.id |
| 150 | 152 | end |
| 151 | 153 | ... | ... |
app/controllers/public/account_controller.rb
| ... | ... | @@ -164,6 +164,7 @@ class AccountController < ApplicationController |
| 164 | 164 | def logout |
| 165 | 165 | if logged_in? |
| 166 | 166 | self.current_user.forget_me |
| 167 | + current_user.update({:chat_status_at => DateTime.now}.merge({:last_chat_status => current_user.chat_status, :chat_status => 'offline'})) | |
| 167 | 168 | end |
| 168 | 169 | reset_session |
| 169 | 170 | 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
| ... | ... | @@ -60,8 +60,9 @@ Depends: adduser, |
| 60 | 60 | ruby-feedparser (>= 0.7-3~), |
| 61 | 61 | ruby-gettext, |
| 62 | 62 | ruby-grape, |
| 63 | - ruby-grape-entity (= 0.4.8), | |
| 63 | + ruby-grape-entity (>= 0.4.8), | |
| 64 | 64 | ruby-grape-logging, |
| 65 | + ruby-liquid (>= 3.0.3), | |
| 65 | 66 | ruby-minitest, |
| 66 | 67 | ruby-nokogiri, |
| 67 | 68 | ruby-pg, |
| ... | ... | @@ -107,7 +108,7 @@ Description: free web-based platform for social networks (apache frontend) |
| 107 | 108 | |
| 108 | 109 | Package: noosfero-chat |
| 109 | 110 | Architecture: all |
| 110 | -Depends: noosfero (>= 1.2), ejabberd, odbc-postgresql, pidgin-data | |
| 111 | +Depends: noosfero (>= 1.5.1), ejabberd (>= 16.06), odbc-postgresql, pidgin-data | |
| 111 | 112 | Description: free web-based platform for social networks (ejabberd based chat) |
| 112 | 113 | Noosfero is a web platform for social and solidarity economy networks with |
| 113 | 114 | 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'. | ... | ... |
lib/noosfero/version.rb
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 | } | ... | ... |
test/functional/cms_controller_test.rb
| ... | ... | @@ -62,6 +62,22 @@ class CmsControllerTest < ActionController::TestCase |
| 62 | 62 | assert_tag :tag => 'form', :attributes => { :action => "/myprofile/#{profile.identifier}/cms/new", :method => /post/i }, :descendant => { :tag => "input", :attributes => { :type => 'hidden', :value => 'TextArticle' }} |
| 63 | 63 | end |
| 64 | 64 | |
| 65 | + should 'inherit parents visibility by default' do | |
| 66 | + p1 = fast_create(Folder, :published => true, :profile_id => profile.id) | |
| 67 | + get :new, :profile => profile.identifier, :type => 'TextArticle', :parent_id => p1.id | |
| 68 | + assert_equal assigns(:article).published, p1.published | |
| 69 | + | |
| 70 | + p2 = fast_create(Folder, :published => false, :show_to_followers => true, :profile_id => profile.id) | |
| 71 | + get :new, :profile => profile.identifier, :type => 'TextArticle', :parent_id => p2.id | |
| 72 | + assert_equal assigns(:article).published, p2.published | |
| 73 | + assert_equal assigns(:article).show_to_followers, p2.show_to_followers | |
| 74 | + | |
| 75 | + p3 = fast_create(Folder, :published => false, :show_to_followers => false, :profile_id => profile.id) | |
| 76 | + get :new, :profile => profile.identifier, :type => 'TextArticle', :parent_id => p3.id | |
| 77 | + assert_equal assigns(:article).published, p3.published | |
| 78 | + assert_equal assigns(:article).show_to_followers, p3.show_to_followers | |
| 79 | + end | |
| 80 | + | |
| 65 | 81 | should 'be able to save a document' do |
| 66 | 82 | assert_difference 'Article.count' do |
| 67 | 83 | post :new, :type => 'TextArticle', :profile => profile.identifier, :article => { :name => 'a test article', :body => 'the text of the article ...' } | ... | ... |
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