From b0d319a92f87ff7c1c7f384e8bfeeeae8d34d361 Mon Sep 17 00:00:00 2001 From: anupamasingh10 Date: Thu, 23 Feb 2023 11:11:06 +0100 Subject: Add new api conn_info for SSL connections to LDAP server --- lib/eldap/doc/src/eldap.xml | 26 +++++++++++++++++ lib/eldap/src/eldap.erl | 29 ++++++++++++++++++- lib/eldap/test/eldap_basic_SUITE.erl | 56 ++++++++++++++++++++++++++++++++++-- 3 files changed, 107 insertions(+), 4 deletions(-) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index 4d9ec96a70..8f08514886 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -548,6 +548,32 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), the series.

+ + conn_info(Handle) -> {ok, Data} | {error, Reason} + Returns all the connection information. + + + Handle = handle() + Data = ssl:connection_info() + +

Returns the most relevant information for SSL connection to an LDAP server, ssl options + that are undefined will be filtered out. Note that values that affect the security of the + connection will only be returned if explicitly requested by conn_info/2.

+
+
+ + conn_info(Handle, Items) -> {ok, Data} | {error, Reason} + Returns the requested connection information. + + + Handle = handle() + Items = ssl:connection_info_items() + Data = ssl:connection_info() + +

Returns the requested information items about the SSL connection to LDAP server, + if they are defined.

