Le 12/01/2013 23:54, Nathan Wall a écrit :
David Bruant wrote:
Leaking the information that the node is actually a proxy is due to a
DOM API issue (which is way way too late to fix obviously).
If you want proxied node to go in the tree, you'll need to find an
answer to the issue Boris Zbarsky brought up about selector matching
[1]. I've given up [2], but I'm curious to know if there is a decent
solution.
I have an idea, but I'm going to think through it some more and possibly post 
it as a separate reply later to keep this reply more focused.
I'm looking forward to it :-)

Thinking a bit more about how A and B can share things, I'm realizing
that anytime they want to share a private symbol, they have to do it
through a "capturable" channel (set trap value argument, etc.). So if A
and B are in touch, the membrane could capture all private symbols going
from one side to the other and add it to the membrane whitelist. This
way, anytime there is a communication attempt via private symbols, the
private symbol is known and the non-unknownPrivateSymbol trap is called.
In theory, it makes the unknownPrivateSymbol not absolutely necessary
for this use case.
In practice, to capture all communication, anytime the membranes
intercept a new symbol, it needs to make sure it wasn't used on any
other object previously shared between both parties and that means
traversing entire graphs of objects which may be an enormous amount of
work degrading performance.
I'm also not a big fan of retroffiting control afterwards.
Ok, I think I understand now.

Here's how I'm imagining it: So if A shares object O with B, the membrane may 
wrap O in proxy P. O may have a private symbol properties M and N, where the 
property for symbol M actually points to symbol N:

     let O = { },
         M = new Symbol(true/* private */),
         N = new Symbol(true/* private */);
     O[M] = N;
     O[N] = null;

When A shares O with B, the membrane will not be able to see either one of 
these symbols.
Exactly.

Let's assume no `unknownPrivateSymbol` trap.

The objects cannot yet communicate without the membrane knowing because B does 
not know O's private symbols.

Later if A shares private symbol M with B, the membrane will intercept the 
symbol and add it to the whitelist before passing it along. Now the membrane 
knows about M but it can only learn about N by searching all previous 
communications for M. The membrane could in theory discover N by searching 
previous communications for M and finding N in O.
That's the scenario I had in mind.

I agree with you though that this is a pretty huge overhead for the membrane to 
have to do, so let's look for another way.

If the membrane fails to search O for M, then B can discover N under-the-hood 
-- that is, B gets access to a private symbol that the membrane doesn't have on 
its whitelist.
Yes. And suddenly A and B can communicate together in ways they aren't supposed to.

However, what if the membrane, instead of passing along M, creates a new 
private symbol M2, and this is the actual symbol shared with B. Now if B checks 
O for property M2 it will not be able to uncover the symbol N.  The membrane 
adds M2 to its whitelist and anytime B tries to send M2 back to A, the membrane 
converts it to M (and vice versa). Therefore, A always sees only symbol M and B 
always sees only symbol M2.

Does this work and allow us to do without `unknownPrivateSymbol`?
I don't think this work. It's important to share the same private symbol, very much like it's important that if O has a "foo" property, it has a "foo" property in both A and B contexts and not "fooa" in one and "foob" in the other.

(An even easier alternative is that the membrane could prevent sharing private 
symbols.)
I don't think that's an option because there are legitimate use cases of private symbols with proxies.

David
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to