Packages
nova
0.4.2
0.15.1
0.14.3
0.14.1
0.13.7
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.11
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.4.4
0.4.3
0.4.2
0.4.1
0.2.2
0.1.0
0.0.1
0.0.0
Nova is a web application framework
Current section
Files
Jump to
Current section
Files
src/nova_security_handler.erl
-module(nova_security_handler).
-behaviour(cowboy_middleware).
-include_lib("nova/include/nova.hrl").
-export([
execute/2
]).
%%--------------------------------------------------------------------
%% @doc
%% If a security module/func is defined in the route of the request that
%% module/func will be called. If the result of that is false it will
%% return a 401 to the requester. Otherwise it will continue to handle
%% the request.
%% @end
%%--------------------------------------------------------------------
-spec execute(Req, Env) -> {ok, Req, Env} | {stop, Req}
when Req :: cowboy_req:req(),
Env :: cowboy_middleware:env().
execute(Req, Env = #{handler_opts := HandlerOpts = #{secure := {Mod, Func}}}) ->
try Mod:Func(Req) of
{ok, AuthData} ->
{ok, Req, Env#{handler_opts => HandlerOpts#{auth_data => AuthData}}};
true ->
{ok, Req, Env};
false ->
{stop, cowboy_req:reply(401, Req)};
{redirect, Route} ->
Req1 = cowboy_req:reply(
302,
#{<<"Location">> => list_to_binary(Route)},
Req),
{stop, Req1};
{cowboy_req, Req1} ->
{ok, Req1, Env}
catch
Class:Reason ->
?ERROR("Security module ~p:~p failed with ~p/~p", [Mod, Func, Class, Reason]),
{stop, cowboy_req:reply(500, Req)}
end;
execute(Req, Env) ->
{ok, Req, Env}.