Skip to content

Commit c650907

Browse files
committed
test: add generate vapid keys
1 parent 975f133 commit c650907

File tree

4 files changed

+29
-41
lines changed

4 files changed

+29
-41
lines changed

lib/mix/tasks/generate_vapid_keys.ex

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ defmodule Mix.Tasks.Generate.Vapid.Keys do
33
use Mix.Task
44

55
@shortdoc "Generate vapid keys"
6-
def run(_) do
7-
WebPushElixir.output_key_pair(WebPushElixir.gen_key_pair()).()
6+
def run(_args) do
7+
{public_key, private_key} = :crypto.generate_key(:ecdh, :prime256v1)
8+
9+
%{
10+
vapid_public_key: Base.url_encode64(public_key, padding: false),
11+
vapid_private_key: Base.url_encode64(private_key, padding: false),
12+
vapid_subject: "mailto:admin@email.com"
13+
}
814
end
9-
end
15+
end

lib/web_push_elixir.ex

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
defmodule WebPushElixir do
2-
require Logger
3-
42
defp url_encode(string) do
53
Base.url_encode64(string, padding: false)
64
end
@@ -75,7 +73,7 @@ defmodule WebPushElixir do
7573
%{ciphertext: cipher_text <> cipher_tag, salt: salt}
7674
end
7775

78-
defp get_signed_json_web_token(endpoint, vapid_public_key, vapid_private_key) do
76+
defp sign_json_web_token(endpoint, vapid_public_key, vapid_private_key) do
7977
json_web_token =
8078
JOSE.JWT.from_map(%{
8179
aud: URI.parse(endpoint).scheme <> "://" <> URI.parse(endpoint).host,
@@ -86,7 +84,7 @@ defmodule WebPushElixir do
8684
json_web_key =
8785
JOSE.JWK.from_key(
8886
{:ECPrivateKey, 1, vapid_private_key, {:namedCurve, {1, 2, 840, 10045, 3, 1, 7}},
89-
vapid_public_key, nil}
87+
vapid_public_key, nil}
9088
)
9189

9290
{%{alg: :jose_jws_alg_ecdsa}, signed_json_web_token} =
@@ -95,21 +93,6 @@ defmodule WebPushElixir do
9593
signed_json_web_token
9694
end
9795

98-
def gen_key_pair() do
99-
{public_key, private_key} = :crypto.generate_key(:ecdh, :prime256v1)
100-
101-
{url_encode(public_key), url_encode(private_key)}
102-
end
103-
104-
def output_key_pair({public_key, private_key}) do
105-
fn ->
106-
Logger.info(%{:vapid_public_key => public_key})
107-
Logger.info(%{:vapid_private_key => private_key})
108-
109-
Logger.info(%{:vapid_subject => "mailto:admin@email.com"})
110-
end
111-
end
112-
11396
def send_notification(subscription, message) do
11497
vapid_public_key = url_decode(System.get_env("VAPID_PUBLIC_KEY"))
11598
vapid_private_key = url_decode(System.get_env("VAPID_PRIVATE_KEY"))
@@ -120,7 +103,7 @@ defmodule WebPushElixir do
120103
encrypted = encrypt(message, auth, p256dh, vapid_public_key, vapid_private_key)
121104

122105
signed_json_web_token =
123-
get_signed_json_web_token(endpoint, vapid_public_key, vapid_private_key)
106+
sign_json_web_token(endpoint, vapid_public_key, vapid_private_key)
124107

125108
HTTPoison.post(endpoint, encrypted.ciphertext, %{
126109
"Authorization" => "WebPush #{signed_json_web_token}",

test/generate_vapid_keys_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule GenerateVapidKeysTest do
2+
use ExUnit.Case
3+
4+
test "it should generate" do
5+
assert %{
6+
vapid_public_key: <<_public_key::binary>>,
7+
vapid_private_key: <<_private_key::binary>>,
8+
vapid_subject: "mailto:admin@email.com"
9+
} = Mix.Tasks.Generate.Vapid.Keys.run([])
10+
end
11+
end

test/web_push_elixir_test.exs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,20 @@
11
defmodule WebPushElixirTest do
22
use ExUnit.Case
33

4-
import ExUnit.CaptureLog
5-
64
@subscription ~c"{\"endpoint\":\"http://localhost:4040/some-endpoint\",\"keys\":{\"p256dh\":\"BIPUL12DLfytvTajnryr2PRdAgXS3HGKiLqndGcJGabyhHheJYlNGCeXl1dn18gSJ1WAkAPIxr4gK0_dQds4yiI=\",\"auth\":\"FPssNDTKnInHVndSTdbKFw==\"}}"
75

8-
test "it should output key pair" do
9-
assert capture_log(WebPushElixir.output_key_pair(WebPushElixir.gen_key_pair())) =~
10-
"vapid_public_key:"
11-
12-
assert capture_log(WebPushElixir.output_key_pair(WebPushElixir.gen_key_pair())) =~
13-
"vapid_private_key:"
14-
15-
assert capture_log(WebPushElixir.output_key_pair(WebPushElixir.gen_key_pair())) =~
16-
"vapid_subject:"
17-
18-
assert capture_log(WebPushElixir.output_key_pair(WebPushElixir.gen_key_pair())) =~
19-
"mailto:admin@email.com"
20-
end
21-
226
test "it should send notification" do
23-
{vapid_public_key, vapid_private_key} = WebPushElixir.gen_key_pair()
7+
%{
8+
vapid_public_key: vapid_public_key,
9+
vapid_private_key: vapid_private_key,
10+
vapid_subject: vapid_subject
11+
} = Mix.Tasks.Generate.Vapid.Keys.run([])
2412

2513
System.put_env("VAPID_PUBLIC_KEY", vapid_public_key)
2614

2715
System.put_env("VAPID_PRIVATE_KEY", vapid_private_key)
2816

29-
System.put_env("VAPID_SUBJECT", "mailto:admin@email.com")
17+
System.put_env("VAPID_SUBJECT", vapid_subject)
3018

3119
{:ok, response} = WebPushElixir.send_notification(@subscription, "some message")
3220

0 commit comments

Comments
 (0)