Skip to content

Commit

Permalink
Merge pull request #1 from martinrehfeld/return-values
Browse files Browse the repository at this point in the history
Use atoms in error return values
  • Loading branch information
hukl committed Jul 10, 2012
2 parents 1e679ff + 76059e6 commit 68ca157
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 18 deletions.
6 changes: 3 additions & 3 deletions README.md
Expand Up @@ -24,9 +24,9 @@ Req = "Z9Xn16Pdo5ac9YWDh5HD70aujhsZ9eCoyPMcpd2aaiM.eyJhbGdvcml0aG0iOiJITUFDLVN"


% If the request is invalid the following return values are expected:
{error, <<"Invalid format of signed request">>}
{error, <<"Invalid Signature">>}
{error, <<"Invalid Payload">>}
{error, invalid_format}
{error, invalid_signature}
{error, invalid_payload}


% Generate a signed request (useful for testing)
Expand Down
19 changes: 9 additions & 10 deletions src/fb_signed_request.erl
Expand Up @@ -28,28 +28,27 @@ generate(Payload, Secret) ->


generate(Payload, Secret, [{return, binary}]) ->
erlang:list_to_binary(generate(Payload, Secret)).
list_to_binary(generate(Payload, Secret)).


extract_signature_and_payload(Request) ->
try
re:split(Request, "\\.", [{return, list}])
catch
_:_ -> throw({fb_signed_request, <<"Invalid format of signed request">>})
case re:split(Request, "\\.", [{return, list}]) of
[Signature, Payload] -> [Signature, Payload];
_ -> throw({fb_signed_request, invalid_format})
end.


decode_body(Payload) when is_binary(Payload) ->
decode_body( binary:bin_to_list(Payload) );
decode_body( binary_to_list(Payload) );