+
+
diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index 22d816c8c8..cc27a31966 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -30,7 +30,9 @@ parse_ldap_url/1, paged_result_control/1, paged_result_control/2, - paged_result_cookie/1]). + paged_result_cookie/1, + conn_info/1, + conn_info/2]). -export([neverDerefAliases/0, derefInSearching/0, derefFindingBaseObj/0, derefAlways/0]). @@ -154,6 +156,16 @@ controlling_process(Handle, Pid) when is_pid(Handle), is_pid(Pid) -> send(Handle, {cnt_proc, Pid}), recv(Handle). +%%% -------------------------------------------------------------------- +%%% Return LDAP connection information +%%% -------------------------------------------------------------------- +conn_info(Handle) when is_pid(Handle) -> + conn_info(Handle, []). + +conn_info(Handle, Items) when is_pid(Handle) -> + send(Handle, {conn_info, Items}), + recv(Handle). + %%% -------------------------------------------------------------------- %%% Authenticate ourselves to the Directory %%% using simple authentication. @@ -608,6 +620,17 @@ loop(Cpid, Data) -> send(From, Result), ?MODULE:loop(Cpid, Data); + {From, {conn_info, Items}} -> + Res = + case Data#eldap.ldaps of + true -> + get_ssl_conn_info(Data#eldap.fd, Items); + false -> + {error, "Not an SSL connection"} + end, + send(From, Res), + ?MODULE:loop(Cpid, Data); + {Cpid, 'EXIT', Reason} -> ?PRINT("Got EXIT from Cpid, reason=~p~n",[Reason]), exit(Reason); @@ -618,6 +641,10 @@ loop(Cpid, Data) -> end. +get_ssl_conn_info(SockFd, []) -> + ssl:connection_information(SockFd); +get_ssl_conn_info(SockFd, Items) -> + ssl:connection_information(SockFd, Items). %%% -------------------------------------------------------------------- %%% startTLS Request diff --git a/lib/eldap/test/eldap_basic_SUITE.erl b/lib/eldap/test/eldap_basic_SUITE.erl index 5fa6d4ca69..1c283a1f82 100644 --- a/lib/eldap/test/eldap_basic_SUITE.erl +++ b/lib/eldap/test/eldap_basic_SUITE.erl @@ -46,6 +46,7 @@ more_add/1, open_ret_val_error/1, open_ret_val_success/1, + plain_ldap_conn_info_error/1, search_filter_and/1, search_filter_and_not/1, search_filter_equalityMatch/1, @@ -63,6 +64,8 @@ search_extensible_match_without_dn/1, search_paged_results/1, ssl_connection/1, + ssl_conn_info/1, + ssl_conn_info_items/1, start_tls_on_ssl_should_fail/1, start_tls_twice_should_fail/1, tcp_connection/1, @@ -81,8 +84,8 @@ suite/0 ]). -%%-include_lib("common_test/include/ct.hrl"). -include_lib("common_test/include/ct.hrl"). +-include_lib("stdlib/include/assert.hrl"). -include_lib("eldap/include/eldap.hrl"). -include_lib("eldap/ebin/ELDAPv3.hrl"). @@ -159,7 +162,10 @@ connection_tests() -> client_side_bind_timeout, client_side_add_timeout, client_side_search_timeout, - close_after_tcp_error + close_after_tcp_error, + ssl_conn_info, + ssl_conn_info_items, + plain_ldap_conn_info_error ]. @@ -259,7 +265,7 @@ end_per_group(start_tls_api, Config) -> clear_db(Config); end_per_group(_Group, Config) -> Config. -init_per_testcase(ssl_connection, Config) -> +init_per_testcase(TC, Config) when TC == ssl_connection; TC == ssl_conn_info; TC == ssl_conn_info_items -> case proplists:get_value(ssl_available,Config) of true -> SSL_Port = 9999, @@ -422,6 +428,50 @@ ssl_connection(Config) -> Other -> ct:fail("eldap:open failed: ~p",[Other]) end. +%%%---------------------------------------------------------------- +ssl_conn_info(Config) -> + Host = proplists:get_value(listen_host, Config), + Port = proplists:get_value(ssl_listen_port, Config), + Opts = proplists:get_value(tcp_connect_opts, Config), + SSLOpts = proplists:get_value(ssl_connect_opts, Config), + case eldap:open([Host], [{port,Port}, + {ssl,true}, + {timeout,5000}, + {sslopts,SSLOpts}|Opts]) of + {ok,H} -> + ?assertMatch({ok, _Data}, eldap:conn_info(H)); + Other -> ct:fail("eldap:open failed: ~p",[Other]) + end. + +%%%---------------------------------------------------------------- +ssl_conn_info_items(Config) -> + Host = proplists:get_value(listen_host, Config), + Port = proplists:get_value(ssl_listen_port, Config), + Opts = proplists:get_value(tcp_connect_opts, Config), + SSLOpts = proplists:get_value(ssl_connect_opts, Config), + case eldap:open([Host], [{port,Port}, + {ssl,true}, + {timeout,5000}, + {sslopts,SSLOpts}|Opts]) of + {ok,H} -> + ?assertEqual({ok, [{protocol, 'tlsv1.3'}, {session_resumption, false}]}, + eldap:conn_info(H, [protocol, session_resumption])); + Other -> ct:fail("eldap:open failed: ~p",[Other]) + end. + +%%%---------------------------------------------------------------- +plain_ldap_conn_info_error(Config) -> + Host = proplists:get_value(listen_host, Config), + Port = proplists:get_value(listen_port, Config), + Opts = proplists:get_value(tcp_connect_opts, Config), + T = 1000, + case eldap:open([Host], [{timeout,T},{port,Port}|Opts]) of + {ok,H} -> + ?assertMatch({error, "Not an SSL connection"}, + eldap:conn_info(H)); + Other -> ct:fail("eldap:open failed: ~p",[Other]) + end. + %%%---------------------------------------------------------------- client_side_add_timeout(Config) -> client_timeout( -- cgit v1.2.1 From f1ac6ef8274009612774b63c1bb7259ee8abdb7b Mon Sep 17 00:00:00 2001 From: anupamasingh10 Date: Mon, 27 Feb 2023 10:22:10 +0100 Subject: Add new api conn_info for SSL connections to LDAP server --- lib/eldap/doc/src/eldap.xml | 12 ++++++------ lib/ssl/src/ssl.erl | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index 8f08514886..5efcbd4c86 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -550,20 +550,20 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), conn_info(Handle) -> {ok, Data} | {error, Reason} - Returns all the connection information. + When LDAP is run over TLS, returns information about the TLS connection. Handle = handle() Data = ssl:connection_info() -

Returns the most relevant information for SSL connection to an LDAP server, ssl options - that are undefined will be filtered out. Note that values that affect the security of the - connection will only be returned if explicitly requested by conn_info/2.

+

Returns the most relevant information for SSL connection to an LDAP server. + See also ssl:connection_information/1.

conn_info(Handle, Items) -> {ok, Data} | {error, Reason} - Returns the requested connection information. + When LDAP is run over TLS, returns requested information items about the TLS + connection. Handle = handle() @@ -571,7 +571,7 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), Data = ssl:connection_info()

