From: Cedric BAIL Date: Fri, 29 Sep 2017 23:01:02 +0000 (-0700) Subject: ecore_con: simplify Efl.Net.Server.Ssl by inheriting from Efl.Net.Server.Tcp. X-Git-Tag: submit/sandbox/upgrade/efl120/20180319.053334~2402 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=871b6ac0ad4c6553150fadfe8555f6db75187de5;p=platform%2Fupstream%2Fefl.git ecore_con: simplify Efl.Net.Server.Ssl by inheriting from Efl.Net.Server.Tcp. --- diff --git a/src/examples/ecore/efl_net_server_example.c b/src/examples/ecore/efl_net_server_example.c index 1129f02..943bf41 100644 --- a/src/examples/ecore/efl_net_server_example.c +++ b/src/examples/ecore/efl_net_server_example.c @@ -702,9 +702,9 @@ main(int argc, char **argv) efl_net_server_ssl_context_set(server, ssl_ctx); - efl_net_server_ssl_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */ - efl_net_server_ssl_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */ - if (socket_activated) efl_net_server_ssl_socket_activate(server, address); + efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */ + efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */ + if (socket_activated) efl_net_server_fd_socket_activate(server, address); } #ifdef EFL_NET_SERVER_UNIX_CLASS else if (cls == EFL_NET_SERVER_UNIX_CLASS) diff --git a/src/examples/ecore/efl_net_server_simple_example.c b/src/examples/ecore/efl_net_server_simple_example.c index d3b0b93..d0d3c9d 100644 --- a/src/examples/ecore/efl_net_server_simple_example.c +++ b/src/examples/ecore/efl_net_server_simple_example.c @@ -509,9 +509,9 @@ main(int argc, char **argv) efl_net_server_ssl_context_set(server, ssl_ctx); - efl_net_server_ssl_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */ - efl_net_server_ssl_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */ - if (socket_activated) efl_net_server_ssl_socket_activate(server, address); + efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */ + efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */ + if (socket_activated) efl_net_server_fd_socket_activate(server, address); } #ifdef EFL_NET_SERVER_UNIX_CLASS else if (cls == EFL_NET_SERVER_UNIX_CLASS) diff --git a/src/lib/ecore_con/ecore_con_legacy.c b/src/lib/ecore_con/ecore_con_legacy.c index 9fb417e..1e04ae6 100644 --- a/src/lib/ecore_con/ecore_con_legacy.c +++ b/src/lib/ecore_con/ecore_con_legacy.c @@ -1526,9 +1526,7 @@ _ecore_con_server_server_set(Ecore_Con_Server *svr, Eo *server) else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS)) { /* old ecore_con did not map ipv4 to ipv6... */ - efl_net_server_ssl_ipv6_only_set(inner_server, EINA_TRUE); - efl_net_server_ssl_reuse_address_set(inner_server, EINA_TRUE); - efl_net_server_ssl_reuse_port_set(inner_server, EINA_TRUE); + efl_net_server_ip_ipv6_only_set(inner_server, EINA_TRUE); } #ifdef EFL_NET_SERVER_UNIX_CLASS else if (efl_isa(inner_server, EFL_NET_SERVER_UNIX_CLASS)) @@ -1542,8 +1540,6 @@ _ecore_con_server_server_set(Ecore_Con_Server *svr, Eo *server) { if (efl_isa(inner_server, EFL_NET_SERVER_FD_CLASS)) efl_net_server_fd_socket_activate(inner_server, address); - else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS)) - efl_net_server_ssl_socket_activate(inner_server, address); else { ERR("svr=%p (%s): not able to socket-activate this type!", svr, efl_class_name_get(inner_server)); diff --git a/src/lib/ecore_con/efl_net_server_ssl.c b/src/lib/ecore_con/efl_net_server_ssl.c index 551980d..d9b8953 100644 --- a/src/lib/ecore_con/efl_net_server_ssl.c +++ b/src/lib/ecore_con/efl_net_server_ssl.c @@ -81,18 +81,29 @@ _efl_net_server_ssl_efl_net_server_client_announce(Eo *o, Efl_Net_Server_Ssl_Dat } static void -_efl_net_server_ssl_tcp_client_add(void *data, const Efl_Event *event) +_efl_net_server_ssl_efl_net_server_fd_client_add(Eo *o, Efl_Net_Server_Ssl_Data *pd, int client_fd) { - Eo *o = data; - Efl_Net_Server_Ssl_Data *pd = efl_data_scope_get(o, MY_CLASS); Eo *client_ssl; - Eo *client_tcp = event->info; - const char *addr = efl_net_socket_address_remote_get(client_tcp); + Eo *client_tcp; + const char *addr; + + client_tcp = efl_add(EFL_NET_SOCKET_TCP_CLASS, o, + efl_io_closer_close_on_exec_set(efl_added, efl_net_server_fd_close_on_exec_get(o)), + efl_io_closer_close_on_destructor_set(efl_added, EINA_TRUE), + efl_loop_fd_set(efl_added, client_fd)); + if (!client_tcp) + { + ERR("could not create client object fd=" SOCKET_FMT, (SOCKET)client_fd); + closesocket(client_fd); + return; + } + addr = efl_net_socket_address_remote_get(client_tcp); if (!pd->ssl_ctx) { ERR("ssl server %p rejecting client %p '%s' since no SSL context was set!", o, client_tcp, addr); efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, (void *)addr); + efl_del(client_tcp); return; } @@ -102,52 +113,31 @@ _efl_net_server_ssl_tcp_client_add(void *data, const Efl_Event *event) { ERR("ssl server %p could not wrap client %p '%s' using context=%p", o, client_tcp, addr, pd->ssl_ctx); efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, (void *)addr); + efl_del(client_tcp); return; } efl_net_server_client_announce(o, client_ssl); } -static void -_efl_net_server_ssl_tcp_client_rejected(void *data, const Efl_Event *event) -{ - Eo *o = data; - char *client = event->info; - efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, client); -} - -static void -_efl_net_server_ssl_tcp_error(void *data, const Efl_Event *event) -{ - Eo *o = data; - Eina_Error *perr = event->info; - efl_event_callback_call(o, EFL_NET_SERVER_EVENT_ERROR, perr); -} - -static void -_efl_net_server_ssl_tcp_serving(void *data, const Efl_Event *event EINA_UNUSED) -{ - Eo *o = data; - efl_event_callback_call(o, EFL_NET_SERVER_EVENT_SERVING, NULL); -} - -EFL_CALLBACKS_ARRAY_DEFINE(_efl_net_server_ssl_tcp_cbs, - { EFL_NET_SERVER_EVENT_CLIENT_ADD, _efl_net_server_ssl_tcp_client_add }, - { EFL_NET_SERVER_EVENT_CLIENT_REJECTED, _efl_net_server_ssl_tcp_client_rejected }, - { EFL_NET_SERVER_EVENT_ERROR, _efl_net_server_ssl_tcp_error }, - { EFL_NET_SERVER_EVENT_SERVING, _efl_net_server_ssl_tcp_serving }); - EOLIAN Efl_Object * _efl_net_server_ssl_efl_object_constructor(Eo *o, Efl_Net_Server_Ssl_Data *pd) { o = efl_constructor(efl_super(o, MY_CLASS)); if (!o) return NULL; - pd->server = efl_add(EFL_NET_SERVER_TCP_CLASS, o, - efl_event_callback_array_add(efl_added, _efl_net_server_ssl_tcp_cbs(), o)); + pd->server = efl_add(EFL_NET_SERVER_TCP_CLASS, o); EINA_SAFETY_ON_NULL_RETURN_VAL(pd->server, NULL); + if (!efl_composite_attach(o, pd->server)) + goto on_error; return o; + + on_error: + ERR("Failed to composite the object\n"); + efl_del(pd->server); + efl_del(o); + return NULL; } static void @@ -195,103 +185,4 @@ _efl_net_server_ssl_ssl_context_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data * return pd->ssl_ctx; } -EOLIAN static Eina_Error -_efl_net_server_ssl_socket_activate(Eo *o, Efl_Net_Server_Ssl_Data *pd, const char *address) -{ - EINA_SAFETY_ON_TRUE_RETURN_VAL(efl_net_server_serving_get(o), EALREADY); - EINA_SAFETY_ON_NULL_RETURN_VAL(address, EINVAL); - return efl_net_server_fd_socket_activate(pd->server, address); -} - -EOLIAN static Eina_Error -_efl_net_server_ssl_efl_net_server_serve(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, const char *address) -{ - return efl_net_server_serve(pd->server, address); -} - -EOLIAN static const char * -_efl_net_server_ssl_efl_net_server_address_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_address_get(pd->server); -} - -EOLIAN static unsigned int -_efl_net_server_ssl_efl_net_server_clients_count_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_clients_count_get(pd->server); -} - -EOLIAN static void -_efl_net_server_ssl_efl_net_server_clients_limit_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, unsigned int limit, Eina_Bool reject_excess) -{ - efl_net_server_clients_limit_set(pd->server, limit, reject_excess); -} - -EOLIAN static void -_efl_net_server_ssl_efl_net_server_clients_limit_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, unsigned int *limit, Eina_Bool *reject_excess) -{ - efl_net_server_clients_limit_get(pd->server, limit, reject_excess); -} - -EOLIAN static Eina_Bool -_efl_net_server_ssl_efl_net_server_serving_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_serving_get(pd->server); -} - -EOLIAN int -_efl_net_server_ssl_family_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_fd_family_get(pd->server); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_close_on_exec_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool close_on_exec) -{ - return efl_net_server_fd_close_on_exec_set(pd->server, close_on_exec); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_close_on_exec_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_fd_close_on_exec_get(pd->server); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_reuse_address_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool reuse_address) -{ - return efl_net_server_fd_reuse_address_set(pd->server, reuse_address); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_reuse_address_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_fd_reuse_address_get(pd->server); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_reuse_port_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool reuse_port) -{ - return efl_net_server_fd_reuse_port_set(pd->server, reuse_port); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_reuse_port_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_fd_reuse_port_get(pd->server); -} - -EOLIAN void -_efl_net_server_ssl_ipv6_only_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool ipv6_only) -{ - efl_net_server_ip_ipv6_only_set(pd->server, ipv6_only); -} - -EOLIAN Eina_Bool -_efl_net_server_ssl_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd) -{ - return efl_net_server_ip_ipv6_only_get(pd->server); -} - - #include "efl_net_server_ssl.eo.c" diff --git a/src/lib/ecore_con/efl_net_server_ssl.eo b/src/lib/ecore_con/efl_net_server_ssl.eo index 52f8bcf..b906b04 100644 --- a/src/lib/ecore_con/efl_net_server_ssl.eo +++ b/src/lib/ecore_con/efl_net_server_ssl.eo @@ -1,4 +1,4 @@ -class Efl.Net.Server.Ssl (Efl.Loop_User, Efl.Net.Server) { +class Efl.Net.Server.Ssl (Efl.Net.Server.Tcp) { [[A SSL server over TCP. @since 1.19 @@ -17,131 +17,12 @@ class Efl.Net.Server.Ssl (Efl.Loop_User, Efl.Net.Server) { ssl_context: Efl.Net.Ssl.Context; [[SSL context]] } } - - socket_activate { - [[If this method is called use an already activated socket. - - This method allows a server to use an existing socket - received from systemd or similar system. - - It will replace @Efl.Net.Server.serve, thus if this is - used, that method will return EALREADY. - - \@note The parameter 'address' given to this function is - only used to validate the next socket available, it - doesn't search for a socket with the given address. Thus - the socket to be used is the next unused and orders - matter is using multiple servers! - - Errors: - - - EALREADY: already have a socket, either from - previous @.socket_activate or - @Efl.Net.Server.serve. Usually represents a - programming error. - - - ENOENT: no sockets received from process manager - (ie: systemd). Usually this is not a fatal error, - just proceed by calling @Efl.Net.Server.serve - - - EINVAL: the socket received is not of the correct - family, type or protocol. Usually this means a - configuration mismatch with the order of server - creation and calls to socket_activate. The - systemd.socket entries must match the order in your - application. - ]] - params { - address: string; [[The address to validate the next available socket. It doesn't serve as search, only as validation!]] - } - return: Eina.Error; [[0 on success, ENOENT if no socket is available or EALREADY if already have a socket]] - } - - @property family { - [[The address family (AF_*) family of this socket. - - It will be one of AF_INET (IPv4) or AF_INET6 (IPv6). - ]] - get { } - values { - family: int; [[Socket address family]] - } - } - - @property close_on_exec { - [[Controls Close-on-Exec() using FD_CLOEXEC. - - Children socket will inherit the server's setting by - default. One can change the behavior using each instance - @Efl.Io.Closer.close_on_exec.set. Defaults to $true. - ]] - get { } - set { - return: bool (false); [[$true on success]] - } - values { - close_on_exec: bool; [[If $true close on exec will be used, $false otherwise]] - } - } - - @property reuse_address { - [[Controls address reuse() using SO_REUSEADDR]] - get { } - set { - return: bool (false); [[$true on success]] - } - values { - reuse_address: bool; [[If $true the server will reuse the address, $false otherwise]] - } - } - - @property reuse_port { - [[Controls port reuse() using SO_REUSEPORT (since linux 3.9)]] - get { } - set { - return: bool (false); [[$true on success]] - } - values { - reuse_port: bool; [[If $true the server will reuse the port, $false otherwise]] - } - } - - @property ipv6_only { - [[Whenever IPv6 listen address will accept only same-family clients or will allow IPv4 to connect as well. - - Since Linux 2.4.21, Windows Vista and MacOS X these - control whenever a server that did bind to an IPv6 - address will accept only IPv6 clients or will also - accept IPv4 by automatically converting them in an IPv6 - address, allowing a single socket to handle both - protocols. - - If an IPv6 address was used in @Efl.Net.Server.address, - this property is $false and an IPv4 connects, then an - address such as [::ffff:IPv4]:PORT will be used, such as - [::ffff:192.168.0.2]:1234, where the IPv4 address can be - extracted. - - If an IPv4 address was used in @Efl.Net.Server.address, - this has no effect. - - Systems can configure their default value, usually true - (allows only IPv6 clients). - ]] - values { - ipv6_only: bool; [[If $true the server will only accept IPv6 clients, $false otherwise]] - } - } } implements { Efl.Object.constructor; Efl.Object.destructor; - Efl.Net.Server.serve; Efl.Net.Server.client_announce; - Efl.Net.Server.address { get; } - Efl.Net.Server.clients_count { get; } - Efl.Net.Server.clients_limit { get; set; } - Efl.Net.Server.serving { get; } + Efl.Net.Server.Fd.client_add; } } diff --git a/src/lib/ecore_ipc/ecore_ipc.c b/src/lib/ecore_ipc/ecore_ipc.c index 4b092a1..913ad3a 100644 --- a/src/lib/ecore_ipc/ecore_ipc.c +++ b/src/lib/ecore_ipc/ecore_ipc.c @@ -490,13 +490,6 @@ ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void /* old ecore_con did not map ipv4 to ipv6... */ efl_net_server_ip_ipv6_only_set(svr->server, EINA_TRUE); } - else if (efl_isa(svr->server, EFL_NET_SERVER_SSL_CLASS)) - { - /* old ecore_con did not map ipv4 to ipv6... */ - efl_net_server_ssl_ipv6_only_set(svr->server, EINA_TRUE); - efl_net_server_ssl_reuse_address_set(svr->server, EINA_TRUE); - efl_net_server_ssl_reuse_port_set(svr->server, EINA_TRUE); - } #ifdef EFL_NET_SERVER_UNIX_CLASS if (efl_isa(svr->server, EFL_NET_SERVER_UNIX_CLASS))