bool IInventoryItemServiceInterface.TryGetValue(UUID key, out InventoryItem item)
        {
            item = default(InventoryItem);
            IValue         iv;
            HttpStatusCode statuscode;

            using (Stream s = new HttpClient.Get($"{m_CapabilityUri}item/{key}")
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest(out statuscode))
            {
                if (statuscode != HttpStatusCode.OK)
                {
                    return(false);
                }
                iv = LlsdXml.Deserialize(s);
            }
            var resmap = iv as Map;

            if (resmap == null)
            {
                throw new InvalidDataException("Wrong response received");
            }

            item = new InventoryItem(resmap["item_id"].AsUUID)
            {
                InventoryType = (InventoryType)resmap["inv_type"].AsInt,
                Description   = resmap["desc"].ToString(),
                Flags         = (InventoryFlags)resmap["flags"].AsUInt,
                CreationDate  = Date.UnixTimeToDateTime(resmap["created_at"].AsULong),
                AssetID       = resmap["asset_id"].AsUUID,
                AssetType     = (AssetType)resmap["type"].AsInt,
                Name          = resmap["name"].ToString()
            };
            var saleinfo = resmap["sale_info"] as Map;

            item.SaleInfo.Price = saleinfo["sale_price"].AsInt;
            item.SaleInfo.Type  = (InventoryItem.SaleInfoData.SaleType)saleinfo["sale_type"].AsInt;
            var perminfo = resmap["permissions"] as Map;

            item.Permissions.Base      = (InventoryPermissionsMask)perminfo["base_mask"].AsUInt;
            item.Permissions.Group     = (InventoryPermissionsMask)perminfo["group_mask"].AsUInt;
            item.LastOwner.ID          = perminfo["last_owner_id"].AsUUID;
            item.Owner.ID              = perminfo["owner_id"].AsUUID;
            item.Creator.ID            = perminfo["creator_id"].AsUUID;
            item.ParentFolderID        = resmap["parent_id"].AsUUID;
            item.Permissions.NextOwner = (InventoryPermissionsMask)perminfo["next_owner_mask"].AsUInt;
            item.Permissions.Current   = (InventoryPermissionsMask)perminfo["owner_mask"].AsUInt;
            item.Group.ID              = perminfo["group_id"].AsUUID;
            item.Permissions.EveryOne  = (InventoryPermissionsMask)perminfo["everyone_mask"].AsUInt;

            return(true);
        }
Exemple #2
0
        public HashtableApi.Hashtable CapsUpdateTaskInventory(ScriptInstance instance, string uri, LSLKey objectid, LSLKey itemid, string contentType, ByteArrayApi.ByteArray assetData)
        {
            HashtableApi.Hashtable res = new HashtableApi.Hashtable();
            lock (instance)
            {
                Map result;
                using (Stream s = new HttpClient.Post(uri,
                                                      new HttpClient.LlsdXmlRequest(new Map
                {
                    { "task_id", objectid.AsUUID },
                    { "item_id", itemid.AsUUID },
                }))
                {
                    TimeoutMs = 20000
                }.ExecuteStreamRequest())
                {
                    result = (Map)LlsdXml.Deserialize(s);
                }

                res["result"] = result["state"].ToString();
                if (result["state"].ToString() == "upload")
                {
                    string uploader_uri = res["uploader"].ToString();

                    using (Stream s = new HttpClient.Post(
                               uploader_uri,
                               contentType,
                               assetData.Length, (Stream sd) => sd.Write(assetData.Data, 0, assetData.Length))
                    {
                        TimeoutMs = 20000
                    }.ExecuteStreamRequest())
                    {
                        result = (Map)LlsdXml.Deserialize(s);
                    }
                    res["result"] = result["state"].ToString();
                    if (result["state"].ToString() == "complete")
                    {
                        res["assetid"] = new LSLKey(result["new_asset"].AsUUID);
                    }
                    if (result.ContainsKey("compiled"))
                    {
                        res["compiled"] = ((bool)result["compiled"].AsBoolean).ToLSLBoolean();
                    }
                    if (result.ContainsKey("errors"))
                    {
                        res.Add("errors", (AnArray)result["errors"]);
                    }
                }
            }

            return(res);
        }
        void IInventoryFolderServiceInterface.Add(InventoryFolder folder)
        {
            var m          = new Map();
            var categories = new AnArray();

            m.Add("categories", categories);
            var category = new Map();

            categories.Add(category);
            category.Add("name", folder.Name);
            category.Add("type_default", (int)folder.DefaultType);

            byte[] reqdata;
            using (var ms = new MemoryStream())
            {
                LlsdXml.Serialize(m, ms);
                reqdata = ms.ToArray();
            }

            IValue         res;
            HttpStatusCode statuscode;

            using (Stream sres = new HttpClient.Post(
                       $"{m_CapabilityUri}category/{folder.ParentFolderID}",
                       "application/llsd+xml",
                       reqdata.Length,
                       (Stream s) => s.Write(reqdata, 0, reqdata.Length))
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest(out statuscode))
            {
                if (statuscode != HttpStatusCode.Created)
                {
                    throw new InventoryFolderNotFoundException(folder.ParentFolderID);
                }
                res = LlsdXml.Deserialize(sres);
            }
            var resmap = res as Map;

            if (resmap == null)
            {
                throw new InvalidDataException();
            }

            var created_items = resmap["_created_categories"] as AnArray;

            if (created_items == null)
            {
                throw new InvalidDataException();
            }
            folder.ID = created_items[0].AsUUID;
        }
Exemple #4
0
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch
            {
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            if (!reqmap.ContainsKey("verb"))
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Invalid request");
                return;
            }
            switch (reqmap["verb"].ToString())
            {
            case "GET":
                HandleObjectMediaRequest(httpreq, reqmap);
                break;

            case "UPDATE":
                HandleObjectMediaUpdate(httpreq, reqmap);
                break;

            default:
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Invalid request");
                break;
            }
        }
        private void EnableSimCircuit(RegionInfo destinationInfo, out UUID sessionID, out uint circuitCode)
        {
            var reqmap = new Map
            {
                ["to_region_id"]   = destinationInfo.ID,
                ["from_region_id"] = ID
            };

            byte[] reqdata;
            using (var ms = new MemoryStream())
            {
                LlsdXml.Serialize(reqmap, ms);
                reqdata = ms.ToArray();
            }

            /* try DNS lookup before triggering add circuit code */
            IPAddress[] addresses = Dns.GetHostAddresses(destinationInfo.ServerIP);
            var         ep        = new IPEndPoint(addresses[0], (int)destinationInfo.ServerPort);

            Map resmap;

            using (var responseStream = new HttpClient.Post(
                       destinationInfo.ServerURI + "circuit",
                       "application/llsd+xml",
                       reqdata.Length,
                       (Stream s) => s.Write(reqdata, 0, reqdata.Length)).ExecuteStreamRequest())
            {
                resmap = (Map)LlsdXml.Deserialize(responseStream);
            }

            circuitCode = resmap["circuit_code"].AsUInt;
            sessionID   = resmap["session_id"].AsUUID;
            Neighbors[destinationInfo.ID].RemoteCircuit = UDPServer.UseSimCircuit(
                ep,
                sessionID,
                this,
                destinationInfo.ID,
                circuitCode,
                destinationInfo.Location,
                destinationInfo.Location - GridPosition);
            CheckAgentsForNeighbors();
        }
