On Fri, Dec 12, 2008 at 12:45:27PM +0000, Malthe Borch wrote:
Martijn Pieters wrote:
The C extension is required to make messageids immutable. Because they are immutable, the security machinery can treat them as rocks, e.g. safe to pass around. Removing the C-extension undoes this, as you cannot make truely immutable.
I believe it is possible to do this in pure Python:
I have doubts about that, but I don't think I'm smart enough to consider all the security implications.
We'll set up a security-proxied global dictionary ``messages`` that maps
object_id of message -> weakref(message)
Then, the ``Message`` class would roughly look like this:
class Message(unicode):
def __new__(...): self = unicode.__new__(...)
messages = removeSecurityProxy(messages)
messages[id(self)] = (default, domain, mapping)
Careful: id(some_object) will likely be reused when the old object is garbage collected.
@property def default(self): return messages[id(self)][0]
The message data is effectively immutable, since the ``messages`` dictionary is security-proxied.
To make sure the message properties are persisted along with the message, we must override the __reduce__-method to maintain the ``messages`` dict upon load.
-- http://pov.lt/ -- Zope 3 consulting and development