private OMVSD.OSD PostHandler(RestHandler handler, Uri uri, String after, OMVSD.OSD body) { try { OMVSD.OSDMap mapBody = (OMVSD.OSDMap)body; m_log.Log(LogLevel.DCOMMDETAIL, "PostHandler: received chat '{0}'", mapBody["Message"]); // collect parameters and send it to the simulator string msg = Uri.UnescapeDataString(mapBody["Message"].AsString().Replace("+", " ")); OMVSD.OSD channelString = new OMVSD.OSDString("0"); mapBody.TryGetValue("Channel", out channelString); int channel = Int32.Parse(channelString.AsString()); OMVSD.OSD typeString = new OMVSD.OSDString("Normal"); mapBody.TryGetValue("Type", out typeString); OMV.ChatType chatType = OpenMetaverse.ChatType.Normal; if (typeString.AsString().Equals("Whisper")) { chatType = OMV.ChatType.Whisper; } if (typeString.AsString().Equals("Shout")) { chatType = OMV.ChatType.Shout; } m_comm.GridClient.Self.Chat(msg, channel, chatType); // echo my own message back for the log and chat window /* NOTE: Don't have to do this. The simulator echos it back * OMV.ChatEventArgs cea = new OpenMetaverse.ChatEventArgs(m_comm.GridClient.Network.CurrentSim, * msg, * OpenMetaverse.ChatAudibleLevel.Fully, * chatType, * OpenMetaverse.ChatSourceType.Agent, * m_comm.GridClient.Self.Name, * OMV.UUID.Zero, * OMV.UUID.Zero, * m_comm.GridClient.Self.RelativePosition); * this.Self_ChatFromSimulator(this, cea); */ } catch (Exception e) { m_log.Log(LogLevel.DCOMM, "ERROR PARSING CHAT MESSAGE: {0}", e); } // the return value does not matter return(new OMVSD.OSDMap()); }
/// <summary> /// Uses reflection to deserialize member variables in an object from /// an SDMap /// </summary> /// <param name="obj">Reference to an object to fill with deserialized /// values</param> /// <param name="serialized">Serialized values to put in the target /// object</param> public static void DeserializeMembers(ref object obj, OSDMap serialized) { Type t = obj.GetType(); FieldInfo[] fields = t.GetFields(); foreach (FieldInfo field in fields) { if (!Attribute.IsDefined(field, typeof(NonSerializedAttribute))) { OSD serializedField; if (serialized.TryGetValue(field.Name, out serializedField)) { field.SetValue(obj, ToObject(field.FieldType, serializedField)); } } } }
private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) { m_log.DebugFormat("[SPECIAL UI]: OnSimulatorFeaturesRequest in {0}", m_scene.RegionInfo.RegionName); if (m_Helper.UserLevel(agentID) <= m_UserLevel) { OSD extrasMap; OSDMap specialUI = new OSDMap(); using (StreamReader s = new StreamReader(Path.Combine(VIEWER_SUPPORT_DIR, "panel_toolbar.xml"))) { if (!features.TryGetValue("OpenSimExtras", out extrasMap)) { extrasMap = new OSDMap(); features["OpenSimExtras"] = extrasMap; } specialUI["toolbar"] = OSDMap.FromString(s.ReadToEnd()); ((OSDMap)extrasMap)["special-ui"] = specialUI; } m_log.DebugFormat("[SPECIAL UI]: Sending panel_toolbar.xml in {0}", m_scene.RegionInfo.RegionName); if (Directory.Exists(Path.Combine(VIEWER_SUPPORT_DIR, "Floaters"))) { OSDMap floaters = new OSDMap(); uint n = 0; foreach (String name in Directory.GetFiles(Path.Combine(VIEWER_SUPPORT_DIR, "Floaters"), "*.xml")) { using (StreamReader s = new StreamReader(name)) { string simple_name = Path.GetFileNameWithoutExtension(name); OSDMap floater = new OSDMap(); floaters[simple_name] = OSDMap.FromString(s.ReadToEnd()); n++; } } specialUI["floaters"] = floaters; m_log.DebugFormat("[SPECIAL UI]: Sending {0} floaters", n); } } else { m_log.DebugFormat("[SPECIAL UI]: NOT Sending panel_toolbar.xml in {0}", m_scene.RegionInfo.RegionName); } }
private void UpdateInventoryItemAsset(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map, byte atype, bool taskSript = false) { m_log.Debug("[CAPS]: UpdateInventoryItemAsset Request in region: " + m_regionName + "\n"); httpResponse.StatusCode = (int)HttpStatusCode.OK; UUID itemID = UUID.Zero; UUID objectID = UUID.Zero; try { if (map.TryGetValue("item_id", out OSD itmp)) { itemID = itmp; } if (map.TryGetValue("task_id", out OSD tmp)) { objectID = tmp; } } catch { } if (itemID == UUID.Zero) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "failed to recode request"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } if (objectID != UUID.Zero) { SceneObjectPart sop = m_Scene.GetSceneObjectPart(objectID); if (sop == null) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "object not found"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } if (!m_Scene.Permissions.CanEditObjectInventory(objectID, m_AgentID)) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "No permissions to edit objec"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } } string uploaderPath = GetNewCapPath(); string protocol = m_HostCapsObj.SSLCaps ? "https://" : "http://"; string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + uploaderPath; LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse(); uploadResponse.uploader = uploaderURL; uploadResponse.state = "upload"; ItemUpdater uploader = new ItemUpdater(itemID, objectID, atype, uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile); uploader.m_remoteAdress = httpRequest.RemoteIPEndPoint.Address; uploader.OnUpLoad += ItemUpdated; var uploaderHandler = new SimpleBinaryHandler("POST", uploaderPath, uploader.process); uploaderHandler.MaxDataSize = 10000000; // change per asset type? m_HostCapsObj.HttpListener.AddSimpleStreamHandler(uploaderHandler); // m_log.InfoFormat("[CAPS]: UpdateAgentInventoryAsset response: {0}", // LLSDHelpers.SerialiseLLSDReply(uploadResponse))); httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(uploadResponse)); }
/// <summary> /// Called by the script task update handler. Provides a URL to which the client can upload a new asset. /// </summary> /// <param name="httpRequest">HTTP request header object</param> /// <param name="httpResponse">HTTP response header object</param> /// <returns></returns> public void UpdateScriptTaskInventory(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map) { httpResponse.StatusCode = (int)HttpStatusCode.OK; try { //m_log.Debug("[CAPS]: ScriptTaskInventory Request in region: " + m_regionName); //m_log.DebugFormat("[CAPS]: request: {0}, path: {1}, param: {2}", request, path, param); UUID itemID = UUID.Zero; UUID objectID = UUID.Zero; bool is_script_running = false; UUID experience_key = UUID.Zero; OSD tmp; try { if (map.TryGetValue("item_id", out tmp)) { itemID = tmp; } if (map.TryGetValue("task_id", out tmp)) { objectID = tmp; } if (map.TryGetValue("is_script_running", out tmp)) { is_script_running = tmp; } if (map.TryGetValue("experience", out tmp)) { experience_key = tmp; } } catch { } if (itemID == UUID.Zero || objectID == UUID.Zero) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "failed to recode request"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } SceneObjectPart sop = m_Scene.GetSceneObjectPart(objectID); if (sop == null) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "object not found"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } if (!m_Scene.Permissions.CanEditObjectInventory(objectID, m_AgentID)) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "No permissions to edit objec"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } if (!m_Scene.Permissions.CanEditScript(itemID, objectID, m_AgentID)) { LLSDAssetUploadError error = new LLSDAssetUploadError(); error.message = "No permissions to edit script"; error.identifier = UUID.Zero; httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); return; } string uploaderPath = GetNewCapPath(); string protocol = m_HostCapsObj.SSLCaps ? "https://" : "http://"; string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + uploaderPath; LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse(); uploadResponse.uploader = uploaderURL; uploadResponse.state = "upload"; TaskInventoryScriptUpdater uploader = new TaskInventoryScriptUpdater(itemID, objectID, is_script_running, experience_key, uploaderPath, m_HostCapsObj.HttpListener, httpRequest.RemoteIPEndPoint.Address, m_dumpAssetsToFile); uploader.OnUpLoad += TaskScriptUpdated; var uploaderHandler = new SimpleBinaryHandler("POST", uploaderPath, uploader.process); uploaderHandler.MaxDataSize = 10000000; // change per asset type? m_HostCapsObj.HttpListener.AddSimpleStreamHandler(uploaderHandler); // m_log.InfoFormat("[CAPS]: " + // "ScriptTaskInventory response: {0}", // LLSDHelpers.SerialiseLLSDReply(uploadResponse))); httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(uploadResponse)); } catch (Exception e) { m_log.Error("[UpdateScriptTaskInventory]: " + e.ToString()); } }
public void FetchInventoryDescendentsRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, ExpiringKey <UUID> BadRequests) { //m_log.DebugFormat("[XXX]: FetchInventoryDescendentsRequest in {0}, {1}", (m_Scene == null) ? "none" : m_Scene.Name, request); List <LLSDFetchInventoryDescendents> folders = null; List <UUID> bad_folders = new List <UUID>(); try { OSDArray foldersrequested = null; OSD tmp = OSDParser.DeserializeLLSDXml(httpRequest.InputStream); httpRequest.InputStream.Dispose(); OSDMap map = (OSDMap)tmp; if (map.TryGetValue("folders", out tmp) && tmp is OSDArray) { foldersrequested = tmp as OSDArray; } if (foldersrequested == null || foldersrequested.Count == 0) { httpResponse.RawBuffer = EmptyResponse; return; } folders = new List <LLSDFetchInventoryDescendents>(foldersrequested.Count); for (int i = 0; i < foldersrequested.Count; i++) { OSDMap mfolder = foldersrequested[i] as OSDMap; UUID id = mfolder["folder_id"].AsUUID(); if (BadRequests.ContainsKey(id)) { bad_folders.Add(id); } else { LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents(); try { llsdRequest.folder_id = id; llsdRequest.owner_id = mfolder["owner_id"].AsUUID(); llsdRequest.sort_order = mfolder["sort_order"].AsInteger(); llsdRequest.fetch_folders = mfolder["fetch_folders"].AsBoolean(); llsdRequest.fetch_items = mfolder["fetch_items"].AsBoolean(); } catch (Exception e) { m_log.Debug("[WEB FETCH INV DESC HANDLER]: caught exception doing OSD deserialize" + e.Message); continue; } folders.Add(llsdRequest); } } foldersrequested = null; map.Clear(); map = null; } catch (Exception e) { m_log.ErrorFormat("[FETCH INV DESC]: fail parsing request: {0}", e.Message); httpResponse.RawBuffer = EmptyResponse; return; } if (folders == null || folders.Count == 0) { if (bad_folders.Count == 0) { httpResponse.RawBuffer = EmptyResponse; return; } StringBuilder sb = osStringBuilderCache.Acquire(); sb.Append("[WEB FETCH INV DESC HANDLER]: Unable to fetch folders owned by "); sb.Append("Unknown"); sb.Append(" :"); int limit = 5; int count = 0; foreach (UUID bad in bad_folders) { if (BadRequests.ContainsKey(bad)) { continue; } sb.Append(" "); sb.Append(bad.ToString()); ++count; if (--limit < 0) { break; } } if (count > 0) { if (limit < 0) { sb.Append(" ..."); } m_log.Warn(osStringBuilderCache.GetStringAndRelease(sb)); } else { osStringBuilderCache.Release(sb); } sb = osStringBuilderCache.Acquire(); sb.Append("<llsd><map><key>folders</key><array /></map><map><key>bad_folders</key><array>"); foreach (UUID bad in bad_folders) { sb.Append("<map><key>folder_id</key><uuid>"); sb.Append(bad.ToString()); sb.Append("</uuid><key>error</key><string>Unknown</string></map>"); } sb.Append("</array></map></llsd>"); httpResponse.RawBuffer = Util.UTF8NBGetbytes(osStringBuilderCache.GetStringAndRelease(sb)); return; } int total_folders = 0; int total_items = 0; UUID requester = folders[0].owner_id; List <InventoryCollection> invcollSet = Fetch(folders, bad_folders, ref total_folders, ref total_items); //m_log.DebugFormat("[XXX]: Got {0} folders from a request of {1}", invcollSet.Count, folders.Count); int invcollSetCount = 0; if (invcollSet != null) { invcollSetCount = invcollSet.Count; } int mem = 8192 + ((256 * invcollSetCount + 384 * total_folders + 1024 * total_items + 128 * bad_folders.Count) & 0x7ffff000); StringBuilder lastresponse = new StringBuilder(mem); lastresponse.Append("<llsd>"); if (invcollSetCount > 0) { lastresponse.Append("<map><key>folders</key><array>"); int i = 0; InventoryCollection thiscoll; for (i = 0; i < invcollSetCount; i++) { thiscoll = invcollSet[i]; invcollSet[i] = null; LLSDxmlEncode.AddMap(lastresponse); LLSDxmlEncode.AddElem("agent_id", thiscoll.OwnerID, lastresponse); LLSDxmlEncode.AddElem("descendents", thiscoll.Descendents, lastresponse); LLSDxmlEncode.AddElem("folder_id", thiscoll.FolderID, lastresponse); if (thiscoll.Folders == null || thiscoll.Folders.Count == 0) { LLSDxmlEncode.AddEmptyArray("categories", lastresponse); } else { LLSDxmlEncode.AddArray("categories", lastresponse); foreach (InventoryFolderBase invFolder in thiscoll.Folders) { LLSDxmlEncode.AddMap(lastresponse); LLSDxmlEncode.AddElem("folder_id", invFolder.ID, lastresponse); LLSDxmlEncode.AddElem("parent_id", invFolder.ParentID, lastresponse); LLSDxmlEncode.AddElem("name", invFolder.Name, lastresponse); LLSDxmlEncode.AddElem("type", invFolder.Type, lastresponse); LLSDxmlEncode.AddElem("preferred_type", (int)-1, lastresponse); LLSDxmlEncode.AddElem("version", invFolder.Version, lastresponse); LLSDxmlEncode.AddEndMap(lastresponse); } LLSDxmlEncode.AddEndArray(lastresponse); } if (thiscoll.Items == null || thiscoll.Items.Count == 0) { LLSDxmlEncode.AddEmptyArray("items", lastresponse); } else { LLSDxmlEncode.AddArray("items", lastresponse); foreach (InventoryItemBase invItem in thiscoll.Items) { invItem.ToLLSDxml(lastresponse); } LLSDxmlEncode.AddEndArray(lastresponse); } LLSDxmlEncode.AddElem("owner_id", thiscoll.OwnerID, lastresponse); LLSDxmlEncode.AddElem("version", thiscoll.Version, lastresponse); LLSDxmlEncode.AddEndMap(lastresponse); invcollSet[i] = null; } lastresponse.Append("</array></map>"); thiscoll = null; } else { lastresponse.Append("<map><key>folders</key><array /></map>"); } if (bad_folders.Count > 0) { lastresponse.Append("<map><key>bad_folders</key><array>"); foreach (UUID bad in bad_folders) { BadRequests.Add(bad); lastresponse.Append("<map><key>folder_id</key><uuid>"); lastresponse.Append(bad.ToString()); lastresponse.Append("</uuid><key>error</key><string>Unknown</string></map>"); } lastresponse.Append("</array></map>"); StringBuilder sb = osStringBuilderCache.Acquire(); sb.Append("[WEB FETCH INV DESC HANDLER]: Unable to fetch folders owned by "); sb.Append(requester.ToString()); sb.Append(" :"); int limit = 9; foreach (UUID bad in bad_folders) { sb.Append(" "); sb.Append(bad.ToString()); if (--limit < 0) { break; } } if (limit < 0) { sb.Append(" ..."); } m_log.Warn(osStringBuilderCache.GetStringAndRelease(sb)); } lastresponse.Append("</llsd>"); httpResponse.RawBuffer = Util.UTF8NBGetbytes(lastresponse.ToString()); }
private void SetExtEnvironmentSettings(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID agentID, Caps caps) { bool success = false; string message = "Could not process request"; int parcel = -1; int track = -1; StringBuilder sb = LLSDxmlEncode.Start(); ScenePresence sp = m_scene.GetScenePresence(agentID); if (sp == null || sp.IsChildAgent || sp.IsNPC) { message = "Could not locate your avatar"; goto Error; } if (httpRequest.Query.Count > 0) { if (httpRequest.Query.ContainsKey("parcelid")) { if (!Int32.TryParse((string)httpRequest.Query["parcelid"], out parcel)) { message = "Failed to decode request"; goto Error; } } if (httpRequest.Query.ContainsKey("trackno")) { if (!Int32.TryParse((string)httpRequest.Query["trackno"], out track)) { message = "Failed to decode request"; goto Error; } } if (track != -1) { message = "Environment Track not supported"; goto Error; } } ViewerEnvironment VEnv = m_scene.RegionEnvironment; ILandObject lchannel; if (parcel == -1) { if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false)) { message = "Insufficient estate permissions, settings has not been saved."; goto Error; } VEnv = m_scene.RegionEnvironment; lchannel = null; } else { lchannel = m_landChannel.GetLandObject(parcel); if (lchannel == null || lchannel.LandData == null) { message = "Could not locate requested parcel"; goto Error; } if (!m_scene.Permissions.CanEditParcelProperties(agentID, lchannel, (GroupPowers.AllowEnvironment | GroupPowers.LandEdit), true)) // wrong { message = "No permission to change parcel environment"; goto Error; } VEnv = lchannel.LandData.Environment; } try { OSD req = OSDParser.Deserialize(httpRequest.InputStream); if (req is OpenMetaverse.StructuredData.OSDMap) { OSDMap map = req as OpenMetaverse.StructuredData.OSDMap; if (map.TryGetValue("environment", out OSD env)) { if (VEnv == null) { // need a proper clone VEnv = m_DefaultEnv.Clone(); } OSDMap evmap = (OSDMap)env; if (evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle")) { string id = tmp.AsString(); AssetBase asset = m_assetService.Get(id); if (asset == null || asset.Data == null || asset.Data.Length == 0) { httpResponse.StatusCode = (int)HttpStatusCode.NotFound; return; } try { OSD oenv = OSDParser.Deserialize(asset.Data); VEnv.CycleFromOSD(oenv); } catch { httpResponse.StatusCode = (int)HttpStatusCode.NotFound; return; } } VEnv.FromOSD(env); if (lchannel == null) { StoreOnRegion(VEnv); m_log.InfoFormat("[{0}]: ExtEnvironment region {1} settings from agentID {2} saved", Name, caps.RegionName, agentID); } else { lchannel.StoreEnvironment(VEnv); m_log.InfoFormat("[{0}]: ExtEnvironment parcel {1} of region {2} settings from agentID {3} saved", Name, parcel, caps.RegionName, agentID); } WindlightRefresh(0, lchannel == null); success = true; } } else if (req is OSDArray) { VEnv = new ViewerEnvironment(); VEnv.FromWLOSD(req); StoreOnRegion(VEnv); success = true; WindlightRefresh(0); m_log.InfoFormat("[{0}]: ExtEnvironment region {1} settings from agentID {2} saved", Name, caps.RegionName, agentID); LLSDxmlEncode.AddMap(sb); LLSDxmlEncode.AddElem("messageID", UUID.Zero, sb); LLSDxmlEncode.AddElem("regionID", regionID, sb); LLSDxmlEncode.AddElem("success", success, sb); LLSDxmlEncode.AddEndMap(sb); httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDxmlEncode.End(sb)); httpResponse.StatusCode = (int)HttpStatusCode.OK; return; } } catch (Exception e) { m_log.ErrorFormat("[{0}]: ExtEnvironment settings not saved for region {1}, Exception: {2} - {3}", Name, caps.RegionName, e.Message, e.StackTrace); success = false; message = String.Format("ExtEnvironment Set for region {0} has failed, settings not saved.", caps.RegionName); } Error: string response; LLSDxmlEncode.AddMap(sb); LLSDxmlEncode.AddElem("success", success, sb); if (!success) { LLSDxmlEncode.AddElem("message", message, sb); } LLSDxmlEncode.AddEndMap(sb); response = LLSDxmlEncode.End(sb); httpResponse.RawBuffer = Util.UTF8NBGetbytes(response); httpResponse.StatusCode = (int)HttpStatusCode.OK; }