Skip to content

Commit

Permalink
Merge pull request #12 from esl/updates
Browse files Browse the repository at this point in the history
Updates
  • Loading branch information
DenysGonchar authored Feb 21, 2025
2 parents 398e31a + 65e077a commit d21aca7
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 44 deletions.
4 changes: 2 additions & 2 deletions rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
]}]}.

{deps, [
{stringprep, "1.0.29"}
{stringprep, "1.0.31"}
]}.

{project_plugins, [
Expand All @@ -22,7 +22,7 @@
{cover_enabled, true},
{cover_export_enabled, true},
{deps, [{proper, "1.4.0"}]},
{plugins, [{rebar3_codecov, "0.6.0"}]}
{plugins, [{rebar3_codecov, "0.7.0"}]}
]},
{prod, [
{erl_opts, [deterministic]}
Expand Down
12 changes: 6 additions & 6 deletions rebar.lock
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{"1.2.0",
[{<<"p1_utils">>,{pkg,<<"p1_utils">>,<<"1.0.23">>},1},
{<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.27">>},0}]}.
[{<<"p1_utils">>,{pkg,<<"p1_utils">>,<<"1.0.26">>},1},
{<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.31">>},0}]}.
[
{pkg_hash,[
{<<"p1_utils">>, <<"7F94466ADA69BD982EA7BB80FBCA18E7053E7D0B82C9D9E37621FA508587069B">>},
{<<"stringprep">>, <<"02808C7024BC6285CA6A8A67E7ADDFC16F35DDA55551A582C5181D8EA960E890">>}]},
{<<"p1_utils">>, <<"67B0C4AC9FA3BA3EF563B31AA111B0A004439A37FAC85E027F1C3617E1C7EC6C">>},
{<<"stringprep">>, <<"FA1688C156DD271722AA18C423A4163E710D2F4F475AD0BC220910DF669B53AF">>}]},
{pkg_hash_ext,[
{<<"p1_utils">>, <<"47F21618694EEEE5006AF1C88731AD86B757161E7823C29B6F73921B571C8502">>},
{<<"stringprep">>, <<"A5967B1144CA8002A58A03D16DD109FBD0BCDB82616CEAD2F983944314AF6A00">>}]}
{<<"p1_utils">>, <<"D0379E8C1156B98BD64F8129C1DE022FCCA4F2FDB7486CE73BF0ED2C3376B04C">>},
{<<"stringprep">>, <<"E9699C88E8DB16B3A41F0E45AC6874A4DA81A6E4854A77D76EDE6D09B08E3530">>}]}
].
147 changes: 113 additions & 34 deletions src/jid.erl
Original file line number Diff line number Diff line change
Expand Up @@ -120,40 +120,6 @@ from_binary(J) when is_binary(J), byte_size(J) < ?XMPP_JID_SIZE_LIMIT ->
from_binary(_) ->
error.

binary_to_jid1(_, <<$@, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N, 0);
binary_to_jid1(_, <<$/, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, byte_size(Jid) - N - 1})};
binary_to_jid1(Jid, <<_C, J/binary>>, N) ->
binary_to_jid1(Jid, J, N + 1);
binary_to_jid1(_, <<>>, 0) ->
error;
binary_to_jid1(J, <<>>, _) ->
{<<>>, J, <<>>}.

binary_to_jid2(_, <<$@, _J/binary>>, _N, _S) ->
error;
binary_to_jid2(_, <<$/, _J/binary>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<$/, _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
erlang:binary_part(Jid, {N + S + 2, byte_size(Jid) - N - S - 2})};
binary_to_jid2(Jid, <<_C, J/binary>>, N, S) ->
binary_to_jid2(Jid, J, N, S + 1);
binary_to_jid2(_, <<>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
<<>>}.

%% @doc Parses a binary and returns a jid record or an error, but without normalisation of the parts
-spec from_binary_noprep(binary()) -> jid() | error.
from_binary_noprep(J) when is_binary(J), byte_size(J) < ?XMPP_JID_SIZE_LIMIT ->
Expand Down Expand Up @@ -338,3 +304,116 @@ binary_to_bare(JID) when is_binary(JID) ->
-spec str_tolower(iodata()) -> binary() | error.
str_tolower(Val) when is_binary(Val); is_list(Val) ->
stringprep:tolower(Val).

%%%%% Helpers
binary_to_jid1(_, <<>>, 0) ->
error;
binary_to_jid1(J, <<>>, _) ->
{<<>>, J, <<>>};
binary_to_jid1(_, <<$@, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N, 0);
binary_to_jid1(Jid, <<_, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 1, 0);
binary_to_jid1(Jid, <<_, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 2, 0);
binary_to_jid1(Jid, <<_, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 3, 0);
binary_to_jid1(Jid, <<_, _, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 4, 0);
binary_to_jid1(Jid, <<_, _, _, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 5, 0);
binary_to_jid1(Jid, <<_, _, _, _, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 6, 0);
binary_to_jid1(Jid, <<_, _, _, _, _, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 7, 0);
binary_to_jid1(Jid, <<_, _, _, _, _, _, _, _, $@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N + 8, 0);
binary_to_jid1(_, <<$/, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, byte_size(Jid) - N - 1})};
binary_to_jid1(Jid, <<_, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 1}),
erlang:binary_part(Jid, {N + 2, byte_size(Jid) - N - 2})};
binary_to_jid1(Jid, <<_, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 2}),
erlang:binary_part(Jid, {N + 3, byte_size(Jid) - N - 3})};
binary_to_jid1(Jid, <<_, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 3}),
erlang:binary_part(Jid, {N + 4, byte_size(Jid) - N - 4})};
binary_to_jid1(Jid, <<_, _, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 4}),
erlang:binary_part(Jid, {N + 5, byte_size(Jid) - N - 5})};
binary_to_jid1(Jid, <<_, _, _, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 5}),
erlang:binary_part(Jid, {N + 6, byte_size(Jid) - N - 6})};
binary_to_jid1(Jid, <<_, _, _, _, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 6}),
erlang:binary_part(Jid, {N + 7, byte_size(Jid) - N - 7})};
binary_to_jid1(Jid, <<_, _, _, _, _, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 7}),
erlang:binary_part(Jid, {N + 8, byte_size(Jid) - N - 8})};
binary_to_jid1(Jid, <<_, _, _, _, _, _, _, _, $/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N + 8}),
erlang:binary_part(Jid, {N + 9, byte_size(Jid) - N - 9})};
binary_to_jid1(Jid, <<_, _, _, _, _, _, _, _, J/binary>>, N) ->
binary_to_jid1(Jid, J, N + 8);
binary_to_jid1(Jid, <<_C, J/binary>>, N) ->
binary_to_jid1(Jid, J, N + 1).

