mirror of
https://github.com/processone/ejabberd.git
synced 2024-12-20 17:27:00 +01:00
3dc55c6d47
- add API versionning - changed error handling, based on exception - commands moved/merged from mod_admin_p1 to mod_admin_extra - command bufixes - add some elixir unit test cases Squashed commit of the following: commit dd59855b3486f78a9349756e4f102e79b3accff8 Merge: 14e8ffc 506e08e Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Oct 30 11:43:18 2015 +0100 Merge branch '3.2.x' into api commit 14e8ffce78cbea6c8605371d1fc50a0c1d1e012c Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Oct 27 16:35:17 2015 +0100 Added OAuth tests to ejabberd_commands commit f81c550c14628edfe4861c228576cb767924366a Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Oct 27 16:34:55 2015 +0100 Added some mod_http_api tests commit 6a64578d5b2ba532a2feb6503ed98561e56d5d53 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Mon Oct 26 15:29:36 2015 +0100 Fix get_last command test Previous version won't work with dst. commit 27e0cde9e9c1f001effe68f8424a365ad947c068 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Oct 23 17:59:34 2015 +0200 Add tests on admin command policy commit 19dad8d54f54c9fabd454280483cccfb06c8e78a Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Oct 23 16:49:36 2015 +0200 Added command related tests (http api & user policy) commit e0e596ab4a3f3a70aba5f374f028939ab794de33 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Oct 23 16:49:16 2015 +0200 Fix command call. commit 128cd7d1ede3c47a34f8ec3a750c980ccad2c61d Merge: 60c4c4c 447313c Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Thu Oct 22 14:48:39 2015 +0200 Merge branch '3.2.x' into api commit 60c4c4c0751302524c14219c6bc8c56a6069a689 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Thu Oct 22 14:45:57 2015 +0200 Fix ejabberd_commands spec. commit 8e145c28c5da762c2b93ee32327eff1db94ebfed Merge: 397273a f13dc94 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Wed Oct 21 18:26:07 2015 +0200 Merge branch '3.2.x' into api commit 397273a23ed415feac87aed33da6452229793387 Merge: c30e89b f289e27 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Wed Oct 21 15:27:45 2015 +0200 Merge branch '3.2.x' into api commit c30e89bb8a0013bff37e61e4c6953350c9c1f313 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Wed Oct 21 12:47:02 2015 +0200 Merge mod_http_api commit 7b0db22b4acd48ff6fabce41c1b2525e6580a3c5 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Oct 16 11:55:48 2015 +0200 Fix exunit tests to run with common_test suites commit d8b1a89800ac7379a57a7eb4a09c3c93c3e1e5eb Merge: 2879ae8 63455b3 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Thu Oct 15 11:39:45 2015 +0200 Merge branch '3.2.x' into api commit 2879ae87ff3eee369ef3d780136b96ecff5285d1 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Wed Oct 14 14:53:44 2015 +0200 Fix update_roster command. commit a1d453dd7a3afda9861a8d747494a45057ad574b Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Oct 13 16:14:28 2015 +0200 API commands refactor Moving and/or merging commands from mod_admin_p1 to mod_admin_extra commit b709ed26b0fc0ca4f3bdd5a59fa58ec7e3db97fa Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Wed Oct 7 15:10:01 2015 +0200 Add tests on commands commit 6711687bee9c672cb3d5aed0744e13420ecf6dbd Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Sep 29 15:58:16 2015 +0200 Add ejabberd_commands tests commit df8682f419cf3877e77e36a19bca0fc55dc991f8 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Mon Sep 28 14:54:39 2015 +0200 Added API versioning for ejabberdctl and rest commands commit cd017b0e3aac431bc3ee807ceb7f8641e1523ef5 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Fri Sep 18 11:21:45 2015 +0200 Better error handling of HTTP API commands. commit ca5cb6acd8e4643f9d6c484d2277b0d7e88471e5 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Sep 15 15:03:05 2015 +0200 add commands to mod_admin_extra: - get_offline_count - get_presence - change_password commit 7f583fa099e30ac2b0915669fd8f102ac565b833 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Tue Sep 15 15:02:16 2015 +0200 Improve REST API error handling commit 14753b1c02cdce434a786b7f80f6c09f0d210075 Author: Jerome Sautret <jerome.sautret@process-one.net> Date: Mon Sep 14 10:51:17 2015 +0200 Change REST API return codes for integer type.
189 lines
5.4 KiB
Elixir
189 lines
5.4 KiB
Elixir
# ----------------------------------------------------------------------
|
|
#
|
|
# ejabberd, Copyright (C) 2002-2015 ProcessOne
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation; either version 2 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
# ----------------------------------------------------------------------
|
|
|
|
defmodule ModHttpApiTest do
|
|
use ExUnit.Case, async: false
|
|
|
|
@author "jsautret@process-one.net"
|
|
|
|
# Admin user
|
|
@admin "admin"
|
|
@adminpass "adminpass"
|
|
# Non admin user
|
|
@user "user"
|
|
@userpass "userpass"
|
|
# XMPP domain
|
|
@domain "domain"
|
|
# mocked command
|
|
@command "command_test"
|
|
@acommand String.to_atom(@command)
|
|
# default API version
|
|
@version 0
|
|
|
|
require Record
|
|
Record.defrecord :request, Record.extract(:request,
|
|
from: "ejabberd_http.hrl")
|
|
|
|
setup_all do
|
|
try do
|
|
:stringprep.start
|
|
rescue
|
|
_ -> :ok
|
|
end
|
|
:mod_http_api.start(@domain, [])
|
|
EjabberdOauthMock.init
|
|
:ok
|
|
end
|
|
|
|
setup do
|
|
:meck.unload
|
|
:meck.new :ejabberd_commands
|
|
EjabberdAuthMock.init
|
|
:ok
|
|
end
|
|
|
|
test "HTTP GET simple command call with Basic Auth" do
|
|
EjabberdAuthMock.create_user @user, @domain, @userpass
|
|
|
|
# Mock a simple command() -> :ok
|
|
:meck.expect(:ejabberd_commands, :get_command_format,
|
|
fn (@acommand, {@user, @domain, @userpass, false}, @version) ->
|
|
{[], {:res, :rescode}}
|
|
end)
|
|
:meck.expect(:ejabberd_commands, :execute_command,
|
|
fn (:undefined, {@user, @domain, @userpass, false}, @acommand, [], @version) ->
|
|
:ok
|
|
end)
|
|
|
|
#:ejabberd_logger.start
|
|
#:ejabberd_logger.set 5
|
|
|
|
# Correct Basic Auth call
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# Basic auth
|
|
auth: {@user<>"@"<>@domain, @userpass},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 200 == elem(result, 0) # HTTP code
|
|
assert "0" == elem(result, 2) # command result
|
|
|
|
# Bad password
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# Basic auth
|
|
auth: {@user<>"@"<>@domain, @userpass<>"bad"},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 401 == elem(result, 0) # HTTP code
|
|
|
|
# Check that the command was executed only once
|
|
assert 1 ==
|
|
:meck.num_calls(:ejabberd_commands, :execute_command, :_)
|
|
|
|
assert :meck.validate :ejabberd_auth
|
|
assert :meck.validate :ejabberd_commands
|
|
#assert :ok = :meck.history(:ejabberd_commands)
|
|
end
|
|
|
|
|
|
test "HTTP GET simple command call with OAuth" do
|
|
EjabberdAuthMock.create_user @user, @domain, @userpass
|
|
|
|
# Mock a simple command() -> :ok
|
|
:meck.expect(:ejabberd_commands, :get_command_format,
|
|
fn (@acommand, {@user, @domain, {:oauth, _token}, false}, @version) ->
|
|
{[], {:res, :rescode}}
|
|
end)
|
|
:meck.expect(:ejabberd_commands, :execute_command,
|
|
fn (:undefined, {@user, @domain, {:oauth, _token}, false},
|
|
@acommand, [], @version) ->
|
|
:ok
|
|
end)
|
|
|
|
#:ejabberd_logger.start
|
|
#:ejabberd_logger.set 5
|
|
|
|
# Correct OAuth call
|
|
token = EjabberdOauthMock.get_token @user, @domain, @command
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# OAuth
|
|
auth: {:oauth, token, []},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 200 == elem(result, 0) # HTTP code
|
|
assert "0" == elem(result, 2) # command result
|
|
|
|
# Wrong OAuth token
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# OAuth
|
|
auth: {:oauth, "bad"<>token, []},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 401 == elem(result, 0) # HTTP code
|
|
|
|
# Expired OAuth token
|
|
token = EjabberdOauthMock.get_token @user, @domain, @command, 1
|
|
:timer.sleep 1500
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# OAuth
|
|
auth: {:oauth, token, []},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 401 == elem(result, 0) # HTTP code
|
|
|
|
# Wrong OAuth scope
|
|
token = EjabberdOauthMock.get_token @user, @domain, "bad_command"
|
|
:timer.sleep 1500
|
|
req = request(method: :GET,
|
|
path: ["api", @command],
|
|
q: [nokey: ""],
|
|
# OAuth
|
|
auth: {:oauth, token, []},
|
|
ip: {{127,0,0,1},60000},
|
|
host: @domain)
|
|
result = :mod_http_api.process([@command], req)
|
|
assert 401 == elem(result, 0) # HTTP code
|
|
|
|
# Check that the command was executed only once
|
|
assert 1 ==
|
|
:meck.num_calls(:ejabberd_commands, :execute_command, :_)
|
|
|
|
assert :meck.validate :ejabberd_auth
|
|
assert :meck.validate :ejabberd_commands
|
|
#assert :ok = :meck.history(:ejabberd_commands)
|
|
end
|
|
|
|
|
|
end
|