esl / MongooseIM

MongooseIM is Erlang Solutions' robust, scalable and efficient XMPP server, aimed at large installations. Specifically designed for enterprise purposes, it is fault-tolerant and can utilise the resources of multiple clustered machines.
Other
1.64k stars 422 forks source link

Help in ODBC Configuration #1360

Closed Arslan007 closed 6 years ago

Arslan007 commented 6 years ago

MongooseIM version: 2.0.1 Installed from: pkg Erlang/OTP version: > 17

I have installed MongooseIM and changed the ejabberd.cfg for mysql ODBC rather than maneisa but I am not able to do it. I am unable to find out where I am doing some mistake.

Here is my configurations file.

%%%
%%%               ejabberd configuration file
%%%
%%%'

%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included with
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/

%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%%  - The character to comment a line is %
%%%
%%%  - Each term ends in a dot, for example:
%%%      override_global.
%%%
%%%  - A tuple has a fixed definition, its elements are
%%%    enclosed in {}, and separated with commas:
%%%      {loglevel, 4}.
%%%
%%%  - A list can have as many elements as you want,
%%%    and is enclosed in [], for example:
%%%      [http_poll, web_admin, tls]
%%%
%%%    Pay attention that list elements are delimited with commas,
%%%    but no comma is allowed after the last list element. This will
%%%    give a syntax error unlike in more lenient languages (e.g. Python).
%%%
%%%  - A keyword of ejabberd is a word in lowercase.
%%%    Strings are enclosed in "" and can contain spaces, dots, ...
%%%      {language, "en"}.
%%%      {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%%  - This term includes a tuple, a keyword, a list, and two strings:
%%%      {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%%  - This config is preprocessed during release generation by a tool which
%%%    interprets double curly braces as substitution markers, so avoid this
%%%    syntax in this file (though it's valid Erlang).
%%%
%%%    So this is OK (though arguably looks quite ugly):
%%%      { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%%%
%%%    And I can't give an example of what's not OK exactly because
%%%    of this rule.
%%%

%%%.   =======================
%%%'   OVERRIDE STORED OPTIONS

%%
%% Override the old values stored in the database.
%%

%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%%override_global.

%%
%% Override local options (specific for this particular ejabberd node).
%%
%%override_local.

%%
%% Remove the Access Control Lists before new ones are added.
%%
%%override_acls.

%%%.   =========
%%%'   DEBUGGING

%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 5}.

%%%.   ================
%%%'   SERVED HOSTNAMES

%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["localhost"] }.

%%
%% route_subdomains: Delegate subdomains to other XMPP servers.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with an XMPP server called im.example.org.
%%
%%{route_subdomains, s2s}.

%%%.   ===============
%%%'   LISTENING PORTS

%%
%% listen: The ports ejabberd will listen on, which service each is handled
%% by and what options to start it with.
%%
{listen,
 [
  %% BOSH and WS endpoints over HTTP
  { 5280, ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [

          {"_", "/http-bind", mod_bosh},
          {"_", "/ws-xmpp", mod_websockets, [{ejabberd_service, [
                                        {access, all},
                                        {shaper_rule, fast},
                                        {ip, {127, 0, 0, 1}},
                                        {password, "secret"}]}
          %% Uncomment to enable connection dropping or/and server-side pings
          %{timeout, 600000}, {ping_rate, 2000}
          ]}
          %% Uncomment to serve static files
          %{"_", "/static/[...]", cowboy_static,
          %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
          %},

          %% Example usage of mod_revproxy

          %% {"_", "/[...]", mod_revproxy, [{timeout, 5000},
          %%                                % time limit for upstream to respond
          %%                                {body_length, 8000000},
          %%                                % maximum body size (may be infinity)
          %%                                {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                % list of extra headers that are send to upstream
          %%                               ]}

          %% Example usage of mod_cowboy

          %% {"_", "/[...]", mod_cowboy, [{http, mod_revproxy,
          %%                                [{timeout, 5000},
          %%                                 % time limit for upstream to respond
          %%                                 {body_length, 8000000},
          %%                                 % maximum body size (may be infinity)
          %%                                 {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                 % list of extra headers that are send to upstream
          %%                                ]},
          %%                               {ws, xmpp, mod_websockets}
          %%                             ]}
      ]}
  ]},

  %% BOSH and WS endpoints over HTTPS
  { 5285, ejabberd_cowboy, [
        {num_acceptors, 10},
        {max_connections, 1024},
        {ssl, [{certfile, "priv/ssl/fake_cert.pem"}, {keyfile, "priv/ssl/fake_key.pem"}, {password, ""}]},
        {modules, [
            {"_", "/http-bind", mod_bosh},
            {"_", "/ws-xmpp", mod_websockets, [
            %% Uncomment to enable connection dropping or/and server-side pings
            %{timeout, 600000}, {ping_rate, 60000}
            ]}
            %% Uncomment to serve static files
            %{"_", "/static/[...]", cowboy_static,
            %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
            %},
        ]}
    ]},

  %% MongooseIM HTTP API it's important to start it on localhost
  %% or some private interface only (not accessible from the outside)
  %% At least start it on different port which will be hidden behind firewall

  { {8088, "127.0.0.1"} , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [
          {"localhost", "/api", mongoose_api_admin, []}
      ]}
  ]},

  { 8089 , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {compress, true},
      {ssl, [{certfile, "priv/ssl/fake_cert.pem"}, {keyfile, "priv/ssl/fake_key.pem"}, {password, ""}]},
      {modules, [
          {"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
          {"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
          {"_", "/api/rooms/[:id]",    mongoose_client_api_rooms, []},
          {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []},
          {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []}
      ]}
  ]},

  %% Following HTTP API is deprected, the new one abouve should be used instead

  { {5288, "127.0.0.1"} , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [
          {"localhost", "/api", mongoose_api, [{handlers, [mongoose_api_metrics,
                                                           mongoose_api_users]}]}
      ]}
  ]},

  { 5222, ejabberd_c2s, [

            %%
            %% If TLS is compiled in and you installed a SSL
            %% certificate, specify the full path to the
            %% file and uncomment this line:
            %%
                        {certfile, "priv/ssl/fake_server.pem"}, starttls,
                        %%{zlib, 10000},
            %% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
            %% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"},
            {access, c2s},
            {shaper, c2s_shaper},
            {max_stanza_size, 65536},
            {protocol_options, ["no_sslv3"]}

               ]},

  %%
  %% To enable the old SSL connection method on port 5223:
  %%
  %%{5223, ejabberd_c2s, [
  %%            {access, c2s},
  %%            {shaper, c2s_shaper},
  %%            {certfile, "/path/to/ssl.pem"}, tls,
  %%            {max_stanza_size, 65536}
  %%               ]},

  { 5269, ejabberd_s2s_in, [
               {shaper, s2s_shaper},
               {max_stanza_size, 131072},
               {protocol_options, ["no_sslv3"]}

              ]}

  %%
  %% ejabberd_service: Interact with external components (transports, ...)
  %%
  ,{8888, ejabberd_service, [
                {access, all},
                {shaper_rule, fast},
                {ip, {127, 0, 0, 1}},
                {password, "secret"}
           ]}

  %%
  %% ejabberd_stun: Handles STUN Binding requests
  %%
  %%{ {3478, udp}, ejabberd_stun, []}

 ]}.

%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
{s2s_use_starttls, optional}.
%%
%% s2s_certfile: Specify a certificate file.
%%
{s2s_certfile, "priv/ssl/fake_server.pem"}.

%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
%% {s2s_ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}.

%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
%%{domain_certfile, "example.org", "/path/to/example_org.pem"}.
%%{domain_certfile, "example.com", "/path/to/example_com.pem"}.

%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
{s2s_default_policy, deny }.

%%
%% Allow or deny communication with specific servers.
%%
%%{ {s2s_host, "goodhost.org"}, allow}.
%%{ {s2s_host, "badhost.org"}, deny}.

{outgoing_s2s_port, 5269 }.

%%
%% IP addresses predefined for specific hosts to skip DNS lookups.
%% Ports defined here take precedence over outgoing_s2s_port.
%% Examples:
%%
%% { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }.
%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }.

%%
%% Outgoing S2S options
%%
%% Preferred address families (which to try first) and connect timeout
%% in milliseconds.
%%
%%{outgoing_s2s_options, [ipv4, ipv6], 10000}.

%%%.   ==============
%%%'   SESSION BACKEND

%% {sm_backend, {mnesia, []}}.

%%{sm_backend, {redis, [{pool_size, 3}, {worker_config, [{host, "localhost"}, {port, 6379}]}]}}.
{sm_backend, {mnesia, []} }.

%%%.   ==============
%%%'   AUTHENTICATION

%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
{auth_method, odbc }.
{auth_opts, [
             %% Store the plain passwords or hashed for SCRAM:
             %% {password_format, plain} % default
             %% {password_format, scram}

             %% {scram_iterations, 4096} % default

             %%
             %% For auth_http:
             %% {host, IP | Hostname}
             %% {connection_pool_size, 10} % default
             %% {connection_opts, Opts}
             %% {basic_auth, "user:password"}
             %% {path_prefix, "/"} % default
             %%
             %% For auth_external
             %%{extauth_program, "/path/to/authentication/script"}.
             %%
             %% For auth_jwt
             %% {jwt_key, "shared_secret"},
             %% {token_user_key, bookingNumber}
            ]}.

%%
%% Authentication using external script
%% Make sure the script is executable by ejabberd.
%%
%%{auth_method, external}.

%%
%% Authentication using ODBC
%% Remember to setup a database in the next section.
%%
{auth_method, odbc}.

%%
%% Authentication using LDAP
%%
%%{auth_method, ldap}.
%%

%% List of LDAP servers:
%%{ldap_servers, ["localhost"]}.
%%
%% Encryption of connection to LDAP servers:
%%{ldap_encrypt, none}.
%%{ldap_encrypt, tls}.
%%
%% Port to connect to on LDAP servers:
%%{ldap_port, 389}.
%%{ldap_port, 636}.
%%
%% LDAP manager:
%%{ldap_rootdn, "dc=example,dc=com"}.
%%
%% Password of LDAP manager:
%%{ldap_password, "******"}.
%%
%% Search base of LDAP directory:
%%{ldap_base, "dc=example,dc=com"}.
%%
%% LDAP attribute that holds user ID:
%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
%%
%% LDAP filter:
%%{ldap_filter, "(objectClass=shadowAccount)"}.

