diff --git a/Sources/pyOpenRPA/Orchestrator/ServerSettings.py b/Sources/pyOpenRPA/Orchestrator/ServerSettings.py index eaf44acf..d6c7878c 100644 --- a/Sources/pyOpenRPA/Orchestrator/ServerSettings.py +++ b/Sources/pyOpenRPA/Orchestrator/ServerSettings.py @@ -10,14 +10,88 @@ import time # sleep functions import datetime # datetime functions import threading # Multi-threading +# Generate CP +# Return {"Key":{"",""}} +def HiddenCPDictGenerate(inRequest, inGSettings): + lL = inGSettings["Logger"] # Alias for logger + # Create result JSON + lCPDict = {} + lRenderFunctionsRobotList = inGSettings["ControlPanelDict"]["RobotList"] + for lItem in lRenderFunctionsRobotList: + lUACBool = True # Check if render function is applicable User Access Rights (UAC) + if inGSettings["Server"]["AccessUsers"]["FlagCredentialsAsk"] is True: + lUserRights = inGSettings["Server"]["AccessUsers"]["RuleDomainUserDict"][(inRequest.OpenRPA["Domain"].upper(), inRequest.OpenRPA["User"].upper())] + if len(lUserRights["ControlPanelKeyAllowedList"]) > 0 and lItem["KeyStr"] not in lUserRights["ControlPanelKeyAllowedList"]: + lUACBool = False # UAC Check is not passed - False for user + if lUACBool: # Run function if UAC is TRUE + # Выполнить вызов и записать результат + # Call def (inRequest, inGSettings) or def (inGSettings) + lItemResultDict = None + lDEFSignature = signature(lItem["RenderFunction"]) # Get signature of the def + lDEFARGLen = len(lDEFSignature.parameters.keys()) # get count of the def args + try: + if lDEFARGLen == 1: # def (inGSettings) + lItemResultDict = lItem["RenderFunction"](inGSettings) + elif lDEFARGLen == 2: # def (inRequest, inGSettings) + lItemResultDict = lItem["RenderFunction"](inRequest, inGSettings) + elif lDEFARGLen == 0: # def () + lItemResultDict = lItem["RenderFunction"]() + # RunFunction + # lResultJSON["RenderRobotList"].append(lItemResultDict) + lCPDict[lItem["KeyStr"]] = lItemResultDict + except Exception as e: + if lL: lL.exception(f"Error in control panel. CP item {lItem}. Exception is below") + return lCPDict + +# Return {"Key":{"",""}} +def HiddenRDPDictGenerate(inRequest, inGSettings): + lRDPDict = {} + # Iterate throught the RDP list + for lRDPSessionKeyStrItem in inGSettings["RobotRDPActive"]["RDPList"]: + lRDPConfiguration = inGSettings["RobotRDPActive"]["RDPList"][ + lRDPSessionKeyStrItem] # Get the configuration dict + lDataItemDict = {"SessionKeyStr": "", "SessionHexStr": "", "IsFullScreenBool": False, + "IsIgnoredBool": False} # Template + lDataItemDict["SessionKeyStr"] = lRDPSessionKeyStrItem # Session key str + lDataItemDict["SessionHexStr"] = lRDPConfiguration["SessionHex"] # Session Hex + lDataItemDict["IsFullScreenBool"] = True if lRDPSessionKeyStrItem == inGSettings["RobotRDPActive"][ + "FullScreenRDPSessionKeyStr"] else False # Check the full screen for rdp window + lDataItemDict["IsIgnoredBool"] = lRDPConfiguration["SessionIsIgnoredBool"] # Is ignored + lRDPDict[lDataItemDict["SessionKeyStr"]].append(lDataItemDict) + return lRDPDict + #v1.2.0 Send data container to the client from the server # /pyOpenRPA/ServerData return {"HashStr" , "ServerDataDict"} # Client: mGlobal.pyOpenRPA.ServerDataHashStr # Client: mGlobal.pyOpenRPA.ServerDataDict def pyOpenRPA_ServerData(inRequest,inGSettings): - lResult = {"HashStr": "", "ServerDataDict": {}} + # Extract the hash value from request + lValueStr = None + if inRequest.headers.get('Content-Length') is not None: + lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) + lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) + # Превращение массива байт в объект + lValueStr = (lInputByteArray.decode('utf8')) + # Generate ServerDataDict + lFlagDoGenerateBool = True + while lFlagDoGenerateBool: + lServerDataDict = { + "CPDict": HiddenCPDictGenerate(inRequest=inRequest, inGSettings=inGSettings), + "RDPDict": HiddenRDPDictGenerate(inRequest=inRequest, inGSettings=inGSettings), + "UserDict": {} + } + # Create JSON + lServerDataDictJSONStr = json.dumps(lServerDataDict) + # Generate hash + lServerDataHashStr = str(hash(lServerDataDictJSONStr)) + if lValueStr!=lServerDataHashStr: # Case if Hash is not equal + lFlagDoGenerateBool = False + else: # Case Hashes are equal + time.sleep(inGSettings["Client"]["Session"]["ControlPanelRefreshIntervalSecFloat"]) + # Return the result if Hash is changed + lResult = {"HashStr": lServerDataHashStr, "ServerDataDict": lServerDataDict} return lResult diff --git a/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py b/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py index 0b88f61d..85f501d7 100644 --- a/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py +++ b/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py @@ -103,7 +103,8 @@ def __Create__(): # "ResponseContentType": "", #HTTP Content-type # "ResponseDefRequestGlobal": None #Function with str result } - ] + ], + }, "OrchestratorStart": { "DefSettingsUpdatePathList": [],