decode_body(Payload) when is_list(Payload) ->
try
erlang:list_to_binary(
list_to_binary(
base64:decode_to_string( base64_pad(Payload) )
)
catch
_:_ -> throw({fb_signed_request, <<"Invalid Payload">>})
_:_ -> throw({fb_signed_request, invalid_payload})
end.


Expand All @@ -59,7 +58,7 @@ validate_signature(Signature, Payload, Secret) ->
ComputedSignature = create_signature(Payload, Secret),
ComputedSignature = Signature
catch
error:{badmatch,_} -> throw({fb_signed_request, <<"Invalid Signature">>})
error:{badmatch,_} -> throw({fb_signed_request, invalid_signature})
end.


Expand Down Expand Up @@ -104,4 +103,4 @@ base64_pad( String ) ->
0 -> 0;
N -> 4 - N
end,
string:left(String, Length + ToPad, $=).
string:left(String, Length + ToPad, $=).
22 changes: 17 additions & 5 deletions test/fb_signed_request_test.erl
Expand Up @@ -7,7 +7,9 @@

-define(FB_SECRET, "897z956a2z7zzzzz5783z458zz3z7556").
-define(VALID_REQ, "Z9Xn16Pdo5ac9YWDh5HD70aujhsZ9eCoyPMcpd2aaiM.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDg5ODg4MDAsImlzc3VlZF9hdCI6MTMwODk4NTAxOCwib2F1dGhfdG9rZW4iOiIxMTExMTExMTExMTExMTF8Mi5BUUJBdHRSbExWbndxTlBaLjM2MDAuMTExMTExMTExMS4xLTExMTExMTExMTExMTExMXxUNDl3M0Jxb1pVZWd5cHJ1NTFHcmE3MGhFRDgiLCJ1c2VyIjp7ImFnZSI6eyJtaW4iOjIxfSwiY291bnRyeSI6ImRlIiwibG9jYWxlIjoiZW5fVVMifSwidXNlcl9pZCI6IjExMTExMTExMTExMTExMSJ9").
-define(INVALID_REQ, "umfudisP7mKhsi9nZboBg15yMZKhfQAARL9UoZtSE.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDg5ODg4MDAsImlzc3VlZF9hdCI6MTMwODk4NTAxOCwib2F1dGhfdG9rZW4iOiIxMTExMTExMTExMTExMTF8Mi5BUUJBdHRSbExWbndxTlBaLjM2MDAuMTExMTExMTExMS4xLTExMTExMTExMTExMTExMXxUNDl3M0Jxb1pVZWd5cHJ1NTFHcmE3MGhFRDgiLCJ1c2VyIjp7ImNvdW50cnkiOiJkZSIsImxvY2FsZSI6ImVuX1VTIiwiYWdlIjp7Im1pbiI6MjF9fSwidXNlcl9pZCI6IjExMTExMTExMTExMTExMSJ9").
-define(INVALID_REQ_FORMAT, "Z9Xn16Pdo5ac9YWDh5HD70aujhsZ9eCoyPMcpd2aaiM2eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDg5ODg4MDAsImlzc3VlZF9hdCI6MTMwODk4NTAxOCwib2F1dGhfdG9rZW4iOiIxMTExMTExMTExMTExMTF8Mi5BUUJBdHRSbExWbndxTlBaLjM2MDAuMTExMTExMTExMS4xLTExMTExMTExMTExMTExMXxUNDl3M0Jxb1pVZWd5cHJ1NTFHcmE3MGhFRDgiLCJ1c2VyIjp7ImFnZSI6eyJtaW4iOjIxfSwiY291bnRyeSI6ImRlIiwibG9jYWxlIjoiZW5fVVMifSwidXNlcl9pZCI6IjExMTExMTExMTExMTExMSJ9").
-define(INVALID_REQ_PAYLOAD, "Z9Xn16Pdo5ac9YWDh5HD70aujhsZ9eCoyPMcpd2aaiM.*yJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDg5ODg4MDAsImlzc3VlZF9hdCI6MTMwODk4NTAxOCwib2F1dGhfdG9rZW4iOiIxMTExMTExMTExMTExMTF8Mi5BUUJBdHRSbExWbndxTlBaLjM2MDAuMTExMTExMTExMS4xLTExMTExMTExMTExMTExMXxUNDl3M0Jxb1pVZWd5cHJ1NTFHcmE3MGhFRDgiLCJ1c2VyIjp7ImFnZSI6eyJtaW4iOjIxfSwiY291bnRyeSI6ImRlIiwibG9jYWxlIjoiZW5fVVMifSwidXNlcl9pZCI6IjExMTExMTExMTExMTExMSJ9").
-define(INVALID_REQ_SIGNATURE, "umfudisP7mKhsi9nZboBg15yMZKhfQAARL9UoZtSE.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDg5ODg4MDAsImlzc3VlZF9hdCI6MTMwODk4NTAxOCwib2F1dGhfdG9rZW4iOiIxMTExMTExMTExMTExMTF8Mi5BUUJBdHRSbExWbndxTlBaLjM2MDAuMTExMTExMTExMS4xLTExMTExMTExMTExMTExMXxUNDl3M0Jxb1pVZWd5cHJ1NTFHcmE3MGhFRDgiLCJ1c2VyIjp7ImNvdW50cnkiOiJkZSIsImxvY2FsZSI6ImVuX1VTIiwiYWdlIjp7Im1pbiI6MjF9fSwidXNlcl9pZCI6IjExMTExMTExMTExMTExMSJ9").
-define(EXPECTED_VALID_DATA, <<"{\"algorithm\":\"HMAC-SHA256\",\"expires\":1308988800,\"issued_at\":1308985018,\"oauth_token\":\"111111111111111|2.AQBAttRlLVnwqNPZ.3600.1111111111.1-111111111111111|T49w3BqoZUegypru51Gra70hED8\",\"user\":{\"age\":{\"min\":21},\"country\":\"de\",\"locale\":\"en_US\"},\"user_id\":\"111111111111111\"}">>).


Expand All @@ -16,9 +18,19 @@ test_parsing_a_valid_request() ->
?assert_equal({ok, ?EXPECTED_VALID_DATA}, Result).


test_parsing_a_invalid_request() ->
Result = fb_signed_request:parse(?INVALID_REQ, ?FB_SECRET),
?assert_equal({error, <<"Invalid Signature">>}, Result).
test_parsing_a_request_with_invalid_format() ->
Result = fb_signed_request:parse(?INVALID_REQ_FORMAT, ?FB_SECRET),
?assert_equal({error, invalid_format}, Result).


test_parsing_a_request_with_invalid_payload() ->
Result = fb_signed_request:parse(?INVALID_REQ_PAYLOAD, ?FB_SECRET),
?assert_equal({error, invalid_payload}, Result).


test_parsing_a_request_with_invalid_signature() ->
Result = fb_signed_request:parse(?INVALID_REQ_SIGNATURE, ?FB_SECRET),
?assert_equal({error, invalid_signature}, Result).


test_generating_and_parsing_and_validating_a_request() ->
Expand All @@ -33,4 +45,4 @@ test_generate_signed_request_as_binary() ->
?EXPECTED_VALID_DATA, ?FB_SECRET, [{return, binary}]
),

?assert_equal(erlang:list_to_binary(?VALID_REQ), SignedRequest).
?assert_equal(erlang:list_to_binary(?VALID_REQ), SignedRequest).

0 comments on commit 68ca157

Please sign in to comment.