[Opensim-dev] Test before you call OSSL function

Mike Higgins mike at kayaker.net
Sun Oct 13 08:25:32 UTC 2019


I am trying to write a new OSSL function osPermissionToCall(string 
function_name)

I want to be able to call this function before calling other OSSL 
functions to find out if I can call them. Then I can give meaningful 
error messages to the users of a script, or use alternate functions. 
Without a test-before-calling, most of the OSSL functions SPAM EVERY 
AVATAR IN THE REGION with an ANGRY RED ERROR MESSAGE on the DEBUG_CHANNEL.

In OSSL_Api.cs there is a function CheckThreatLevelTest(ThreatLevel 
level, string function). I thought this would be the solution, but it is 
lacking. I know because I already wrote and tested a new OSSL function 
that calls CheckThreatLevelTest and it does not work right for this purpose.

Each OSSL function calls this check with a hard-coded threat level in 
the first argument, and its string name in the second. For example:

CheckThreatLevel(ThreatLevel.Moderate, "osGetGridName");

Each OSSL function is required to know what its threat level and string 
name are and to send those to CheckThreatLevel (which calls 
CheckThreatLevelTest to do the test). There is no database, table, ini 
file or xml file that knows what the threat level is for each function, 
how many functions there are or what their names are. 
CheckThreatLevelTest builds a cache in a Dictionary named 
m_FunctionPerms but it only stores the avatars, creators and classes 
that are allowed to call it, and only if those things are mentioned in 
the ini files.

If a function is not mentioned in the ini files, it is added to the 
dictionary cache with default Allow everyone, and only the threat level 
is used to determine if it can be called. Since you don't know the 
threat level of each function, there is no way to find out before hand 
except to call it and get an exception if it is not allowed. When an 
exception happens, every avatar in a region is spammed a red error 
message on the DEBUG_CHANNEL. This is very annoying.

If you ask about a function that does not exist, (like “osTickleBunny”) 
it is added to the Dictionary with Allow all. Since it doesn't have a 
threat level it will always test OK to call. This means you cannot use 
CheckThreatLevelTest to test to see if a function exists in your version 
of OpenSim.

What can be done about this? One solution would be to add the threat 
level of each function to the ini files. The OSSL functions would no 
longer need to know their threat level. During initialization, 
OSSL_Api.cs would iterate over all the names in the [OSSL] section of 
the ini structure and pre-populate the Dictionary. The ini file would 
need to have new lines added to declare the threat level of each OSSL 
function. If a function does not have a threat level line, it is assumed 
to be THREAT LEVEL SEVERE. The CheckThreatLevelTest function would be 
greatly simplified since it would not have to populate the Dictionary 
on-the-fly. If an OSSL function is not mentioned in the ini files, it is 
treated as a non-existing function and cannot be called. Then my 
osPermissionToCall() function could be written to check the Dictionary 
for the existence and permission levels of an OSSL function.

The problems with this solution, and why they are easy to overcome, are:

1) Everyone would be encouraged to upgrade to a new ini file with threat 
level lines added. The Master branch has and uses a file named 
osslEnable.ini that has default Allow permissions and could be upgraded 
to have the new lines. The distribution kit that OSGrid builds already 
includes a copy of that file and would get the new one from Master.

2) People who do not upgrade to this file may notice that all OSSL 
functions are down-graded to threat level SEVERE. Since the threat level 
is only used when an OSSL function does not have an Allow line in the 
osslEnable.ini file, and existing copies of that file do have Allow 
lines for most of the functions, people still using the old 
osslEnable.ini file might never notice.

3) Some regions, like the LBSA Plaza region on OSGrid for example, do 
not use the osslEnable.ini file at all and depend solely on the current 
hard-wired threat levels. They will be unable to call any OSSL functions 
and need to start including the osslEnable.ini file.

4) People who have carefully edited their osslEnable.ini files to 
control who can use each OSSL function would have to carefully merge 
their old osslEnable.ini file with the new one. This is a recommended 
procedure with all new versions of OpenSim anyway.

5) There is a group of OSSL functions that do not call CheckThreatLevel. 
These functions will continue to work as is with the old osslEnable.ini 
file. However, my proposed osPermissionToCall function depends on the 
ini file to populate the list of functions. It would return a false 
negative if anyone asked it about these always-safe-to-call functions 
with the old ini file. Since nobody is calling my new function yet, most 
people would not notice. Those that do notice, can upgrade to the new 
osslEnable.ini file which would have a line for each of these 
always-safe functions.





More information about the Opensim-dev mailing list