> diff --git a/src/python/openvpn3/SessionManager.py
> b/src/python/openvpn3/SessionManager.py
> index 3632790..1a567be 100644
> --- a/src/python/openvpn3/SessionManager.py
> +++ b/src/python/openvpn3/SessionManager.py
> @@ -114,6 +114,7 @@ def __init__(self, dbuscon, objpath):
>          self.__log_callback = None
>          self.__status_callback = None
>          self.__deleted = False
> +        self.__log_forward_enabled = False
>
>
>      def __del__(self):
> @@ -291,16 +292,11 @@ def LogCallback(self, cbfnc):
>
> dbus_interface='net.openvpn.v3.backends',
>                                                 bus_name='net.openvpn.v3.log',
>                                                 path=self.__session_path)
> -            self.__session_intf.LogForward(True)
>          else:
> -            try:
> -                self.__session_intf.LogForward(False)
> -            except dbus.exceptions.DBusException:
> -                # If this fails, the session is typically already removed
> -                pass
>              self.__dbuscon.remove_signal_receiver(self.__log_callback, 'Log')
>              self.__log_callback = None

Oops, this code unconditionally removes the callback, even if there
isn't currently a callback. The code below in StatusChangeCallback
first checks if there is currently a callback registered before removing
it. If `self.__dbuscon.remove_signal_receiver` is resilient to getting
passed None values for callbacks, then I suppose would could skip the
check and just unconditionally remove the callback.
Let me know what's best.

>
> +        self.__set_log_forward()
>
>      ##
>      #  Subscribes to the StatusChange signals for this session and register
> @@ -318,10 +314,14 @@ def StatusChangeCallback(self, cbfnc):
>                                                 bus_name='net.openvpn.v3.log',
>                                                 path=self.__session_path)
>          else:
> -            self.__dbuscon.remove_signal_receiver(self.__status_callback,
> -                                                  'StatusChange')
> -            self.__status_callback = None
> +            # Only remove the callback if there actually *is* a callback
> +            # currently.
> +            if self.__status_callback is not None:
> +                self.__dbuscon.remove_signal_receiver(self.__status_callback,
> +                                                      'StatusChange')
> +                self.__status_callback = None
>
> +        self.__set_log_forward()
>
>
>      ##
> @@ -417,6 +417,30 @@ def GetDCO(self):
>      def SetDCO(self, dco):
>          self.__prop_intf.Set('net.openvpn.v3.sessions', 'dco', dco)
>
> +    ##
> +    #  Internal method to enable/disable LogForward as needed.
> +    #  Must be called whenever a callback that needs LogForward enabled is
> +    #  added or removed.
> +    #
> +    def __set_log_forward(self):
> +        # The LogCallback and the StatusChangeCallback both need LogForward
> +        # enabled. In other words, LogForward should be enabled iff one or 
> both
> +        # of those callbacks are registered.
> +        should_log_forward_be_enabled = (
> +            self.__log_callback is not None or self.__status_callback
> is not None
> +        )
> +
> +        if should_log_forward_be_enabled and not self.__log_forward_enabled:
> +            self.__session_intf.LogForward(True)
> +            self.__log_forward_enabled = True
> +        elif not should_log_forward_be_enabled and 
> self.__log_forward_enabled:
> +            try:
> +                self.__session_intf.LogForward(False)
> +            except dbus.exceptions.DBusException:
> +                # If this fails, the session is typically already removed
> +                pass
> +
> +            self.__log_forward_enabled = False
>
>
>  ##


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to