%%
%% Anonymous login support:
%%   auth_method: anonymous
%%   anonymous_protocol: sasl_anon | login_anon | both
%%   allow_multiple_connections: true | false
%%
%%{host_config, "public.example.org", [{auth_method, anonymous},
%%                                     {allow_multiple_connections, false},
%%                                     {anonymous_protocol, sasl_anon}]}.
%%
%% To use both anonymous and internal authentication:
%%
%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.

%%%.   ==============
%%%'   DATABASE SETUP

%% ejabberd by default uses the internal Mnesia database,
%% so you do not necessarily need this section.
%% This section provides configuration examples in case
%% you want to use other database backends.
%% Please consult the ejabberd Guide for details on database creation.

%%
%% MySQL server:
%%
{odbc_server, {mysql, “localhost”, 3306, "mongooseim", “root”, “yahoo7”}}.
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.

%%
%% PostgreSQL server:
%%
%%{odbc_server, {pgsql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%%{pgsql_users_number_estimate, true}.

%%
%% ODBC compatible or MSSQL server:
%%
%%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.

%% Specifies what database is used over the ODBC layer
%% Can take values odbc, pgsql, mysql
%% In some cases (for example for MAM with pgsql) it is required to set proper value.
%% {odbc_server_type, odbc}.
%%
%% Number of connections to open to the database for each virtual host
%%
%%{odbc_pool_size, 10}.

%% Enable the default database connection pool
%%{pool, odbc, default}.
{odbc_pool_size, 10}.
{pool, odbc, default}.

%%% ====================
%%% RIAK SETUP
%%% ====================

%%{riak_server, [{pool_size, 20}, {address, "127.0.0.1"}, {port, 8087}, {riak_pb_socket_opts, []}]}.

%%% ==================================
%%% POOLS OF OUTGOING HTTP CONNECTIONS
%%% ==================================
%%
%%{http_connections, [{conn1, [{server, "http://server:8080"},
%%                              {pool_size, 50}]}
%%                    ]}.
%%
%% Interval to make a dummy SQL request to keep the connections to the
%% database alive. Specify in seconds: for example 28800 means 8 hours
%%
%%{odbc_keepalive_interval, undefined}.

%%% ====================
%%% CASSANDRA SETUP
%%% ====================

%%{cassandra_servers, [{default, []}]}.

%% Connect to localhost:9042, one worker, one pool, shared between all hosts
%%{cassandra_servers, [{default, []}]}.

%% ALTERNATIVE CONFIGURATION: Custom server address
%% - 100 connections to all four Cassandra servers in total
%% - Keyspace "big_mongooseim"
%%
%%{cassandra_servers,
%% [
%%  {default, 100,
%%   [
%%    {servers,
%%     [
%%      {"cassandra_server1.example.com", 9042},
%%      {"cassandra_server2.example.com", 9042},
%%      {"cassandra_server3.example.com", 9042},
%%      {"cassandra_server4.example.com", 9042}
%%     ]
%%    },
%%    {keyspace, "big_mongooseim"}
%%   ]
%%  }
%% ]
%%}.

%% ALTERNATIVE CONFIGURATION: Two pools: for mam and for mam_muc
%% - Each pool uses different keyspace
%% - Module mod_mam_cassandra_arch uses pool "mam" and keyspace "mam_space"
%% - Module mod_mam_muc_cassandra_arch uses pool "mam_muc" and keyspace "mam_muc_space"
%%
%% Set pool_name for modules like this (not just uncomment this example!)
%% {modules,
%%    [{mod_mam_cassandra_arch, [{pool_name, mam}]},
%%     {mod_mam_muc_cassandra_arch, [{pool_name, mam_muc}]}]}.
%%
%%{cassandra_servers, [{mam, [{keyspace, "mam_space"}]}, {mam_muc, [{keyspace, "mam_muc_space"}]}]}.

%%%.   ===============
%%%'   TRAFFIC SHAPERS

%%
%% The "normal" shaper limits traffic speed to 1000 B/s
%%
{shaper, normal, {maxrate, 1000}}.

%%
%% The "fast" shaper limits traffic speed to 50000 B/s
%%
{shaper, fast, {maxrate, 50000}}.

%%
%% This option specifies the maximum number of elements in the queue
%% of the FSM. Refer to the documentation for details.
%%
{max_fsm_queue, 1000}.

%%%.   ====================
%%%'   ACCESS CONTROL LISTS

%%
%% The 'admin' ACL grants administrative privileges to XMPP accounts.
%% You can put here as many accounts as you want.
%%
%{acl, admin, {user, "alice", "localhost"}}.
%{acl, admin, {user, "a", "localhost"}}.

%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.

%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.

%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.

%%
%% Define specific ACLs in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {acl, admin, {user, "bob-local", "localhost"}}
%% ]
%%}.

%%%.   ============
%%%'   ACCESS RULES

%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.

%% Maximum number of offline messages that users can have:
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.

%% This rule allows access only for local users:
{access, local, [{allow, local}]}.

%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
           {allow, all}]}.

%% For C2S connections, all users except admins use the "normal" shaper
{access, c2s_shaper, [{none, admin},
              {normal, all}]}.

%% All S2S connections use the "fast" shaper
{access, s2s_shaper, [{fast, all}]}.

%% Admins of this server are also admins of the MUC service:
{access, muc_admin, [{allow, admin}]}.

%% Only accounts of the local ejabberd server can create rooms:
{access, muc_create, [{allow, local}]}.

%% All users are allowed to use the MUC service:
{access, muc, [{allow, all}]}.

%% In-band registration allows registration of any possible username.
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.

%% By default the frequency of account registrations from the same IP
%% is limited to 1 account every 10 minutes. To disable, specify: infinity
{registration_timeout, infinity}.

%% Default settings for MAM.
%% To set non-standard value, replace 'default' with 'allow' or 'deny'.
%% Only user can access his/her archive by default.
%% An online user can read room's archive by default.
%% Only an owner can change settings and purge messages by default.
%% Empty list (i.e. `[]`) means `[{deny, all}]`.
{access, mam_set_prefs, [{default, all}]}.
{access, mam_get_prefs, [{default, all}]}.
{access, mam_lookup_messages, [{default, all}]}.
{access, mam_purge_single_message, [{default, all}]}.
{access, mam_purge_multiple_messages, [{default, all}]}.

%% 1 command of the specified type per second.
{shaper, mam_shaper, {maxrate, 1}}.
%% This shaper is primeraly for Mnesia overload protection during stress testing.
%% The limit is 1000 operations of each type per second.
{shaper, mam_global_shaper, {maxrate, 1000}}.

{access, mam_set_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_get_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_lookup_messages_shaper, [{mam_shaper, all}]}.
{access, mam_purge_single_message_shaper, [{mam_shaper, all}]}.
{access, mam_purge_multiple_messages_shaper, [{mam_shaper, all}]}.

{access, mam_set_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_get_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_lookup_messages_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_single_message_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_multiple_messages_global_shaper, [{mam_global_shaper, all}]}.

%%
%% Define specific Access Rules in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {access, c2s, [{allow, admin}, {deny, all}]},
%%  {access, register, [{deny, all}]}
%% ]
%%}.

%%%.   ================
%%%'   DEFAULT LANGUAGE

%%
%% language: Default language used for server messages.
%%
{language, "en"}.

%%
%% Set a different default language in a virtual host.
%%
%%{host_config, "localhost",
%% [{language, "ru"}]
%%}.

%%%.   ================
%%%'   MISCELLANEOUS

{all_metrics_are_global, false }.

%%%.   =======
%%%'   MODULES