Exemple #6
0
        public HashtableApi.Hashtable SeedRequest(
            ScriptInstance instance,
            string seedCaps,
            AnArray elements)
        {
            lock (instance)
            {
                byte[] post;

                using (var ms = new MemoryStream())
                {
                    LlsdXml.Serialize(elements, ms);
                    post = ms.ToArray();
                }

                Map resdata;

                try
                {
                    using (Stream res = new HttpClient.Post(seedCaps, "application/llsd+xml", post.Length, (Stream req) => req.Write(post, 0, post.Length)).ExecuteStreamRequest())
                    {
                        resdata = LlsdXml.Deserialize(res) as Map;
                    }
                }
                catch
                {
                    return(new HashtableApi.Hashtable());
                }

                if (null == resdata)
                {
                    return(new HashtableApi.Hashtable());
                }

                var result = new HashtableApi.Hashtable();
                foreach (KeyValuePair <string, IValue> kvp in resdata)
                {
                    result.Add(kvp.Key, kvp.Value);
                }
                return(result);
            }
        }
        public static MeshInventoryItem FromUploadFormat(string name, Stream s, UGUI creator, AssetData objectAsset = null)
        {
            var map  = (Map)LlsdXml.Deserialize(s);
            var item = new MeshInventoryItem
            {
                Name          = name,
                AssetType     = AssetType.Object,
                InventoryType = InventoryType.Object,
                Owner         = creator,
                LastOwner     = creator,
                Creator       = creator
            };

            item.Permissions.Base    = InventoryPermissionsMask.Every;
            item.Permissions.Current = InventoryPermissionsMask.Every;
            ProcessTextures((AnArray)map["texture_list"], item);
            ProcessMeshes((AnArray)map["mesh_list"], item);
            ProcessInstances((AnArray)map["instance_list"], item, objectAsset);
            return(item);
        }
        private void HandleRegionExperiencesPost(ViewerAgent agent, AgentCircuit circuit, HttpRequest httpreq)
        {
            Map reqmap;

            using (Stream s = httpreq.Body)
            {
                reqmap = LlsdXml.Deserialize(s) as Map;
            }

            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad request");
                return;
            }

            /* process map */
            /* process experience addition and authorization */

            HandleRegionExperiencesGet(agent, circuit, httpreq);
        }
        UUID IInventoryItemServiceInterface.Copy(UUID principalID, UUID id, UUID newFolder)
        {
            var headers = new Dictionary <string, string>
            {
                ["Destination"] = $"{m_CapabilityUri}category/{newFolder}"
            };
            Map            res;
            HttpStatusCode statuscode;

            using (Stream s = new HttpClient.Copy($"{m_CapabilityUri}item/{id}")
            {
                TimeoutMs = TimeoutMs,
                Headers = headers,
                DisableExceptions = HttpClient.Request.DisableExceptionFlags.DisableForbidden | HttpClient.Request.DisableExceptionFlags.DisableGone
            }.ExecuteStreamRequest(out statuscode))
            {
                switch (statuscode)
                {
                case HttpStatusCode.OK:
                    break;

                case HttpStatusCode.Forbidden:
                    throw new InventoryItemNotCopiableException(id);

                case HttpStatusCode.Gone:
                    throw new InventoryItemNotFoundException(id);

                default:
                    throw new InvalidParentFolderIdException();
                }
                res = (Map)LlsdXml.Deserialize(s);
            }

            AnArray created_items;

            if (!res.TryGetValue("_created_items", out created_items) || created_items.Count != 1)
            {
                throw new InventoryItemNotStoredException();
            }
            return(created_items[0].AsUUID);
        }
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch
            {
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            IValue iv;

            if (reqmap.TryGetValue("message", out iv) && iv.ToString() == "ViewerAppearanceChangeMetrics" &&
                reqmap.TryGetValue("rez_status", out iv))
            {
                OwnRezStatus = iv.ToString();
            }

            HaveValidData = true;
            httpreq.EmptyResponse();
        }
Exemple #11
0
        public static EnvironmentSettings Deserialize(Stream input)
        {
            var env = new EnvironmentSettings();
            var a   = LlsdXml.Deserialize(input) as AnArray;

            if (a == null)
            {
                throw new EnvironmentSettingsSerializationException();
            }

            var dayCycleArray = a[1] as AnArray;
            var skyArray      = a[2] as Map;
            var waterSettings = a[3] as Map;

            if (dayCycleArray != null && skyArray != null)
            {
                for (int i = 0; i < dayCycleArray.Count - 1; i += 2)
                {
                    env.DayCycle.Add(new KeyValuePair <double, string>(dayCycleArray[i + 0].AsReal, dayCycleArray[i + 1].ToString()));
                }

                foreach (KeyValuePair <string, IValue> kvp in skyArray)
                {
                    if (kvp.Value is Map)
                    {
                        env.SkySettings.Add(kvp.Key, new SkyEntry((Map)kvp.Value));
                    }
                }
            }

            if (waterSettings != null)
            {
                env.WaterSettings = new WaterEntry(waterSettings);
            }

            return(env);
        }
        private void Cap_LSLSyntax(HttpRequest httpreq)
        {
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            using (var res = httpreq.BeginResponse("application/llsd+xml"))
            {
                var compiler = CompilerRegistry.ScriptCompilers["lsl"];
                var mi       = compiler.GetType().GetMethod("WriteLSLSyntaxFile", new Type[] { typeof(Stream) });
                using (var o = res.GetOutputStream())
                {
                    mi.Invoke(compiler, new object[] { o });
                }
            }
        }
