From 37f47683b3416d05c04d68e9898c19a95f3d4e8f Mon Sep 17 00:00:00 2001
From: Christopher <git@clatza.dev>
Date: Wed, 27 May 2020 15:28:23 +0200
Subject: [PATCH] Add os commands similar to experience data storage Add
 similar os commands to llReadKeyValue llCreateKeyValue llDeleteKeyValue ==
 osGetDataValue osSetDataValue osDeleteDataValue and osCheckDataValue

---
 .../Shared/Api/Implementation/OSSL_Api.cs     | 149 ++++++++++++++++++
 .../Shared/Api/Interface/IOSSL_Api.cs         |  10 ++
 .../Shared/Api/Runtime/OSSL_Stub.cs           |  40 +++++
 bin/config-include/osslDefaultEnable.ini      |   4 +
 4 files changed, 203 insertions(+)

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 8289dec2e7..197fde3a01 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -42,8 +42,10 @@ using System;
 using System.Collections;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.IO;
 using System.Reflection;
 using System.Runtime.Remoting.Lifetime;
+using System.Security.Cryptography;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading;
@@ -948,6 +950,153 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return false;
         }
 
+        public string osGetDataValue(string key)
+        {
+            return osGetDataValue(key, false);
+        }
+
+        public string osGetDataValue(string key, bool personal)
+        {
+            CheckThreatLevel(ThreatLevel.Moderate, "osGetDataValue");
+
+            string dataValueDirectory = m_ScriptEngine.ConfigSource.Configs["XEngine"].GetString("DataValueStorageDirectory", "./ScriptDataValue");
+
+            String groupFolderName = m_host.GroupID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if(personal)
+                groupFolderName = m_host.OwnerID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (!Directory.Exists(dataValueDirectory))
+                Directory.CreateDirectory(dataValueDirectory);
+
+            if (!Directory.Exists(dataValueDirectory + "/" + groupFolderName))
+                Directory.CreateDirectory(dataValueDirectory + "/" + groupFolderName);
+
+            try
+            {
+                string keyMD = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCIIEncoding.ASCII.GetBytes(key.Trim().ToUpper()))).Replace("-", "");
+                FileInfo file = new FileInfo(dataValueDirectory + "/" + groupFolderName + "/" + keyMD + ".txt");
+
+                if (file.Exists)
+                    return File.ReadAllText(file.FullName);
+            }
+            catch (Exception _error)
+            {
+                Console.WriteLine(_error.Message);
+            }
+
+            return "";
+        }
+
+        public void osSetDataValue(string key, string value)
+        {
+            osSetDataValue(key, value, false);
+        }
+
+        public void osSetDataValue(string key, string value, bool personal)
+        {
+            CheckThreatLevel(ThreatLevel.Moderate, "osSetDataValue");
+
+            string dataValueDirectory = m_ScriptEngine.ConfigSource.Configs["XEngine"].GetString("DataValueStorageDirectory", "./ScriptDataValue");
+
+            String groupFolderName = m_host.GroupID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (personal)
+                groupFolderName = m_host.OwnerID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (!Directory.Exists(dataValueDirectory))
+                Directory.CreateDirectory(dataValueDirectory);
+
+            if (!Directory.Exists(dataValueDirectory + "/" + groupFolderName))
+                Directory.CreateDirectory(dataValueDirectory + "/" + groupFolderName);
+
+            try
+            {
+                string keyMD = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCIIEncoding.ASCII.GetBytes(key.Trim().ToUpper()))).Replace("-", "");
+                FileInfo file = new FileInfo(dataValueDirectory + "/" + groupFolderName + "/" + keyMD + ".txt");
+
+                File.WriteAllText(file.FullName, value);
+            }
+            catch (Exception _error)
+            {
+                Console.WriteLine(_error.Message);
+            }
+        }
+
+        public void osDeleteDataValue(string key)
+        {
+            osDeleteDataValue(key, false);
+        }
+
+        public void osDeleteDataValue(string key, bool personal)
+        {
+            CheckThreatLevel(ThreatLevel.Moderate, "osDeleteDataValue");
+
+            string dataValueDirectory = m_ScriptEngine.ConfigSource.Configs["XEngine"].GetString("DataValueStorageDirectory", "./ScriptDataValue");
+
+            String groupFolderName = m_host.GroupID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (personal)
+                groupFolderName = m_host.OwnerID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (!Directory.Exists(dataValueDirectory))
+                Directory.CreateDirectory(dataValueDirectory);
+
+            if (!Directory.Exists(dataValueDirectory + "/" + groupFolderName))
+                Directory.CreateDirectory(dataValueDirectory + "/" + groupFolderName);
+
+            try
+            {
+                string keyMD = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCIIEncoding.ASCII.GetBytes(key.Trim().ToUpper()))).Replace("-", "");
+                FileInfo file = new FileInfo(dataValueDirectory + "/" + groupFolderName + "/" + keyMD + ".txt");
+
+                if (file.Exists)
+                    file.Delete();
+            }
+            catch (Exception _error)
+            {
+                Console.WriteLine(_error.Message);
+            }
+        }
+
+        public bool osCheckDataValue(string key)
+        {
+            return osCheckDataValue(key, false);
+        }
+
+        public bool osCheckDataValue(string key, bool personal)
+        {
+            CheckThreatLevel(ThreatLevel.Moderate, "osCheckDataValue");
+
+            string dataValueDirectory = m_ScriptEngine.ConfigSource.Configs["XEngine"].GetString("DataValueStorageDirectory", "./ScriptDataValue");
+
+            String groupFolderName = m_host.GroupID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (personal)
+                groupFolderName = m_host.OwnerID.ToString().Trim().ToUpper().Replace("-", "");
+
+            if (!Directory.Exists(dataValueDirectory))
+                Directory.CreateDirectory(dataValueDirectory);
+
+            if (!Directory.Exists(dataValueDirectory + "/" + groupFolderName))
+                Directory.CreateDirectory(dataValueDirectory + "/" + groupFolderName);
+
+            try
+            {
+                string keyMD = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCIIEncoding.ASCII.GetBytes(key.Trim().ToUpper()))).Replace("-", "");
+                FileInfo file = new FileInfo(dataValueDirectory + "/" + groupFolderName + "/" + keyMD + ".txt");
+
+                if (file.Exists)
+                    return true;
+            }
+            catch (Exception _error)
+            {
+                Console.WriteLine(_error.Message);
+            }
+
+            return false;
+        }
+
         public void osSetPrimFloatOnWater(int floatYN)
         {
             CheckThreatLevel(ThreatLevel.VeryLow, "osSetPrimFloatOnWater");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index e9aeda5f28..93dbc64366 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -142,6 +142,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
         void osRegionNotice(string msg);
         void osRegionNotice(LSL_Key agentID, string msg);
         bool osConsoleCommand(string Command);
+
+        string osGetDataValue(string key);
+        string osGetDataValue(string key, bool persoanl);
+        void osSetDataValue(string key, string value);
+        void osSetDataValue(string key, string value, bool personal);
+        void osDeleteDataValue(string key);
+        void osDeleteDataValue(string key, bool personal);
+        bool osCheckDataValue(string key);
+        bool osCheckDataValue(string key, bool personal);
+
         void osSetParcelMediaURL(string url);
         void osSetPrimFloatOnWater(int floatYN);
         void osSetParcelSIPAddress(string SIPAddress);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 4bae45e392..55e911c6ae 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -235,6 +235,46 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
             return m_OSSL_Functions.osConsoleCommand(Command);
         }
 
