From 1b6ba5283e4980da7bd5f1d98b5518062a4c61ad Mon Sep 17 00:00:00 2001 From: David Kupka Date: Oct 12 2016 08:42:24 +0000 Subject: UnsafeIPAddress: Implement __(g|s)etstate__ and to ensure proper (un)pickling Missing attributes in instance created by pickle.load cause AttributeError in second part of ipa-server-install --external-ca. https://fedorahosted.org/freeipa/ticket/6385 Reviewed-By: Martin Basti Reviewed-By: Jan Cholasta --- diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index 2418088..e444ab1 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -125,6 +125,17 @@ class UnsafeIPAddress(netaddr.IPAddress): super(UnsafeIPAddress, self).__init__(addr, flags=self.netaddr_ip_flags) + def __getstate__(self): + state = { + '_net': self._net, + 'super_state': super(UnsafeIPAddress, self).__getstate__(), + } + return state + + def __setstate__(self, state): + super(UnsafeIPAddress, self).__setstate__(state['super_state']) + self._net = state['_net'] + class CheckedIPAddress(UnsafeIPAddress): """IPv4 or IPv6 address with additional constraints. @@ -200,6 +211,17 @@ class CheckedIPAddress(UnsafeIPAddress): self.prefixlen = self._net.prefixlen + def __getstate__(self): + state = { + 'prefixlen': self.prefixlen, + 'super_state': super(CheckedIPAddress, self).__getstate__(), + } + return state + + def __setstate__(self, state): + super(CheckedIPAddress, self).__setstate__(state['super_state']) + self.prefixlen = state['prefixlen'] + def is_network_addr(self): return self == self._net.network