From 02cf9f7e9f879642b1a1b84373b51429e263d532 Mon Sep 17 00:00:00 2001
From: Mike Mazur
Date: Mon, 16 Feb 2009 02:26:44 +0000
Subject: Move BrowseFrontend and ReferenceFrontend to
OpenSim/Grid/AssetInventoryServer/Plugins.
---
.../Plugins/BrowseFrontendPlugin.cs | 151 ++++++++++++
.../Plugins/ReferenceFrontendPlugin.cs | 265 +++++++++++++++++++++
.../AssetInventoryServerPlugins.addin.xml | 6 +
3 files changed, 422 insertions(+)
create mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs
create mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs
(limited to 'OpenSim/Grid/AssetInventoryServer/Plugins')
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs
new file mode 100644
index 0000000..f445b97
--- /dev/null
+++ b/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2008 Intel Corporation
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -- Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * -- Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * -- Neither the name of the Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Net;
+using System.Text;
+using System.Web;
+using OpenMetaverse;
+using HttpServer;
+using OpenSim.Framework;
+
+namespace OpenSim.Grid.AssetInventoryServer.Plugins
+{
+ public class BrowseFrontendPlugin : IAssetInventoryServerPlugin
+ {
+ AssetInventoryServer server;
+
+ public BrowseFrontendPlugin()
+ {
+ }
+
+ #region IPlugin implementation
+
+ public void Initialise(AssetInventoryServer server)
+ {
+ this.server = server;
+
+ // Request for / or /?...
+ server.HttpServer.AddHandler("get", null, @"(^/$)|(^/\?.*)", BrowseRequestHandler);
+
+ Logger.Log.Info("[ASSET] Browser Frontend loaded.");
+ }
+
+ ///
+ /// Initialises asset interface
+ ///
+ public void Initialise()
+ {
+ Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
+ throw new PluginNotInitialisedException(Name);
+ }
+
+ public void Dispose()
+ {
+ }
+
+ public string Version
+ {
+ // TODO: this should be something meaningful and not hardcoded?
+ get { return "0.1"; }
+ }
+
+ public string Name
+ {
+ get { return "AssetInventoryServer Browse asset frontend"; }
+ }
+
+ #endregion IPlugin implementation
+
+ bool BrowseRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ const int ASSETS_PER_PAGE = 25;
+ const string HEADER = "
Asset Server";
+ const string TABLE_HEADER =
+ "Name | Description | Type | ID | Temporary | SHA-1 |
";
+ const string TABLE_FOOTER = "
";
+ const string FOOTER = "";
+
+ UUID authToken = Utils.GetAuthToken(request);
+
+ StringBuilder html = new StringBuilder();
+ int start = 0;
+ uint page = 0;
+
+ if (!String.IsNullOrEmpty(request.Uri.Query))
+ {
+ NameValueCollection query = HttpUtility.ParseQueryString(request.Uri.Query);
+ if (!String.IsNullOrEmpty(query["page"]) && UInt32.TryParse(query["page"], out page))
+ start = (int)page * ASSETS_PER_PAGE;
+ }
+
+ html.AppendLine(HEADER);
+
+ html.AppendLine("");
+ if (page > 0)
+ html.AppendFormat("< Previous Page | ", request.Uri.AbsolutePath, page - 1);
+ html.AppendFormat("Next Page >", request.Uri.AbsolutePath, page + 1);
+ html.AppendLine("
");
+
+ html.AppendLine(TABLE_HEADER);
+
+ server.StorageProvider.ForEach(
+ delegate(Metadata data)
+ {
+ if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, data.ID))
+ {
+ html.AppendLine(String.Format(
+ "{0} | {1} | {2} | {3} | {4} | {5} |
",
+ data.Name, data.Description, data.ContentType, data.ID, data.Temporary,
+ BitConverter.ToString(data.SHA1).Replace("-", String.Empty)));
+ }
+ else
+ {
+ html.AppendLine(String.Format(
+ "[Protected Asset] | | | {0} | {1} | |
",
+ data.ID, data.Temporary));
+ }
+ }, start, ASSETS_PER_PAGE
+ );
+
+ html.AppendLine(TABLE_FOOTER);
+
+ html.AppendLine(FOOTER);
+
+ byte[] responseData = System.Text.Encoding.UTF8.GetBytes(html.ToString());
+
+ response.Status = HttpStatusCode.OK;
+ response.Body.Write(responseData, 0, responseData.Length);
+ response.Body.Flush();
+ return true;
+ }
+ }
+}
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs
new file mode 100644
index 0000000..fddc385
--- /dev/null
+++ b/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2008 Intel Corporation
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * -- Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * -- Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * -- Neither the name of the Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Xml;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using HttpServer;
+using OpenSim.Framework;
+
+namespace OpenSim.Grid.AssetInventoryServer.Plugins
+{
+ public class ReferenceFrontendPlugin : IAssetInventoryServerPlugin
+ {
+ AssetInventoryServer server;
+
+ public ReferenceFrontendPlugin()
+ {
+ }
+
+ #region IPlugin implementation
+
+ public void Initialise(AssetInventoryServer server)
+ {
+ this.server = server;
+
+ // Asset metadata request
+ server.HttpServer.AddHandler("get", null, @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/metadata",
+ MetadataRequestHandler);
+
+ // Asset data request
+ server.HttpServer.AddHandler("get", null, @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/data",
+ DataRequestHandler);
+
+ // Asset creation
+ server.HttpServer.AddHandler("post", null, "^/createasset", CreateRequestHandler);
+
+ Logger.Log.Info("[ASSET] Reference Frontend loaded.");
+ }
+
+ ///
+ /// Initialises asset interface
+ ///
+ public void Initialise()
+ {
+ Logger.Log.InfoFormat("[ASSET]: {0} cannot be default-initialized!", Name);
+ throw new PluginNotInitialisedException(Name);
+ }
+
+ public void Dispose()
+ {
+ }
+
+ public string Version
+ {
+ // TODO: this should be something meaningful and not hardcoded?
+ get { return "0.1"; }
+ }
+
+ public string Name
+ {
+ get { return "AssetInventoryServer Reference asset frontend"; }
+ }
+
+ #endregion IPlugin implementation
+
+ bool MetadataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ UUID assetID;
+ // Split the URL up into an AssetID and a method
+ string[] rawUrl = request.Uri.PathAndQuery.Split('/');
+
+ if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID))
+ {
+ UUID authToken = Utils.GetAuthToken(request);
+
+ if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID))
+ {
+ Metadata metadata;
+ BackendResponse storageResponse = server.StorageProvider.TryFetchMetadata(assetID, out metadata);
+
+ if (storageResponse == BackendResponse.Success)
+ {
+ // If the asset data location wasn't specified in the metadata, specify it
+ // manually here by pointing back to this asset server
+ if (!metadata.Methods.ContainsKey("data"))
+ {
+ metadata.Methods["data"] = new Uri(String.Format("{0}://{1}/{2}/data",
+ request.Uri.Scheme, request.Uri.Authority, assetID));
+ }
+
+ byte[] serializedData = metadata.SerializeToBytes();
+
+ response.Status = HttpStatusCode.OK;
+ response.ContentType = "application/json";
+ response.ContentLength = serializedData.Length;
+ response.Body.Write(serializedData, 0, serializedData.Length);
+
+ }
+ else if (storageResponse == BackendResponse.NotFound)
+ {
+ Logger.Log.Warn("Could not find metadata for asset " + assetID.ToString());
+ response.Status = HttpStatusCode.NotFound;
+ }
+ else
+ {
+ response.Status = HttpStatusCode.InternalServerError;
+ }
+ }
+ else
+ {
+ response.Status = HttpStatusCode.Forbidden;
+ }
+
+ return true;
+ }
+
+ response.Status = HttpStatusCode.NotFound;
+ return true;
+ }
+
+ bool DataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ UUID assetID;
+ // Split the URL up into an AssetID and a method
+ string[] rawUrl = request.Uri.PathAndQuery.Split('/');
+
+ if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID))
+ {
+ UUID authToken = Utils.GetAuthToken(request);
+
+ if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID))
+ {
+ byte[] assetData;
+ BackendResponse storageResponse = server.StorageProvider.TryFetchData(assetID, out assetData);
+
+ if (storageResponse == BackendResponse.Success)
+ {
+ response.Status = HttpStatusCode.OK;
+ response.Status = HttpStatusCode.OK;
+ response.ContentType = "application/octet-stream";
+ response.AddHeader("Content-Disposition", "attachment; filename=" + assetID.ToString());
+ response.ContentLength = assetData.Length;
+ response.Body.Write(assetData, 0, assetData.Length);
+ }
+ else if (storageResponse == BackendResponse.NotFound)
+ {
+ response.Status = HttpStatusCode.NotFound;
+ }
+ else
+ {
+ response.Status = HttpStatusCode.InternalServerError;
+ }
+ }
+ else
+ {
+ response.Status = HttpStatusCode.Forbidden;
+ }
+
+ return true;
+ }
+
+ response.Status = HttpStatusCode.BadRequest;
+ return true;
+ }
+
+ bool CreateRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response)
+ {
+ UUID authToken = Utils.GetAuthToken(request);
+
+ if (server.AuthorizationProvider.IsCreateAuthorized(authToken))
+ {
+ try
+ {
+ OSD osdata = OSDParser.DeserializeJson(request.Body);
+
+ if (osdata.Type == OSDType.Map)
+ {
+ OSDMap map = (OSDMap)osdata;
+ Metadata metadata = new Metadata();
+ metadata.Deserialize(map);
+
+ byte[] assetData = map["data"].AsBinary();
+
+ if (assetData != null && assetData.Length > 0)
+ {
+ BackendResponse storageResponse;
+
+ if (metadata.ID != UUID.Zero)
+ storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData);
+ else
+ storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData, out metadata.ID);
+
+ if (storageResponse == BackendResponse.Success)
+ {
+ response.Status = HttpStatusCode.Created;
+ OSDMap responseMap = new OSDMap(1);
+ responseMap["id"] = OSD.FromUUID(metadata.ID);
+ LitJson.JsonData jsonData = OSDParser.SerializeJson(responseMap);
+ byte[] responseData = System.Text.Encoding.UTF8.GetBytes(jsonData.ToJson());
+ response.Body.Write(responseData, 0, responseData.Length);
+ response.Body.Flush();
+ }
+ else if (storageResponse == BackendResponse.NotFound)
+ {
+ response.Status = HttpStatusCode.NotFound;
+ }
+ else
+ {
+ response.Status = HttpStatusCode.InternalServerError;
+ }
+ }
+ else
+ {
+ response.Status = HttpStatusCode.BadRequest;
+ }
+ }
+ else
+ {
+ response.Status = HttpStatusCode.BadRequest;
+ }
+ }
+ catch (Exception ex)
+ {
+ response.Status = HttpStatusCode.InternalServerError;
+ response.Reason = ex.Message;
+ }
+ }
+ else
+ {
+ response.Status = HttpStatusCode.Forbidden;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml
index 089c6a2..0ec28de 100644
--- a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml
+++ b/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml
@@ -10,4 +10,10 @@
+
+
+
+
+
+
--
cgit v1.1