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.66k stars 426 forks source link

MongooseIM HTTP API returns 500 Internal Server Error #2256

Closed jasl closed 5 years ago

jasl commented 5 years ago

MongooseIM version: 3.3.0 Installed from: source Erlang/OTP version: Erlang/OTP 21 [erts-10.3.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]

I'm trying MongooseIM HTTP API for example simply browse http://localhost:8088/api/contacts from chrome, then I got 500 Internal Server Error

At MongooseIM side, the log shows

23:19:41.164 [error] CRASH REPORT Process <0.1418.0> with 0 neighbours crashed with reason: no match of right hand value [] in mongoose_api_admin:to_json/2 line 159
23:19:41.165 [error] Lager event handler error_logger_lager_h exited with reason {'EXIT',{{case_clause,['ejabberd_cowboy_127.0.0.1_8088',<0.1412.0>,3,<0.1418.0>,{badmatch,[]},[{mongoose_api_admin,to_json,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_admin.erl"},{line,159}]},{cowboy_rest,call,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1571}]},{cowboy_rest,set_resp_body,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1461}]},...]]},...}}

I also tried http://localhost:8088/api/users got the same error, but http://localhost:8088/api/commands works great.

arcusfelis commented 5 years ago

From code:

to_json(Req, #http_api_state{command_category = Category, bindings = B} = State) ->
    Cmds = mongoose_commands:list(admin, Category, method_to_action(<<"GET">>)),
    Arity = length(B),
    [Command] = [C || C <- Cmds, mongoose_commands:arity(C) == Arity], % line 159
    process_request(<<"GET">>, Command, Req, State).

There is no api/users command configured, probably because of misconfiguration. Please, include listen block of mongooseim.cfg configuration file, if you are still feeling, that it's a bug and not misconfiguration.

Some configuration documentation can be found here: https://mongooseim.readthedocs.io/en/latest/advanced-configuration/Listener-modules/#http-based-services-bosh-websocket-rest-ejabberd_cowboy

You can also generate a development release using make mim1 and check the config example _build/mim1/rel/mongooseim/etc/mongooseim.cfg, it should have the cowboy listeners configured correctly.

It should look something like this:

  { 8089 , ejabberd_cowboy, [
      {num_acceptors, 10},
      {transport_options, [{max_connections, 1024}]},
      {protocol_options, [{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/contacts/[:jid]", mongoose_client_api_contacts, []},
          {"_", "/api/rooms/[:id]",    mongoose_client_api_rooms, []},
          {"_", "/api/rooms/[:id]/config",    mongoose_client_api_rooms_config, []},
          {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []},
          {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []}
      ]}
  ]},

{"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []} is the module you try to access.

jasl commented 5 years ago

@arcusfelis

Here's my configuration, it should be generated on make rel and I didn't modify it, I only tried http (port 8088)

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

I've read the doc, it said mongoose_api_admin - REST API for admin commands. Exposes all mongoose_commands. It expects one optional argument that I think I'm not misconfigured.

jasl commented 5 years ago

But I'm not familiar with Erlang and MongooseIM, so I'm not sure anything

jasl commented 5 years ago

I've updated my configuration as yours @arcusfelis

  {8088, ejabberd_cowboy, [
    {num_acceptors, 10},
    {transport_options, [{max_connections, 1024}]},
    {modules, [
      % {"_", "/api", mongoose_api_admin, []},
      {"_", "/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]/config",    mongoose_client_api_rooms_config, []},
      {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []},
      {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []}
    ]}
  ]},

still got error, but reason is different

20:16:56.924 [error] CRASH REPORT Process <0.1398.0> with 0 neighbours crashed with reason: no match of right hand value error in mongoose_client_api:check_password/2 line 114
20:16:56.926 [error] Lager event handler error_logger_lager_h exited with reason {'EXIT',{{case_clause,['ejabberd_cowboy_0.0.0.0_8088',<0.1396.0>,1,<0.1398.0>,{badmatch,error},[{mongoose_client_api,check_password,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_client_api.erl"},{line,114}]},{mongoose_client_api,do_authorize,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_client_api.erl"},{line,109}]},{mongoose_client_api,authorize,4,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/..."},...]},...]]},...}}
jasl commented 5 years ago

I attached my full mongooseim.cfg, XMPP works great, but got problem on MongooseIM API

%%%
%%%               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, 4}.

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

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

%%
%% 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}}
        ]},
        {timeout, 600000}, {ping_rate, 2000}
      ]}
    ]}
  ]},

  %% BOSH and WS endpoints over HTTPS
  % {5285, ejabberd_cowboy, [
  %   {num_acceptors, 10},
  %   {transport_options, [{max_connections, 1024}]},
  %   {ssl, [{certfile, "priv/ssl/cybros.io.pem"}, {keyfile, "priv/ssl/cybros.io.key"}, {password, ""}]},
  %   {modules, [
  %     {"_", "/http-bind", mod_bosh},
  %     {"_", "/ws-xmpp", mod_websockets, [
  %       {timeout, 600000}, {ping_rate, 60000}
  %     ]}
  %   ]}
  % ]},

  %% 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},
    {transport_options, [{max_connections, 1024}]},
    {modules, [
      {"localhost", "/api", mongoose_api_admin, []}
    ]}
  ]},

  % {8089, ejabberd_cowboy, [
  %   {num_acceptors, 10},
  %   {transport_options, [{max_connections, 1024}]},
  %   {protocol_options, [{compress, true}]},
  %   {ssl, [{certfile, "priv/ssl/cybros.io.pem"}, {keyfile, "priv/ssl/cybros.io.key"}, {password, ""}]},
  %   {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]/config", mongoose_client_api_rooms_config, []},
  %     {"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []},
  %     {"_", "/api/rooms/[:id]/messages", mongoose_client_api_rooms_messages, []}
  %   ]}
  % ]},

  % {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/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"]}
  % ]},

  {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/cybros.io.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, []}}.

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

