Packages
nova
0.7.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_plugin.erl
-module(nova_security_plugin).
-behaviour(nova_plugin).
-include_lib("nova/include/nova.hrl").
-export([
pre_ws_upgrade/2,
pre_http_request/2,
post_http_request/2,
plugin_info/0
]).
%%--------------------------------------------------------------------
%% @doc
%% Pre-request callback
%% @end
%%--------------------------------------------------------------------
-spec pre_http_request(State :: nova_http_handler:nova_http_state(), Options :: map()) ->
{ok, State0 :: nova_http_handler:nova_http_state()} |
{stop, State0 :: nova_http_handler:nova_http_state()} |
{error, Reason :: term()}.
pre_http_request(State = #{req := Req, secure := {Module, Function}}, _Options) ->
try Module:Function(Req) of
{true, AuthData} ->
{ok, State#{controller_data =>
#{auth_data => AuthData}}};
true ->
{ok, State};
false ->
{ok, State2} = nova_http_handler:render_page(401, State),
{stop, State2};
{false, Headers} ->
{ok, #{req := Req0} = State2} = nova_http_handler:render_page(401, State),
Headers0 = cowboy_req:resp_headers(Req0),
Req1 = cowboy_req:set_resp_headers(maps:merge(Headers0, Headers), Req0),
{stop, State2#{req => Req1}};
{redirect, Route} ->
Req0 = cowboy_req:set_resp_headers(#{<<"Location">> => list_to_binary(Route)}, Req),
{stop, State#{resp_status := 302, req := Req0}}
catch
Class:Reason ->
?ERROR("pre_http_request: ~p:~p failed with ~p/~p", [Module, Function, Class, Reason]),
{error, Reason}
end;
pre_http_request(State, _Options) ->
{ok, State}.
%%--------------------------------------------------------------------
%% @doc
%% Will be called on if a websocket route is defined as secure in the same
%% way a http route is. This will check in the upgrade flow if the client
%% is allowed to continue.
%% @end
%%--------------------------------------------------------------------
-spec pre_ws_upgrade(State :: nova_http_handler:nova_http_state(), Options :: map()) ->
{ok, State0 :: nova_http_handler:nova_http_state()} |
{stop, State0 :: nova_http_handler:nova_http_state()} |
{error, Reason :: term()}.
pre_ws_upgrade(State = #{req := Req, secure := {Module, Function}}, _Options) ->
try Module:Function(Req) of
{true, AuthData} ->
{ok, State#{controller_data =>
#{auth_data => AuthData}}};
true ->
{ok, State};
false ->
Req0 = cowboy_req:reply(401, Req),
{stop, State#{req => Req0}};
{false, Headers} ->
Headers0 = cowboy_req:resp_headers(Req),
Req0 = cowboy_req:set_resp_headers(maps:merge(Headers0, Headers), Req),
Req1 = cowboy_req:reply(401, Headers, Req0),
{stop, State#{req => Req1}}
catch
Class:Reason ->
?ERROR("pre_ws_upgrade: ~p:~p failed with ~p/~p", [Module, Function, Class, Reason]),
{error, Reason}
end;
pre_ws_upgrade(State, _Options) ->
{ok, State}.
%%--------------------------------------------------------------------
%% @doc
%% Post-request callback
%% @end
%%--------------------------------------------------------------------
-spec post_http_request(State :: nova_http_handler:nova_http_state(), Options :: map()) ->
{ok, State0 :: nova_http_handler:nova_http_state()} |
{stop, State0 :: nova_http_handler:nova_http_state()} |
{error, Reason :: term()}.
post_http_request(State, _Options) ->
{ok, State}.
%%--------------------------------------------------------------------
%% @doc
%% nova_plugin callback. Returns information about the plugin.
%% @end
%%--------------------------------------------------------------------
-spec plugin_info() -> {Title :: binary(),
Version :: binary(),
Author :: binary(),
Description :: binary(),
Options :: [{Key :: atom(), OptionDescription :: binary()}]}.
plugin_info() ->
{<<"Nova Security Plugin">>,
<<"0.0.1">>,
<<"Nova Team <info@novaframework.org">>,
<<"Plugin that handles the security around paths.">>,
[]}.