World: r3wp
[Core] Discuss core issues
older newer | first last |
Pekr 6-Jan-2006 [3082] | regarding security - can I somehow, for my client, generate .exe, which will have directly lowered security? We simply want to automate packing/upacking archives, to allow user to choose source and destination dir .... surely we don't want to answer security dialog each time ... |
Volker 6-Jan-2006 [3083x2] | rebol -s switches security off. |
encap should not have it on, or? | |
Pekr 6-Jan-2006 [3085] | not in rebol ... |
JaimeVargas 6-Jan-2006 [3086] | Geomol. Yes. I am the author. |
Pekr 6-Jan-2006 [3087x2] | I mean - someone has incorrectly installed rebol and runs scripts by pressing enter in Total commander :-) |
so I thought I can disable it directly in the script, to overcome requester :-) | |
Rebolek 6-Jan-2006 [3089] | what's wrong with running scripts from TC? |
Volker 6-Jan-2006 [3090x2] | you can do secure none That asks on start and then all requesters etc are free. |
Kru: no -s -option. | |
Rebolek 6-Jan-2006 [3092] | ok |
Pekr 6-Jan-2006 [3093] | I don't want to answer any question :-) |
Volker 6-Jan-2006 [3094x2] | but making a shortcut or menu-entry instead, is that to difficult? |
Then encap? | |
Pekr 6-Jan-2006 [3096] | I will simply accept the rule that I should not develop outside my sandbox, or it gets denerving :-) |
Volker 6-Jan-2006 [3097x4] | Or the cruel trick: put script in c:\ . then everything is in a subfolder. except of the 25 other letters. |
I personally like the requesters. Its so easy to accidentally click. Then i can say "No dont delete this!" | |
(click and launch one of these half-baked test-script i mean) | |
For that total commander: is a bat to terrible? | |
Pekr 6-Jan-2006 [3101] | ah, bat could be a solution, yes, thanks ... |
MichaelB 6-Jan-2006 [3102] | Jaime: I checked your code above: first I thought it's not possible, then I thought wow, but I got one thing left that doesn't work: You're using the 'class word to bind the code of the functions of an object later to the right object - this doesn't work, because 'class is always bound to the function context and thus has the last object referenced - in your example no problem, because the code is the same - but with different code doesn't work anymore - maybe with one of the closures it would work - because 'class gets always bound to a new context (but I'm not sure yet whether I understand it right) CounterClass2: context [ d: 0 bump2: does [d: d + 1] read2: does [d] bump-by2: func [inc][d: d + inc] ] ctr1: make-instance CounterClass ctr2: make-instance CounterClass2 ctr1/bump ctr1/bump ctr1/read ctr2/bump2 ctr2/read2 fails, because at ctr1/bump, class is bound to object CounterClass2 which has only bump2 so if this gets sorted out - it seams to be really difficult to access the hidden contexts (or impossible, because after invoking the function the contexts are gone) |
JaimeVargas 6-Jan-2006 [3103x5] | Humm. This is strange. Let me check it here. |
Solved. See below. | |
make-instance: func [ class [object!] /local class-vars instance-data class-methods v ][ class-vars: copy [*-private-*] class-methods: copy [] instance-data: copy [] foreach w next first class [ either function! = type? v: get in class :w [ append class-methods compose/deep [ (to set-word! :w) func [(first :v)] [ bind second get in (:class) (to lit-word! :w) '*-private-* do reduce [get in (:class) (to lit-word! :w) (first :v)] ] ] ][ append class-vars :w append instance-data reduce [to set-word! :w :v] ] ] use class-vars compose/deep [ (instance-data) context [(class-methods)] ] ] | |
The beaty of this is that you are able to change a class method, changing the behaviour of all instances at the same time. | |
While the private state vars are kept private, and current. | |
MichaelB 6-Jan-2006 [3108x2] | yes - that's good now. I just have to try to access the object in malicous ways - if it's not possible then this is the first time I see (doesn't have to mean anything of course) completely hidden data of an object. |
So we could make some rules how to make data completely invisible: a) all words to be used later have to be used indirect via words in the function (like the traversing of the objects words via [foreach w next first 'object ... ] b) if that's not possible the words used in the function (if they expose any context) have to be cleaned by a use which doesn't return the context b) is actually the really smart thing to me - the 'use and the returning of the new context in 'use - so one can't catch the 'use context and get the words with the usual means | |
JaimeVargas 6-Jan-2006 [3110] | Howver there is a way to access the private ctx. It is leave as an exercise to the reader. |
Volker 6-Jan-2006 [3111x2] | If you have access to a function-body you can get the values of all words. Still it is a lot obfuscated. |
Oops. Saw your last posting was to late, sorry. | |
JaimeVargas 6-Jan-2006 [3113] | I actually there is a way to improve this which will make it 100% secure, but it will lose a different property. |
MichaelB 6-Jan-2006 [3114] | Ok, me as the reader is searching then, at least it's not too obvious or I'm too blind today. :-) |
JaimeVargas 6-Jan-2006 [3115] | ;-) |
MichaelB 6-Jan-2006 [3116] | ctr1/read == 2 >> ctr1/bump == 3 bl: [c] == [c] >> f: get in ctr1 'read >> o: third tenth second :f >> bind bl first second get in o 'read == [c] >> set first bl 12 == 12 >> ctr1/read == 12 :-) But how you want to prevent this ? I mean what property you talked about would get lost ? |
JaimeVargas 6-Jan-2006 [3117] | Good job. The property lost will be the ability to change a class method and propagating the new behaviour to all instances at the same time. |
MichaelB 6-Jan-2006 [3118] | Just saw - a little bit easier would have been to do it with *-private-*. |
JaimeVargas 6-Jan-2006 [3119] | Now you got it completely. That is the backdoor. |
Volker 6-Jan-2006 [3120] | I have access to global context, can patch functions there (which you use - or?) and traverse everything. Hmm, could clone all meazines and never return. then the only reference is from the stack, which is not traversable. |
MichaelB 6-Jan-2006 [3121x2] | behavior change: you mean by copying the code and hiding it in a 'use ? |
or something like that ? | |
JaimeVargas 6-Jan-2006 [3123] | Yes. |
MichaelB 6-Jan-2006 [3124] | That's my problem with Rebol, on the one side I hate this vulnerability, on the other side it's so nice to be able to bind around like wished. |
JaimeVargas 6-Jan-2006 [3125x3] | Well ObjC allows you to bind to anything and instrospect anything. So I think is all is good. |
Here is the safe version: | |
CounterClass: context [ c: 0 bump: does [c: c + 1] read: does [c] bump-by: func [inc][c: c + inc] ] make-instance: func [ class /local class-vars instance-data class-methods v ][ class-vars: copy [*-private-*] class-methods: copy [] instance-data: copy [] foreach w next first class [ either function! = type? v: get in class :w [ append class-methods compose/deep [ (to set-word! :w) func [(third :v)] [ (bind copy second get in class (to lit-word! :w) '*-private-*) ] ] ][ append class-vars :w append instance-data reduce [to set-word! :w :v] ] ] use class-vars compose/deep [ (instance-data) context [(class-methods)] ] ] ctr1: make-instance CounterClass ctr2: make-instance CounterClass ctr1/bump ctr1/bump ctr1/read ctr2/bump ctr2/read | |
MichaelB 6-Jan-2006 [3128] | I didn't know this - thought always only a highly dynamic language would allow this - but never watched ObjC - thought it's also kind of C++ - just that they went into a different direction at some point, more pure OO. |
Volker 6-Jan-2006 [3129] | The object-part is quite smalltalk afaik. Only they skip the bytecode-interpreter and "inline" the calls to c. |
JaimeVargas 6-Jan-2006 [3130] | Correct. |
MichaelB 6-Jan-2006 [3131] | unfortunately easier: :-( so my thoughts seamed to be wrong as well f: get in ctr1 'read >> ctr1/read == 2 >> set first second :f 12 == 12 >> ctr1/read == 12 |
older newer | first last |