%%
%% Modules enabled in all ejabberd virtual hosts.
%% For list of possible modules options, check documentation.
%%
{modules,
 [

  %% The format for a single route is as follows:
  %% {Host, Path, Method, Upstream}
  %%
  %% "_" can be used as wildcard for Host, Path and Method
  %% Upstream can be either host (just http(s)://host:port) or uri
  %% The difference is that host upstreams append whole path while
  %% uri upstreams append only remainder that follows the matched Path
  %% (this behaviour is similar to nginx's proxy_pass rules)
  %%
  %% Bindings can be used to match certain parts of host or path.
  %% They will be later overlaid with parts of the upstream uri.
  %%
  %% {mod_revproxy,
  %%    [{routes, [{"www.erlang-solutions.com", "/admin", "_",
  %%                "https://www.erlang-solutions.com/"},
  %%               {":var.com", "/:var", "_", "http://localhost:8080/"},
  %%               {":domain.com", "/", "_", "http://localhost:8080/:domain"}]
  %%     }]},

  %{mod_admin_extra, [{submods, [node, accounts, sessions, vcard,
  %                              roster, last, private, stanza, stats]}]},

% {mod_http_upload, [
    %% Set max file size in bytes. Defaults to 10 MB.
    %% Disabled if value is `undefined`.
%   {max_file_size, 1024},
    %% Use S3 storage backend
%   {backend, s3},
    %% Set options for S3 backend
%   {s3, [
%     {bucket_url, "http://s3-eu-west-1.amazonaws.com/konbucket2"},
%     {region, "eu-west-1"},
%     {access_key_id, "AKIAIAOAONIULXQGMOUA"},
%     {secret_access_key, "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"}
%   ]}
% ]},

%  {colorbook_roster, []}, 

  {mod_adhoc, []},

  {mod_disco, []},
  {mod_commands, []},
  {mod_muc_commands, []},
  {mod_muc_light_commands, []},
  {mod_last, [{backend, odbc}]},
  {mod_stream_management, [
                           % default 100
                           % size of a buffer of unacked messages
                           % {buffer_max, 100}

                           % default 1 - server sends the ack request after each stanza
                           % {ack_freq, 1}

                           % default: 600 seconds
                           % {resume_timeout, 600}
                          ]},
  {mod_muc_light, [
      {host, "conference.@HOST@"},
      {backend, odbc}
    ]},
  {mod_vcard, [%{matches, 1},

  {mod_vcard, [ {allow_return_all, true},
              {search_all_hosts, true},
              {matches, 1},
              {search, true},
            {backend, odbc}
             ]},

  {mod_muc, [{host, "conference.@HOST@"},
            {access, muc},
            {access_create, muc_create}
            ]},

  %% {mod_muc_log, [
  %%                {outdir, "/tmp/muclogs"},
  %%                {access_log, muc}
  %%               ]},
  {mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
  {mod_privacy, [{backend, odbc}]},
  {mod_blocking, []},
  {mod_private, []},
% {mod_private, [{backend, mnesia}]},
% {mod_private, [{backend, odbc}]},
  {mod_register, [
          %%
          %% Set the minimum informational entropy for passwords.
          %%
          %%{password_strength, 32},

          %%
          %% After successful registration, the user receives
          %% a message with this subject and body.
          %%
          {welcome_message, {""}},

          %%
          %% When a user registers, send a notification to
          %% these XMPP accounts.
          %%
                  %{registration_watchers, ["admin@localhost"]},

          %%
          %% Only clients in the server machine can register accounts
          %%
          {ip_access, [{allow, "127.0.0.0/8"},
                   {deny, "0.0.0.0/0"}]},

          %%
          %% Local c2s or remote s2s users cannot register accounts
          %%
          %%{access_from, deny},

          {access, register}
         ]},
  {mod_roster, [{backend, odbc},
  {versioning, true},
  {store_current_id, true}]},
  {mod_sic, []},
  {mod_bosh, []},
  {mod_carboncopy, []},

  %%
  %% Message Archive Management (MAM, XEP-0313) for registered users and
  %% Multi-User chats (MUCs).
  %%

% {mod_mam_meta, [
    %% Use ODBC backend (default)
%   {backend, odbc},

    %% Do not store user preferences (default)
%   {user_prefs_store, false},
    %% Store user preferences in RDBMS
%   {user_prefs_store, odbc},
    %% Store user preferences in Mnesia (recommended).
    %% The preferences store will be called each time, as a message is routed.
    %% That is why Mnesia is better suited for this job.
%   {user_prefs_store, mnesia},
    %% Mnesia back-end with optimized writes and dirty synchronious writes.
%   {user_prefs_store, mnesia_dirty},

    %% Enables a pool of asynchronous writers. (default)
    %% Messages will be grouped together based on archive id.
%   {async_writer, true},

    %% Cache information about users (default)
%   {cache_users, true},

    %% Enable archivization for private messages (default)
%   {pm, [
      %% Top-level options can be overriden here if needed, for example:
%     {async_writer, false}
%   ]},

    %%
    %% Message Archive Management (MAM) for multi-user chats (MUC).
    %% Enable XEP-0313 for "muc.@HOST@".
    %%
%   {muc, [
%     {host, "muc.@HOST@"}
      %% As with pm, top-level options can be overriden for MUC archive
%   ]}
% ]},

  %%
  %% MAM configuration examples
  %%

  %% Only MUC, no user-defined preferences, good performance.
  {mod_mam_meta, [
    {backend, odbc},
    {pm, true},
    {muc, [
      {host, "conference.@HOST@"}
    ]}
  ]}

  %% Only archives for c2c messages, good performance.
% {mod_mam_meta, [
%   {backend, odbc},
%   {pm, [
%     {user_prefs_store, mnesia_dirty}
%   ]}
% ]},

  %% Basic configuration for c2c messages, bad performance, easy to debug.
% {mod_mam_meta, [
%   {backend, odbc},
%   {async_writer, false},
%   {cache_users, false}
% ]},

  %% Cassandra archive for c2c and MUC conversations.
  %% No custom settings supported (always archive).
% {mod_mam_meta, [
%   {backend, cassandra},
%   {user_prefs_store, cassandra},
%   {muc, [{host, "muc.@HOST@"}]}
% ]}

  %%
  %% Configuration for Amazon SNS notifications.
  %%

%  {mod_aws_sns, [
    %% AWS credentials, region and host configuration
%    {access_key_id, "AKIAJAZYHOIPY6A2PESA"},
%    {secret_access_key, "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"},
%    {region, "eu-west-1"},
%    {account_id, "251423380551"},
%    {region, "eu-west-1"},
%    {sns_host, "sns.eu-west-1.amazonaws.com"},

    %% Messages from this MUC host will be sent to the SNS topic
%    {muc_host, "muc.@HOST@"},

    %% Plugin module for defining custom message attributes and user identification
%    {plugin_module, mod_aws_sns_defaults},

    %% Topic name configurations. Removing topic will disable this specific SNS notification
%    {presence_updates_topic, "user_presence_updated-dev-1"},  %% For presence updates
%    {pm_messages_topic, "user_message_sent-dev-1"},           %% For private chat messages
%    {muc_messages_topic, "user_messagegroup_sent-dev-1"}      %% For group chat messages

    %% Pool options
%    {pool_size, 100}, %% Worker pool size for publishing notifications
%    {publish_retry_count, 2}, %% Retry count in case of publish error
%    {publish_retry_time_ms, 50} %% Base exponential backoff time (in ms) for publish errors
%   ]}

 ]}.

%%
%% Enable modules with custom options in a specific virtual host
%%
%%{host_config, "localhost",
%% [{ {add, modules},
%%   [
%%    {mod_some_module, []}
%%   ]
%%  }
%% ]}.

%%%.
%%%'

%%% $Id$

%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker:
%%%.

I have executed mysql schema and given the credentials in ejabberd.cfg

Created user with this ctl command. mongooseimctl register user1 localhost GJ9TuHq8 but there is no user in DB.

fenek commented 6 years ago

Are you sure the server is even starting with this config file? I had to correct following issues in order to get it accepted by MongooseIM:

With these fixes, I can register a user just fine.

Arslan007 commented 6 years ago

@fenek Yes its starting with this config file.

fenek commented 6 years ago

Can you attach the config as a file to your message? Maybe Github has modified the content somehow when pasting.

Arslan007 commented 6 years ago

ejabberd.cfg.zip

Sorry I did update before reading your second comment. Here is the new one attached and pasted as well with your said changes but still issue persist for me.

%%%
%%%               ejabberd configuration file
%%%
%%%

%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included with
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/

%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%%  - The character to comment a line is %
%%%
%%%  - Each term ends in a dot, for example:
%%%      override_global.
%%%
%%%  - A tuple has a fixed definition, its elements are
%%%    enclosed in {}, and separated with commas:
%%%      {loglevel, 4}.
%%%
%%%  - A list can have as many elements as you want,
%%%    and is enclosed in [], for example:
%%%      [http_poll, web_admin, tls]
%%%
%%%    Pay attention that list elements are delimited with commas,
%%%    but no comma is allowed after the last list element. This will
%%%    give a syntax error unlike in more lenient languages (e.g. Python).
%%%
%%%  - A keyword of ejabberd is a word in lowercase.
%%%    Strings are enclosed in "" and can contain spaces, dots, ...
%%%      {language, "en"}.
%%%      {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%%  - This term includes a tuple, a keyword, a list, and two strings:
%%%      {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%%  - This config is preprocessed during release generation by a tool which
%%%    interprets double curly braces as substitution markers, so avoid this
%%%    syntax in this file (though it's valid Erlang).
%%%
%%%    So this is OK (though arguably looks quite ugly):
%%%      { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%%%
%%%    And I can't give an example of what's not OK exactly because
%%%    of this rule.
%%%

%%%.   =======================
%%%'   OVERRIDE STORED OPTIONS

%%
%% Override the old values stored in the database.
%%

%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%%override_global.

%%
%% Override local options (specific for this particular ejabberd node).
%%
%%override_local.

%%
%% Remove the Access Control Lists before new ones are added.
%%
%%override_acls.

%%%.   =========
%%%'   DEBUGGING

%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 5}.

%%%.   ================
%%%'   SERVED HOSTNAMES

%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["localhost"] }.

%%
%% route_subdomains: Delegate subdomains to other XMPP servers.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with an XMPP server called im.example.org.
%%
%%{route_subdomains, s2s}.

%%%.   ===============
%%%'   LISTENING PORTS

%%
%% listen: The ports ejabberd will listen on, which service each is handled
%% by and what options to start it with.
%%
{listen,
 [
  %% BOSH and WS endpoints over HTTP
  { 5280, ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [

          {"_", "/http-bind", mod_bosh},
          {"_", "/ws-xmpp", mod_websockets, [{ejabberd_service, [
                                        {access, all},
                                        {shaper_rule, fast},
                                        {ip, {127, 0, 0, 1}},
                                        {password, "secret"}]}
          %% Uncomment to enable connection dropping or/and server-side pings
          %{timeout, 600000}, {ping_rate, 2000}
          ]}
          %% Uncomment to serve static files
          %{"_", "/static/[...]", cowboy_static,
          %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
          %},

          %% Example usage of mod_revproxy

          %% {"_", "/[...]", mod_revproxy, [{timeout, 5000},
          %%                                % time limit for upstream to respond
          %%                                {body_length, 8000000},
          %%                                % maximum body size (may be infinity)
          %%                                {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                % list of extra headers that are send to upstream
          %%                               ]}

          %% Example usage of mod_cowboy

          %% {"_", "/[...]", mod_cowboy, [{http, mod_revproxy,
          %%                                [{timeout, 5000},
          %%                                 % time limit for upstream to respond
          %%                                 {body_length, 8000000},
          %%                                 % maximum body size (may be infinity)
          %%                                 {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                 % list of extra headers that are send to upstream
          %%                                ]},
          %%                               {ws, xmpp, mod_websockets}
          %%                             ]}
      ]}
  ]},

  %% BOSH and WS endpoints over HTTPS
  { 5285, ejabberd_cowboy, [
        {num_acceptors, 10},
        {max_connections, 1024},
        {ssl, [{certfile, "priv/ssl/fake_cert.pem"}, {keyfile, "priv/ssl/fake_key.pem"}, {password, ""}]},
        {modules, [
            {"_", "/http-bind", mod_bosh},
            {"_", "/ws-xmpp", mod_websockets, [
            %% Uncomment to enable connection dropping or/and server-side pings
            %{timeout, 600000}, {ping_rate, 60000}
            ]}
            %% Uncomment to serve static files
            %{"_", "/static/[...]", cowboy_static,
            %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
            %},
        ]}
    ]},

  %% MongooseIM HTTP API it's important to start it on localhost
  %% or some private interface only (not accessible from the outside)
  %% At least start it on different port which will be hidden behind firewall

  { {8088, "127.0.0.1"} , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [
          {"localhost", "/api", mongoose_api_admin, []}
      ]}
  ]},

  { 8089 , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {compress, true},
      {ssl, [{certfile, "priv/ssl/fake_cert.pem"}, {keyfile, "priv/ssl/fake_key.pem"}, {password, ""}]},
      {modules, [
          {"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
          {"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
          {"_", "/api/rooms/[:id]",    mongoose_client_api_rooms, []},
          {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []},
          {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []}
      ]}
  ]},

  %% Following HTTP API is deprected, the new one abouve should be used instead

  { {5288, "127.0.0.1"} , ejabberd_cowboy, [
      {num_acceptors, 10},
      {max_connections, 1024},
      {modules, [
          {"localhost", "/api", mongoose_api, [{handlers, [mongoose_api_metrics,
                                                           mongoose_api_users]}]}
      ]}
  ]},

  { 5222, ejabberd_c2s, [

            %%
            %% If TLS is compiled in and you installed a SSL
            %% certificate, specify the full path to the
            %% file and uncomment this line:
            %%
                        {certfile, "priv/ssl/fake_server.pem"}, starttls,
                        %%{zlib, 10000},
            %% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
            %% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"},
            {access, c2s},
            {shaper, c2s_shaper},
            {max_stanza_size, 65536},
            {protocol_options, ["no_sslv3"]}

               ]},

  %%
  %% To enable the old SSL connection method on port 5223:
  %%
  %%{5223, ejabberd_c2s, [
  %%            {access, c2s},
  %%            {shaper, c2s_shaper},
  %%            {certfile, "/path/to/ssl.pem"}, tls,
  %%            {max_stanza_size, 65536}
  %%               ]},

  { 5269, ejabberd_s2s_in, [
               {shaper, s2s_shaper},
               {max_stanza_size, 131072},
               {protocol_options, ["no_sslv3"]}

              ]}

  %%
  %% ejabberd_service: Interact with external components (transports, ...)
  %%
  ,{8888, ejabberd_service, [
                {access, all},
                {shaper_rule, fast},
                {ip, {127, 0, 0, 1}},
                {password, "secret"}
           ]}

  %%
  %% ejabberd_stun: Handles STUN Binding requests
  %%
  %%{ {3478, udp}, ejabberd_stun, []}

 ]}.

%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
{s2s_use_starttls, optional}.
%%
%% s2s_certfile: Specify a certificate file.
%%
{s2s_certfile, "priv/ssl/fake_server.pem"}.

%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
%% {s2s_ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}.

%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
%%{domain_certfile, "example.org", "/path/to/example_org.pem"}.
%%{domain_certfile, "example.com", "/path/to/example_com.pem"}.

%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
{s2s_default_policy, deny }.

%%
%% Allow or deny communication with specific servers.
%%
%%{ {s2s_host, "goodhost.org"}, allow}.
%%{ {s2s_host, "badhost.org"}, deny}.

{outgoing_s2s_port, 5269 }.

%%
%% IP addresses predefined for specific hosts to skip DNS lookups.
%% Ports defined here take precedence over outgoing_s2s_port.
%% Examples:
%%
%% { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }.
%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }.

%%
%% Outgoing S2S options
%%
%% Preferred address families (which to try first) and connect timeout
%% in milliseconds.
%%
%%{outgoing_s2s_options, [ipv4, ipv6], 10000}.

%%%.   ==============
%%%'   SESSION BACKEND

%% {sm_backend, {mnesia, []}}.

%%{sm_backend, {redis, [{pool_size, 3}, {worker_config, [{host, "localhost"}, {port, 6379}]}]}}.
{sm_backend, {mnesia, []} }.

%%%.   ==============
%%%'   AUTHENTICATION

%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
{auth_method, odbc }.
{auth_opts, [
             %% Store the plain passwords or hashed for SCRAM:
             %% {password_format, plain} % default
             %% {password_format, scram}

             %% {scram_iterations, 4096} % default

             %%
             %% For auth_http:
             %% {host, IP | Hostname}
             %% {connection_pool_size, 10} % default
             %% {connection_opts, Opts}
             %% {basic_auth, "user:password"}
             %% {path_prefix, "/"} % default
             %%
             %% For auth_external
             %%{extauth_program, "/path/to/authentication/script"}.
             %%
             %% For auth_jwt
             %% {jwt_key, "shared_secret"},
             %% {token_user_key, bookingNumber}
            ]}.

%%
%% Authentication using external script
%% Make sure the script is executable by ejabberd.
%%
%%{auth_method, external}.

%%
%% Authentication using ODBC
%% Remember to setup a database in the next section.
%%
{auth_method, odbc}.

%%
%% Authentication using LDAP
%%
%%{auth_method, ldap}.
%%

%% List of LDAP servers:
%%{ldap_servers, ["localhost"]}.
%%
%% Encryption of connection to LDAP servers:
%%{ldap_encrypt, none}.
%%{ldap_encrypt, tls}.
%%
%% Port to connect to on LDAP servers:
%%{ldap_port, 389}.
%%{ldap_port, 636}.
%%
%% LDAP manager:
%%{ldap_rootdn, "dc=example,dc=com"}.
%%
%% Password of LDAP manager:
%%{ldap_password, "******"}.
%%
%% Search base of LDAP directory:
%%{ldap_base, "dc=example,dc=com"}.
%%
%% LDAP attribute that holds user ID:
%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
%%
%% LDAP filter:
%%{ldap_filter, "(objectClass=shadowAccount)"}.

%%
%% Anonymous login support:
%%   auth_method: anonymous
%%   anonymous_protocol: sasl_anon | login_anon | both
%%   allow_multiple_connections: true | false
%%
%%{host_config, "public.example.org", [{auth_method, anonymous},
%%                                     {allow_multiple_connections, false},
%%                                     {anonymous_protocol, sasl_anon}]}.
%%
%% To use both anonymous and internal authentication:
%%
%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.

%%%.   ==============
%%%'   DATABASE SETUP

%% ejabberd by default uses the internal Mnesia database,
%% so you do not necessarily need this section.
%% This section provides configuration examples in case
%% you want to use other database backends.
%% Please consult the ejabberd Guide for details on database creation.

%%
%% MySQL server:
%%
{odbc_server, {mysql, "localhost", 3306, "mongooseim", "root", "yahoo7"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.

%%
%% PostgreSQL server:
%%
%%{odbc_server, {pgsql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%%{pgsql_users_number_estimate, true}.

%%
%% ODBC compatible or MSSQL server:
%%
%%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.

%% Specifies what database is used over the ODBC layer
%% Can take values odbc, pgsql, mysql
%% In some cases (for example for MAM with pgsql) it is required to set proper value.
%% {odbc_server_type, odbc}.
%%
%% Number of connections to open to the database for each virtual host
%%
%%{odbc_pool_size, 10}.

%% Enable the default database connection pool
%%{pool, odbc, default}.
{odbc_pool_size, 10}.
{pool, odbc, default}.

%%% ====================
%%% RIAK SETUP
%%% ====================

%%{riak_server, [{pool_size, 20}, {address, "127.0.0.1"}, {port, 8087}, {riak_pb_socket_opts, []}]}.

%%% ==================================
%%% POOLS OF OUTGOING HTTP CONNECTIONS
%%% ==================================
%%
%%{http_connections, [{conn1, [{server, "http://server:8080"},
%%                              {pool_size, 50}]}
%%                    ]}.
%%
%% Interval to make a dummy SQL request to keep the connections to the
%% database alive. Specify in seconds: for example 28800 means 8 hours
%%
%%{odbc_keepalive_interval, undefined}.

%%% ====================
%%% CASSANDRA SETUP
%%% ====================

%%{cassandra_servers, [{default, []}]}.

%% Connect to localhost:9042, one worker, one pool, shared between all hosts
%%{cassandra_servers, [{default, []}]}.

%% ALTERNATIVE CONFIGURATION: Custom server address
%% - 100 connections to all four Cassandra servers in total
%% - Keyspace "big_mongooseim"
%%
%%{cassandra_servers,
%% [
%%  {default, 100,
%%   [
%%    {servers,
%%     [
%%      {"cassandra_server1.example.com", 9042},
%%      {"cassandra_server2.example.com", 9042},
%%      {"cassandra_server3.example.com", 9042},
%%      {"cassandra_server4.example.com", 9042}
%%     ]
%%    },
%%    {keyspace, "big_mongooseim"}
%%   ]
%%  }
%% ]
%%}.

%% ALTERNATIVE CONFIGURATION: Two pools: for mam and for mam_muc
%% - Each pool uses different keyspace
%% - Module mod_mam_cassandra_arch uses pool "mam" and keyspace "mam_space"
%% - Module mod_mam_muc_cassandra_arch uses pool "mam_muc" and keyspace "mam_muc_space"
%%
%% Set pool_name for modules like this (not just uncomment this example!)
%% {modules,
%%    [{mod_mam_cassandra_arch, [{pool_name, mam}]},
%%     {mod_mam_muc_cassandra_arch, [{pool_name, mam_muc}]}]}.
%%
%%{cassandra_servers, [{mam, [{keyspace, "mam_space"}]}, {mam_muc, [{keyspace, "mam_muc_space"}]}]}.

%%%.   ===============
%%%'   TRAFFIC SHAPERS

%%
%% The "normal" shaper limits traffic speed to 1000 B/s
%%
{shaper, normal, {maxrate, 1000}}.

%%
%% The "fast" shaper limits traffic speed to 50000 B/s
%%
{shaper, fast, {maxrate, 50000}}.

%%
%% This option specifies the maximum number of elements in the queue
%% of the FSM. Refer to the documentation for details.
%%
{max_fsm_queue, 1000}.

%%%.   ====================
%%%'   ACCESS CONTROL LISTS

%%
%% The 'admin' ACL grants administrative privileges to XMPP accounts.
%% You can put here as many accounts as you want.
%%
%{acl, admin, {user, "alice", "localhost"}}.
%{acl, admin, {user, "a", "localhost"}}.

%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.

%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.

%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.

%%
%% Define specific ACLs in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {acl, admin, {user, "bob-local", "localhost"}}
%% ]
%%}.

%%%.   ============
%%%'   ACCESS RULES

%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.

%% Maximum number of offline messages that users can have:
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.

%% This rule allows access only for local users:
{access, local, [{allow, local}]}.

%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
           {allow, all}]}.

%% For C2S connections, all users except admins use the "normal" shaper
{access, c2s_shaper, [{none, admin},
              {normal, all}]}.

%% All S2S connections use the "fast" shaper
{access, s2s_shaper, [{fast, all}]}.

%% Admins of this server are also admins of the MUC service:
{access, muc_admin, [{allow, admin}]}.

%% Only accounts of the local ejabberd server can create rooms:
{access, muc_create, [{allow, local}]}.

%% All users are allowed to use the MUC service:
{access, muc, [{allow, all}]}.

%% In-band registration allows registration of any possible username.
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.

%% By default the frequency of account registrations from the same IP
%% is limited to 1 account every 10 minutes. To disable, specify: infinity
{registration_timeout, infinity}.

%% Default settings for MAM.
%% To set non-standard value, replace 'default' with 'allow' or 'deny'.
%% Only user can access his/her archive by default.
%% An online user can read room's archive by default.
%% Only an owner can change settings and purge messages by default.
%% Empty list (i.e. `[]`) means `[{deny, all}]`.
{access, mam_set_prefs, [{default, all}]}.
{access, mam_get_prefs, [{default, all}]}.
{access, mam_lookup_messages, [{default, all}]}.
{access, mam_purge_single_message, [{default, all}]}.
{access, mam_purge_multiple_messages, [{default, all}]}.

%% 1 command of the specified type per second.
{shaper, mam_shaper, {maxrate, 1}}.
%% This shaper is primeraly for Mnesia overload protection during stress testing.
%% The limit is 1000 operations of each type per second.
{shaper, mam_global_shaper, {maxrate, 1000}}.

{access, mam_set_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_get_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_lookup_messages_shaper, [{mam_shaper, all}]}.
{access, mam_purge_single_message_shaper, [{mam_shaper, all}]}.
{access, mam_purge_multiple_messages_shaper, [{mam_shaper, all}]}.

{access, mam_set_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_get_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_lookup_messages_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_single_message_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_multiple_messages_global_shaper, [{mam_global_shaper, all}]}.

%%
%% Define specific Access Rules in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {access, c2s, [{allow, admin}, {deny, all}]},
%%  {access, register, [{deny, all}]}
%% ]
%%}.

%%%.   ================
%%%'   DEFAULT LANGUAGE

%%
%% language: Default language used for server messages.
%%
{language, "en"}.

%%
%% Set a different default language in a virtual host.
%%
%%{host_config, "localhost",
%% [{language, "ru"}]
%%}.

%%%.   ================
%%%'   MISCELLANEOUS

{all_metrics_are_global, false }.

%%%.   =======
%%%'   MODULES

%%
%% Modules enabled in all ejabberd virtual hosts.
%% For list of possible modules options, check documentation.
%%
{modules,
 [

  %% The format for a single route is as follows:
  %% {Host, Path, Method, Upstream}
  %%
  %% "_" can be used as wildcard for Host, Path and Method
  %% Upstream can be either host (just http(s)://host:port) or uri
  %% The difference is that host upstreams append whole path while
  %% uri upstreams append only remainder that follows the matched Path
  %% (this behaviour is similar to nginx's proxy_pass rules)
  %%
  %% Bindings can be used to match certain parts of host or path.
  %% They will be later overlaid with parts of the upstream uri.
  %%
  %% {mod_revproxy,
  %%    [{routes, [{"www.erlang-solutions.com", "/admin", "_",
  %%                "https://www.erlang-solutions.com/"},
  %%               {":var.com", "/:var", "_", "http://localhost:8080/"},
  %%               {":domain.com", "/", "_", "http://localhost:8080/:domain"}]
  %%     }]},

  %{mod_admin_extra, [{submods, [node, accounts, sessions, vcard,
  %                              roster, last, private, stanza, stats]}]},

% {mod_http_upload, [
    %% Set max file size in bytes. Defaults to 10 MB.
    %% Disabled if value is `undefined`.
%   {max_file_size, 1024},
    %% Use S3 storage backend
%   {backend, s3},
    %% Set options for S3 backend
%   {s3, [
%     {bucket_url, "http://s3-eu-west-1.amazonaws.com/konbucket2"},
%     {region, "eu-west-1"},
%     {access_key_id, "AKIAIAOAONIULXQGMOUA"},
%     {secret_access_key, "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"}
%   ]}
% ]},

%  {colorbook_roster, []}, 

  {mod_adhoc, []},

  {mod_disco, []},
  {mod_commands, []},
  {mod_muc_commands, []},
  {mod_muc_light_commands, []},
  {mod_last, [{backend, odbc}]},
  {mod_stream_management, [
                           % default 100
                           % size of a buffer of unacked messages
                           % {buffer_max, 100}

                           % default 1 - server sends the ack request after each stanza
                           % {ack_freq, 1}

                           % default: 600 seconds
                           % {resume_timeout, 600}
                          ]},
  {mod_muc_light, [
      {host, "conference.@HOST@"},
      {backend, odbc}
    ]},

  {mod_vcard, [ {allow_return_all, true},
              {search_all_hosts, true},
              {matches, 1},
              {search, true},
            {backend, odbc}
             ]},

  {mod_muc, [{host, "conference.@HOST@"},
            {access, muc},
            {access_create, muc_create}
            ]},

  %% {mod_muc_log, [
  %%                {outdir, "/tmp/muclogs"},
  %%                {access_log, muc}
  %%               ]},
  {mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
  {mod_privacy, [{backend, odbc}]},
  {mod_blocking, []},
  {mod_private, []},
% {mod_private, [{backend, mnesia}]},
% {mod_private, [{backend, odbc}]},
  {mod_register, [
          %%
          %% Set the minimum informational entropy for passwords.
          %%
          %%{password_strength, 32},

          %%
          %% After successful registration, the user receives
          %% a message with this subject and body.
          %%
          {welcome_message, {""}},

          %%
          %% When a user registers, send a notification to
          %% these XMPP accounts.
          %%
                  %{registration_watchers, ["admin@localhost"]},

          %%
          %% Only clients in the server machine can register accounts
          %%
          {ip_access, [{allow, "127.0.0.0/8"},
                   {deny, "0.0.0.0/0"}]},

          %%
          %% Local c2s or remote s2s users cannot register accounts
          %%
          %%{access_from, deny},

          {access, register}
         ]},
  {mod_roster, [{backend, odbc},
  {versioning, true},
  {store_current_id, true}]},
  {mod_sic, []},
  {mod_bosh, []},
  {mod_carboncopy, []},

  %%
  %% Message Archive Management (MAM, XEP-0313) for registered users and
  %% Multi-User chats (MUCs).
  %%

% {mod_mam_meta, [
    %% Use ODBC backend (default)
%   {backend, odbc},

    %% Do not store user preferences (default)
%   {user_prefs_store, false},
    %% Store user preferences in RDBMS
%   {user_prefs_store, odbc},
    %% Store user preferences in Mnesia (recommended).
    %% The preferences store will be called each time, as a message is routed.
    %% That is why Mnesia is better suited for this job.
%   {user_prefs_store, mnesia},
    %% Mnesia back-end with optimized writes and dirty synchronious writes.
%   {user_prefs_store, mnesia_dirty},

    %% Enables a pool of asynchronous writers. (default)
    %% Messages will be grouped together based on archive id.
%   {async_writer, true},

    %% Cache information about users (default)
%   {cache_users, true},

    %% Enable archivization for private messages (default)
%   {pm, [
      %% Top-level options can be overriden here if needed, for example:
%     {async_writer, false}
%   ]},

    %%
    %% Message Archive Management (MAM) for multi-user chats (MUC).
    %% Enable XEP-0313 for "muc.@HOST@".
    %%
%   {muc, [
%     {host, "muc.@HOST@"}
      %% As with pm, top-level options can be overriden for MUC archive
%   ]}
% ]},

  %%
  %% MAM configuration examples
  %%

  %% Only MUC, no user-defined preferences, good performance.
  {mod_mam_meta, [
    {backend, odbc},
    {pm, []},
    {muc, [
      {host, "conference.@HOST@"}
    ]}
  ]}

  %% Only archives for c2c messages, good performance.
% {mod_mam_meta, [
%   {backend, odbc},
%   {pm, [
%     {user_prefs_store, mnesia_dirty}
%   ]}
% ]},

  %% Basic configuration for c2c messages, bad performance, easy to debug.
% {mod_mam_meta, [
%   {backend, odbc},
%   {async_writer, false},
%   {cache_users, false}
% ]},

  %% Cassandra archive for c2c and MUC conversations.
  %% No custom settings supported (always archive).
% {mod_mam_meta, [
%   {backend, cassandra},
%   {user_prefs_store, cassandra},
%   {muc, [{host, "muc.@HOST@"}]}
% ]}

  %%
  %% Configuration for Amazon SNS notifications.
  %%

%  {mod_aws_sns, [
    %% AWS credentials, region and host configuration
%    {access_key_id, "AKIAJAZYHOIPY6A2PESA"},
%    {secret_access_key, "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"},
%    {region, "eu-west-1"},
%    {account_id, "251423380551"},
%    {region, "eu-west-1"},
%    {sns_host, "sns.eu-west-1.amazonaws.com"},

    %% Messages from this MUC host will be sent to the SNS topic
%    {muc_host, "muc.@HOST@"},

    %% Plugin module for defining custom message attributes and user identification
%    {plugin_module, mod_aws_sns_defaults},

    %% Topic name configurations. Removing topic will disable this specific SNS notification
%    {presence_updates_topic, "user_presence_updated-dev-1"},  %% For presence updates
%    {pm_messages_topic, "user_message_sent-dev-1"},           %% For private chat messages
%    {muc_messages_topic, "user_messagegroup_sent-dev-1"}      %% For group chat messages

    %% Pool options
%    {pool_size, 100}, %% Worker pool size for publishing notifications
%    {publish_retry_count, 2}, %% Retry count in case of publish error
%    {publish_retry_time_ms, 50} %% Base exponential backoff time (in ms) for publish errors
%   ]}

 ]}.

%%
%% Enable modules with custom options in a specific virtual host
%%
%%{host_config, "localhost",
%% [{ {add, modules},
%%   [
%%    {mod_some_module, []}
%%   ]
%%  }
%% ]}.

%%%.
%%%'

%%% $Id$

%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker:
%%%.
fenek commented 6 years ago

What is the output of mongooseimctl register user1 localhost GJ9TuHq8 command when you execute it?

Arslan007 commented 6 years ago

It gives success but there is no user in DB

fenek commented 6 years ago

Can you please try to open MongooseIM console, execute ejabberd_auth:try_register(<<"user1">>, <<"localhost">>, <<"GJ9TuHq8">>). command and tell me what is the output?

Arslan007 commented 6 years ago

Hi @fenek

My apologies!! I was trying to install MongooseIM with pkg but I was facing this issue so I tried to compile MongooseIM on Ubuntu 14.04 from source and it was unsuccessful due to Erland version and I Updated my OS to Ubuntu 16.04 but its failing again on compile due to issue #1361

If you want that I can try to reproduce again from pkg file

fenek commented 6 years ago

Hi @Arslan007

Anything new on this matter? :) If the issue persists, can you please paste the output of try_register, like I've described in my previous post?

Arslan007 commented 6 years ago

@fenek I am going to close down this issue as unfortunately, I am not having same environment and I had already upgraded the system and with this upgraded system I am unable to reproduce with same configs. I will give a try later in spare time to reproduce this issue.

Thanks for your all support

hartmut-pq commented 6 years ago

Hi,

I've got issues with odbc Postgresql pgsql database backend. Running on docker image mongooseim/mongooseim:2.1.0beta2

Seems the only tables actively written to are

but what about e.g. users, mam_message, mam_server_user, ....? Ideally I would want to use pgsql to store everything but SESSIONs maybe...

ejabberd.cfg:

%%%
%%%               ejabberd configuration file
%%%
%%%'

%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included with
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/

%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%%  - The character to comment a line is %
%%%
%%%  - Each term ends in a dot, for example:
%%%      override_global.
%%%
%%%  - A tuple has a fixed definition, its elements are
%%%    enclosed in {}, and separated with commas:
%%%      {loglevel, 4}.
%%%
%%%  - A list can have as many elements as you want,
%%%    and is enclosed in [], for example:
%%%      [http_poll, web_admin, tls]
%%%
%%%    Pay attention that list elements are delimited with commas,
%%%    but no comma is allowed after the last list element. This will
%%%    give a syntax error unlike in more lenient languages (e.g. Python).
%%%
%%%  - A keyword of ejabberd is a word in lowercase.
%%%    Strings are enclosed in "" and can contain spaces, dots, ...
%%%      {language, "en"}.
%%%      {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%%  - This term includes a tuple, a keyword, a list, and two strings:
%%%      {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%%  - This config is preprocessed during release generation by a tool which
%%%    interprets double curly braces as substitution markers, so avoid this
%%%    syntax in this file (though it's valid Erlang).
%%%
%%%    So this is OK (though arguably looks quite ugly):
%%%      { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%%%
%%%    And I can't give an example of what's not OK exactly because
%%%    of this rule.
%%%

%%%.   =======================
%%%'   OVERRIDE STORED OPTIONS

%%
%% Override the old values stored in the database.
%%

%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%%override_global.

%%
%% Override local options (specific for this particular ejabberd node).
%%
%%override_local.

%%
%% Remove the Access Control Lists before new ones are added.
%%
%%override_acls.

%%%.   =========
%%%'   DEBUGGING

%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 5}.

%%%.   ================
%%%'   SERVED HOSTNAMES

%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["chat.mydomain.net"]}.

%%
%% route_subdomains: Delegate subdomains to other XMPP servers.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with an XMPP server called im.example.org.
%%
%%{route_subdomains, s2s}.

%%%.   ===============
%%%'   LISTENING PORTS

%%
%% listen: The ports ejabberd will listen on, which service each is handled
%% by and what options to start it with.
%%
{listen,
 [
  %% BOSH and WS endpoints over HTTP
  { 5280, ejabberd_cowboy, [
      {num_acceptors, 10},
      {transport_options, [{max_connections, 1024}]},
      {modules, [

          {"_", "/http-bind", mod_bosh},
          {"_", "/ws-xmpp", mod_websockets, [{ejabberd_service, [
                                        {access, all},
                                        {shaper_rule, fast},
                                        {ip, {127, 0, 0, 1}},
                                        {password, "secret"}]}
          %% Uncomment to enable connection dropping or/and server-side pings
          %{timeout, 600000}, {ping_rate, 2000}
          ]}
          %% Uncomment to serve static files
          %{"_", "/static/[...]", cowboy_static,
          %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
          %},

          %% Example usage of mod_revproxy

          %% {"_", "/[...]", mod_revproxy, [{timeout, 5000},
          %%                                % time limit for upstream to respond
          %%                                {body_length, 8000000},
          %%                                % maximum body size (may be infinity)
          %%                                {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                % list of extra headers that are send to upstream
          %%                               ]}

          %% Example usage of mod_cowboy

          %% {"_", "/[...]", mod_cowboy, [{http, mod_revproxy,
          %%                                [{timeout, 5000},
          %%                                 % time limit for upstream to respond
          %%                                 {body_length, 8000000},
          %%                                 % maximum body size (may be infinity)
          %%                                 {custom_headers, [{<<"header">>,<<"value">>}]}
          %%                                 % list of extra headers that are send to upstream
          %%                                ]},
          %%                               {ws, xmpp, mod_websockets}
          %%                             ]}
      ]}
  ]},

  %% BOSH and WS endpoints over HTTPS
  { 5285, ejabberd_cowboy, [
        {num_acceptors, 10},
        {transport_options, [{max_connections, 1024}]},
%        {{{https_config}}},
        {modules, [
            {"_", "/http-bind", mod_bosh},
            {"_", "/ws-xmpp", mod_websockets, [
            %% Uncomment to enable connection dropping or/and server-side pings
            %{timeout, 600000}, {ping_rate, 60000}
            ]}
            %% Uncomment to serve static files
            %{"_", "/static/[...]", cowboy_static,
            %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]}
            %},
        ]}
    ]},

  %% MongooseIM HTTP API it's important to start it on localhost
  %% or some private interface only (not accessible from the outside)
  %% At least start it on different port which will be hidden behind firewall

  { 8088 , ejabberd_cowboy, [
      {num_acceptors, 10},
      {transport_options, [{max_connections, 1024}]},
      {modules, [
          {"_", "/api", mongoose_api_admin, []}
      ]}
  ]},

  { 8089 , ejabberd_cowboy, [
      {num_acceptors, 10},
      {transport_options, [{max_connections, 1024}]},
      {protocol_options, [{compress, true}]},
%      {{{https_config}}},
      {modules, [
          {"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
          {"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
          {"_", "/api/contacts/[:jid]", mongoose_client_api_contacts, []},
          {"_", "/api/rooms/[:id]",    mongoose_client_api_rooms, []},
          {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []},
          {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []}
      ]}
  ]},

  %% Following HTTP API is deprected, the new one abouve should be used instead

%  { 8089, ejabberd_cowboy, [
%      {num_acceptors, 10},
%      {transport_options, [{max_connections, 1024}]},
%      {modules, [
%          {"localhost", "/api", mongoose_api, [{handlers, [mongoose_api_metrics,
%                                                           mongoose_api_users]}]}
%      ]}
%  ]},

  { 5222, ejabberd_c2s, [

            %%
            %% If TLS is compiled in and you installed a SSL
            %% certificate, specify the full path to the
            %% file and uncomment this line:
            %%
%                        {{{tls_config}}},
%                        {{{zlib}}},
            %% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
            %% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"},
            {access, c2s},
            {shaper, c2s_shaper},
            {max_stanza_size, 65536},
            {protocol_options, ["no_sslv3"]}
%                        {{{c2s_dhfile}}}
               ]},

%  {{{secondary_c2s}}}

  %%
  %% To enable the old SSL connection method on port 5223:
  %%
  %%{5223, ejabberd_c2s, [
  %%            {access, c2s},
  %%            {shaper, c2s_shaper},
  %%            {certfile, "/path/to/ssl.pem"}, tls,
  %%            {max_stanza_size, 65536}
  %%               ]},

  { 5269, ejabberd_s2s_in, [
               {shaper, s2s_shaper},
               {max_stanza_size, 131072},
               {protocol_options, ["no_sslv3"]}
%              {{{s2s_dhfile}}}
              ]}

  %%
  %% ejabberd_service: Interact with external components (transports, ...)
  %%
%  {{{ejabberd_service}}}

  %%
  %% ejabberd_stun: Handles STUN Binding requests
  %%
  %%{ {3478, udp}, ejabberd_stun, []}

 ]}.

%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
%{{{s2s_use_starttls}}}
%%
%% s2s_certfile: Specify a certificate file.
%%
%{{{s2s_certfile}}}

%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
%% {s2s_ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}.

%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
%%{domain_certfile, "example.org", "/path/to/example_org.pem"}.
%%{domain_certfile, "example.com", "/path/to/example_com.pem"}.

%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
{s2s_default_policy, {{{s2s_default_policy}}} }.

%%
%% Allow or deny communication with specific servers.
%%
%%{ {s2s_host, "goodhost.org"}, allow}.
%%{ {s2s_host, "badhost.org"}, deny}.

{outgoing_s2s_port, 5269 }.

%%
%% IP addresses predefined for specific hosts to skip DNS lookups.
%% Ports defined here take precedence over outgoing_s2s_port.
%% Examples:
%%
%% { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }.
%{{{s2s_addr}}}

%%
%% Outgoing S2S options
%%
%% Preferred address families (which to try first) and connect timeout
%% in milliseconds.
%%
%%{outgoing_s2s_options, [ipv4, ipv6], 10000}.

%%%.   ==============
%%%'   SESSION BACKEND

%%{sm_backend, {mnesia, []}}.
{sm_backend, {mnesia, []}}.

%%{sm_backend, {redis, [{pool_size, 3}, {worker_config, [{host, "localhost"}, {port, 6379}]}]}}.
%{sm_backend, {{{sm_backend}}} }.

%%%.   ==============
%%%'   AUTHENTICATION

%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
%{auth_method, {{{auth_method}}} }.
{auth_method, internal }.
{auth_opts, [
             %% Store the plain passwords or hashed for SCRAM:
             %% {password_format, plain} % default
             %% {password_format, scram}
%             {{{password_format}}}
             %% {scram_iterations, 4096} % default
%             {{{scram_iterations}}}
             %%
             %% For auth_http:
             %% {host, IP | Hostname}
             %% {connection_pool_size, 10} % default
             %% {connection_opts, Opts}
             %% {basic_auth, "user:password"}
             %% {path_prefix, "/"} % default
             %%
             %% For auth_external
%             {{{ext_auth_script}}}
             %%
             %% For auth_jwt
             %% {jwt_key, "shared_secret"},
             %% {token_user_key, bookingNumber}
            ]}.

%%
%% Authentication using external script
%% Make sure the script is executable by ejabberd.
%%
%%{auth_method, external}.

%%
%% Authentication using ODBC
%% Remember to setup a database in the next section.
%%
%{auth_method, odbc}.

%%
%% Authentication using LDAP
%%
%%{auth_method, ldap}.
%%
%{{{auth_ldap}}}
%% List of LDAP servers:
%%{ldap_servers, ["localhost"]}.
%%
%% Encryption of connection to LDAP servers:
%%{ldap_encrypt, none}.
%%{ldap_encrypt, tls}.
%%
%% Port to connect to on LDAP servers:
%%{ldap_port, 389}.
%%{ldap_port, 636}.
%%
%% LDAP manager:
%%{ldap_rootdn, "dc=example,dc=com"}.
%%
%% Password of LDAP manager:
%%{ldap_password, "******"}.
%%
%% Search base of LDAP directory:
%%{ldap_base, "dc=example,dc=com"}.
%%
%% LDAP attribute that holds user ID:
%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
%%
%% LDAP filter:
%%{ldap_filter, "(objectClass=shadowAccount)"}.

%%
%% Anonymous login support:
%%   auth_method: anonymous
%%   anonymous_protocol: sasl_anon | login_anon | both
%%   allow_multiple_connections: true | false
%%
%%{host_config, "public.example.org", [{auth_method, anonymous},
%%                                     {allow_multiple_connections, false},
%%                                     {anonymous_protocol, sasl_anon}]}.
%%
%% To use both anonymous and internal authentication:
%%
%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.
%{{{host_config}}}

%%%.   ==============
%%%'   DATABASE SETUP

%% ejabberd by default uses the internal Mnesia database,
%% so you do not necessarily need this section.
%% This section provides configuration examples in case
%% you want to use other database backends.
%% Please consult the ejabberd Guide for details on database creation.

%%
%% MySQL server:
%%
%{{{odbc_server}}}
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.

%%
%% PostgreSQL server:
%%
%%{odbc_server, {pgsql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
{odbc_server, {pgsql, "postgres-server", 5432, "mongooseim", "mongooseim", "password"}}.
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%%{pgsql_users_number_estimate, true}.

%%
%% ODBC compatible or MSSQL server:
%%
%%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.

%% Specifies what database is used over the ODBC layer
%% Can take values odbc, pgsql, mysql
%% In some cases (for example for MAM with pgsql) it is required to set proper value.
%{{{odbc_server_type}}}
%{odbc_server_type, "pgsql"}.
%%
%% Number of connections to open to the database for each virtual host
%%
%%{odbc_pool_size, 10}.
{odbc_pool_size, 10}.

%% Enable the default database connection pool
%%{pool, odbc, default}.
%{{{odbc_pools}}}
{pool, odbc, default}.

%%% ====================
%%% RIAK SETUP
%%% ====================

%{{{riak_server}}}

%%% ==================================
%%% POOLS OF OUTGOING HTTP CONNECTIONS
%%% ==================================
%%
%%{http_connections, [{conn1, [{server, "http://server:8080"},
%%                              {pool_size, 50}]}
%%                    ]}.
%%
%% Interval to make a dummy SQL request to keep the connections to the
%% database alive. Specify in seconds: for example 28800 means 8 hours
%%
%%{odbc_keepalive_interval, undefined}.

%%% ====================
%%% CASSANDRA SETUP
%%% ====================

%{{cassandra_servers}}

%% Connect to localhost:9042, one worker, one pool, shared between all hosts
%%{cassandra_servers, [{default, []}]}.

%% ALTERNATIVE CONFIGURATION: Custom server address
%% - 100 connections to all four Cassandra servers in total
%% - Keyspace "big_mongooseim"
%%
%%{cassandra_servers,
%% [
%%  {default, 100,
%%   [
%%    {servers,
%%     [
%%      {"cassandra_server1.example.com", 9042},
%%      {"cassandra_server2.example.com", 9042},
%%      {"cassandra_server3.example.com", 9042},
%%      {"cassandra_server4.example.com", 9042}
%%     ]
%%    },
%%    {keyspace, "big_mongooseim"}
%%   ]
%%  }
%% ]
%%}.

%% ALTERNATIVE CONFIGURATION: Two pools: for mam and for mam_muc
%% - Each pool uses different keyspace
%% - Module mod_mam_cassandra_arch uses pool "mam" and keyspace "mam_space"
%% - Module mod_mam_muc_cassandra_arch uses pool "mam_muc" and keyspace "mam_muc_space"
%%
%% Set pool_name for modules like this (not just uncomment this example!)
%% {modules,
%%    [{mod_mam_cassandra_arch, [{pool_name, mam}]},
%%     {mod_mam_muc_cassandra_arch, [{pool_name, mam_muc}]}]}.
%%
%%{cassandra_servers, [{mam, [{keyspace, "mam_space"}]}, {mam_muc, [{keyspace, "mam_muc_space"}]}]}.

%%%.   ===============
%%%'   TRAFFIC SHAPERS

%%
%% The "normal" shaper limits traffic speed to 1000 B/s
%%
{shaper, normal, {maxrate, 1000}}.

%%
%% The "fast" shaper limits traffic speed to 50000 B/s
%%
{shaper, fast, {maxrate, 50000}}.

%%
%% This option specifies the maximum number of elements in the queue
%% of the FSM. Refer to the documentation for details.
%%
{max_fsm_queue, 1000}.

%%%.   ====================
%%%'   ACCESS CONTROL LISTS

%%
%% The 'admin' ACL grants administrative privileges to XMPP accounts.
%% You can put here as many accounts as you want.
%%
%{acl, admin, {user, "alice", "localhost"}}.
%{acl, admin, {user, "a", "localhost"}}.

%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.

%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.

%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.

%%
%% Define specific ACLs in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {acl, admin, {user, "bob-local", "localhost"}}
%% ]
%%}.

%%%.   ============
%%%'   ACCESS RULES

%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.

%% Maximum number of offline messages that users can have:
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.

%% This rule allows access only for local users:
{access, local, [{allow, local}]}.

%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
           {allow, all}]}.

%% For C2S connections, all users except admins use the "normal" shaper
{access, c2s_shaper, [{none, admin},
              {normal, all}]}.

%% All S2S connections use the "fast" shaper
{access, s2s_shaper, [{fast, all}]}.

%% Admins of this server are also admins of the MUC service:
{access, muc_admin, [{allow, admin}]}.

%% Only accounts of the local ejabberd server can create rooms:
{access, muc_create, [{allow, local}]}.

%% All users are allowed to use the MUC service:
{access, muc, [{allow, all}]}.

%% In-band registration allows registration of any possible username.
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.

%% By default the frequency of account registrations from the same IP
%% is limited to 1 account every 10 minutes. To disable, specify: infinity
{registration_timeout, infinity}.

%% Default settings for MAM.
%% To set non-standard value, replace 'default' with 'allow' or 'deny'.
%% Only user can access his/her archive by default.
%% An online user can read room's archive by default.
%% Only an owner can change settings and purge messages by default.
%% Empty list (i.e. `[]`) means `[{deny, all}]`.
{access, mam_set_prefs, [{default, all}]}.
{access, mam_get_prefs, [{default, all}]}.
{access, mam_lookup_messages, [{default, all}]}.
{access, mam_purge_single_message, [{default, all}]}.
{access, mam_purge_multiple_messages, [{default, all}]}.

%% 1 command of the specified type per second.
{shaper, mam_shaper, {maxrate, 1}}.
%% This shaper is primeraly for Mnesia overload protection during stress testing.
%% The limit is 1000 operations of each type per second.
{shaper, mam_global_shaper, {maxrate, 1000}}.

{access, mam_set_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_get_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_lookup_messages_shaper, [{mam_shaper, all}]}.
{access, mam_purge_single_message_shaper, [{mam_shaper, all}]}.
{access, mam_purge_multiple_messages_shaper, [{mam_shaper, all}]}.

{access, mam_set_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_get_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_lookup_messages_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_single_message_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_multiple_messages_global_shaper, [{mam_global_shaper, all}]}.

%%
%% Define specific Access Rules in a virtual host.
%%
%%{host_config, "localhost",
%% [
%%  {access, c2s, [{allow, admin}, {deny, all}]},
%%  {access, register, [{deny, all}]}
%% ]
%%}.

%%%.   ================
%%%'   DEFAULT LANGUAGE

%%
%% language: Default language used for server messages.
%%
{language, "en"}.

%%
%% Set a different default language in a virtual host.
%%
%%{host_config, "localhost",
%% [{language, "ru"}]
%%}.

%%%.   ================
%%%'   MISCELLANEOUS

{all_metrics_are_global, {{{all_metrics_are_global}}} }.

%%%.   =======
%%%'   MODULES

%%
%% Modules enabled in all ejabberd virtual hosts.
%% For list of possible modules options, check documentation.
%%
{modules,
 [

  %% The format for a single route is as follows:
  %% {Host, Path, Method, Upstream}
  %%
  %% "_" can be used as wildcard for Host, Path and Method
  %% Upstream can be either host (just http(s)://host:port) or uri
  %% The difference is that host upstreams append whole path while
  %% uri upstreams append only remainder that follows the matched Path
  %% (this behaviour is similar to nginx's proxy_pass rules)
  %%
  %% Bindings can be used to match certain parts of host or path.
  %% They will be later overlaid with parts of the upstream uri.
  %%
  %% {mod_revproxy,
  %%    [{routes, [{"www.erlang-solutions.com", "/admin", "_",
  %%                "https://www.erlang-solutions.com/"},
  %%               {":var.com", "/:var", "_", "http://localhost:8080/"},
  %%               {":domain.com", "/", "_", "http://localhost:8080/:domain"}]
  %%     }]},

  %{mod_admin_extra, [{submods, [node, accounts, sessions, vcard,
  %                              roster, last, private, stanza, stats]}]},

% {mod_http_upload, [
    %% Set max file size in bytes. Defaults to 10 MB.
    %% Disabled if value is `undefined`.
%   {max_file_size, 1024},
    %% Use S3 storage backend
%   {backend, s3},
    %% Set options for S3 backend
%   {s3, [
%     {bucket_url, "http://s3-eu-west-1.amazonaws.com/konbucket2"},
%     {region, "eu-west-1"},
%     {access_key_id, "AKIAIAOAONIULXQGMOUA"},
%     {secret_access_key, "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"}
%   ]}
% ]},

  {mod_adhoc, []},
%  {{{mod_amp}}}
  {mod_disco, []},
  {mod_commands, []},
  {mod_muc_commands, []},
  {mod_muc_light_commands, []},
%  {{{mod_last}}}
%  {mod_last, []},
  {mod_last, [{backend, odbc}]},
  {mod_stream_management, [
                           % default 100
                           % size of a buffer of unacked messages
                           % {buffer_max, 100}

                           % default 1 - server sends the ack request after each stanza
                           % {ack_freq, 1}

                           % default: 600 seconds
                           % {resume_timeout, 600}
                          ]},
  %% {mod_muc_light, [{host, "muclight.@HOST@"}]},
  {mod_muc_light, [
    {host, "muclight.@HOST@"},
    {backend, odbc}
  ]},
  %% {mod_muc, [{host, "muc.@HOST@"},
  %%            {access, muc},
  %%            {access_create, muc_create}
  %%           ]},
  %% {mod_muc_log, [
  %%                {outdir, "/tmp/muclogs"},
  %%                {access_log, muc}
  %%               ]},
%  {{{mod_offline}}}
  {mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
%  {{{mod_privacy}}}
%  {mod_privacy, []},
  {mod_privacy, [{backend, odbc}]},
%  {{{mod_blocking}}}
  {mod_blocking, []},
%  {{{mod_private}}}
%   {mod_private, []},
% {mod_private, [{backend, mnesia}]},
  {mod_private, [{backend, odbc}]},
%  {mod_private, [{backend, odbc}]},
%  {mod_register, [
%         %%
%         %% Set the minimum informational entropy for passwords.
%         %%
%         %%{password_strength, 32},
%
%         %%
%         %% After successful registration, the user receives
%         %% a message with this subject and body.
%         %%
%         {welcome_message, {""}},
%
%         %%
%         %% When a user registers, send a notification to
%         %% these XMPP accounts.
%         %%
%                  {{{registration_watchers}}}
%
%         %%
%         %% Only clients in the server machine can register accounts
%         %%
%         {ip_access, [{allow, "127.0.0.0/8"},
%                  {deny, "0.0.0.0/0"}]},
%
%         %%
%         %% Local c2s or remote s2s users cannot register accounts
%         %%
%         %%{access_from, deny},
%
%         {access, register}
%        ]},
%  {{{mod_roster}}}
  {mod_roster, [{backend, odbc}]},
  {mod_sic, []},
%  {{{mod_vcard}}}
%  {mod_vcard, [%{matches, 1}, {host, "vjid.@HOST@"}]},
  {mod_vcard, [
    {allow_return_all, true},
    {search_all_hosts, true},
    %{matches, 1},
    {search, true},
    {backend, odbc}
  ]},
  {mod_bosh, []},
  {mod_carboncopy, []},

  %%
  %% Message Archive Management (MAM, XEP-0313) for registered users and
  %% Multi-User chats (MUCs).
  %%

 {mod_mam_meta, [
    %% Use ODBC backend (default)
   {backend, odbc},

    %% Do not store user preferences (default)
%   {user_prefs_store, false},
    %% Store user preferences in RDBMS
%   {user_prefs_store, odbc},
    %% Store user preferences in Mnesia (recommended).
    %% The preferences store will be called each time, as a message is routed.
    %% That is why Mnesia is better suited for this job.
%   {user_prefs_store, mnesia},
    %% Mnesia back-end with optimized writes and dirty synchronious writes.
%   {user_prefs_store, mnesia_dirty},

    %% Enables a pool of asynchronous writers. (default)
    %% Messages will be grouped together based on archive id.
   {async_writer, true},

    %% Cache information about users (default)
   {cache_users, true},

    %% Enable archivization for private messages (default)
   {pm, [
      %% Top-level options can be overriden here if needed, for example:
     {async_writer, false}
   ]},

    %%
    %% Message Archive Management (MAM) for multi-user chats (MUC).
    %% Enable XEP-0313 for "muc.@HOST@".
    %%
   {muc, [
     {host, "muc.@HOST@"}
      %% As with pm, top-level options can be overriden for MUC archive
   ]}
 ]}

  %%
  %% MAM configuration examples
  %%

  %% Only MUC, no user-defined preferences, good performance.
% {mod_mam_meta, [
%   {backend, odbc},
%   {pm, false},
%   {muc, [
%     {host, "muc.@HOST@"}
%   ]}
% ]},

  %% Only archives for c2c messages, good performance.
% {mod_mam_meta, [
%   {backend, odbc},
%   {pm, [
%     {user_prefs_store, mnesia_dirty}
%   ]}
% ]},

  %% Basic configuration for c2c messages, bad performance, easy to debug.
% {mod_mam_meta, [
%   {backend, odbc},
%   {async_writer, false},
%   {cache_users, false}
% ]},

  %% Cassandra archive for c2c and MUC conversations.
  %% No custom settings supported (always archive).
% {mod_mam_meta, [
%   {backend, cassandra},
%   {user_prefs_store, cassandra},
%   {muc, [{host, "muc.@HOST@"}]}
% ]}

  %%
  %% Configuration for Amazon SNS notifications.
  %%

%  {mod_aws_sns, [
    %% AWS credentials, region and host configuration
%    {access_key_id, "AKIAJAZYHOIPY6A2PESA"},
%    {secret_access_key, "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"},
%    {region, "eu-west-1"},
%    {account_id, "251423380551"},
%    {region, "eu-west-1"},
%    {sns_host, "sns.eu-west-1.amazonaws.com"},

    %% Messages from this MUC host will be sent to the SNS topic
%    {muc_host, "muc.@HOST@"},

    %% Plugin module for defining custom message attributes and user identification
%    {plugin_module, mod_aws_sns_defaults},

    %% Topic name configurations. Removing topic will disable this specific SNS notification
%    {presence_updates_topic, "user_presence_updated-dev-1"},  %% For presence updates
%    {pm_messages_topic, "user_message_sent-dev-1"},           %% For private chat messages
%    {muc_messages_topic, "user_messagegroup_sent-dev-1"}      %% For group chat messages

    %% Pool options
%    {pool_size, 100}, %% Worker pool size for publishing notifications
%    {publish_retry_count, 2}, %% Retry count in case of publish error
%    {publish_retry_time_ms, 50} %% Base exponential backoff time (in ms) for publish errors
%   ]}

 ]}.

%{{{module_host_config}}}
%%
%% Enable modules with custom options in a specific virtual host
%%
%%{host_config, "localhost",
%% [{ {add, modules},
%%   [
%%    {mod_some_module, []}
%%   ]
%%  }
%% ]}.

%%%.
%%%'

%%% $Id$

%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker:
%%%.
Arslan007 commented 6 years ago

@hartmut-pq

Hi I found two things wrong in this cfg by quickly looking into it.

You need to commit this since you want to external auth

%{auth_method, {{{auth_method}}} }.
{auth_method, internal }.
{auth_opts, [
             %% Store the plain passwords or hashed for SCRAM:
             %% {password_format, plain} % default
             %% {password_format, scram}
%             {{{password_format}}}
             %% {scram_iterations, 4096} % default
%             {{{scram_iterations}}}
             %%
             %% For auth_http:
             %% {host, IP | Hostname}
             %% {connection_pool_size, 10} % default
             %% {connection_opts, Opts}
             %% {basic_auth, "user:password"}
             %% {path_prefix, "/"} % default
             %%
             %% For auth_external
%             {{{ext_auth_script}}}
             %%
             %% For auth_jwt
             %% {jwt_key, "shared_secret"},
             %% {token_user_key, bookingNumber}
            ]}.

And uncomment these lines to use postgre sql

%{auth_method, odbc}.

Last thing have you executed pgsql script to create tables in your DB.

hartmut-pq commented 6 years ago

Hi, thanks a lot for having a look. Unsure though what to put in place. I'll have to look into different authentication methods later - but right now I would be fine with odbc (postgres) + plain passwords.

What would I need to define in this case? {auth_method, odbc}. or {auth_method, internal}. and do I need to define anything for {auth_opts, [.... in this case?

Then with this set up - should I then be able to see the users stored in the db table?

pgsql script for init db has had been applied successfully aready. As mentioned rosterusers & last are getting populated already - but those tables only. Anything wrong with the mam configuration?

fenek commented 6 years ago

@hartmut-pq

In order to use Postgres authentication, you'll need {auth_method, odbc}.

Indeed I haven't noticed that you've changed it to internal later. It was odbc in the first config file so I assumed it hasn't changed.

hartmut-pq commented 6 years ago

Hi @fenek thanks for the quick response. Pls note I'm not the original issue creator - so have an entirely separate configuration. I should've created a new issue to avoid confusion :-/

fenek commented 6 years ago

Indeed. I'm sorry, I got confused due to these very long posts. :) Has setting {auth_method, odbc}. helped you?

hartmut-pq commented 6 years ago

Mant thanks @fenek setting {auth_method, odbc}. helped for users, can now see them in users db table. I did set {password_format, plain} as an option manually now, too (unsure though if required as says default).

Still not getting mam_message populated. Anything missing there?

fenek commented 6 years ago

You'll need to enable mod_mam_meta module. Please check this section of documentation: http://mongooseim.readthedocs.io/en/latest/modules/mod_mam/

You can find some configuration examples in ejabberd.cfg at the end of modules section as well.

I see it's enabled in the last config you've pasted but maybe you've commented it out at some point?

hartmut-pq commented 6 years ago

Hmm could you pls have a quick look at the config file I've posted above - can't figure out what's missing - shouldn't it be enabled?

fenek commented 6 years ago

Are there any errors in the logs? Could you give me an example of a stanza that should be archived but is not stored in mam_message eventually?

fenek commented 6 years ago

I can't see any messages passed between users in these logs. :( Can you please delete all logs, start the server again and send one message?

I think it will be more convenient to paste the logs in a service like Pastebin, because these posts are becoming very long. :)

hartmut-pq commented 6 years ago

Thanks for having a look, here's log for messages: https://pastebin.com/4vL2Cmu4

with following error: 2017-07-10 12:01:09.172 [error] <0.3708.0>@ejabberd_hooks:run_fold1:244 {{case_clause,{error,"permission denied for sequence mam_server_user_id_seq"}},[{mod_mam_odbc_user,create_user_archive,3, ...

fenek commented 6 years ago

It might indicate that MongooseIM user in Postgres doesn't have sufficient privileges to the database. Usually full access is granted for MIM to the schema. How did you create MIM user in the DB?

hartmut-pq commented 6 years ago

Hi @fenek, many thanks for the hint. I've had seeded the db with the pgsql superuser and had granted privileges on tables only...

So with privileges on sequences, it's working now! 👍

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO mongooseim;