Using basically the rexxref.pdf example in "Chapter 13. The Security Manager".
Here is the program ("agent.rex") that should run under the control of a
security manager:
/* Agent, cf. rexxref.pdf, "Chapter 13. The Security Manager */ "echo Hello
There" -- a command
call rxfuncadd "rxcalcsqrt", "rxmath", "rxcalcsqrt" -- external function say
"result:" result --
access a variable call syssleep 0.5 -- external call line =
linein("./profile") -- access stream
BIF say .error -- access .local say .methods -- access .environment
.json~define("") -- access
.environment t = .test~new -- access .context~package~local t~hello --
access an unprotected
method t~myProtectedMethod -- access protected method ::requires json.cls --
about to require
::class test -- a Test class ::method "myProtectedMethod" protected -- can
be supervised say
self": method named" .context~name ::method "hello" -- cannot be supervised say
self": hello!"
The above program contains all the supervised operations including the requires directive for which
rexxref.pdf states:
"REQUIRES
sent whenever a ::REQUIRES directive in the file is processed. The
information directory contains
the following entry:
NAME
The name of the file specified on the ::REQUIRES directive.
When the REQUIRES method returns .false, indicating that it handled the
request, the
entry NAME in the information directory is used as the actual file to load
for the request. The
REQUIRES method can also provide a security manager to be used for the
program loaded by
the ::REQUIRES directive by setting the information directory entry
SECURITYMANAGER to the
desired security manager object."
However, it seems that the REQUIRES message gets never sent!
Here the code monitoring all messages that the security manager receives, using
.routine's fromFile:
parse arg program -- fetch program to run supervised
routine=.Routine~newFile(program) -- create
routine object routine~setSecurityManager(.monitoringSupervisor~new)
routine~call -- execute
program ::class monitoringSupervisor ::method unknown -- intercept all
messages use arg
methName, methArgs infoDir=methArgs[1] -- get the information directory call
show
methName,infoDir return .true -- let runtime execute operation ::routine
show use arg name, dir
str="" do idx over dir~allIndexes~sort if str="" then str= idx"='"dir[idx]"'" else
str=str","
idx"='"dir[idx]"'" end say "checkpoint" left('"'name'" ',13,".") str
Here the code monitoring all messages that the seucrity manager receives, using .method's fromFile
method:
parse arg program -- fetch program to run supervised
meth=.Method~newFile(program) -- create
routine object meth~setSecurityManager(.monitoringSupervisor~new)
.Agent~new(meth) -- execute
program ::class agent -- class to allow sueprvised method to run ::method
init use arg meth --
fetch method object self~run(meth) -- run method object ::class
monitoringSupervisor ::method
unknown -- intercept all messages use arg methName, methArgs
infoDir=methArgs[1] -- get the
information directory call show methName,infoDir return .true -- let runtime
execute operation
::routine show use arg name, dir str="" do idx over dir~allIndexes~sort if
str="" then str=
idx"='"dir[idx]"'" else str=str"," idx"='"dir[idx]"'" end say "checkpoint"
left('"'name'"
',13,".") str
Running either with the following command their output gives:
E:\WU\securityManager>*monitorAsRoutine.rex agent.rex*
checkpoint*"COMMAND"* ... ADDRESS='CMD', COMMAND='echo Hello There'
result: 0
checkpoint*"CALL"* ...... ARGUMENTS='0.5', NAME='SYSSLEEP'
checkpoint*"STREAM"* ....
NAME='E:\WU\Lehrveranstaltungen\Materialien\BP1_AutoWin\090_ooRexx_advanced_code\securityManager\profile'
checkpoint*"LOCAL"* ..... NAME='ERROR'
The ERROR monitor
checkpoint*"LOCAL"* ..... NAME='METHODS'
checkpoint*"ENVIRONMENT"* NAME='METHODS'
.METHODS
checkpoint*"METHOD"* .... ARGUMENTS='', NAME='DEFINE', OBJECT='The JSON
class'
a TEST: hello!
checkpoint*"METHOD"* .... ARGUMENTS='', NAME='MYPROTECTEDMETHOD', OBJECT='a
TEST'
E:\WU\securityManager>*monitorAsMethod.rex agent.rex*
checkpoint*"COMMAND"* ... ADDRESS='CMD', COMMAND='echo Hello There'
result: 0
checkpoint*"CALL"* ...... ARGUMENTS='0.5', NAME='SYSSLEEP'
checkpoint*"STREAM"* ....
NAME='E:\WU\Lehrveranstaltungen\Materialien\BP1_AutoWin\090_ooRexx_advanced_code\securityManager\profile'
checkpoint*"LOCAL"* ..... NAME='ERROR'
The ERROR monitor
checkpoint*"LOCAL"* ..... NAME='METHODS'
checkpoint*"ENVIRONMENT"* NAME='METHODS'
.METHODS
checkpoint*"METHOD"* .... ARGUMENTS='', NAME='DEFINE', OBJECT='The JSON
class'
a TEST: hello!
checkpoint*"METHOD"* .... ARGUMENTS='', NAME='MYPROTECTEDMETHOD', OBJECT='a
TEST'
Unlike all other security manager methods, the security manager method
"REQUIRES" never gets triggered!
Is there a solution to this problem, and if so, what would it be?
---rony
_______________________________________________
Oorexx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oorexx-devel