Exemple #13
0
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }

            var parts = httpreq.RawUrl.Substring(1).Split('/');

            if (parts.Length == 3)
            {
                if (httpreq.ContentType != "application/llsd+xml")
                {
                    httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                    return;
                }
                if (httpreq.Method != "POST")
                {
                    httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                    return;
                }

                Map reqmap;
                try
                {
                    IValue iv = LlsdXml.Deserialize(httpreq.Body);
                    reqmap = iv as Map;
                }
                catch
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                    return;
                }
                UUID parcelID;
                if (reqmap == null || !reqmap.TryGetValue("parcel_id", out parcelID))
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                    return;
                }

                var parcelPos = new ParcelID(parcelID.GetBytes(), 0);

                ParcelInfo pinfo;
                if (!m_Scene.Parcels.TryGetValue(parcelPos.Location, out pinfo))
                {
                    httpreq.ErrorResponse(HttpStatusCode.Gone, "Gone");
                    return;
                }

                var resdata = new Map
                {
                    { "ScriptResourceDetails", m_ServerURI + httpreq.RawUrl + "/Details/" + pinfo.ID.ToString() },
                    { "ScriptResourceSummary", m_ServerURI + httpreq.RawUrl + "/Summary/" + pinfo.ID.ToString() }
                };

                using (HttpResponse res = httpreq.BeginResponse("application/llsd+xml"))
                    using (Stream s = res.GetOutputStream())
                    {
                        LlsdXml.Serialize(resdata, s);
                    }
            }
            else if (parts.Length == 5)
            {
                UUID parcelID;
                if (!UUID.TryParse(parts[4], out parcelID))
                {
                    httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not found");
                    return;
                }

                if (httpreq.Method != "GET")
                {
                    httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                    return;
                }

                switch (parts[3])
                {
                case "Details":
                    HandleDetailsReport(httpreq, parcelID);
                    break;

                case "Summary":
                    HandleSummaryReport(httpreq, parcelID);
                    break;

                default:
                    httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not found");
                    break;
                }
            }
            else
            {
                httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not found");
            }
        }
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch
            {
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            if (reqmap["agent-id"].AsUUID != m_Agent.ID)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            var localID = reqmap["local-id"].AsInt; /* this is parcel local id */
            var url     = reqmap["url"].ToString();

            ParcelInfo parcelInfo;

            if (m_Scene.Parcels.TryGetValue(localID, out parcelInfo))
            {
                if (!m_Scene.CanEditParcelDetails(m_Agent, parcelInfo))
                {
                    return;
                }
                parcelInfo.MediaURI = new URI(url);
                var pmu = new ParcelMediaUpdate
                {
                    MediaAutoScale = parcelInfo.MediaAutoScale,
                    MediaDesc      = parcelInfo.MediaDescription,
                    MediaHeight    = parcelInfo.MediaHeight,
                    MediaID        = parcelInfo.MediaID,
                    MediaLoop      = parcelInfo.MediaLoop,
                    MediaType      = parcelInfo.MediaType,
                    MediaURL       = url,
                    MediaWidth     = parcelInfo.MediaWidth
                };
                parcelInfo.MediaAutoScale   = pmu.MediaAutoScale;
                parcelInfo.MediaDescription = pmu.MediaDesc;
                parcelInfo.MediaHeight      = pmu.MediaHeight;
                parcelInfo.MediaID          = pmu.MediaID;
                parcelInfo.MediaType        = pmu.MediaType;
                parcelInfo.MediaLoop        = pmu.MediaLoop;
                parcelInfo.MediaURI         = new URI(pmu.MediaURL);
                parcelInfo.MediaWidth       = pmu.MediaWidth;
                m_Scene.Parcels.Store(parcelInfo.ID);

                foreach (var rootAgent in m_Scene.RootAgents)
                {
                    rootAgent.SendMessageIfRootAgent(pmu, m_Scene.ID);
                }
            }

            var m = new Map();

            using (var resp = httpreq.BeginResponse(HttpStatusCode.OK, "OK"))
            {
                resp.ContentType = "application/llsd+xml";
                using (var s = resp.GetOutputStream())
                {
                    LlsdXml.Serialize(m, s);
                }
            }
        }
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch
            {
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            var notecardID          = reqmap["notecard-id"].AsUUID;
            var objectID            = reqmap["object-id"].AsUUID;
            var itemID              = reqmap["item-id"].AsUUID;
            var destinationFolderID = reqmap["folder-id"].AsUUID;
            var callbackID          = reqmap["callback-id"].AsUInt;

            Notecard              nc = null;
            InventoryFolder       destinationFolder = null;
            AssetData             data;
            AssetServiceInterface sourceAssetService = null;
            InventoryItem         notecarditem;

            if (objectID != UUID.Zero)
            {
                ObjectPart part;

                sourceAssetService = m_Scene.AssetService;

                if (!m_Scene.Primitives.TryGetValue(objectID, out part))
                {
                    httpreq.ErrorResponse(HttpStatusCode.NotFound);
                    return;
                }

                ObjectPartInventoryItem objitem;

                if (part.Inventory.TryGetValue(notecardID, out objitem) &&
                    objitem.InventoryType == InventoryType.Notecard &&
                    m_Scene.AssetService.TryGetValue(objitem.AssetID, out data))
                {
                    nc = new Notecard(data);
                }
                notecarditem = objitem;
            }
            else
            {
                sourceAssetService = m_Agent.AssetService;

                if (m_Agent.InventoryService.Item.TryGetValue(m_Agent.ID, notecardID, out notecarditem) &&
                    notecarditem.InventoryType == InventoryType.Notecard &&
                    m_Agent.AssetService.TryGetValue(notecarditem.AssetID, out data))
                {
                    nc = new Notecard(data);
                }
            }

            var             transferItems      = new List <UUID>();
            var             destFolder         = new Dictionary <AssetType, InventoryFolder>();
            InventoryFolder selectedDestFolder = null;

            if (nc != null)
            {
                var invlist = new List <NotecardInventoryItem>();
                if (itemID != UUID.Zero)
                {
                    NotecardInventoryItem ncitem;
                    if (!nc.Inventory.TryGetValue(itemID, out ncitem))
                    {
                        httpreq.ErrorResponse(HttpStatusCode.NotFound);
                        return;
                    }
                    else
                    {
                        invlist.Add(ncitem);
                    }
                }
                else
                {
                    invlist.AddRange(nc.Inventory.Values);
                }

                foreach (var ncitem in invlist)
                {
                    ncitem.LastOwner = notecarditem.LastOwner;
                    ncitem.Owner     = m_Agent.Owner;
                    if ((notecarditem.Flags & InventoryFlags.NotecardSlamPerm) != 0)
                    {
                        ncitem.AdjustToNextOwner();
                    }

                    if ((notecarditem.Flags & InventoryFlags.NotecardSlamSale) != 0)
                    {
                        if (notecarditem.AssetType == AssetType.Object)
                        {
                            ncitem.Flags |= InventoryFlags.ObjectSlamSale;
                        }
                        if (notecarditem.AssetType == AssetType.Notecard)
                        {
                            ncitem.Flags |= InventoryFlags.NotecardSlamSale;
                        }
                        ncitem.SaleInfo.Type = InventoryItem.SaleInfoData.SaleType.NoSale;
                    }

                    try
                    {
                        if (destinationFolderID == UUID.Zero)
                        {
                            if (!destFolder.ContainsKey(ncitem.AssetType))
                            {
                                if (!m_Agent.InventoryService.Folder.TryGetDefaultFolderOrFallback(m_Agent.ID, ncitem.AssetType, out destinationFolder))
                                {
                                    m_Log.WarnFormat("Failed to copy notecard inventory {0} to agent {1} ({2}): No Folder found for {3}", ncitem.Name, m_Agent.NamedOwner.FullName, m_Agent.ID, ncitem.AssetType.ToString());
                                    continue;
                                }
                                else
                                {
                                    destFolder.Add(ncitem.AssetType, destinationFolder);
                                }
                            }
                            ncitem.ParentFolderID = destinationFolder.ID;
                        }
                        else if (selectedDestFolder != null ||
                                 m_Agent.InventoryService.Folder.TryGetSpecificOrDefaultFolderOrFallback(m_Agent.ID, destinationFolderID, ncitem.AssetType, out selectedDestFolder))
                        {
                            ncitem.ParentFolderID = selectedDestFolder.ID;
                        }
                        else
                        {
                            m_Log.WarnFormat("Failed to copy notecard inventory {0} to agent {1} ({2}): No Folder found for {3}", ncitem.Name, m_Agent.NamedOwner.FullName, m_Agent.ID, ncitem.AssetType.ToString());
                            continue;
                        }

                        var assetID = CreateInventoryItemFromNotecard(destinationFolder, ncitem, callbackID);
                        if (!transferItems.Contains(assetID))
                        {
                            transferItems.Add(assetID);
                        }
                    }
                    catch (Exception e)
                    {
                        m_Log.WarnFormat("Failed to copy notecard inventory {0} to agent {1} ({2}): {3}: {4}\n{5}", ncitem.Name, m_Agent.NamedOwner.FullName, m_Agent.ID, e.GetType().FullName, e.Message, e.StackTrace);
                    }
                }

                if (objectID != UUID.Zero)
                {
                    /* no need to wait for its completion since for the sim processing it the assets are either available through sim assets or user assets
                     * only transfer assets if it is from prim inventory notecard to user inventory.
                     */
                    new NotecardAssetTransfer(m_Agent.AssetService, sourceAssetService, transferItems).QueueWorkItem();
                }
            }

            using (HttpResponse httpres = httpreq.BeginResponse())
            {
                httpres.ContentType = "application/llsd+xml";
                using (Stream outStream = httpres.GetOutputStream())
                {
                    LlsdXml.Serialize(new Map(), outStream);
                }
            }
        }
Exemple #16
0
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch
            {
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            IValue iv;

            Map agent;

            if (reqmap.TryGetValue("agent", out agent))
            {
                if (agent.TryGetValue("fps", out iv))
                {
                    ViewerFps = iv.AsReal;
                }
                if (agent.TryGetValue("version", out iv))
                {
                    ViewerVersion = iv.ToString();
                }
                if (agent.TryGetValue("agents_in_view", out iv))
                {
                    NumAgentsInView = iv.AsInt;
                }
            }

            Map system;

            if (reqmap.TryGetValue("system", out system))
            {
                if (system.TryGetValue("ram", out iv))
                {
                    ViewerPhysicalMemoryKb = iv.AsInt;
                }
                if (system.TryGetValue("os", out iv))
                {
                    ViewerOs = iv.ToString();
                }
                if (system.TryGetValue("cpu", out iv))
                {
                    ViewerCpu = iv.ToString();
                }
                if (system.TryGetValue("mac_address", out iv))
                {
                    ViewerMacAddress = iv.ToString();
                }
                if (system.TryGetValue("gpu", out iv))
                {
                    ViewerGpu = iv.ToString();
                }
                if (system.TryGetValue("gpu_class", out iv))
                {
                    ViewerGpuClass = iv.ToString();
                }
                if (system.TryGetValue("gpu_vendor", out iv))
                {
                    ViewerGpuVendor = iv.ToString();
                }
                if (system.TryGetValue("gpu_version", out iv))
                {
                    ViewerGpuVersion = iv.ToString();
                }
                if (system.TryGetValue("opengl_verion", out iv))
                {
                    OpenGlVersion = iv.ToString();
                }
                if (system.TryGetValue("shader_level", out iv))
                {
                    ShaderLevel = iv.AsInt;
                }
            }

            Map downloads;

            if (reqmap.TryGetValue("downloads", out downloads))
            {
                if (downloads.TryGetValue("world_kbytes", out iv))
                {
                    DownloadWorldKbytes = iv.AsReal;
                }
                if (downloads.TryGetValue("object_kbytes", out iv))
                {
                    DownloadObjectKbytes = iv.AsReal;
                }
                if (downloads.TryGetValue("texture_kbytes", out iv))
                {
                    DownloadTextureKbytes = iv.AsReal;
                }
                if (downloads.TryGetValue("mesh_kbytes", out iv))
                {
                    DownloadMeshKbytes = iv.AsReal;
                }
            }

            Map stats;

            if (reqmap.TryGetValue("stats", out stats))
            {
                Map map;
                if (stats.TryGetValue("in", out map))
                {
                    if (map.TryGetValue("kbytes", out iv))
                    {
                        TotalKBytesIn = iv.AsReal;
                    }
                    if (map.TryGetValue("packets", out iv))
                    {
                        TotalPacketsIn = iv.AsInt;
                    }
                    if (map.TryGetValue("compressed_packets", out iv))
                    {
                        TotalCompressedPacketsIn = iv.AsInt;
                    }
                    if (map.TryGetValue("savings", out iv))
                    {
                        TotalSavingsKBytesIn = iv.AsReal;
                    }
                }
                if (stats.TryGetValue("out", out map))
                {
                    if (map.TryGetValue("kbytes", out iv))
                    {
                        TotalKBytesOut = iv.AsReal;
                    }
                    if (map.TryGetValue("packets", out iv))
                    {
                        TotalPacketsOut = iv.AsInt;
                    }
                    if (map.TryGetValue("compressed_packets", out iv))
                    {
                        TotalCompressedPacketsOut = iv.AsInt;
                    }
                    if (map.TryGetValue("savings", out iv))
                    {
                        TotalSavingsKBytesOut = iv.AsReal;
                    }
                }
                if (stats.TryGetValue("failures", out map))
                {
                    if (map.TryGetValue("send_packet", out iv))
                    {
                        Fail_SendPacket = iv.AsInt;
                    }
                    if (map.TryGetValue("dropped", out iv))
                    {
                        Fail_Dropped = iv.AsInt;
                    }
                    if (map.TryGetValue("resent", out iv))
                    {
                        Fail_Resent = iv.AsInt;
                    }
                    if (map.TryGetValue("failed_resends", out iv))
                    {
                        Fail_FailedResends = iv.AsInt;
                    }
                    if (map.TryGetValue("off_circuit", out iv))
                    {
                        Fail_OffCircuit = iv.AsInt;
                    }
                    if (map.TryGetValue("invalid", out iv))
                    {
                        Fail_Invalid = iv.AsInt;
                    }
                }
            }

            HaveValidData = true;
            httpreq.EmptyResponse();
        }
