Add plug to generate Matrix error
This commit is contained in:
parent
dac1a429b9
commit
1ec18163c1
6 changed files with 47 additions and 50 deletions
36
lib/matrix_server_web/plug/authenticate.ex
Normal file
36
lib/matrix_server_web/plug/authenticate.ex
Normal file
|
@ -0,0 +1,36 @@
|
|||
defmodule MatrixServerWeb.Plug.Authenticate do
|
||||
import MatrixServerWeb.Plug.Error
|
||||
import Plug.Conn
|
||||
import Phoenix.Controller, only: [json: 2]
|
||||
|
||||
alias MatrixServer.Account
|
||||
alias Plug.Conn
|
||||
|
||||
def init(opts), do: opts
|
||||
|
||||
def call(%Conn{params: %{"access_token" => access_token}} = conn, _opts) do
|
||||
authenticate(conn, access_token)
|
||||
end
|
||||
|
||||
def call(%Conn{req_headers: headers} = conn, _opts) do
|
||||
case List.keyfind(headers, "authorization", 0) do
|
||||
{_, "Bearer " <> access_token} ->
|
||||
authenticate(conn, access_token)
|
||||
|
||||
_ ->
|
||||
put_error(conn, :missing_token)
|
||||
end
|
||||
end
|
||||
|
||||
defp authenticate(conn, access_token) do
|
||||
case Account.get_by_access_token(access_token) do
|
||||
%Account{devices: [device]} = account ->
|
||||
conn
|
||||
|> assign(:account, account)
|
||||
|> assign(:device, device)
|
||||
|
||||
nil ->
|
||||
put_error(conn, :unknown_token)
|
||||
end
|
||||
end
|
||||
end
|
23
lib/matrix_server_web/plug/error.ex
Normal file
23
lib/matrix_server_web/plug/error.ex
Normal file
|
@ -0,0 +1,23 @@
|
|||
defmodule MatrixServerWeb.Plug.Error do
|
||||
import Plug.Conn
|
||||
import Phoenix.Controller, only: [json: 2]
|
||||
|
||||
@error_code_and_message %{
|
||||
bad_json: {400, "M_BAD_JSON", "Bad request."},
|
||||
user_in_use: {400, "M_USE_IN_USE", "Username is already taken."},
|
||||
invalid_username: {400, "M_INVALID_USERNAME", "Invalid username."},
|
||||
forbidden: {400, "M_FORBIDDEN", "The requested action is forbidden."},
|
||||
unknown_token: {401, "M_UNKNOWN_TOKEN", "Invalid access token."},
|
||||
missing_token: {401, "M_MISSING_TOKEN", "Access token required."}
|
||||
}
|
||||
|
||||
def put_error(conn, error) do
|
||||
{status, errcode, errmsg} = @error_code_and_message[error]
|
||||
data = %{errcode: errcode, error: errmsg}
|
||||
|
||||
conn
|
||||
|> put_status(status)
|
||||
|> json(data)
|
||||
|> halt()
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue