Skip to content

Commit 522a6c9

Browse files
committed
Add typespecs
Signed-off-by: Annopaolo <arnaldo.cesco@gmail.com>
1 parent 98dc50b commit 522a6c9

9 files changed

Lines changed: 88 additions & 19 deletions

File tree

lib/cfxxl.ex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ defmodule CFXXL do
3636
@scan_opts [:ip, :timeout, :family, :scanner]
3737
@sign_opts [:hosts, :subject, :serial_sequence, :label, :profile, :bundle]
3838

39+
@spec authsign(CFXXL.Client.t(), String.t(), String.t(), keyword) :: {:ok, any} | {:error, any}
3940
@doc """
4041
Request to sign a CSR with authentication.
4142
@@ -65,6 +66,7 @@ defmodule CFXXL do
6566
post(client, "authsign", body)
6667
end
6768

69+
@spec bundle(CFXXL.Client.t(), keyword) :: {:ok, any} | {:error, any}
6870
@doc """
6971
Request a certificate bundle
7072
@@ -127,6 +129,7 @@ defmodule CFXXL do
127129

128130
def bundle(_client, _opts), do: {:error, :no_certificate_or_domain}
129131

132+
@spec certinfo(CFXXL.Client.t(), keyword) :: {:ok, any} | {:error, any}
130133
@doc """
131134
Request information about a certificate
132135
@@ -161,6 +164,7 @@ defmodule CFXXL do
161164

162165
def certinfo(_client, _opts), do: {:error, :no_certificate_or_domain}
163166

167+
@spec crl(CFXXL.Client.t(), any) :: {:ok, any} | {:error, any}
164168
@doc """
165169
Generate a CRL from the database
166170
@@ -181,6 +185,7 @@ defmodule CFXXL do
181185
end
182186
end
183187

188+
@spec get(CFXXL.Client.t(), String.t(), map()) :: {:ok, any} | {:error, any}
184189
@doc """
185190
Perform a generic GET to the CFSSL API.
186191
@@ -199,6 +204,7 @@ defmodule CFXXL do
199204
|> process_response()
200205
end
201206

207+
@spec info(CFXXL.Client.t(), String.t(), keyword) :: {:ok, any} | {:error, any}
202208
@doc """
203209
Get signer information
204210
@@ -225,6 +231,8 @@ defmodule CFXXL do
225231
post(client, "info", body)
226232
end
227233

234+
@spec init_ca(CFXXL.Client.t(), list(String.t()), CFXXL.DName.t(), keyword) ::
235+
{:ok, any} | {:error, any}
228236
@doc """
229237
Request a new CA key/certificate pair.
230238
@@ -253,6 +261,8 @@ defmodule CFXXL do
253261
post(client, "init_ca", body)
254262
end
255263

264+
@spec newcert(CFXXL.Client.t(), list(String.t()), CFXXL.DName.t(), keyword) ::
265+
{:ok, any} | {:error, any}
256266
@doc """
257267
Request a new key/signed certificate pair.
258268
@@ -285,6 +295,8 @@ defmodule CFXXL do
285295
post(client, "newcert", body)
286296
end
287297

298+
@spec newkey(CFXXL.Client.t(), list(String.t()), CFXXL.DName.t(), keyword) ::
299+
{:ok, any} | {:error, any}
288300
@doc """
289301
Request a new key/CSR pair.
290302
@@ -309,6 +321,7 @@ defmodule CFXXL do
309321
post(client, "newkey", body)
310322
end
311323

324+
@spec post(CFXXL.Client.t(), String.t(), map()) :: {:ok, any} | {:error, any}
312325
@doc """
313326
Perform a generic POST to the CFSSL API.
314327
@@ -328,6 +341,7 @@ defmodule CFXXL do
328341
|> process_response()
329342
end
330343

344+
@spec revoke(CFXXL.Client.t(), any, binary, String.t()) :: :ok | {:error, any}
331345
@doc """
332346
Request to revoke a certificate.
333347
@@ -351,6 +365,7 @@ defmodule CFXXL do
351365
end
352366
end
353367

368+
@spec scan(CFXXL.Client.t(), any, keyword) :: {:ok, any} | {:error, any}
354369
@doc """
355370
Scan an host
356371
@@ -378,6 +393,7 @@ defmodule CFXXL do
378393
get(client, "scan", params)
379394
end
380395

