diff options
Diffstat (limited to 'OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs')
-rw-r--r-- | OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs | 478 |
1 files changed, 239 insertions, 239 deletions
diff --git a/OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs b/OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs index 454984e..df6bd95 100644 --- a/OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs +++ b/OpenSim/Grid/AssetInventoryServer/Extensions/ReferenceFrontend.cs | |||
@@ -1,239 +1,239 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2008 Intel Corporation | 2 | * Copyright (c) 2008 Intel Corporation |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * Redistribution and use in source and binary forms, with or without | 4 | * Redistribution and use in source and binary forms, with or without |
5 | * modification, are permitted provided that the following conditions | 5 | * modification, are permitted provided that the following conditions |
6 | * are met: | 6 | * are met: |
7 | * | 7 | * |
8 | * -- Redistributions of source code must retain the above copyright | 8 | * -- Redistributions of source code must retain the above copyright |
9 | * notice, this list of conditions and the following disclaimer. | 9 | * notice, this list of conditions and the following disclaimer. |
10 | * -- Redistributions in binary form must reproduce the above copyright | 10 | * -- Redistributions in binary form must reproduce the above copyright |
11 | * notice, this list of conditions and the following disclaimer in the | 11 | * notice, this list of conditions and the following disclaimer in the |
12 | * documentation and/or other materials provided with the distribution. | 12 | * documentation and/or other materials provided with the distribution. |
13 | * -- Neither the name of the Intel Corporation nor the names of its | 13 | * -- Neither the name of the Intel Corporation nor the names of its |
14 | * contributors may be used to endorse or promote products derived from | 14 | * contributors may be used to endorse or promote products derived from |
15 | * this software without specific prior written permission. | 15 | * this software without specific prior written permission. |
16 | * | 16 | * |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
18 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 18 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | 19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
20 | * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS | 20 | * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS |
21 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 21 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
22 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 22 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
23 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 23 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
24 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 24 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
25 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 25 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
26 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 26 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | using System; | 30 | using System; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Net; | 32 | using System.Net; |
33 | using System.Xml; | 33 | using System.Xml; |
34 | using ExtensionLoader; | 34 | using ExtensionLoader; |
35 | using OpenMetaverse; | 35 | using OpenMetaverse; |
36 | using OpenMetaverse.StructuredData; | 36 | using OpenMetaverse.StructuredData; |
37 | using HttpServer; | 37 | using HttpServer; |
38 | 38 | ||
39 | namespace OpenSim.Grid.AssetInventoryServer.Extensions | 39 | namespace OpenSim.Grid.AssetInventoryServer.Extensions |
40 | { | 40 | { |
41 | public class ReferenceFrontend : IExtension<AssetInventoryServer> | 41 | public class ReferenceFrontend : IExtension<AssetInventoryServer> |
42 | { | 42 | { |
43 | AssetInventoryServer server; | 43 | AssetInventoryServer server; |
44 | 44 | ||
45 | public ReferenceFrontend() | 45 | public ReferenceFrontend() |
46 | { | 46 | { |
47 | } | 47 | } |
48 | 48 | ||
49 | public void Start(AssetInventoryServer server) | 49 | public void Start(AssetInventoryServer server) |
50 | { | 50 | { |
51 | this.server = server; | 51 | this.server = server; |
52 | 52 | ||
53 | // Asset metadata request | 53 | // Asset metadata request |
54 | 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", | 54 | 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", |
55 | MetadataRequestHandler); | 55 | MetadataRequestHandler); |
56 | 56 | ||
57 | // Asset data request | 57 | // Asset data request |
58 | 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", | 58 | 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", |
59 | DataRequestHandler); | 59 | DataRequestHandler); |
60 | 60 | ||
61 | // Asset creation | 61 | // Asset creation |
62 | server.HttpServer.AddHandler("post", null, "^/createasset", CreateRequestHandler); | 62 | server.HttpServer.AddHandler("post", null, "^/createasset", CreateRequestHandler); |
63 | } | 63 | } |
64 | 64 | ||
65 | public void Stop() | 65 | public void Stop() |
66 | { | 66 | { |
67 | } | 67 | } |
68 | 68 | ||
69 | bool MetadataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) | 69 | bool MetadataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
70 | { | 70 | { |
71 | UUID assetID; | 71 | UUID assetID; |
72 | // Split the URL up into an AssetID and a method | 72 | // Split the URL up into an AssetID and a method |
73 | string[] rawUrl = request.Uri.PathAndQuery.Split('/'); | 73 | string[] rawUrl = request.Uri.PathAndQuery.Split('/'); |
74 | 74 | ||
75 | if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) | 75 | if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) |
76 | { | 76 | { |
77 | UUID authToken = Utils.GetAuthToken(request); | 77 | UUID authToken = Utils.GetAuthToken(request); |
78 | 78 | ||
79 | if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) | 79 | if (server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) |
80 | { | 80 | { |
81 | Metadata metadata; | 81 | Metadata metadata; |
82 | BackendResponse storageResponse = server.StorageProvider.TryFetchMetadata(assetID, out metadata); | 82 | BackendResponse storageResponse = server.StorageProvider.TryFetchMetadata(assetID, out metadata); |
83 | 83 | ||
84 | if (storageResponse == BackendResponse.Success) | 84 | if (storageResponse == BackendResponse.Success) |
85 | { | 85 | { |
86 | // If the asset data location wasn't specified in the metadata, specify it | 86 | // If the asset data location wasn't specified in the metadata, specify it |
87 | // manually here by pointing back to this asset server | 87 | // manually here by pointing back to this asset server |
88 | if (!metadata.Methods.ContainsKey("data")) | 88 | if (!metadata.Methods.ContainsKey("data")) |
89 | { | 89 | { |
90 | metadata.Methods["data"] = new Uri(String.Format("{0}://{1}/{2}/data", | 90 | metadata.Methods["data"] = new Uri(String.Format("{0}://{1}/{2}/data", |
91 | request.Uri.Scheme, request.Uri.Authority, assetID)); | 91 | request.Uri.Scheme, request.Uri.Authority, assetID)); |
92 | } | 92 | } |
93 | 93 | ||
94 | byte[] serializedData = metadata.SerializeToBytes(); | 94 | byte[] serializedData = metadata.SerializeToBytes(); |
95 | 95 | ||
96 | response.Status = HttpStatusCode.OK; | 96 | response.Status = HttpStatusCode.OK; |
97 | response.ContentType = "application/json"; | 97 | response.ContentType = "application/json"; |
98 | response.ContentLength = serializedData.Length; | 98 | response.ContentLength = serializedData.Length; |
99 | response.Body.Write(serializedData, 0, serializedData.Length); | 99 | response.Body.Write(serializedData, 0, serializedData.Length); |
100 | 100 | ||
101 | } | 101 | } |
102 | else if (storageResponse == BackendResponse.NotFound) | 102 | else if (storageResponse == BackendResponse.NotFound) |
103 | { | 103 | { |
104 | Logger.Log.Warn("Could not find metadata for asset " + assetID.ToString()); | 104 | Logger.Log.Warn("Could not find metadata for asset " + assetID.ToString()); |
105 | response.Status = HttpStatusCode.NotFound; | 105 | response.Status = HttpStatusCode.NotFound; |
106 | } | 106 | } |
107 | else | 107 | else |
108 | { | 108 | { |
109 | response.Status = HttpStatusCode.InternalServerError; | 109 | response.Status = HttpStatusCode.InternalServerError; |
110 | } | 110 | } |
111 | } | 111 | } |
112 | else | 112 | else |
113 | { | 113 | { |
114 | response.Status = HttpStatusCode.Forbidden; | 114 | response.Status = HttpStatusCode.Forbidden; |
115 | } | 115 | } |
116 | 116 | ||
117 | return true; | 117 | return true; |
118 | } | 118 | } |
119 | 119 | ||
120 | response.Status = HttpStatusCode.NotFound; | 120 | response.Status = HttpStatusCode.NotFound; |
121 | return true; | 121 | return true; |
122 | } | 122 | } |
123 | 123 | ||
124 | bool DataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) | 124 | bool DataRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
125 | { | 125 | { |
126 | UUID assetID; | 126 | UUID assetID; |
127 | // Split the URL up into an AssetID and a method | 127 | // Split the URL up into an AssetID and a method |
128 | string[] rawUrl = request.Uri.PathAndQuery.Split('/'); | 128 | string[] rawUrl = request.Uri.PathAndQuery.Split('/'); |
129 | 129 | ||
130 | if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) | 130 | if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) |
131 | { | 131 | { |
132 | UUID authToken = Utils.GetAuthToken(request); | 132 | UUID authToken = Utils.GetAuthToken(request); |
133 | 133 | ||
134 | if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) | 134 | if (server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) |
135 | { | 135 | { |
136 | byte[] assetData; | 136 | byte[] assetData; |
137 | BackendResponse storageResponse = server.StorageProvider.TryFetchData(assetID, out assetData); | 137 | BackendResponse storageResponse = server.StorageProvider.TryFetchData(assetID, out assetData); |
138 | 138 | ||
139 | if (storageResponse == BackendResponse.Success) | 139 | if (storageResponse == BackendResponse.Success) |
140 | { | 140 | { |
141 | response.Status = HttpStatusCode.OK; | 141 | response.Status = HttpStatusCode.OK; |
142 | response.Status = HttpStatusCode.OK; | 142 | response.Status = HttpStatusCode.OK; |
143 | response.ContentType = "application/octet-stream"; | 143 | response.ContentType = "application/octet-stream"; |
144 | response.AddHeader("Content-Disposition", "attachment; filename=" + assetID.ToString()); | 144 | response.AddHeader("Content-Disposition", "attachment; filename=" + assetID.ToString()); |
145 | response.ContentLength = assetData.Length; | 145 | response.ContentLength = assetData.Length; |
146 | response.Body.Write(assetData, 0, assetData.Length); | 146 | response.Body.Write(assetData, 0, assetData.Length); |
147 | } | 147 | } |
148 | else if (storageResponse == BackendResponse.NotFound) | 148 | else if (storageResponse == BackendResponse.NotFound) |
149 | { | 149 | { |
150 | response.Status = HttpStatusCode.NotFound; | 150 | response.Status = HttpStatusCode.NotFound; |
151 | } | 151 | } |
152 | else | 152 | else |
153 | { | 153 | { |
154 | response.Status = HttpStatusCode.InternalServerError; | 154 | response.Status = HttpStatusCode.InternalServerError; |
155 | } | 155 | } |
156 | } | 156 | } |
157 | else | 157 | else |
158 | { | 158 | { |
159 | response.Status = HttpStatusCode.Forbidden; | 159 | response.Status = HttpStatusCode.Forbidden; |
160 | } | 160 | } |
161 | 161 | ||
162 | return true; | 162 | return true; |
163 | } | 163 | } |
164 | 164 | ||
165 | response.Status = HttpStatusCode.BadRequest; | 165 | response.Status = HttpStatusCode.BadRequest; |
166 | return true; | 166 | return true; |
167 | } | 167 | } |
168 | 168 | ||
169 | bool CreateRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) | 169 | bool CreateRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
170 | { | 170 | { |
171 | UUID authToken = Utils.GetAuthToken(request); | 171 | UUID authToken = Utils.GetAuthToken(request); |
172 | 172 | ||
173 | if (server.AuthorizationProvider.IsCreateAuthorized(authToken)) | 173 | if (server.AuthorizationProvider.IsCreateAuthorized(authToken)) |
174 | { | 174 | { |
175 | try | 175 | try |
176 | { | 176 | { |
177 | OSD osdata = OSDParser.DeserializeJson(request.Body); | 177 | OSD osdata = OSDParser.DeserializeJson(request.Body); |
178 | 178 | ||
179 | if (osdata.Type == OSDType.Map) | 179 | if (osdata.Type == OSDType.Map) |
180 | { | 180 | { |
181 | OSDMap map = (OSDMap)osdata; | 181 | OSDMap map = (OSDMap)osdata; |
182 | Metadata metadata = new Metadata(); | 182 | Metadata metadata = new Metadata(); |
183 | metadata.Deserialize(map); | 183 | metadata.Deserialize(map); |
184 | 184 | ||
185 | byte[] assetData = map["data"].AsBinary(); | 185 | byte[] assetData = map["data"].AsBinary(); |
186 | 186 | ||
187 | if (assetData != null && assetData.Length > 0) | 187 | if (assetData != null && assetData.Length > 0) |
188 | { | 188 | { |
189 | BackendResponse storageResponse; | 189 | BackendResponse storageResponse; |
190 | 190 | ||
191 | if (metadata.ID != UUID.Zero) | 191 | if (metadata.ID != UUID.Zero) |
192 | storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData); | 192 | storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData); |
193 | else | 193 | else |
194 | storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData, out metadata.ID); | 194 | storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData, out metadata.ID); |
195 | 195 | ||
196 | if (storageResponse == BackendResponse.Success) | 196 | if (storageResponse == BackendResponse.Success) |
197 | { | 197 | { |
198 | response.Status = HttpStatusCode.Created; | 198 | response.Status = HttpStatusCode.Created; |
199 | OSDMap responseMap = new OSDMap(1); | 199 | OSDMap responseMap = new OSDMap(1); |
200 | responseMap["id"] = OSD.FromUUID(metadata.ID); | 200 | responseMap["id"] = OSD.FromUUID(metadata.ID); |
201 | LitJson.JsonData jsonData = OSDParser.SerializeJson(responseMap); | 201 | LitJson.JsonData jsonData = OSDParser.SerializeJson(responseMap); |
202 | byte[] responseData = System.Text.Encoding.UTF8.GetBytes(jsonData.ToJson()); | 202 | byte[] responseData = System.Text.Encoding.UTF8.GetBytes(jsonData.ToJson()); |
203 | response.Body.Write(responseData, 0, responseData.Length); | 203 | response.Body.Write(responseData, 0, responseData.Length); |
204 | response.Body.Flush(); | 204 | response.Body.Flush(); |
205 | } | 205 | } |
206 | else if (storageResponse == BackendResponse.NotFound) | 206 | else if (storageResponse == BackendResponse.NotFound) |
207 | { | 207 | { |
208 | response.Status = HttpStatusCode.NotFound; | 208 | response.Status = HttpStatusCode.NotFound; |
209 | } | 209 | } |
210 | else | 210 | else |
211 | { | 211 | { |
212 | response.Status = HttpStatusCode.InternalServerError; | 212 | response.Status = HttpStatusCode.InternalServerError; |
213 | } | 213 | } |
214 | } | 214 | } |
215 | else | 215 | else |
216 | { | 216 | { |
217 | response.Status = HttpStatusCode.BadRequest; | 217 | response.Status = HttpStatusCode.BadRequest; |
218 | } | 218 | } |
219 | } | 219 | } |
220 | else | 220 | else |
221 | { | 221 | { |
222 | response.Status = HttpStatusCode.BadRequest; | 222 | response.Status = HttpStatusCode.BadRequest; |
223 | } | 223 | } |
224 | } | 224 | } |
225 | catch (Exception ex) | 225 | catch (Exception ex) |
226 | { | 226 | { |
227 | response.Status = HttpStatusCode.InternalServerError; | 227 | response.Status = HttpStatusCode.InternalServerError; |
228 | response.Reason = ex.Message; | 228 | response.Reason = ex.Message; |
229 | } | 229 | } |
230 | } | 230 | } |
231 | else | 231 | else |
232 | { | 232 | { |
233 | response.Status = HttpStatusCode.Forbidden; | 233 | response.Status = HttpStatusCode.Forbidden; |
234 | } | 234 | } |
235 | 235 | ||
236 | return true; | 236 | return true; |
237 | } | 237 | } |
238 | } | 238 | } |
239 | } | 239 | } |