summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2023-04-25 17:08:51 +0200
committerErlang/OTP <otp@erlang.org>2023-04-25 17:08:51 +0200
commite597996dded611ed8b07a29e666599818607fc12 (patch)
treedfd07f17976a2e1596a1bb972f7c777cc0d0da2c
parent4a47e66cb721fe65fee771a5db58538b852e638e (diff)
parent58771d0171e1ecbe51528070731f56d29218c793 (diff)
downloaderlang-e597996dded611ed8b07a29e666599818607fc12.tar.gz
Merge branch 'ingela/eldap/ssl-connection-information/OTP-18480' into maint-25
* ingela/eldap/ssl-connection-information/OTP-18480: eldap:Fix since tag Update lib/eldap/src/eldap.erl Update lib/eldap/src/eldap.erl Update lib/eldap/src/eldap.erl Update lib/eldap/src/eldap.erl Update eldap:info/1 documentation Add new api eldap:info/1 Add new api conn_info for SSL connections to LDAP server Add new api conn_info for SSL connections to LDAP server
-rw-r--r--lib/eldap/doc/src/eldap.xml12
-rw-r--r--lib/eldap/src/eldap.erl23
-rw-r--r--lib/eldap/test/eldap_basic_SUITE.erl39
3 files changed, 69 insertions, 5 deletions
diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml
index 4d9ec96a70..b3b8dc0a9b 100644
--- a/lib/eldap/doc/src/eldap.xml
+++ b/lib/eldap/doc/src/eldap.xml
@@ -548,6 +548,18 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1),
the series.</p>
</desc>
</func>
+ <func>
+ <name since="OTP @OTP-18480@">info(Handle) -> connection_info()</name>
+ <fsummary>Returns information about the LDAP connection.
+ </fsummary>
+ <type>
+ <v>connection_info() = #{socket := Socket, socket_type := tcp | ssl}</v>
+ <v>Socket = ssl:sslsocket() | gen_tcp:socket()</v>
+ </type>
+ <desc><p>Currently available information reveals the socket and the transport
+ protocol, TCP or TLS (SSL), used by the LDAP connection.</p>
+ </desc>
+ </func>
</funcs>
diff --git a/lib/eldap/src/eldap.erl b/lib/eldap/src/eldap.erl
index 22d816c8c8..7edd012263 100644
--- a/lib/eldap/src/eldap.erl
+++ b/lib/eldap/src/eldap.erl
@@ -30,7 +30,8 @@
parse_ldap_url/1,
paged_result_control/1,
paged_result_control/2,
- paged_result_cookie/1]).
+ paged_result_cookie/1,
+ info/1]).
-export([neverDerefAliases/0, derefInSearching/0,
derefFindingBaseObj/0, derefAlways/0]).
@@ -155,6 +156,13 @@ controlling_process(Handle, Pid) when is_pid(Handle), is_pid(Pid) ->
recv(Handle).
%%% --------------------------------------------------------------------
+%%% Return LDAP socket information
+%%% --------------------------------------------------------------------
+info(Handle) when is_pid(Handle) ->
+ send(Handle, info),
+ recv(Handle).
+
+%%% --------------------------------------------------------------------
%%% Authenticate ourselves to the Directory
%%% using simple authentication.
%%%
@@ -608,6 +616,18 @@ loop(Cpid, Data) ->
send(From, Result),
?MODULE:loop(Cpid, Data);
+ {From, info} ->
+ SocketType =
+ case Data#eldap.ldaps of
+ true ->
+ ssl;
+ false ->
+ tcp
+ end,
+ Res = #{socket => Data#eldap.fd, socket_type => SocketType},
+ send(From, Res),
+ ?MODULE:loop(Cpid, Data);
+
{Cpid, 'EXIT', Reason} ->
?PRINT("Got EXIT from Cpid, reason=~p~n",[Reason]),
exit(Reason);
@@ -618,7 +638,6 @@ loop(Cpid, Data) ->
end.
-
%%% --------------------------------------------------------------------
%%% startTLS Request
%%% --------------------------------------------------------------------
diff --git a/lib/eldap/test/eldap_basic_SUITE.erl b/lib/eldap/test/eldap_basic_SUITE.erl
index 5fa6d4ca69..2b26ed52bd 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_socket_info/1,
search_filter_and/1,
search_filter_and_not/1,
search_filter_equalityMatch/1,
@@ -63,6 +64,7 @@
search_extensible_match_without_dn/1,
search_paged_results/1,
ssl_connection/1,
+ ssl_conn_socket_info/1,
start_tls_on_ssl_should_fail/1,
start_tls_twice_should_fail/1,
tcp_connection/1,
@@ -81,8 +83,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 +161,9 @@ connection_tests() ->
client_side_bind_timeout,
client_side_add_timeout,
client_side_search_timeout,
- close_after_tcp_error
+ close_after_tcp_error,
+ ssl_conn_socket_info,
+ plain_ldap_socket_info
].
@@ -259,7 +263,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_socket_info ->
case proplists:get_value(ssl_available,Config) of
true ->
SSL_Port = 9999,
@@ -423,6 +427,35 @@ ssl_connection(Config) ->
end.
%%%----------------------------------------------------------------
+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),
+ SSLOpts = proplists:get_value(ssl_connect_opts, Config),
+ case eldap:open([Host], [{port,Port},
+ {ssl,true},
+ {timeout,5000},
+ {sslopts,SSLOpts}|Opts]) of
+ {ok,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.
+
+%%%----------------------------------------------------------------
+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(#{socket := _, socket_type := tcp},
+ eldap:info(H));
+ Other -> ct:fail("eldap:open failed: ~p",[Other])
+ end.
+
+%%%----------------------------------------------------------------
client_side_add_timeout(Config) ->
client_timeout(
fun(H) ->