%% Advertised SASL mechanisms
{sasl_mechanisms, [cyrsasl_plain]}.

%%
%% 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, http}.
{auth_opts, [
  %% Store the plain passwords or hashed for SCRAM:
  {password_format, plain},
  % {password_format, scram}
  % {scram_iterations, 4096} % default

  %%
  %% For auth_http:
  %% auth_http requires {http, Host | global, auth, ..., ...} outgoing pool.
  % {basic_auth, "mongooseim:48Fcdc@7"}
  {connection_pool_size, 10}
]}.

%%%.   ==============
%%%'   OUTGOING CONNECTIONS (e.g. DB)

%% Here you may configure all outgoing connections used by MongooseIM,
%% e.g. to RDBMS (such as MySQL), Riak or external HTTP components.
%% Default MongooseIM configuration uses only Mnesia (non-Mnesia extensions are disabled),
%% so no options here are uncommented out of the box.
%% This section includes configuration examples; for comprehensive guide
%% please consult MongooseIM documentation, page "Outgoing connections":
%% - doc/advanced-configuration/outgoing-connections.md
%% - https://mongooseim.readthedocs.io/en/latest/advanced-configuration/outgoing-connections/

{outgoing_pools, [
  {http, global, auth, [
    {workers, 10}
  ], [
    {server, "http://127.0.0.1:3000"},
    {path_prefix, "/internal/ejabberd/"}
  ]},
  {rdbms, global, default, [
    {workers, 10}
  ], [
    {server, {pgsql, "localhost", 5432, "mongooseim", "mongooseim", "PASSWORD"}}
  ]},
  {redis, global, default, [
    {strategy, random_worker}
  ], [
    {host, "localhost"},
    {port, 6379},
    {database, 2}
  ]}
]}.

%% == Extra options ==
%%
%% 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}.
%%
%% rdbms_server_type specifies what database is used over the RDBMS layer
%% Can take values mssql, pgsql, mysql
%% In some cases (for example for MAM with pgsql) it is required to set proper value.
%%
{rdbms_server_type, pgsql}.

%%%.   ===============
%%%'   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}.

%%%.   ========
%%%'   SERVICES

%% Unlike modules, services are started per node and provide either features which are not
%% related to any particular host, or backend stuff which is used by modules.
%% This is handled by `mongoose_service` module.

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

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