Exemple #17
0
        private void HandleGroupNotice(ViewerAgent agent, SceneInterface scene, ImprovedInstantMessage m)
        {
            /* no validation needed with IM, that is already done in circuit */
            var groupsService = scene.GroupsService;

            if (groupsService == null)
            {
                return;
            }

            UGI group;

            try
            {
                group = groupsService.Groups[agent.Owner, m.ToAgentID];
            }
            catch
            {
                return;
            }

            if ((GetGroupPowers(agent.Owner, groupsService, group) & GroupPowers.SendNotices) == 0)
            {
                return;
            }

            InventoryItem item = null;

            if (m.BinaryBucket.Length >= 1 && m.BinaryBucket[0] > 0)
            {
                try
                {
                    var iv = LlsdXml.Deserialize(new MemoryStream(m.BinaryBucket));
                    if (iv is Map)
                    {
                        var binBuck = (Map)iv;
                        var itemID  = binBuck["item_id"].AsUUID;
                        var ownerID = binBuck["owner_id"].AsUUID;
                        item = agent.InventoryService.Item[ownerID, itemID];
                    }
                }
                catch
                {
                    /* do not expose exceptions to caller */
                }
            }

            var gn = new GroupNotice
            {
                ID       = UUID.Random,
                Group    = group,
                FromName = agent.NamedOwner.FullName
            };
            var submsg = m.Message.Split(new char[] { '|' }, 2);

            gn.Subject          = submsg.Length > 1 ? submsg[0] : string.Empty;
            gn.Message          = submsg.Length > 1 ? submsg[1] : submsg[0];
            gn.HasAttachment    = item != null;
            gn.AttachmentType   = item != null ? item.AssetType : Types.Asset.AssetType.Unknown;
            gn.AttachmentName   = item != null ? item.Name : string.Empty;
            gn.AttachmentItemID = item != null ? item.ID : UUID.Zero;
            gn.AttachmentOwner  = item != null ? item.Owner : UGUI.Unknown;

            var gim = new GridInstantMessage
            {
                FromAgent    = agent.NamedOwner,
                Dialog       = GridInstantMessageDialog.GroupNotice,
                IsFromGroup  = true,
                Message      = m.Message,
                IMSessionID  = gn.ID,
                BinaryBucket = m.BinaryBucket
            };

            try
            {
                groupsService.Notices.Add(agent.Owner, gn);
                IMGroupNoticeQueue.Enqueue(new KeyValuePair <SceneInterface, GridInstantMessage>(scene, gim));
            }
            catch
            {
                /* do not expose exceptions to caller */
            }
        }
        private Dictionary <UUID, KeyValuePair <InventoryFolder, InventoryFolderContent> > GetFolderContents(UUID[] folderids, bool fetch_children)
        {
            var folderidsreq = new AnArray();
            var reqmap       = new Map
            {
                ["folder_ids"] = folderidsreq
            };

            foreach (UUID folderid in folderids)
            {
                folderidsreq.Add(new Map {
                    { "folder_id", folderid }, { "fetch_folders", fetch_children }, { "fetch_items", fetch_children }
                });
            }
            byte[] reqdata;
            using (var ms = new MemoryStream())
            {
                LlsdXml.Serialize(reqmap, ms);
                reqdata = ms.ToArray();
            }
            Map resdata;

            using (Stream s = new HttpClient.Post(m_CapabilityUri, "application/llsd+xml", reqdata.Length,
                                                  (Stream o) => o.Write(reqdata, 0, reqdata.Length))
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest())
            {
                resdata = LlsdXml.Deserialize(s) as Map;
            }
            if (resdata == null)
            {
                throw new InvalidDataException();
            }
            AnArray foldersres;
            var     resultset = new Dictionary <UUID, KeyValuePair <InventoryFolder, InventoryFolderContent> >();

            if (!resdata.TryGetValue("folders", out foldersres))
            {
                return(resultset);
            }
            foreach (IValue folderiv in foldersres)
            {
                var folderdata = folderiv as Map;
                if (folderdata == null)
                {
                    continue;
                }
                var folder = new InventoryFolder(folderdata["folder_id"].AsUUID)
                {
                    Owner          = new UGUI(folderdata["owner_id"].AsUUID),
                    Version        = folderdata["version"].AsInt,
                    ParentFolderID = folderdata["parent_id"].AsUUID,
                };
                var content = new InventoryFolderContent
                {
                    Version  = folderdata["version"].AsInt,
                    FolderID = folderdata["folder_id"].AsUUID,
                    Owner    = new UGUI(folderdata["owner_id"].AsUUID)
                };
                AnArray categories;
                if (folderdata.TryGetValue("categories", out categories))
                {
                    foreach (IValue categoryiv in categories)
                    {
                        var category = categoryiv as Map;
                        if (category == null)
                        {
                            continue;
                        }
                        content.Folders.Add(new InventoryFolder(category["folder_id"].AsUUID)
                        {
                            Name           = category["name"].ToString(),
                            ParentFolderID = category["parent_id"].AsUUID,
                            DefaultType    = (AssetType)category["type"].AsInt,
                            Version        = category["version"].AsInt
                        });
                    }
                }

                AnArray childitems;
                if (folderdata.TryGetValue("items", out childitems))
                {
                    foreach (IValue childiv in childitems)
                    {
                        var childdata = childiv as Map;
                        if (childdata == null)
                        {
                            continue;
                        }
                        if (childdata["parent_id"].AsUUID != folder.ID)
                        {
                            continue;
                        }
                        var permissions = (Map)childdata["permissions"];
                        var sale_info   = (Map)childdata["sale_info"];
                        var item        = new InventoryItem(childdata["item_id"].AsUUID)
                        {
                            AssetID        = childdata["asset_id"].AsUUID,
                            CreationDate   = Date.UnixTimeToDateTime(childdata["created_at"].AsULong),
                            Description    = childdata["desc"].ToString(),
                            Flags          = (InventoryFlags)childdata["flags"].AsInt,
                            InventoryType  = (InventoryType)childdata["inv_type"].AsInt,
                            Name           = childdata["name"].ToString(),
                            ParentFolderID = childdata["parent_id"].AsUUID,
                            AssetType      = (AssetType)childdata["type"].AsInt,
                            Creator        = new UGUI(permissions["creator_id"].AsUUID),
                            Group          = new UGI(permissions["group_id"].AsUUID),
                            IsGroupOwned   = permissions["is_owner_group"].AsBoolean,
                            LastOwner      = new UGUI(permissions["last_owner_id"].AsUUID),
                            Owner          = new UGUI(permissions["owner_id"].AsUUID),
                            SaleInfo       = new InventoryItem.SaleInfoData
                            {
                                Price = sale_info["sale_price"].AsInt,
                                Type  = (InventoryItem.SaleInfoData.SaleType)sale_info["sale_type"].AsInt
                            }
                        };
                        item.Permissions.Base      = (InventoryPermissionsMask)permissions["base_mask"].AsInt;
                        item.Permissions.EveryOne  = (InventoryPermissionsMask)permissions["everyone_mask"].AsInt;
                        item.Permissions.Group     = (InventoryPermissionsMask)permissions["group_mask"].AsInt;
                        item.Permissions.NextOwner = (InventoryPermissionsMask)permissions["next_owner_mask"].AsInt;
                        item.Permissions.Current   = (InventoryPermissionsMask)permissions["owner_mask"].AsInt;
                        content.Items.Add(item);
                    }
                }

                resultset.Add(folder.ID, new KeyValuePair <InventoryFolder, InventoryFolderContent>(folder, content));
            }

            return(resultset);
        }
        private void Cap_RenderMaterials_POST(HttpRequest httpreq)
        {
            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            var materials = new List <Material>();

            if (reqmap.ContainsKey("Zipped"))
            {
                AnArray zippedDataArray;
                Map     zippedDataMap;
                try
                {
                    using (var ms = new MemoryStream((BinaryData)reqmap["Zipped"]))
                    {
                        using (var gz = new ZlibStream(ms, CompressionMode.Decompress))
                        {
                            var inp = LlsdBinary.Deserialize(gz);
                            zippedDataArray = inp as AnArray;
                            zippedDataMap   = inp as Map;
                        }
                    }
                }
                catch (Exception e)
                {
                    m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                    httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                    return;
                }
                if (zippedDataArray == null && zippedDataMap == null)
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted Zipped LLSD-XML");
                    return;
                }

                if (zippedDataArray != null)
                {
                    foreach (var v in zippedDataArray)
                    {
                        try
                        {
                            materials.Add(Scene.GetMaterial(v.AsUUID));
                        }
                        catch
                        {
                            /* adding faled due to duplicate */
                        }
                    }
                }
                else if (zippedDataMap?.ContainsKey("FullMaterialsPerFace") ?? false)
                {
                    var faceData = zippedDataMap["FullMaterialsPerFace"] as AnArray;
                    if (faceData != null)
                    {
                        foreach (var face_iv in faceData)
                        {
                            var faceDataMap = face_iv as Map;
                            if (faceDataMap == null)
                            {
                                continue;
                            }

                            try
                            {
                                uint     primLocalID = faceDataMap["ID"].AsUInt;
                                var      matID       = UUID.Random;
                                Material mat;
                                try
                                {
                                    matID = UUID.Random;
                                    mat   = new Material(matID, faceDataMap["Material"] as Map);
                                }
                                catch
                                {
                                    matID = UUID.Zero;
                                    mat   = null;
                                }
                                if (mat != null)
                                {
                                    Scene.StoreMaterial(mat);
                                    continue;
                                }
                                var p = Scene.Primitives[primLocalID];
                                if (faceDataMap.ContainsKey("Face"))
                                {
                                    var face = faceDataMap["Face"].AsUInt;
                                    var te   = p.TextureEntry[face];
                                    te.MaterialID = matID;
                                }
                                else
                                {
                                    var te = p.TextureEntry.DefaultTexture;
                                    te.MaterialID = matID;
                                    p.TextureEntry.DefaultTexture = te;
                                }
                            }
                            catch
                            {
                                /* no action possible */
                            }
                        }
                    }
                }
            }

            using (var httpres = httpreq.BeginResponse("application/llsd+xml"))
            {
#if DEBUG
                m_Log.DebugFormat("Responding RenderMaterials block scene={0}", Scene.ID);
#endif
                var matdata = Scene.MaterialsData;
                using (Stream s = httpres.GetOutputStream())
                {
#if DEBUG
                    m_Log.DebugFormat("Sending out RenderMaterials block scene={0} length={1}", Scene.ID, matdata.Length);
#endif
                    s.Write(matdata, 0, matdata.Length);
                }
            }
        }
        private void Cap_EventQueueGet(HttpRequest httpreq)
        {
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            try
            {
                LlsdXml.Deserialize(httpreq.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            var     timeout = 31;
            Message m       = null;

            while (timeout-- != 0)
            {
                if (!m_EventQueueEnabled)
                {
                    httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
                    return;
                }
                try
                {
                    m = m_EventQueue.Dequeue(1000);
                    break;
                }
                catch
                {
                    /* no action required */
                }
            }

            if (m == null)
            {
                using (var res = httpreq.BeginResponse(HttpStatusCode.BadGateway, "Upstream error:"))
                {
                    res.MinorVersion = 0;
                    using (var w = res.GetOutputStream().UTF8StreamWriter())
                    {
                        w.Write("Upstream error: ");
                        w.Flush();
                    }
                }
                return;
            }

            var eventarr = new AnArray();
            int count    = m_EventQueue.Count - 1;

            do
            {
                IValue body;
                string message;

                try
                {
                    message = m.NameEQG;
                    body    = m.SerializeEQG();
                }
                catch (Exception e)
                {
                    m_Log.DebugFormat("Unsupported message {0} in EventQueueGet: {1}\n{2}", m.GetType().FullName, e.Message, e.StackTrace);
                    using (var res = httpreq.BeginResponse(HttpStatusCode.BadGateway, "Upstream error:"))
                    {
                        res.MinorVersion = 0;
                        using (var w = res.GetOutputStream().UTF8StreamWriter())
                        {
                            w.Write("Upstream error: ");
                            w.Flush();
                        }
                    }
                    return;
                }
                var ev = new Map
                {
                    { "message", message },
                    { "body", body }
                };
                eventarr.Add(ev);
                if (count > 0)
                {
                    --count;
                    m = m_EventQueue.Dequeue(0);
                }
                else
                {
                    m = null;
                }
            } while (m != null);

            var result = new Map
            {
                { "events", eventarr },
                { "id", m_EventQueueEventId++ }
            };

            using (var res = httpreq.BeginResponse(HttpStatusCode.OK, "OK"))
            {
                res.ContentType = "application/llsd+xml";
                using (var o = res.GetOutputStream())
                {
                    LlsdXml.Serialize(result, o);
                }
            }
        }
        public void RegionSeedHandler(HttpRequest httpreq)
        {
            IValue o;

            if (httpreq.CallerIP != RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            try
            {
                o = LlsdXml.Deserialize(httpreq.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }
            var oarray = o as AnArray;

            if (oarray == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            var capsUri = new Dictionary <string, string>();

            foreach (IValue v in oarray)
            {
                UUID   capsID;
                string capsUriStr = string.Empty;
                if (v.ToString() == "SEED")
                {
                    /* SEED capability has no additional handling */
                }
                else if (v.ToString() == "ObjectAnimation")
                {
                    /* triggers enable of objectanimation */
                    m_EnableObjectAnimation = true;
                    if (m_EnableObjectAnimation && m_EnableObjectUpdates)
                    {
                        foreach (ObjectPart p in Scene.Primitives)
                        {
                            if ((p.ExtendedMesh.Flags & ExtendedMeshParams.MeshFlags.AnimatedMeshEnabled) != 0)
                            {
#if DEBUG
                                m_Log.DebugFormat("Sending object animations for {0}", p.ID);
#endif
                                p.AnimationController.SendAnimationsToAgent(Agent);
                            }
                        }
                    }
                }
                else if (GetCustomCapsUri(v.ToString(), out capsUriStr))
                {
                    if (capsUriStr.Length != 0)
                    {
                        capsUri[v.ToString()] = capsUriStr;
                    }
                }
                else if (m_RegisteredCapabilities.TryGetValue(v.ToString(), out capsID))
                {
                    capsUri[v.ToString()] = string.Format("{0}://{1}:{2}/CAPS/{3}/{4}",
                                                          m_CapsRedirector.Scheme, m_CapsRedirector.ExternalHostName, m_CapsRedirector.Port,
                                                          v.ToString(), capsID);
                }
            }

            using (var res = httpreq.BeginResponse())
            {
                res.ContentType = "application/llsd+xml";
                using (var tw = res.GetOutputStream())
                {
                    using (var text = tw.UTF8XmlTextWriter())
                    {
                        text.WriteStartElement("llsd");
                        text.WriteStartElement("map");
                        foreach (KeyValuePair <string, string> kvp in capsUri)
                        {
                            text.WriteKeyValuePair(kvp.Key, kvp.Value);
                        }
                        text.WriteEndElement();
                        text.WriteEndElement();
                        text.Flush();
                    }
                }
            }
        }
        public void HandleRemoteParcelRequest(ViewerAgent agent, AgentCircuit circuit, HttpRequest req)
        {
            if (req.CallerIP != circuit.RemoteIP)
            {
                req.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (req.Method != "POST")
            {
                req.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(req.Body) as Map;
            }
            catch
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad request");
                return;
            }

            if (reqmap == null)
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad request");
                return;
            }

            SceneInterface scene = circuit.Scene;

            if (scene == null)
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad request");
                return;
            }

            AnArray locationArray;
            IValue  iv_target;
            var     parcelid = new ParcelID();

            if (reqmap.TryGetValue("location", out locationArray))
            {
                uint x = locationArray[0].AsUInt;
                uint y = locationArray[1].AsUInt;

                if (reqmap.TryGetValue("region_handle", out iv_target))
                {
                    byte[]     regHandleBytes = (BinaryData)iv_target;
                    var        v = new GridVector(regHandleBytes, 0);
                    RegionInfo rInfo;

                    if (v == scene.GridPosition)
                    {
                        parcelid = new ParcelID(v, new Vector3(x, y, 0));
                    }
                    else if (scene.GridService.TryGetValue(v, out rInfo))
                    {
                        /* shift coordinate to actual region begin */
                        Vector3 offset = (Vector3)v - rInfo.Location;
                        offset.X += x;
                        offset.Y += y;
                        /* ensure that the position is inside region */
                        if (offset.X > rInfo.Size.X)
                        {
                            offset.X = rInfo.Size.X;
                        }
                        if (offset.Y > rInfo.Size.Y)
                        {
                            offset.Y = rInfo.Size.Y;
                        }
                        parcelid = new ParcelID(rInfo.Location, offset);
                    }
                }
                else if (reqmap.TryGetValue("region_id", out iv_target))
                {
                    SceneInterface remoteSceneLocal;
                    RegionInfo     rInfo;
                    if (m_Scenes.TryGetValue(iv_target.AsUUID, out remoteSceneLocal))
                    {
                        parcelid = new ParcelID(remoteSceneLocal.GridPosition, new Vector3(x, y, 0));
                    }
                    else if (scene.GridService.TryGetValue(iv_target.AsUUID, out rInfo))
                    {
                        parcelid = new ParcelID(rInfo.Location, new Vector3(x, y, 0));
                    }
                }
            }

            var resmap = new Map
            {
                ["parcel_id"] = new UUID(parcelid.GetBytes(), 0)
            };

            using (HttpResponse res = req.BeginResponse("application/llsd+xml"))
            {
                using (Stream s = res.GetOutputStream())
                {
                    LlsdXml.Serialize(resmap, s);
                }
            }
        }
Exemple #23
0
        protected static void HandleHttpRequest(HttpRequest httpreq, InventoryServiceInterface inventoryService, UUID agentID, UUID ownerID)
        {
            IValue o;

            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            try
            {
                o = LlsdXml.Deserialize(httpreq.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }

            var reqmap = o as Map;

            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            using (var res = httpreq.BeginResponse("application/llsd+xml"))
                using (var text = res.GetOutputStream().UTF8XmlTextWriter())
                {
                    var baditems = new List <UUID>();
                    text.WriteStartElement("llsd");
                    text.WriteStartElement("map");
                    text.WriteKeyValuePair("agent_id", agentID);
                    bool wroteheader = false;

                    foreach (var iv in (AnArray)reqmap["items"])
                    {
                        var itemmap = iv as Map;
                        if (itemmap == null)
                        {
                            continue;
                        }

                        if (!itemmap.ContainsKey("item_id"))
                        {
                            continue;
                        }
                        var           itemid = itemmap["item_id"].AsUUID;
                        InventoryItem item;
                        if (itemid == UUID.Zero)
                        {
                            baditems.Add(itemid);
                            continue;
                        }
                        try
                        {
                            item = inventoryService.Item[ownerID, itemid];
                        }
                        catch
                        {
                            baditems.Add(itemid);
                            continue;
                        }
                        if (!wroteheader)
                        {
                            wroteheader = true;
                            text.WriteNamedValue("key", "items");
                            text.WriteStartElement("array");
                        }
                        text.WriteStartElement("map");
                        WriteInventoryItem(item, text, agentID);
                        text.WriteEndElement();
                    }
                    if (wroteheader)
                    {
                        text.WriteEndElement();
                    }
                    if (baditems.Count != 0)
                    {
                        text.WriteStartElement("key");
                        text.WriteValue("bad_items");
                        text.WriteEndElement();
                        text.WriteStartElement("array");
                        foreach (var id in baditems)
                        {
                            text.WriteNamedValue("uuid", id);
                        }
                        text.WriteEndElement();
                    }
                    text.WriteEndElement();
                    text.WriteEndElement();
                }
        }
        public void HandleGetMetadataCapability(ViewerAgent agent, AgentCircuit circuit, HttpRequest req)
        {
            if (req.CallerIP != circuit.RemoteIP)
            {
                req.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (req.Method != "POST")
            {
                req.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            var scene = circuit.Scene;

            if (scene == null)
            {
                req.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
                return;
            }
            IValue iv;
            UUID   objectid;
            UUID   itemid;

            try
            {
                iv = LlsdXml.Deserialize(req.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD-XML received at GetMetadata", e);
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }
            if (!(iv is Map))
            {
                m_Log.WarnFormat("Invalid LLSD-XML received at GetMetadata");
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            Map m = iv as Map;

            objectid = m["object-id"].AsUUID;
            itemid   = m["item-id"].AsUUID;

            Map        res = new Map();
            ObjectPart part;
            ObjectPartInventoryItem item;

            if (scene.Primitives.TryGetValue(objectid, out part) &&
                part.Inventory.TryGetValue(itemid, out item))
            {
                UEI id = item.ExperienceID;
                if (id != UEI.Unknown)
                {
                    res.Add("experience", item.ExperienceID.ID);
                }
            }

            using (var httpres = req.BeginResponse("application/llsd+xml"))
            {
                LlsdXml.Serialize(res, httpres.GetOutputStream());
            }
        }
Exemple #25
0
        public static void HandleSimCircuitRequest(HttpRequest req, ConfigurationLoader loader)
        {
            if (req.ContainsHeader("X-SecondLife-Shard"))
            {
                req.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Request source not allowed");
                return;
            }

            if (req.Method != "POST")
            {
                req.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(req.Body) as Map;
            }
            catch
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }
            if (reqmap == null)
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            var regionID     = reqmap["to_region_id"].AsUUID;
            var fromRegionID = reqmap["from_region_id"].AsUUID;

            SceneInterface scene;

            try
            {
                scene = loader.Scenes[regionID];
            }
            catch
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            var gridService = scene.GridService;

            if (gridService == null)
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            RegionInfo regionInfo;

            try
            {
                regionInfo = gridService[fromRegionID];
            }
            catch
            {
                req.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            var     sessionID    = UUID.Random;
            uint    circuitCode  = NewCircuitCode;
            Vector3 remoteOffset = regionInfo.Location - scene.GridPosition;
            var     udpServer    = (UDPCircuitsManager)scene.UDPServer;
            var     circuit      = new SimCircuit(udpServer, circuitCode, fromRegionID, sessionID, regionInfo.Location, remoteOffset);

            udpServer.AddCircuit(circuit);
            var resmap = new Map
            {
                { "circuit_code", circuitCode },
                { "session_id", sessionID }
            };

            using (var res = req.BeginResponse("application/llsd+xml"))
            {
                using (var o = res.GetOutputStream())
                {
                    LlsdXml.Serialize(resmap, o);
                }
            }
        }
        public void HandleUpdateExperienceCapability(ViewerAgent agent, AgentCircuit circuit, HttpRequest httpreq)
        {
            if (httpreq.CallerIP != circuit.RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            using (Stream s = httpreq.Body)
            {
                reqmap = LlsdXml.Deserialize(s) as Map;
            }

            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad request");
                return;
            }

            SceneInterface scene = circuit.Scene;

            if (scene == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
                return;
            }

            ExperienceServiceInterface experienceService = scene.ExperienceService;

            if (experienceService == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
                return;
            }

            UUID experienceid = reqmap["public_id"].AsUUID;

            ExperienceInfo info;
            Map            resmap = new Map();

            if (experienceService.TryGetValue(experienceid, out info))
            {
                IValue iv;
                if (reqmap.TryGetValue("group_id", out iv))
                {
                    UUID id = iv.AsUUID;
                    UGI  ugi;
                    if (id == UUID.Zero)
                    {
                        info.Group = UGI.Unknown;
                    }
                    else if (scene.GroupsNameService != null && scene.GroupsNameService.TryGetValue(id, out ugi))
                    {
                        info.Group = ugi;
                    }
                }

                if (reqmap.TryGetValue("name", out iv))
                {
                    info.ID.ExperienceName = iv.ToString();
                }

                if (reqmap.TryGetValue("description", out iv))
                {
                    info.Description = iv.ToString();
                }

                if (reqmap.TryGetValue("properties", out iv))
                {
                    info.Properties = (ExperiencePropertyFlags)iv.AsInt;
                }

                if (reqmap.TryGetValue("maturity", out iv))
                {
                    info.Maturity = (RegionAccess)iv.AsInt;
                }

                if (reqmap.TryGetValue("extended_metadata", out iv))
                {
                    info.ExtendedMetadata = iv.ToString();
                }

                if (reqmap.TryGetValue("slurl", out iv))
                {
                    info.SlUrl = iv.ToString();
                }

                try
                {
                    experienceService.Update(agent.Owner, info);
                }
                catch (Exception e)
                {
#if DEBUG
                    m_Log.Debug("UpdateExperience capability", e);
#endif
                    resmap.Add("removed", new AnArray
                    {
                        new Map
                        {
                            { "error-tag", "Failed to update" }
                        }
                    });
                }

                if (!resmap.ContainsKey("removed"))
                {
                    var ids = new AnArray();
                    ids.Add(info.ToMap());
                    resmap.Add("experience_keys", ids);
                }
            }
            else
            {
                resmap.Add("removed", new AnArray
                {
                    new Map
                    {
                        { "error-tag", "Not found" }
                    }
                });
            }

            using (HttpResponse res = httpreq.BeginResponse("application/llsd+xml"))
            {
                using (Stream o = res.GetOutputStream())
                {
                    LlsdXml.Serialize(resmap, o);
                }
            }
        }
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            Map reqmap;

            try
            {
                reqmap = LlsdXml.Deserialize(httpreq.Body) as Map;
            }
            catch (Exception e)
            {
                m_Log.ErrorFormat("Exception {0}: {1}\n{2}", e.GetType().FullName, e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }
            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            ParcelInfo pInfo;

            if (!m_Scene.Parcels.TryGetValue(reqmap["local_id"].AsInt, out pInfo))
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }

            if (!m_Scene.CanEditParcelDetails(m_Agent.Owner, pInfo))
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }

            byte[] parcelFlagsBinary = (BinaryData)reqmap["parcel_flags"];
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(parcelFlagsBinary);
            }
            uint parcelFlags = BitConverter.ToUInt32(parcelFlagsBinary, 0);

            pInfo.Flags       = (ParcelFlags)parcelFlags;
            pInfo.Name        = reqmap["name"].ToString();
            pInfo.SalePrice   = reqmap["sale_price"].AsInt;
            pInfo.Description = reqmap["description"].ToString();
            var music_uri = reqmap["music_url"].ToString();

            pInfo.MusicURI = music_uri != string.Empty && Uri.IsWellFormedUriString(music_uri, UriKind.Absolute) ? new URI(music_uri) : null;
            var media_uri = reqmap["media_url"].ToString();

            pInfo.MediaURI         = media_uri != string.Empty && Uri.IsWellFormedUriString(media_uri, UriKind.Absolute) ? new URI(media_uri) : null;
            pInfo.MediaDescription = reqmap["media_desc"].ToString();
            pInfo.MediaType        = reqmap["media_type"].ToString();
            pInfo.MediaWidth       = reqmap["media_width"].AsInt;
            pInfo.MediaHeight      = reqmap["media_height"].AsInt;
            pInfo.MediaAutoScale   = reqmap["auto_scale"].AsBoolean;
            pInfo.MediaLoop        = reqmap["media_loop"].AsBoolean;
            pInfo.ObscureMedia     = reqmap["obscure_media"].AsBoolean;
            pInfo.ObscureMusic     = reqmap["obscure_music"].AsBoolean;
            pInfo.MediaID          = reqmap["media_id"].AsUUID;
            pInfo.Group            = new UGI(reqmap["group_id"].AsUUID);
            pInfo.PassPrice        = reqmap["pass_price"].AsInt;
            pInfo.PassHours        = reqmap["pass_hours"].AsReal;
            pInfo.Category         = (ParcelCategory)reqmap["category"].AsInt;
            pInfo.AuthBuyer        = new UGUIWithName(reqmap["auth_buyer_id"].AsUUID);
            pInfo.SnapshotID       = reqmap["snapshot_id"].AsUUID;
            pInfo.LandingPosition  = reqmap["user_location"].AsVector3;
            pInfo.LandingLookAt    = reqmap["user_look_at"].AsVector3;
            pInfo.LandingType      = (TeleportLandingType)reqmap["landing_type"].AsInt;
            if (reqmap.ContainsKey("see_avs"))
            {
                pInfo.SeeAvatars = reqmap["see_avs"].AsBoolean;
            }
            if (reqmap.ContainsKey("group_av_sounds"))
            {
                pInfo.GroupAvatarSounds = reqmap["group_av_sounds"].AsBoolean;
            }
            if (reqmap.ContainsKey("any_av_sounds"))
            {
                pInfo.AnyAvatarSounds = reqmap["any_av_sounds"].AsBoolean;
            }
            if (reqmap.ContainsKey("obscure_media"))
            {
                pInfo.ObscureMedia = reqmap["obscure_media"].AsBoolean;
            }
            if (reqmap.ContainsKey("obscure_music"))
            {
                pInfo.ObscureMusic = reqmap["obscure_music"].AsBoolean;
            }

            //media_prevent_camera_zoom
            //media_url_timeout
            //media_allow_navigate
            //media_current_url

            m_Scene.TriggerParcelUpdate(pInfo);

            using (var httpres = httpreq.BeginResponse())
            {
                httpres.ContentType = "application/llsd+xml";
                using (var outStream = httpres.GetOutputStream())
                {
                    LlsdXml.Serialize(new Map(), outStream);
                }
            }
        }
        private static void FolderLinks_PutHandler(Request req, string[] elements)
        {
            AnArray newlinks;

            try
            {
                using (Stream s = req.HttpRequest.Body)
                {
                    newlinks = (AnArray)LlsdXml.Deserialize(s);
                }
            }
            catch
            {
                ErrorResponse(req, HttpStatusCode.BadRequest, AisErrorCode.InvalidRequest, "Bad request");
                return;
            }

            InventoryFolder folder;
            var             folderCache = new Dictionary <UUID, InventoryFolder>();

            try
            {
                if (!TryFindFolder(req, elements[1], out folder, folderCache))
                {
                    ErrorResponse(req, HttpStatusCode.NotFound, AisErrorCode.NotFound, "Not Found");
                    return;
                }
            }
            catch (HttpResponse.ConnectionCloseException)
            {
                /* we need to pass it */
                throw;
            }
            catch (Exception e)
            {
                m_Log.Debug("Exception occured", e);
                ErrorResponse(req, HttpStatusCode.InternalServerError, AisErrorCode.InternalError, "Internal Server Error");
                return;
            }

            List <InventoryItem> items = req.InventoryService.Folder.GetItems(req.Agent.ID, folder.ID);
            var ids = new List <UUID>();

            foreach (InventoryItem item in items)
            {
                if (item.AssetType == AssetType.Link || item.AssetType == AssetType.LinkFolder)
                {
                    ids.Add(item.ID);
                }
            }

            List <UUID> deleted = req.InventoryService.Item.Delete(req.Agent.ID, ids);

            var category_items_removed    = new AnArray();
            var updated_category_versions = new Map();

            foreach (InventoryItem item in items)
            {
                if (!ids.Contains(item.ID))
                {
                    continue;
                }
                category_items_removed.Add(item.ID);
            }

            var links      = new Map();
            var addeditems = new AnArray();
            var linkedids  = new Map();

            foreach (IValue iv in newlinks)
            {
                var newlink = iv as Map;
                if (newlink == null)
                {
                    continue;
                }
                var item = new InventoryItem(UUID.Random)
                {
                    AssetID     = newlink["linked_id"].AsUUID,
                    Name        = newlink["name"].ToString(),
                    Description = newlink["desc"].ToString(),
                    AssetType   = (AssetType)newlink["type"].AsInt
                };
                InventoryItem   linkeditem;
                InventoryFolder linkedfolder;
                Map             itemdata;
                if (item.AssetType == AssetType.Link && req.InventoryService.Item.TryGetValue(req.Agent.ID, item.AssetID, out linkeditem))
                {
                    item.InventoryType = linkeditem.InventoryType;
                    itemdata           = item.ToAisV3(req.FullPrefixUrl);
                    var embedded = new Map();
                    embedded.Add("item", linkeditem.ToAisV3(req.FullPrefixUrl));
                    itemdata.Add("_embedded", embedded);
                    links.Add(item.ID.ToString(), itemdata);
                    req.InventoryService.Item.Add(item);
                    addeditems.Add(item.ID);
                    linkedids.Add(item.ID.ToString(), item.AssetID.ToString());
                }
                else if (item.AssetType == AssetType.LinkFolder && req.InventoryService.Folder.TryGetValue(req.Agent.ID, item.AssetID, out linkedfolder))
                {
                    item.InventoryType = InventoryType.Unknown;
                    itemdata           = item.ToAisV3(req.FullPrefixUrl);
                    var embedded = new Map();
                    embedded.Add("category", linkedfolder.ToAisV3(req.FullPrefixUrl));
                    itemdata.Add("_embedded", embedded);
                    links.Add(item.ID.ToString(), itemdata);
                    req.InventoryService.Item.Add(item);
                    addeditems.Add(item.ID);
                    linkedids.Add(item.ID.ToString(), item.AssetID.ToString());
                }
            }

            if (req.InventoryService.Folder.TryGetValue(req.Agent.ID, folder.ID, out folder))
            {
                updated_category_versions.Add(folder.ID.ToString(), folder.Version);
            }

            SuccessResponse(req, new Map
            {
                ["_embedded"] = new Map {
                    { "links", links }
                },
                ["_linked_ids"]                = linkedids,
                ["_created_items"]             = addeditems,
                ["_category_items_removed"]    = category_items_removed,
                ["_updated_category_versions"] = updated_category_versions
            });
        }
Exemple #29
0
        public void HttpRequestHandler(HttpRequest httpreq)
        {
            if (httpreq.CallerIP != m_RemoteIP)
            {
                httpreq.ErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
                return;
            }
            UUID transactionID;

            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            var parts = httpreq.RawUrl.Substring(1).Split('/');

            if (parts.Length == 3)
            {
                UUID uploadID;
                if (httpreq.ContentType != "application/llsd+xml")
                {
                    httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                    return;
                }

                Map reqmap;
                try
                {
                    IValue iv = LlsdXml.Deserialize(httpreq.Body);
                    reqmap = iv as Map;
                }
                catch
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                    return;
                }
                if (reqmap == null)
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                    return;
                }

                try
                {
                    uploadID = GetUploaderID(reqmap);
                }
                catch (UploadErrorException e)
                {
                    var llsderrorreply = new Map
                    {
                        { "state", "error" },
                        { "message", e.Message }
                    };
                    using (HttpResponse httperrorres = httpreq.BeginResponse())
                    {
                        using (Stream outErrorStream = httperrorres.GetOutputStream())
                        {
                            LlsdXml.Serialize(llsderrorreply, outErrorStream);
                        }
                    }
                    return;
                }
                catch (InsufficientFundsException)
                {
                    var llsderrorreply = new Map
                    {
                        { "state", "insufficient funds" }
                    };
                    using (HttpResponse httperrorres = httpreq.BeginResponse())
                    {
                        using (Stream outErrorStream = httperrorres.GetOutputStream())
                        {
                            LlsdXml.Serialize(llsderrorreply, outErrorStream);
                        }
                    }
                    return;
                }
                catch
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                    return;
                }
                /* Upload start */
                var llsdreply = new Map
                {
                    { "state", "upload" },
                    { "uploader", m_ServerURI + httpreq.RawUrl + "/Upload/" + uploadID.ToString() }
                };
                using (HttpResponse httpres = httpreq.BeginResponse())
                {
                    using (Stream outStream = httpres.GetOutputStream())
                    {
                        LlsdXml.Serialize(llsdreply, outStream);
                    }
                }
            }
            else if (parts.Length < 5 || parts[3] != "Upload" || !UUID.TryParse(parts[4], out transactionID))
            {
                httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
            }
            else
            {
                /* Upload finished */
                var asset = new AssetData();
                var body  = httpreq.Body;
                asset.Data = new byte[body.Length];
                int readBytes = body.Read(asset.Data, 0, (int)body.Length);
                if (body.Length != readBytes)
                {
                    httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Bad Request");
                    return;
                }

                asset.Type      = NewAssetType;
                asset.ID        = NewAssetID;
                asset.Local     = AssetIsLocal;
                asset.Temporary = AssetIsTemporary;
                asset.Name      = string.Empty;

                Map llsdreply;
                try
                {
                    llsdreply = UploadedData(transactionID, asset);
                }
                catch (UrlNotFoundException)
                {
                    httpreq.ErrorResponse(HttpStatusCode.NotFound, "Not Found");
                    return;
                }
                catch (UploadErrorException e)
                {
                    var llsderrorreply = new Map
                    {
                        { "state", "error" },
                        { "message", e.Message }
                    };
                    using (var httperrorres = httpreq.BeginResponse())
                    {
                        httperrorres.ContentType = "application/llsd+xml";
                        using (var outErrorStream = httperrorres.GetOutputStream())
                        {
                            LlsdXml.Serialize(llsderrorreply, outErrorStream);
                        }
                    }
                    return;
                }
                catch (InsufficientFundsException)
                {
                    var llsderrorreply = new Map
                    {
                        { "state", "insufficient funds" }
                    };
                    using (var httperrorres = httpreq.BeginResponse())
                    {
                        httperrorres.ContentType = "application/llsd+xml";
                        using (var outErrorStream = httperrorres.GetOutputStream())
                        {
                            LlsdXml.Serialize(llsderrorreply, outErrorStream);
                        }
                    }
                    return;
                }
                catch
                {
                    httpreq.ErrorResponse(HttpStatusCode.InternalServerError, "Internal Server Error");
                    return;
                }

                llsdreply.Add("new_asset", asset.ID);
                llsdreply.Add("state", "complete");

                using (var httpres = httpreq.BeginResponse())
                {
                    httpres.ContentType = "application/llsd+xml";
                    using (var outStream = httpres.GetOutputStream())
                    {
                        LlsdXml.Serialize(llsdreply, outStream);
                    }
                }
            }
        }
        List <InventoryItem> this[List <UUID> itemids]
        {
            get
            {
                var items  = new AnArray();
                var reqmap = new Map
                {
                    ["items"] = items
                };
                foreach (UUID itemid in itemids)
                {
                    items.Add(itemid);
                }
                byte[] reqdata;
                using (var ms = new MemoryStream())
                {
                    LlsdXml.Serialize(reqmap, ms);
                    reqdata = ms.ToArray();
                }
                Map resdata;
                using (Stream s = new HttpClient.Post(m_CapabilityUri, "application/llsd+xml", reqdata.Length,
                                                      (Stream o) => o.Write(reqdata, 0, reqdata.Length))
                {
                    TimeoutMs = TimeoutMs
                }.ExecuteStreamRequest())
                {
                    resdata = LlsdXml.Deserialize(s) as Map;
                }
                if (resdata == null)
                {
                    throw new InvalidDataException();
                }

                AnArray itemres;
                if (!resdata.TryGetValue("items", out itemres))
                {
                    throw new InvalidDataException();
                }
                var result = new List <InventoryItem>();
                foreach (IValue item in itemres)
                {
                    var itemdata = item as Map;
                    if (itemdata == null)
                    {
                        continue;
                    }

                    var permissions = (Map)itemdata["permissions"];
                    var sale_info   = (Map)itemdata["sale_info"];
                    var resitem     = new InventoryItem(itemdata["item_id"].AsUUID)
                    {
                        AssetID        = itemdata["asset_id"].AsUUID,
                        CreationDate   = Date.UnixTimeToDateTime(itemdata["created_at"].AsULong),
                        Description    = itemdata["desc"].ToString(),
                        Flags          = (InventoryFlags)itemdata["flags"].AsInt,
                        InventoryType  = (InventoryType)itemdata["inv_type"].AsInt,
                        Name           = itemdata["name"].ToString(),
                        ParentFolderID = itemdata["parent_id"].AsUUID,
                        AssetType      = (AssetType)itemdata["type"].AsInt,
                        Creator        = new UGUI(permissions["creator_id"].AsUUID),
                        Group          = new UGI(permissions["group_id"].AsUUID),
                        IsGroupOwned   = permissions["is_owner_group"].AsBoolean,
                        LastOwner      = new UGUI(permissions["last_owner_id"].AsUUID),
                        Owner          = new UGUI(permissions["owner_id"].AsUUID),
                        SaleInfo       = new InventoryItem.SaleInfoData
                        {
                            Price = sale_info["sale_price"].AsInt,
                            Type  = (InventoryItem.SaleInfoData.SaleType)sale_info["sale_type"].AsInt
                        }
                    };
                    resitem.Permissions.Base      = (InventoryPermissionsMask)permissions["base_mask"].AsInt;
                    resitem.Permissions.EveryOne  = (InventoryPermissionsMask)permissions["everyone_mask"].AsInt;
                    resitem.Permissions.Group     = (InventoryPermissionsMask)permissions["group_mask"].AsInt;
                    resitem.Permissions.NextOwner = (InventoryPermissionsMask)permissions["next_owner_mask"].AsInt;
                    resitem.Permissions.Current   = (InventoryPermissionsMask)permissions["owner_mask"].AsInt;
                }
                return(result);
            }
        }