396+
@spec scaninfo(CFXXL.Client.t()) :: {:ok, any} | {:error, any}
381397
@doc """
382398
Get information on scan families
383399
@@ -392,6 +408,7 @@ defmodule CFXXL do
392408
get(client, "scaninfo")
393409
end
394410

411+
@spec sign(CFXXL.Client.t(), String.t(), keyword) :: {:ok, any} | {:error, any}
395412
@doc """
396413
Request to sign a CSR.
397414
@@ -426,6 +443,7 @@ defmodule CFXXL do
426443
defp process_response({:error, _} = response), do: response
427444
defp process_response({:ok, %HTTPoison.Response{body: body}}), do: extract_result(body)
428445

446+
@spec extract_result(iodata) :: {:error, any} | {:ok, any}
429447
defp extract_result(""), do: {:error, :empty_response}
430448

431449
defp extract_result(body) do
@@ -436,6 +454,7 @@ defmodule CFXXL do
436454
end
437455
end
438456

457+
@spec extract_error_message(map) :: any
439458
defp extract_error_message(%{"errors" => errors}) do
440459
case errors do
441460
[%{"message" => msg} | _] -> msg

lib/cfxxl/ca_config.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ defmodule CFXXL.CAConfig do
3232
"""
3333
defstruct [:pathlength, :pathlenzero, :expiry]
3434

35+
@type t() :: %__MODULE__{
36+
pathlength: non_neg_integer(),
37+
pathlenzero: boolean(),
38+
expiry: String.t()
39+
}
40+
3541
defimpl Jason.Encoder, for: CFXXL.CAConfig do
3642
def encode(ca_config, options) do
3743
# Encode only non-nil values

lib/cfxxl/cert_utils.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ defmodule CFXXL.CertUtils do
6363
Record.extract(:Validity, from_lib: "public_key/include/public_key.hrl")
6464
)
6565

66+
@spec serial_number!(String.t()) :: String.t()
6667
@doc """
6768
Extracts the serial number of a certificate.
6869
@@ -77,6 +78,7 @@ defmodule CFXXL.CertUtils do
7778
|> to_string()
7879
end
7980

81+
@spec authority_key_identifier!(String.t()) :: String.t()
8082
@doc """
8183
Extracts the authority key identifier of a certificate.
8284
@@ -103,6 +105,7 @@ defmodule CFXXL.CertUtils do
103105
end
104106
end
105107

108+
@spec common_name!(String.t()) :: String.t() | nil
106109
@doc """
107110
Extracts the Common Name of a certificate.
108111
@@ -134,6 +137,7 @@ defmodule CFXXL.CertUtils do
134137
end
135138
end
136139

140+
@spec not_after!(String.t()) :: DateTime.t()
137141
@doc """
138142
Extracts the not_after field (expiration) of a certificate.
139143
@@ -149,6 +153,7 @@ defmodule CFXXL.CertUtils do
149153
|> cert_time_tuple_to_datetime()
150154
end
151155

156+
@spec not_before!(String.t()) :: DateTime.t()
152157
@doc """
153158
Extracts the not_before field of a certificate.
154159
@@ -201,7 +206,8 @@ defmodule CFXXL.CertUtils do
201206
parsed
202207
end
203208

204-
defp tbs(cert) do
209+
@spec tbs(binary) :: any
210+
def tbs(cert) do
205211
cert
206212
|> :public_key.pem_decode()
207213
|> hd()

lib/cfxxl/client.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ defmodule CFXXL.Client do
3030
"""
3131
defstruct endpoint: "http://localhost:8888/#{@api_prefix}", options: []
3232

33+
@type t() :: %__MODULE__{
34+
endpoint: String.t(),
35+
options: HTTPoison.Request.options()
36+
}
37+
38+
@spec new :: CFXXL.Client.t()
3339
@doc """
3440
Returns a default client
3541
@@ -42,6 +48,7 @@ defmodule CFXXL.Client do
4248
"""
4349
def new(), do: %__MODULE__{}
4450

51+
@spec new(String.t(), HTTPoison.Request.options()) :: CFXXL.Client.t()
4552
@doc """
4653
Creates a client with the given parameters.
4754

