Skip to content

Commit

Permalink
remove cowlib as dependency, fix #45
Browse files Browse the repository at this point in the history
  • Loading branch information
Bas Wegh committed Jan 19, 2017
1 parent 414c6ba commit c3f4f60
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 8 deletions.
2 changes: 0 additions & 2 deletions rebar.lock
@@ -1,12 +1,10 @@
{"1.1.0",
[{<<"base64url">>,{pkg,<<"base64url">>,<<"0.0.1">>},1},
{<<"cowlib">>,{pkg,<<"cowlib">>,<<"1.0.2">>},0},
{<<"erljwt">>,{pkg,<<"erljwt">>,<<"0.3.1">>},0},
{<<"jsone">>,{pkg,<<"jsone">>,<<"1.4.0">>},1}]}.
[
{pkg_hash,[
{<<"base64url">>, <<"36A90125F5948E3AFD7BE97662A1504B934DD5DAC78451CA6E9ABF85A10286BE">>},
{<<"cowlib">>, <<"9D769A1D062C9C3AC753096F868CA121E2730B9A377DE23DEC0F7E08B1DF84EE">>},
{<<"erljwt">>, <<"8E69AA39CDC99FA0D6909046FCD79BFA5A27292A1A2CA3CA832296157BFB538D">>},
{<<"jsone">>, <<"6ECFD2C91E16F48E1535743B57D01A42C65D7DD51A8B43E5723B1F79927169A8">>}]}
].
3 changes: 2 additions & 1 deletion src/oidcc.app.src
Expand Up @@ -14,9 +14,10 @@
kernel,
stdlib,
ssl,
public_key,
crypto,
erljwt,
base64url,
cowlib,
inets
]},
{maintainers, ["Bas Wegh"]},
Expand Down
10 changes: 5 additions & 5 deletions src/oidcc.erl
Expand Up @@ -315,7 +315,7 @@ introspect_token(Token, #{introspection_endpoint := Endpoint,
{"accept", "application/json"},
basic_auth(ClientId, ClientSecret)
],
BodyQs = cow_qs:qs([{<<"token">>, AccessToken}]),
BodyQs = oidcc_http_util:qs([{<<"token">>, AccessToken}]),
HttpResult = oidcc_http_util:sync_http(post, Endpoint, Header,
"application/x-www-form-urlencoded",
BodyQs),
Expand Down Expand Up @@ -343,7 +343,7 @@ retrieve_a_token(QsBodyIn, Pkce, OpenIdProviderInfo) ->
{QsBody, Header} = add_authentication_code_verifier(QsBodyIn, Header0,
AuthMethod, ClientId,
Secret, Pkce),
Body = cow_qs:qs(QsBody),
Body = oidcc_http_util:qs(QsBody),
return_token(oidcc_http_util:sync_http(post, Endpoint, Header,
"application/x-www-form-urlencoded",
Body)).
Expand Down Expand Up @@ -384,7 +384,7 @@ create_redirect_url_if_ready(Info, Scopes, OidcState, OidcNonce, Pkce) ->
UrlList2 = append_nonce(OidcNonce, UrlList1),
UrlList3 = append_code_challenge(Pkce, UrlList2),
UrlList4 = append_scope(Scopes, UrlList3),
Qs = cow_qs:qs(UrlList4),
Qs = oidcc_http_util:qs(UrlList4),
Url = << AuthEndpoint/binary, <<"?">>/binary, Qs/binary>>,
{ok, Url}.

Expand Down Expand Up @@ -475,8 +475,8 @@ return_json_info({ok, Map}) ->


basic_auth(User, Secret) ->
UserEnc = cow_qs:urlencode(User),
SecretEnc = cow_qs:urlencode(Secret),
UserEnc = oidcc_http_util:urlencode(User),
SecretEnc = oidcc_http_util:urlencode(Secret),
RawAuth = <<UserEnc/binary, <<":">>/binary, SecretEnc/binary>>,
AuthData = base64:encode(RawAuth),
BasicAuth = << <<"Basic ">>/binary, AuthData/binary >>,
Expand Down
117 changes: 117 additions & 0 deletions src/oidcc_http_util.erl
Expand Up @@ -3,7 +3,9 @@
-export([async_http/3, async_http/5]).
-export([sync_http/3, sync_http/5]).
-export([uncompress_body_if_needed/2]).
-export([qs/1, urlencode/1]).

-type qs_vals() :: [{binary(), binary() | true}].

