summaryrefslogtreecommitdiff
path: root/src/jwtf/src/jwtf_keystore.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/jwtf/src/jwtf_keystore.erl')
-rw-r--r--src/jwtf/src/jwtf_keystore.erl152
1 files changed, 0 insertions, 152 deletions
diff --git a/src/jwtf/src/jwtf_keystore.erl b/src/jwtf/src/jwtf_keystore.erl
deleted file mode 100644
index 4c2933264..000000000
--- a/src/jwtf/src/jwtf_keystore.erl
+++ /dev/null
@@ -1,152 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(jwtf_keystore).
--behaviour(gen_server).
--behaviour(config_listener).
-
--include_lib("public_key/include/public_key.hrl").
-
-% public api.
--export([
- get/2,
- start_link/0
-]).
-
-% gen_server api.
--export([
- init/1,
- handle_call/3,
- handle_cast/2,
- handle_info/2,
- code_change/3,
- terminate/2
-]).
-
-% config_listener api
--export([handle_config_change/5, handle_config_terminate/3]).
-
-% public functions
-
-get(Alg, undefined) when is_binary(Alg) ->
- get(Alg, <<"_default">>);
-get(Alg, KID0) when is_binary(Alg), is_binary(KID0) ->
- Kty = kty(Alg),
- KID = binary_to_list(KID0),
- case ets:lookup(?MODULE, {Kty, KID}) of
- [] ->
- Key = get_from_config(Kty, KID),
- ok = gen_server:call(?MODULE, {set, Kty, KID, Key}),
- Key;
- [{{Kty, KID}, Key}] ->
- Key
- end.
-
-start_link() ->
- gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
-
-% gen_server functions
-
-init(_) ->
- ok = config:listen_for_changes(?MODULE, nil),
- ets:new(?MODULE, [public, named_table]),
- {ok, nil}.
-
-handle_call({set, Kty, KID, Key}, _From, State) ->
- true = ets:insert(?MODULE, {{Kty, KID}, Key}),
- {reply, ok, State}.
-
-handle_cast({delete, Kty, KID}, State) ->
- true = ets:delete(?MODULE, {Kty, KID}),
- {noreply, State};
-handle_cast(_Msg, State) ->
- {noreply, State}.
-
-handle_info(restart_config_listener, State) ->
- ok = config:listen_for_changes(?MODULE, nil),
- {noreply, State};
-handle_info(_Msg, State) ->
- {noreply, State}.
-
-terminate(_Reason, _State) ->
- ok.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-% config listener callback
-
-handle_config_change("jwt_keys", ConfigKey, _ConfigValue, _, _) ->
- case string:split(ConfigKey, ":") of
- [Kty, KID] ->
- gen_server:cast(?MODULE, {delete, Kty, KID});
- _ ->
- ignored
- end,
- {ok, nil};
-handle_config_change(_, _, _, _, _) ->
- {ok, nil}.
-
-handle_config_terminate(_Server, stop, _State) ->
- ok;
-handle_config_terminate(_Server, _Reason, _State) ->
- erlang:send_after(100, whereis(?MODULE), restart_config_listener).
-
-% private functions
-
-get_from_config(Kty, KID) ->
- case config:get("jwt_keys", string:join([Kty, KID], ":")) of
- undefined ->
- throw({bad_request, <<"Unknown kid">>});
- Encoded ->
- case Kty of
- "hmac" ->
- try
- base64:decode(Encoded)
- catch
- error:_ ->
- throw({bad_request, <<"Not a valid key">>})
- end;
- "rsa" ->
- case pem_decode(Encoded) of
- #'RSAPublicKey'{} = Key ->
- Key;
- _ ->
- throw({bad_request, <<"not an RSA public key">>})
- end;
- "ec" ->
- case pem_decode(Encoded) of
- {#'ECPoint'{}, _} = Key ->
- Key;
- _ ->
- throw({bad_request, <<"not an EC public key">>})
- end
- end
- end.
-
-pem_decode(PEM) ->
- BinPEM = iolist_to_binary(string:replace(PEM, "\\n", "\n", all)),
- case public_key:pem_decode(BinPEM) of
- [PEMEntry] ->
- public_key:pem_entry_decode(PEMEntry);
- [] ->
- throw({bad_request, <<"Not a valid key">>})
- end.
-
-kty(<<"HS", _/binary>>) ->
- "hmac";
-kty(<<"RS", _/binary>>) ->
- "rsa";
-kty(<<"ES", _/binary>>) ->
- "ec";
-kty(_) ->
- throw({bad_request, <<"Unknown kty">>}).