%%
%% Modules enabled in all mongooseim virtual hosts.
%% For list of possible modules options, check documentation.
%%
{modules, [
  {mod_adhoc, []},
  {mod_disco, [{users_can_see_hidden_services, false}]},
  {mod_commands, []},
  {mod_muc_light_commands, []},
  {mod_last, []},
  {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@"},
    {backend, rdbms},
    {all_can_invite, true},
    {all_can_configure, false},
    {blocking, false},
    {rooms_per_page, 10},
    {rooms_in_rosters, true},
    {config_schema, ["roomname"]},
    {default_config, [{"roomname", "The Room"}]}
  ]},
  {mod_inbox, [
    {backend, rdbms},
    {reset_markers, [displayed, received, acknowledged]},
    {aff_changes, true},
    {remove_on_kicked, true},
    {groupchat, [muclight]}
  ]},
  {mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
  {mod_privacy, []},
  {mod_blocking, []},
  {mod_roster, [
    {backend, rdbms},
    {versioning, true},
    {store_current_id, true}
  ]},
  {mod_sic, []},
  {mod_bosh, []},
  {mod_carboncopy, []},
  {mod_mam_meta, [
    {backend, rdbms},
    %% 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},

    %% 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, [
      {archive_groupchats, true}
    ]},

    %%
    %% Message Archive Management (MAM) for multi-user chats (MUC).
    %% Enable XEP-0313 for "muc.@HOST@".
    %%
    {muc, [
      {host, "muclight.@HOST@"}
    ]}

    %% Do not use a <stanza-id/> element (by default stanzaid is used)
    % no_stanzaid_element,
  ]},
  {mod_event_pusher, [
    {backends, [
      {http, [
        {pool_name, auth},
        {path, "/notifications"}
      ]}
    ]}
  ]}
]}.
rslota commented 5 years ago

@jasl ,

I think even previous configuration (default one) should work without any issues as the commands you're trying to use are standard (see mod_commands module). The issue you initially faced is that both /api/contacts/[:jid] and /api/users/[:jid] require JID of user for which you're running the command. The HTTP path /api/contacts doesn't exists - you should call /api/contacts/john@snow.com instead.

EDIT:

I just checked and I can actually confirm - after enabling {"localhost", "/api", mongoose_api_admin, []} HTTP module, and after adding john@snow.com user, I do get HTTP 200 code after calling http://localhost:8088/api/contacts/john@snow.com.

jasl commented 5 years ago

@rslota

I just tried as your suggest, it works! Thank you!

BTW, I mistype a wrong account then I got 500 internal error with

21:45:56.041 [error] Caught error:{badkey,{roster,items}} while executing list_contacts stacktrace=[{maps,get,[{roster,items},#{lserver => <<"local-dev.cybros.im">>,mongoose_acc => true,non_strippable => {set,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},origin_location => {mod_commands,list_contacts,275},origin_pid => <0.1400.0>,origin_stanza => undefined,ref => #Ref<0.3085154091.3834904577.76840>,stanza => undefined,timestamp => {1554,731156,41064},{roster,show_full_roster} => true}],[]},{mongoose_acc,get,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_acc.erl"},{line,185}]},{mod_commands,list_contacts,1,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mod_commands.erl"},{line,281}]},{mongoose_commands,check_and_execute,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,401}]},{mongoose_commands,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,346}]},{mongoose_api_common,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,221}]},{mongoose_api_common,handle_request,5,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,128}]},{cowboy_rest,call,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1571}]}]
21:46:20.648 [error] Caught error:{badkey,{roster,items}} while executing list_contacts stacktrace=[{maps,get,[{roster,items},#{lserver => <<"handsome">>,mongoose_acc => true,non_strippable => {set,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},origin_location => {mod_commands,list_contacts,275},origin_pid => <0.1403.0>,origin_stanza => undefined,ref => #Ref<0.3085154091.3834904577.76864>,stanza => undefined,timestamp => {1554,731180,648026},{roster,show_full_roster} => true}],[]},{mongoose_acc,get,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_acc.erl"},{line,185}]},{mod_commands,list_contacts,1,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mod_commands.erl"},{line,281}]},{mongoose_commands,check_and_execute,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,401}]},{mongoose_commands,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,346}]},{mongoose_api_common,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,221}]},{mongoose_api_common,handle_request,5,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,128}]},{cowboy_rest,call,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1571}]}]

That's should be 404, I think I should open an issue about this