Returns the requested information items about the SSL connection to LDAP server, - if they are defined.

+ if they are defined. See also ssl:connection_information/2.

diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index ad5028655d..08ebfae269 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -138,7 +138,9 @@ srp_param_type/0, named_curve/0, sign_scheme/0, - group/0]). + group/0, + connection_info/0, + connection_info_items/0]). %% ------------------------------------------------------------------------------------------------------- -- cgit v1.2.1 From 474317eeb9cf929cb6a2a0a181b0c1ced2aa034d Mon Sep 17 00:00:00 2001 From: anupamasingh10 Date: Thu, 9 Mar 2023 12:17:27 +0100 Subject: Add new api eldap:info/1 --- lib/eldap/doc/src/eldap.xml | 25 +++++------------------ lib/eldap/src/eldap.erl | 23 +++++++-------------- lib/eldap/test/eldap_basic_SUITE.erl | 39 ++++++++++-------------------------- lib/ssl/src/ssl.erl | 4 +--- 4 files changed, 24 insertions(+), 67 deletions(-) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index 5efcbd4c86..edc308ba52 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -549,29 +549,14 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), - conn_info(Handle) -> {ok, Data} | {error, Reason} - When LDAP is run over TLS, returns information about the TLS connection. + info(Handle) -> #{socket := Socket, socket_type := tcp | ssl} + Returns the SSL or TCP socket for LDAP connection. - Handle = handle() - Data = ssl:connection_info() - -

Returns the most relevant information for SSL connection to an LDAP server. - See also ssl:connection_information/1.

-
-
- - conn_info(Handle, Items) -> {ok, Data} | {error, Reason} - When LDAP is run over TLS, returns requested information items about the TLS - connection. - - - Handle = handle() - Items = ssl:connection_info_items() - Data = ssl:connection_info() + Socket = ssl:sslsocket() | gen_tcp:socket() -

Returns the requested information items about the SSL connection to LDAP server, - if they are defined. See also ssl:connection_information/2.

+

Returns the socket type and socket for a TCP/SSL connection + to an LDAP server

diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index cc27a31966..ab6363a28b 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -31,8 +31,7 @@ paged_result_control/1, paged_result_control/2, paged_result_cookie/1, - conn_info/1, - conn_info/2]). + info/1]). -export([neverDerefAliases/0, derefInSearching/0, derefFindingBaseObj/0, derefAlways/0]). @@ -157,13 +156,10 @@ controlling_process(Handle, Pid) when is_pid(Handle), is_pid(Pid) -> recv(Handle). %%% -------------------------------------------------------------------- -%%% Return LDAP connection information +%%% Return LDAP socket information %%% -------------------------------------------------------------------- -conn_info(Handle) when is_pid(Handle) -> - conn_info(Handle, []). - -conn_info(Handle, Items) when is_pid(Handle) -> - send(Handle, {conn_info, Items}), +info(Handle) when is_pid(Handle) -> + send(Handle, info), recv(Handle). %%% -------------------------------------------------------------------- @@ -620,13 +616,13 @@ loop(Cpid, Data) -> send(From, Result), ?MODULE:loop(Cpid, Data); - {From, {conn_info, Items}} -> + {From, info} -> Res = case Data#eldap.ldaps of true -> - get_ssl_conn_info(Data#eldap.fd, Items); + #{socket => Data#eldap.fd, socket_type => ssl}; false -> - {error, "Not an SSL connection"} + #{socket => Data#eldap.fd, socket_type => tcp} end, send(From, Res), ?MODULE:loop(Cpid, Data); @@ -641,11 +637,6 @@ loop(Cpid, Data) -> end. -get_ssl_conn_info(SockFd, []) -> - ssl:connection_information(SockFd); -get_ssl_conn_info(SockFd, Items) -> - ssl:connection_information(SockFd, Items). - %%% -------------------------------------------------------------------- %%% startTLS Request %%% -------------------------------------------------------------------- diff --git a/lib/eldap/test/eldap_basic_SUITE.erl b/lib/eldap/test/eldap_basic_SUITE.erl index 1c283a1f82..2b26ed52bd 100644 --- a/lib/eldap/test/eldap_basic_SUITE.erl +++ b/lib/eldap/test/eldap_basic_SUITE.erl @@ -46,7 +46,7 @@ more_add/1, open_ret_val_error/1, open_ret_val_success/1, - plain_ldap_conn_info_error/1, + plain_ldap_socket_info/1, search_filter_and/1, search_filter_and_not/1, search_filter_equalityMatch/1, @@ -64,8 +64,7 @@ search_extensible_match_without_dn/1, search_paged_results/1, ssl_connection/1, - ssl_conn_info/1, - ssl_conn_info_items/1, + ssl_conn_socket_info/1, start_tls_on_ssl_should_fail/1, start_tls_twice_should_fail/1, tcp_connection/1, @@ -163,9 +162,8 @@ connection_tests() -> client_side_add_timeout, client_side_search_timeout, close_after_tcp_error, - ssl_conn_info, - ssl_conn_info_items, - plain_ldap_conn_info_error + ssl_conn_socket_info, + plain_ldap_socket_info ]. @@ -265,7 +263,7 @@ end_per_group(start_tls_api, Config) -> clear_db(Config); end_per_group(_Group, Config) -> Config. -init_per_testcase(TC, Config) when TC == ssl_connection; TC == ssl_conn_info; TC == ssl_conn_info_items -> +init_per_testcase(TC, Config) when TC == ssl_connection; TC == ssl_conn_socket_info -> case proplists:get_value(ssl_available,Config) of true -> SSL_Port = 9999, @@ -429,7 +427,7 @@ ssl_connection(Config) -> end. %%%---------------------------------------------------------------- -ssl_conn_info(Config) -> +ssl_conn_socket_info(Config) -> Host = proplists:get_value(listen_host, Config), Port = proplists:get_value(ssl_listen_port, Config), Opts = proplists:get_value(tcp_connect_opts, Config), @@ -439,36 +437,21 @@ ssl_conn_info(Config) -> {timeout,5000}, {sslopts,SSLOpts}|Opts]) of {ok,H} -> - ?assertMatch({ok, _Data}, eldap:conn_info(H)); + #{socket := Socket, socket_type := ssl} = eldap:info(H), + ?assertMatch({ok, _Data}, ssl:connection_information(Socket)); Other -> ct:fail("eldap:open failed: ~p",[Other]) end. %%%---------------------------------------------------------------- -ssl_conn_info_items(Config) -> - Host = proplists:get_value(listen_host, Config), - Port = proplists:get_value(ssl_listen_port, Config), - Opts = proplists:get_value(tcp_connect_opts, Config), - SSLOpts = proplists:get_value(ssl_connect_opts, Config), - case eldap:open([Host], [{port,Port}, - {ssl,true}, - {timeout,5000}, - {sslopts,SSLOpts}|Opts]) of - {ok,H} -> - ?assertEqual({ok, [{protocol, 'tlsv1.3'}, {session_resumption, false}]}, - eldap:conn_info(H, [protocol, session_resumption])); - Other -> ct:fail("eldap:open failed: ~p",[Other]) - end. - -%%%---------------------------------------------------------------- -plain_ldap_conn_info_error(Config) -> +plain_ldap_socket_info(Config) -> Host = proplists:get_value(listen_host, Config), Port = proplists:get_value(listen_port, Config), Opts = proplists:get_value(tcp_connect_opts, Config), T = 1000, case eldap:open([Host], [{timeout,T},{port,Port}|Opts]) of {ok,H} -> - ?assertMatch({error, "Not an SSL connection"}, - eldap:conn_info(H)); + ?assertMatch(#{socket := _, socket_type := tcp}, + eldap:info(H)); Other -> ct:fail("eldap:open failed: ~p",[Other]) end. diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index 08ebfae269..ad5028655d 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -138,9 +138,7 @@ srp_param_type/0, named_curve/0, sign_scheme/0, - group/0, - connection_info/0, - connection_info_items/0]). + group/0]). %% ------------------------------------------------------------------------------------------------------- -- cgit v1.2.1 From 6706de788689d4b65f2190fb047641a6d94a6131 Mon Sep 17 00:00:00 2001 From: anupamasingh10 Date: Fri, 10 Mar 2023 19:25:11 +0100 Subject: Update eldap:info/1 documentation --- lib/eldap/doc/src/eldap.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index edc308ba52..aae0f346b9 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -549,14 +549,15 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), - info(Handle) -> #{socket := Socket, socket_type := tcp | ssl} - Returns the SSL or TCP socket for LDAP connection. + info(Handle) -> connection_info() + Returns information about the LDAP connection. + connection_info() = #{socket := Socket, socket_type := tcp | ssl} Socket = ssl:sslsocket() | gen_tcp:socket() -

