summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2021-06-30 03:32:39 -0400
committerNick Vatamaniuc <nickva@users.noreply.github.com>2021-06-30 12:46:05 -0400
commitcf71d00cb4b41da5527230d62b63e714c7777cf2 (patch)
treed54e6a49e5530d83a9e0d1c6580466d9611d7252
parentf78162743e5455984e276e94b7566a6d02808a43 (diff)
downloadcouchdb-cf71d00cb4b41da5527230d62b63e714c7777cf2.tar.gz
Use correct socks5 proxy ibrowse options
This is a port of the 3.x PR https://github.com/apache/couchdb/pull/3634 to main
-rw-r--r--src/couch_replicator/src/couch_replicator_api_wrap.erl14
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl34
2 files changed, 47 insertions, 1 deletions
diff --git a/src/couch_replicator/src/couch_replicator_api_wrap.erl b/src/couch_replicator/src/couch_replicator_api_wrap.erl
index f182ecd10..2fa9feb20 100644
--- a/src/couch_replicator/src/couch_replicator_api_wrap.erl
+++ b/src/couch_replicator/src/couch_replicator_api_wrap.erl
@@ -1035,6 +1035,10 @@ db_from_json(#{} = DbMap) ->
[],
Headers0
),
+ Socks5 = case maps:get(<<"proxy_protocol">>, IBrowseOptions0, undefined) of
+ <<"socks5">> -> true;
+ _ -> false
+ end,
IBrowseOptions = maps:fold(
fun
(<<"socket_options">>, #{} = SockOpts, Acc) ->
@@ -1043,6 +1047,16 @@ db_from_json(#{} = DbMap) ->
(<<"ssl_options">>, #{} = SslOpts, Acc) ->
SslOptsKVs = maps:fold(fun ssl_opts_fold/3, [], SslOpts),
[{ssl_options, SslOptsKVs} | Acc];
+ (<<"proxy_protocol">>, _Val, Acc) ->
+ Acc;
+ (<<"proxy_host">>, Val, Acc) when Socks5, is_binary(Val) ->
+ [{socks5_host, binary_to_list(Val)} | Acc];
+ (<<"proxy_port">>, Val, Acc) when Socks5, is_integer(Val) ->
+ [{socks5_port, Val} | Acc];
+ (<<"proxy_user">>, Val, Acc) when Socks5, is_binary(Val) ->
+ [{socks5_user, binary_to_list(Val)} | Acc];
+ (<<"proxy_password">>, Val, Acc) when Socks5, is_binary(Val) ->
+ [{socks5_password, binary_to_list(Val)} | Acc];
(K, V, Acc) when is_binary(V) ->
[{binary_to_atom(K, utf8), binary_to_list(V)} | Acc];
(K, V, Acc) ->
diff --git a/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl
index 8cbaf151c..fdfb57929 100644
--- a/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl
@@ -14,6 +14,7 @@
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch_replicator/src/couch_replicator.hrl").
+-include_lib("couch_replicator/include/couch_replicator_api_wrap.hrl").
-include_lib("fabric/test/fabric2_test.hrl").
replicator_proxy_test_() ->
@@ -28,7 +29,8 @@ replicator_proxy_test_() ->
?TDEF(parse_rep_doc_with_proxy),
?TDEF(parse_rep_source_target_proxy),
?TDEF(mutually_exclusive_proxy_and_source_proxy),
- ?TDEF(mutually_exclusive_proxy_and_target_proxy)
+ ?TDEF(mutually_exclusive_proxy_and_target_proxy),
+ ?TDEF(sock5_proxy_in_db_from_json)
])
}
}.
@@ -100,3 +102,33 @@ mutually_exclusive_proxy_and_target_proxy(_) ->
{bad_rep_doc, _},
couch_replicator_parse:parse_rep_doc(ProxyDoc)
).
+
+sock5_proxy_in_db_from_json(_) ->
+ SrcProxyURL = <<"socks5://u1:p1@mysrcproxy.com:1234">>,
+ TgtProxyURL = <<"http://u2:p2@mytgtproxy.com:9999">>,
+ ProxyDoc =
+ {[
+ {<<"source">>, <<"http://unproxied.com">>},
+ {<<"target">>, <<"http://otherunproxied.com">>},
+ {<<"source_proxy">>, SrcProxyURL},
+ {<<"target_proxy">>, TgtProxyURL}
+ ]},
+ Rep = couch_replicator_parse:parse_rep_doc(ProxyDoc),
+ Src = maps:get(?SOURCE, Rep),
+ Tgt = maps:get(?TARGET, Rep),
+ ?assertEqual(SrcProxyURL, maps:get(<<"proxy_url">>, Src)),
+ ?assertEqual(TgtProxyURL, maps:get(<<"proxy_url">>, Tgt)),
+ SrcHttpDb = couch_replicator_api_wrap:db_from_json(Src),
+ TgtHttpDb = couch_replicator_api_wrap:db_from_json(Tgt),
+ SrcOpts = SrcHttpDb#httpdb.ibrowse_options,
+ TgtOpts = TgtHttpDb#httpdb.ibrowse_options,
+ ?assertEqual(undefined, couch_util:get_value(proxy_protocol, SrcOpts)),
+ ?assertEqual(undefined, couch_util:get_value(proxy_protocol, TgtOpts)),
+ ?assertEqual("mysrcproxy.com", couch_util:get_value(socks5_host, SrcOpts)),
+ ?assertEqual("mytgtproxy.com", couch_util:get_value(proxy_host, TgtOpts)),
+ ?assertEqual(1234, couch_util:get_value(socks5_port, SrcOpts)),
+ ?assertEqual(9999, couch_util:get_value(proxy_port, TgtOpts)),
+ ?assertEqual("u1", couch_util:get_value(socks5_user, SrcOpts)),
+ ?assertEqual("u2", couch_util:get_value(proxy_user, TgtOpts)),
+ ?assertEqual("p1", couch_util:get_value(socks5_password, SrcOpts)),
+ ?assertEqual("p2", couch_util:get_value(proxy_password, TgtOpts)).