lib/cfxxl/dname.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ defmodule CFXXL.DName do
3333
"""
3434
defstruct [:C, :L, :O, :OU, :ST]
3535

36+
@type t() :: %__MODULE__{
37+
C: String.t(),
38+
L: String.t(),
39+
O: String.t(),
40+
OU: String.t(),
41+
ST: String.t()
42+
}
43+
3644
defimpl Jason.Encoder, for: CFXXL.DName do
3745
def encode(dname, options) do
3846
# Encode only non-nil values

lib/cfxxl/key_config.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ defmodule CFXXL.KeyConfig do
4343
* 521
4444
"""
4545
defstruct algo: :ecdsa, size: 256
46+
47+
@type t() :: %__MODULE__{
48+
algo: :ecdsa | :rsa,
49+
size: pos_integer()
50+
}
4651
end

lib/cfxxl/subject.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ defmodule CFXXL.Subject do
3131
"""
3232
defstruct [:CN, :dname]
3333

34+
@type t() :: %__MODULE__{
35+
CN: String.t(),
36+
dname: CFXXL.DName.t()
37+
}
38+
3439
defimpl Jason.Encoder, for: CFXXL.Subject do
3540
def encode(subject, options) do
3641
# Encode only non-nil values and substitute dname

mix.exs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ defmodule CFXXL.Mixfile do
2424
"coveralls.detail": :test,
2525
"coveralls.post": :test,
2626
"coveralls.html": :test
27-
]
27+
],
28+
29+
# Dyalizer cache
30+
dialyzer_cache_directory: dialyzer_cache_directory(Mix.env())
2831
]
2932
end
3033

@@ -36,6 +39,14 @@ defmodule CFXXL.Mixfile do
3639
[extra_applications: [:logger]]
3740
end
3841

42+
defp dialyzer_cache_directory(:ci) do
43+
"dialyzer_cache"
44+
end
45+
46+
defp dialyzer_cache_directory(_) do
47+
nil
48+
end
49+
3950
# Dependencies can be Hex packages:
4051
#
4152
# {:my_dep, "~> 0.3.0"}
@@ -50,7 +61,8 @@ defmodule CFXXL.Mixfile do
5061
{:httpoison, "~> 1.6"},
5162
{:jason, "~> 1.2"},
5263
{:ex_doc, ">= 0.0.0", only: :dev, runtime: false},
53-
{:excoveralls, "~> 0.12", only: :test}
64+
{:excoveralls, "~> 0.12", only: :test},
65+
{:dialyzex, github: "Comcast/dialyzex", only: [:dev, :ci]}
5466
]
5567
end
5668

mix.lock

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
%{
2-
"certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"},
3-
"earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm"},
4-
"ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
5-
"excoveralls": {:hex, :excoveralls, "0.12.3", "2142be7cb978a3ae78385487edda6d1aff0e482ffc6123877bb7270a8ffbcfe0", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
6-
"hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
7-
"httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
8-
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
9-
"jason": {:hex, :jason, "1.2.0", "10043418c42d2493d0ee212d3fddd25d7ffe484380afad769a0a38795938e448", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
10-
"makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
11-
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
12-
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
13-
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"},
14-
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"},
15-
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"},
16-
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"},
17-
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
2+
"certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "805abd97539caf89ec6d4732c91e62ba9da0cda51ac462380bbd28ee697a8c42"},
3+
"dialyzex": {:git, "https://github.com/Comcast/dialyzex.git", "cdc7cf71fe6df0ce4cf59e3f497579697a05c989", []},
4+
"earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"},
5+
"ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "0db1ee8d1547ab4877c5b5dffc6604ef9454e189928d5ba8967d4a58a801f161"},
6+
"excoveralls": {:hex, :excoveralls, "0.12.3", "2142be7cb978a3ae78385487edda6d1aff0e482ffc6123877bb7270a8ffbcfe0", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "568a3e616c264283f5dea5b020783ae40eef3f7ee2163f7a67cbd7b35bcadada"},
7+
"hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "e0100f8ef7d1124222c11ad362c857d3df7cb5f4204054f9f0f4a728666591fc"},
8+
"httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "aa2c74bd271af34239a3948779612f87df2422c2fdcfdbcec28d9c105f0773fe"},
9+
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"},
10+
"jason": {:hex, :jason, "1.2.0", "10043418c42d2493d0ee212d3fddd25d7ffe484380afad769a0a38795938e448", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "116747dbe057794c3a3e4e143b7c8390b29f634e16c78a7f59ba75bfa6852e7f"},
11+
"makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49736fe5b66a08d8575bf5321d716bac5da20c8e6b97714fec2bcd6febcfa1f8"},
12+
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
13+
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
14+
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
15+
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"},
16+
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
17+
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"},
18+
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
1819
}

0 commit comments

Comments
 (0)