binary_to_jid2(_, <<>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
<<>>};
binary_to_jid2(_, <<$/, _J/binary>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<$/, _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
erlang:binary_part(Jid, {N + S + 2, byte_size(Jid) - N - S - 2})};
binary_to_jid2(Jid, <<_, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 1}),
erlang:binary_part(Jid, {N + S + 3, byte_size(Jid) - N - S - 3})};
binary_to_jid2(Jid, <<_, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 2}),
erlang:binary_part(Jid, {N + S + 4, byte_size(Jid) - N - S - 4})};
binary_to_jid2(Jid, <<_, _, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 3}),
erlang:binary_part(Jid, {N + S + 5, byte_size(Jid) - N - S - 5})};
binary_to_jid2(Jid, <<_, _, _, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 4}),
erlang:binary_part(Jid, {N + S + 6, byte_size(Jid) - N - S - 6})};
binary_to_jid2(Jid, <<_, _, _, _, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 5}),
erlang:binary_part(Jid, {N + S + 7, byte_size(Jid) - N - S - 7})};
binary_to_jid2(Jid, <<_, _, _, _, _, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 6}),
erlang:binary_part(Jid, {N + S + 8, byte_size(Jid) - N - S - 8})};
binary_to_jid2(Jid, <<_, _, _, _, _, _, _, "/", _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S + 7}),
erlang:binary_part(Jid, {N + S + 9, byte_size(Jid) - N - S - 9})};
binary_to_jid2(Jid, <<_, _, _, _, _, _, _, _, J/binary>>, N, S) ->
binary_to_jid2(Jid, J, N, S + 8);
binary_to_jid2(Jid, <<_C, J/binary>>, N, S) ->
binary_to_jid2(Jid, J, N, S + 1).
56 changes: 54 additions & 2 deletions test/jid_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ groups() ->
make_empty_domain,
make_bare_empty_domain,
make_noprep_empty_domain,
getters_equal_struct_lookup
getters_equal_struct_lookup,
equivalent_good,
equivalent_bad
]}
].