+        public string osGetDataValue(string key)
+        {
+            return m_OSSL_Functions.osGetDataValue(key);
+        }
+
+        public string osGetDataValue(string key, bool personal)
+        {
+            return m_OSSL_Functions.osGetDataValue(key, personal);
+        }
+
+        public void osSetDataValue(string key, string value)
+        {
+            m_OSSL_Functions.osSetDataValue(key, value);
+        }
+
+        public void osSetDataValue(string key, string value, bool personal)
+        {
+            m_OSSL_Functions.osSetDataValue(key, value, personal);
+        }
+
+        public void osDeleteDataValue(string key)
+        {
+            m_OSSL_Functions.osDeleteDataValue(key);
+        }
+
+        public void osDeleteDataValue(string key, bool personal)
+        {
+            m_OSSL_Functions.osDeleteDataValue(key, personal);
+        }
+
+        public bool osCheckDataValue(string key)
+        {
+            return m_OSSL_Functions.osCheckDataValue(key);
+        }
+
+        public bool osCheckDataValue(string key, bool personal)
+        {
+            return m_OSSL_Functions.osCheckDataValue(key, personal);
+        }
+
         public void osSetParcelMediaURL(string url)
         {
             m_OSSL_Functions.osSetParcelMediaURL(url);
diff --git a/bin/config-include/osslDefaultEnable.ini b/bin/config-include/osslDefaultEnable.ini
index e66577dbcf..72885d9d30 100644
--- a/bin/config-include/osslDefaultEnable.ini
+++ b/bin/config-include/osslDefaultEnable.ini
@@ -146,6 +146,10 @@
   Allow_osSetOwnerSpeed =           ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
   Allow_osRequestURL =              ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
   Allow_osRequestSecureURL =        ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
+  Allow_osGetDataValue =            ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
+  Allow_osSetDataValue =            ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
+  Allow_osDeleteDataValue =         ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
+  Allow_osCheckDataValue =          ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
 
   ; ThreatLevel High
   Allow_osCauseDamage =             ${OSSL|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER
-- 
2.25.1.windows.1