Returns the socket type and socket for a TCP/SSL connection - to an LDAP server

+

Currently available information reveals the socket and the transport + protocol, TCP or TLS (SSL), used by the LDAP connection.

-- cgit v1.2.1 From 45aabdf3015126b6448d9c286b01f5814f680cce Mon Sep 17 00:00:00 2001 From: anupamasingh10 <31176057+anupamasingh10@users.noreply.github.com> Date: Wed, 15 Mar 2023 12:14:49 +0100 Subject: Update lib/eldap/src/eldap.erl Co-authored-by: Kenneth Lundin --- lib/eldap/src/eldap.erl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index ab6363a28b..b9a2891fa7 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -617,13 +617,14 @@ loop(Cpid, Data) -> ?MODULE:loop(Cpid, Data); {From, info} -> - Res = + SocketType = case Data#eldap.ldaps of - true -> - #{socket => Data#eldap.fd, socket_type => ssl}; - false -> - #{socket => Data#eldap.fd, socket_type => tcp} + true -> + ssl; + false -> + tcp end, + Res = #{socket => Data#eldap.fd, socket_type => SocketType} , send(From, Res), ?MODULE:loop(Cpid, Data); -- cgit v1.2.1 From 7ade6057647861cfd00e8dc5ee31544102d3b15c Mon Sep 17 00:00:00 2001 From: anupamasingh10 <31176057+anupamasingh10@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:27:52 +0100 Subject: Update lib/eldap/src/eldap.erl Co-authored-by: Viacheslav Katsuba --- lib/eldap/src/eldap.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index b9a2891fa7..8c34a45c6a 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -619,7 +619,7 @@ loop(Cpid, Data) -> {From, info} -> SocketType = case Data#eldap.ldaps of - true -> + true -> ssl; false -> tcp -- cgit v1.2.1 From be0a3cc13a599f981f5d1f5e2532a2be0df3c4d1 Mon Sep 17 00:00:00 2001 From: anupamasingh10 <31176057+anupamasingh10@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:27:59 +0100 Subject: Update lib/eldap/src/eldap.erl Co-authored-by: Viacheslav Katsuba --- lib/eldap/src/eldap.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index 8c34a45c6a..2ac6e3d3cf 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -621,7 +621,7 @@ loop(Cpid, Data) -> case Data#eldap.ldaps of true -> ssl; - false -> + false -> tcp end, Res = #{socket => Data#eldap.fd, socket_type => SocketType} , -- cgit v1.2.1 From b5259a1036663de459859be4d74d03884ce8c9dc Mon Sep 17 00:00:00 2001 From: anupamasingh10 <31176057+anupamasingh10@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:28:08 +0100 Subject: Update lib/eldap/src/eldap.erl Co-authored-by: Viacheslav Katsuba --- lib/eldap/src/eldap.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl index 2ac6e3d3cf..7edd012263 100644 --- a/lib/eldap/src/eldap.erl +++ b/lib/eldap/src/eldap.erl @@ -624,7 +624,7 @@ loop(Cpid, Data) -> false -> tcp end, - Res = #{socket => Data#eldap.fd, socket_type => SocketType} , + Res = #{socket => Data#eldap.fd, socket_type => SocketType}, send(From, Res), ?MODULE:loop(Cpid, Data); -- cgit v1.2.1 From 58771d0171e1ecbe51528070731f56d29218c793 Mon Sep 17 00:00:00 2001 From: Ingela Anderton Andin Date: Tue, 25 Apr 2023 16:32:26 +0200 Subject: eldap:Fix since tag --- lib/eldap/doc/src/eldap.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index aae0f346b9..b3b8dc0a9b 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -549,7 +549,7 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1), - info(Handle) -> connection_info() + info(Handle) -> connection_info() Returns information about the LDAP connection. -- cgit v1.2.1