Expand All @@ -61,7 +63,6 @@ init_per_suite(C) ->
end_per_suite(C) ->
C.


empty_server_fails(_C) ->
?assertEqual(error, jid:from_binary(<<"$@/">>)).

Expand Down Expand Up @@ -312,6 +313,14 @@ getters_equal_struct_lookup(_) ->
?assertEqual(jid:lserver(US), Jid#jid.lserver),
?assertEqual(jid:lresource(US), <<>>).

equivalent_good(_C) ->
Prop = ?FORALL(Jid, jid_gen:jid(), from_binary(Jid) =:= jid:from_binary(Jid)),
run_property(Prop, 500, 1, 100).

equivalent_bad(_C) ->
Prop = ?FORALL(Jid, jid_gen:invalid_jid(), from_binary(Jid) =:= jid:from_binary(Jid)),
run_property(Prop, 500, 1, 100).

%% HELPERS
run_property(Prop, NumTest, StartSize, StopSize) ->
Res = proper:quickcheck(Prop, [verbose, long_result,
Expand All @@ -320,3 +329,46 @@ run_property(Prop, NumTest, StartSize, StopSize) ->
{max_size, StopSize}]),
ct:pal("Result of the property is ~p~n", [Res]),
?assert(Res).

%% Original code
from_binary(J) when is_binary(J), byte_size(J) < 3100 ->
case binary_to_jid1(J, J, 0) of
{U, H, R} -> jid:make(U, H, R);
error -> error
end;
from_binary(_) ->
error.

binary_to_jid1(_, <<$@, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$@, J/binary>>, N) ->
binary_to_jid2(Jid, J, N, 0);
binary_to_jid1(_, <<$/, _J/binary>>, 0) ->
error;
binary_to_jid1(Jid, <<$/, _/binary>>, N) ->
{<<>>,
erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, byte_size(Jid) - N - 1})};
binary_to_jid1(Jid, <<_C, J/binary>>, N) ->
binary_to_jid1(Jid, J, N + 1);
binary_to_jid1(_, <<>>, 0) ->
error;
binary_to_jid1(J, <<>>, _) ->
{<<>>, J, <<>>}.

binary_to_jid2(_, <<$@, _J/binary>>, _N, _S) ->
error;
binary_to_jid2(_, <<$/, _J/binary>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<$/, _/binary>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
erlang:binary_part(Jid, {N + S + 2, byte_size(Jid) - N - S - 2})};
binary_to_jid2(Jid, <<_C, J/binary>>, N, S) ->
binary_to_jid2(Jid, J, N, S + 1);
binary_to_jid2(_, <<>>, _N, 0) ->
error;
binary_to_jid2(Jid, <<>>, N, S) ->
{erlang:binary_part(Jid, {0, N}),
erlang:binary_part(Jid, {N + 1, S}),
<<>>}.

0 comments on commit d21aca7

Please sign in to comment.