sync_http(Method, Url, Header) ->
perform_request(Method, Url, Header, undefined, undefined,
Expand Down Expand Up @@ -126,3 +128,118 @@ normalize_headers(L) when is_list(L) ->

normalize_header(K, V) ->
{normalize(K), normalize(V)}.


%%% copied from cowlib, so there is no dependecy anymore
%% @doc Build an application/x-www-form-urlencoded string.

-spec qs(qs_vals()) -> binary().
qs([]) ->
<<>>;
qs(L) ->
qs(L, <<>>).

qs([], Acc) ->
<< $&, Qs/bits >> = Acc,
Qs;
qs([{Name, true}|Tail], Acc) ->
Acc2 = urlencode(Name, << Acc/bits, $& >>),
qs(Tail, Acc2);
qs([{Name, Value}|Tail], Acc) ->
Acc2 = urlencode(Name, << Acc/bits, $& >>),
Acc3 = urlencode(Value, << Acc2/bits, $= >>),
qs(Tail, Acc3).

-spec urlencode(B) -> B when B::binary().
urlencode(B) ->
urlencode(B, <<>>).

urlencode(<< $\s, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $+ >>);
urlencode(<< $-, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $- >>);
urlencode(<< $., Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $. >>);
urlencode(<< $0, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $0 >>);
urlencode(<< $1, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $1 >>);
urlencode(<< $2, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $2 >>);
urlencode(<< $3, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $3 >>);
urlencode(<< $4, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $4 >>);
urlencode(<< $5, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $5 >>);
urlencode(<< $6, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $6 >>);
urlencode(<< $7, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $7 >>);
urlencode(<< $8, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $8 >>);
urlencode(<< $9, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $9 >>);
urlencode(<< $A, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $A >>);
urlencode(<< $B, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $B >>);
urlencode(<< $C, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $C >>);
urlencode(<< $D, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $D >>);
urlencode(<< $E, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $E >>);
urlencode(<< $F, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $F >>);
urlencode(<< $G, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $G >>);
urlencode(<< $H, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $H >>);
urlencode(<< $I, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $I >>);
urlencode(<< $J, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $J >>);
urlencode(<< $K, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $K >>);
urlencode(<< $L, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $L >>);
urlencode(<< $M, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $M >>);
urlencode(<< $N, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $N >>);
urlencode(<< $O, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $O >>);
urlencode(<< $P, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $P >>);
urlencode(<< $Q, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $Q >>);
urlencode(<< $R, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $R >>);
urlencode(<< $S, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $S >>);
urlencode(<< $T, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $T >>);
urlencode(<< $U, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $U >>);
urlencode(<< $V, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $V >>);
urlencode(<< $W, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $W >>);
urlencode(<< $X, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $X >>);
urlencode(<< $Y, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $Y >>);
urlencode(<< $Z, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $Z >>);
urlencode(<< $_, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $_ >>);
urlencode(<< $a, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $a >>);
urlencode(<< $b, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $b >>);
urlencode(<< $c, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $c >>);
urlencode(<< $d, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $d >>);
urlencode(<< $e, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $e >>);
urlencode(<< $f, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $f >>);
urlencode(<< $g, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $g >>);
urlencode(<< $h, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $h >>);
urlencode(<< $i, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $i >>);
urlencode(<< $j, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $j >>);
urlencode(<< $k, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $k >>);
urlencode(<< $l, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $l >>);
urlencode(<< $m, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $m >>);
urlencode(<< $n, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $n >>);
urlencode(<< $o, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $o >>);
urlencode(<< $p, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $p >>);
urlencode(<< $q, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $q >>);
urlencode(<< $r, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $r >>);
urlencode(<< $s, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $s >>);
urlencode(<< $t, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $t >>);
urlencode(<< $u, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $u >>);
urlencode(<< $v, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $v >>);
urlencode(<< $w, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $w >>);
urlencode(<< $x, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $x >>);
urlencode(<< $y, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $y >>);
urlencode(<< $z, Rest/bits >>, Acc) -> urlencode(Rest, << Acc/bits, $z >>);
urlencode(<< C, Rest/bits >>, Acc) ->
H = hex(C bsr 4),
L = hex(C band 16#0f),
urlencode(Rest, << Acc/bits, $%, H, L >>);
urlencode(<<>>, Acc) ->
Acc.

hex( 0) -> $0;
hex( 1) -> $1;
hex( 2) -> $2;
hex( 3) -> $3;
hex( 4) -> $4;
hex( 5) -> $5;
hex( 6) -> $6;
hex( 7) -> $7;
hex( 8) -> $8;
hex( 9) -> $9;
hex(10) -> $A;
hex(11) -> $B;
hex(12) -> $C;
hex(13) -> $D;
hex(14) -> $E;
hex(15) -> $F.
5 changes: 5 additions & 0 deletions test/oidcc_test.erl
Expand Up @@ -178,13 +178,18 @@ retrieve_token(AuthMethods) ->
{ok, #{status => 200, header => [], body => HttpBody}}
end,

PassThrough = fun(Data) ->
meck:passthrough([Data])
end,
ok = meck:new(oidcc_openid_provider),
ok = meck:new(oidcc_openid_provider_mgr),
ok = meck:new(oidcc_http_util),

ok = meck:expect(oidcc_openid_provider, get_config, ConfigFun),
ok = meck:expect(oidcc_openid_provider_mgr, get_openid_provider, MapFun),
ok = meck:expect(oidcc_http_util, sync_http, HttpFun),
ok = meck:expect(oidcc_http_util, urlencode, PassThrough ),
ok = meck:expect(oidcc_http_util, qs, PassThrough),

AuthCode = <<"1234567890">>,

Expand Down

0 comments on commit c3f4f60

Please sign in to comment.