aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Capabilities/Caps.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Communications/Capabilities/Caps.cs')
-rw-r--r--OpenSim/Framework/Communications/Capabilities/Caps.cs189
1 files changed, 48 insertions, 141 deletions
diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs
index 53cad66..886ca49 100644
--- a/OpenSim/Framework/Communications/Capabilities/Caps.cs
+++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs
@@ -55,25 +55,22 @@ namespace OpenSim.Region.Capabilities
55 public delegate List<InventoryItemBase> FetchInventoryDescendentsCAPS(LLUUID agentID, LLUUID folderID, LLUUID ownerID, 55 public delegate List<InventoryItemBase> FetchInventoryDescendentsCAPS(LLUUID agentID, LLUUID folderID, LLUUID ownerID,
56 bool fetchFolders, bool fetchItems, int sortOrder); 56 bool fetchFolders, bool fetchItems, int sortOrder);
57 57
58 /// <summary>
59 /// FIXME This is a temporary delegate, and should disappear once the voice code is fleshed out and moved into its
60 /// own region module.
61 /// </summary>
62 public delegate CachedUserInfo GetUserDetailsCAPS(LLUUID agentID);
63
64 public class Caps 58 public class Caps
65 { 59 {
66 private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 60 private static readonly log4net.ILog m_log =
67 61 log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
62
68 private string m_httpListenerHostName; 63 private string m_httpListenerHostName;
69 private uint m_httpListenPort; 64 private uint m_httpListenPort;
70 65
71 /// <summary> 66 /// <summary>
72 /// This is the uuid portion of every CAPS path. It is used to make capability urls private to the requester. 67 /// This is the uuid portion of every CAPS path. It is used to make capability urls private to the requester.
73 /// </summary> 68 /// </summary>
74 private string m_capsObjectPath; 69 private string m_capsObjectPath;
75 public string CapsObjectPath { get { return m_capsObjectPath; } } 70 public string CapsObjectPath { get { return m_capsObjectPath; } }
76 71
72 private CapsHandlers m_capsHandlers;
73
77 private static readonly string m_requestPath = "0000/"; 74 private static readonly string m_requestPath = "0000/";
78 private static readonly string m_mapLayerPath = "0001/"; 75 private static readonly string m_mapLayerPath = "0001/";
79 private static readonly string m_newInventory = "0002/"; 76 private static readonly string m_newInventory = "0002/";
@@ -99,7 +96,6 @@ namespace OpenSim.Region.Capabilities
99 public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null; 96 public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null;
100 // 97 //
101 public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null; 98 public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null;
102 public GetUserDetailsCAPS CAPSGetUserDetails = null;
103 99
104 public Caps(AssetCache assetCache, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, 100 public Caps(AssetCache assetCache, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath,
105 LLUUID agent, bool dumpAssetsToFile) 101 LLUUID agent, bool dumpAssetsToFile)
@@ -111,6 +107,7 @@ namespace OpenSim.Region.Capabilities
111 m_httpListenPort = httpPort; 107 m_httpListenPort = httpPort;
112 m_agentID = agent; 108 m_agentID = agent;
113 m_dumpAssetsToFile = dumpAssetsToFile; 109 m_dumpAssetsToFile = dumpAssetsToFile;
110 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort);
114 } 111 }
115 112
116 /// <summary> 113 /// <summary>
@@ -123,27 +120,31 @@ namespace OpenSim.Region.Capabilities
123 string capsBase = "/CAPS/" + m_capsObjectPath; 120 string capsBase = "/CAPS/" + m_capsObjectPath;
124 121
125 try 122 try
126 { 123 {
127 m_httpListener.AddStreamHandler( 124 // the root of all evil
128 new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, GetMapLayer)); 125 m_capsHandlers["SEED"] = new RestStreamHandler("POST", capsBase + m_requestPath, CapsRequest);
129 m_httpListener.AddStreamHandler( 126 m_capsHandlers["MapLayer"] =
127 new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST",
128 capsBase + m_mapLayerPath,
129 GetMapLayer);
130 m_capsHandlers["NewFileAgentInventory"] =
130 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST", 131 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST",
131 capsBase + m_newInventory, 132 capsBase + m_newInventory,
132 NewAgentInventoryRequest)); 133 NewAgentInventoryRequest);
133 134 m_capsHandlers["UpdateNotecardAgentInventory"] =
134 // m_httpListener.AddStreamHandler( 135 new RestStreamHandler("POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory);
135 // new LLSDStreamhandler<LLSDFetchInventoryDescendents, LLSDInventoryDescendents>("POST", 136 m_capsHandlers["UpdateScriptAgentInventory"] = m_capsHandlers["UpdateNotecardAgentInventory"];
136 // capsBase + m_fetchInventory, 137 m_capsHandlers["UpdateScriptTaskInventory"] =
137 // FetchInventory)); 138 new RestStreamHandler("POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory);
138 139 m_capsHandlers["FetchInventoryDescendents"] =
139 140 new RestStreamHandler("POST", capsBase + m_fetchInventoryPath, FetchInventoryRequest);
140 AddLegacyCapsHandler(m_httpListener, m_requestPath, CapsRequest); 141 // m_capsHandlers["FetchInventoryDescendents"] =
141 //AddLegacyCapsHandler(m_httpListener, m_requestTexture , RequestTexture); 142 // new LLSDStreamhandler<LLSDFetchInventoryDescendents, LLSDInventoryDescendents>("POST",
142 AddLegacyCapsHandler(m_httpListener, m_parcelVoiceInfoRequestPath, ParcelVoiceInfoRequest); 143 // capsBase + m_fetchInventory,
143 AddLegacyCapsHandler(m_httpListener, m_provisionVoiceAccountRequestPath, ProvisionVoiceAccountRequest); 144 // FetchInventory));
144 AddLegacyCapsHandler(m_httpListener, m_notecardUpdatePath, NoteCardAgentInventory); 145 // m_capsHandlers["RequestTextureDownload"] = new RestStreamHandler("POST",
145 AddLegacyCapsHandler(m_httpListener, m_notecardTaskUpdatePath, ScriptTaskInventory); 146 // capsBase + m_requestTexture,
146 AddLegacyCapsHandler(m_httpListener, m_fetchInventoryPath, FetchInventoryRequest); 147 // RequestTexture);
147 } 148 }
148 catch (Exception e) 149 catch (Exception e)
149 { 150 {
@@ -152,35 +153,29 @@ namespace OpenSim.Region.Capabilities
152 } 153 }
153 154
154 /// <summary> 155 /// <summary>
156 /// Register a handler. This allows modules to register handlers.
157 /// </summary>
158 /// <param name="capName"></param>
159 /// <param name="handler"></param>
160 public void RegisterHandler(string capName, IRequestHandler handler)
161 {
162 m_capsHandlers[capName] = handler;
163 m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path);
164 }
165
166 /// <summary>
155 /// Remove all CAPS service handlers. 167 /// Remove all CAPS service handlers.
156 /// 168 ///
157 /// FIXME: Would be much nicer to remove and all paths to a single list. However, this is a little awkward
158 /// than it could be as we set up some handlers differently (legacy and non-legacy)
159 /// </summary> 169 /// </summary>
160 /// <param name="httpListener"></param> 170 /// <param name="httpListener"></param>
161 /// <param name="path"></param> 171 /// <param name="path"></param>
162 /// <param name="restMethod"></param> 172 /// <param name="restMethod"></param>
163 public void DeregisterHandlers() 173 public void DeregisterHandlers()
164 { 174 {
165 string capsBase = "/CAPS/" + m_capsObjectPath; 175 foreach(string capsName in m_capsHandlers.Caps)
166 176 {
167 m_httpListener.RemoveStreamHandler("POST", capsBase + m_mapLayerPath); 177 m_capsHandlers.Remove(capsName);
168 m_httpListener.RemoveStreamHandler("POST", capsBase + m_newInventory); 178 }
169 m_httpListener.RemoveStreamHandler("POST", capsBase + m_requestPath);
170 m_httpListener.RemoveStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath);
171 m_httpListener.RemoveStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath);
172 m_httpListener.RemoveStreamHandler("POST", capsBase + m_notecardUpdatePath);
173 m_httpListener.RemoveStreamHandler("POST", capsBase + m_notecardTaskUpdatePath);
174 m_httpListener.RemoveStreamHandler("POST", capsBase + m_fetchInventoryPath);
175 }
176
177 //[Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")]
178 //Commented out the obsolete as at this time the first caps request can not use the new Caps method
179 //as the sent type is a array and not a map and the deserialising doesn't deal properly with arrays.
180 private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod)
181 {
182 string capsBase = "/CAPS/" + m_capsObjectPath;
183 httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod));
184 } 179 }
185 180
186 /// <summary> 181 /// <summary>
@@ -193,31 +188,12 @@ namespace OpenSim.Region.Capabilities
193 public string CapsRequest(string request, string path, string param) 188 public string CapsRequest(string request, string path, string param)
194 { 189 {
195 //Console.WriteLine("caps request " + request); 190 //Console.WriteLine("caps request " + request);
196 string result = LLSDHelpers.SerialiseLLSDReply(GetCapabilities()); 191 string result = LLSDHelpers.SerialiseLLSDReply(m_capsHandlers.CapsDetails);
197 return result; 192 return result;
198 } 193 }
199 194
200 /// <summary> 195 // FIXME: these all should probably go into the respective region
201 /// Return an LLSDCapsDetails listing all the capabilities this server can provide 196 // modules
202 /// </summary>
203 /// <returns></returns>
204 protected LLSDCapsDetails GetCapabilities()
205 {
206 LLSDCapsDetails caps = new LLSDCapsDetails();
207 string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" +
208 m_capsObjectPath;
209 caps.MapLayer = capsBaseUrl + m_mapLayerPath;
210 // caps.RequestTextureDownload = capsBaseUrl + m_requestTexture;
211 caps.NewFileAgentInventory = capsBaseUrl + m_newInventory;
212 caps.UpdateNotecardAgentInventory = capsBaseUrl + m_notecardUpdatePath;
213 caps.UpdateScriptAgentInventory = capsBaseUrl + m_notecardUpdatePath;
214 caps.UpdateScriptTaskInventory = capsBaseUrl + m_notecardTaskUpdatePath;
215 caps.FetchInventoryDescendents = capsBaseUrl + m_fetchInventoryPath;
216 caps.ParcelVoiceInfoRequest = capsBaseUrl + m_parcelVoiceInfoRequestPath;
217 caps.ProvisionVoiceAccountRequest = capsBaseUrl + m_provisionVoiceAccountRequestPath;
218
219 return caps;
220 }
221 197
222 public string FetchInventoryRequest(string request, string path, string param) 198 public string FetchInventoryRequest(string request, string path, string param)
223 { 199 {
@@ -443,75 +419,6 @@ namespace OpenSim.Region.Capabilities
443 return null; 419 return null;
444 } 420 }
445 421
446 /// <summary>
447 /// Callback for a client request for ParcelVoiceInfo
448 /// </summary>
449 /// <param name="request"></param>
450 /// <param name="path"></param>
451 /// <param name="param"></param>
452 /// <returns></returns>
453 public string ParcelVoiceInfoRequest(string request, string path, string param) {
454 try
455 {
456 m_log.DebugFormat("[CAPS][PARCELVOICE]: request: {0}, path: {1}, param: {2}", request, path, param);
457
458 // XXX brutal hack, we need to get channel_uri, region
459 // name, and parcel_local_id from somewhere
460 Hashtable creds = new Hashtable();
461
462 creds["channel_uri"] = "sip:testroom@testserver.com";
463
464 LLSDParcelVoiceInfoResponse parcelVoiceInfo =
465 new LLSDParcelVoiceInfoResponse("OpenSim Test", 1, creds);
466
467 // XXX for debugging purposes:
468 string r = LLSDHelpers.SerialiseLLSDReply(parcelVoiceInfo);
469 m_log.DebugFormat("[CAPS][PARCELVOICE]: {0}", r);
470
471 return r;
472 }
473 catch (Exception e)
474 {
475 m_log.Error("[CAPS]: " + e.ToString());
476 }
477
478 return null;
479 }
480
481 /// <summary>
482 /// Callback for a client request for Voice Account Details
483 /// </summary>
484 /// <param name="request"></param>
485 /// <param name="path"></param>
486 /// <param name="param"></param>
487 /// <returns></returns>
488 public string ProvisionVoiceAccountRequest(string request, string path, string param) {
489 try
490 {
491 m_log.DebugFormat("[CAPS][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}", request, path, param);
492
493 if (null == CAPSGetUserDetails) throw new Exception("CAPSGetUserDetails null");
494
495 string voiceUser = "x" + Convert.ToBase64String(m_agentID.GetBytes());
496 voiceUser = voiceUser.Replace('+', '-').Replace('/', '_');
497
498 CachedUserInfo userInfo = CAPSGetUserDetails(m_agentID);
499 if (null == userInfo) throw new Exception("CAPSGetUserDetails returned null");
500
501 LLSDVoiceAccountResponse voiceAccountResponse =
502 new LLSDVoiceAccountResponse(voiceUser, "$1$" + userInfo.UserProfile.passwordHash);
503 string r = LLSDHelpers.SerialiseLLSDReply(voiceAccountResponse);
504 m_log.DebugFormat("[CAPS][PROVISIONVOICE]: {0}", r);
505 return r;
506 }
507 catch (Exception e)
508 {
509 m_log.Error("[CAPS][PROVISIONVOICE]: " + e.ToString());
510 }
511
512 return null;
513 }
514
515 /// <summary> 422 /// <summary>
516 /// Called by the notecard update handler. Provides a URL to which the client can upload a new asset. 423 /// Called by the notecard update handler. Provides a URL to which the client can upload a new asset.
517 /// </summary> 424 /// </summary>