From d62f0bc35d966ca4099e43026b90ab24cd768e4b Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Sun, 2 Mar 2014 14:43:43 +0200 Subject: Refactored: moved OpenProfileClient to a location where it can be used by both the Simulators and Robust --- .../Avatar/UserProfiles/OpenProfileClient.cs | 193 --------------------- .../Avatar/UserProfiles/UserProfileModule.cs | 1 + 2 files changed, 1 insertion(+), 193 deletions(-) delete mode 100644 OpenSim/Region/CoreModules/Avatar/UserProfiles/OpenProfileClient.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/OpenProfileClient.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/OpenProfileClient.cs deleted file mode 100644 index 23de3f5..0000000 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/OpenProfileClient.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * 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 OpenSimulator Project 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 DEVELOPERS ``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 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; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Reflection; -using System.Text; -using System.Xml; -using log4net; -using Nwc.XmlRpc; -using OpenMetaverse; -using OpenSim.Framework; - -namespace OpenSim.Region.CoreModules.Avatar.UserProfiles -{ - /// - /// A client for accessing a profile server using the OpenProfile protocol. - /// - /// - /// This class was adapted from the full OpenProfile class. Since it's only a client, and not a server, - /// it's much simpler. - /// - public class OpenProfileClient - { - static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private string m_serverURI; - - /// - /// Creates a client for accessing a foreign grid's profile server using the OpenProfile protocol. - /// - /// The grid's profile server URL - public OpenProfileClient(string serverURI) - { - m_serverURI = serverURI; - } - - - /// - /// Gets an avatar's profile using the OpenProfile protocol. - /// - /// On success, this will contain the avatar's profile - /// Success/failure - /// - /// There are two profile modules currently in use in OpenSim: the older one is OpenProfile, and the newer - /// one is UserProfileModule (this file). This method attempts to read an avatar's profile from a foreign - /// grid using the OpenProfile protocol. - /// - public bool RequestAvatarPropertiesUsingOpenProfile(ref UserProfileProperties props) - { - Hashtable ReqHash = new Hashtable(); - ReqHash["avatar_id"] = props.UserId.ToString(); - - Hashtable profileData = GenericXMLRPCRequest(ReqHash, "avatar_properties_request", m_serverURI); - - ArrayList dataArray = (ArrayList)profileData["data"]; - - if (dataArray == null || dataArray[0] == null) - return false; - profileData = (Hashtable)dataArray[0]; - - props.WebUrl = string.Empty; - props.AboutText = String.Empty; - props.FirstLifeText = String.Empty; - props.ImageId = UUID.Zero; - props.FirstLifeImageId = UUID.Zero; - props.PartnerId = UUID.Zero; - - if (profileData["ProfileUrl"] != null) - props.WebUrl = profileData["ProfileUrl"].ToString(); - if (profileData["AboutText"] != null) - props.AboutText = profileData["AboutText"].ToString(); - if (profileData["FirstLifeAboutText"] != null) - props.FirstLifeText = profileData["FirstLifeAboutText"].ToString(); - if (profileData["Image"] != null) - props.ImageId = new UUID(profileData["Image"].ToString()); - if (profileData["FirstLifeImage"] != null) - props.FirstLifeImageId = new UUID(profileData["FirstLifeImage"].ToString()); - if (profileData["Partner"] != null) - props.PartnerId = new UUID(profileData["Partner"].ToString()); - - props.WantToMask = 0; - props.WantToText = String.Empty; - props.SkillsMask = 0; - props.SkillsText = String.Empty; - props.Language = String.Empty; - - if (profileData["wantmask"] != null) - props.WantToMask = Convert.ToInt32(profileData["wantmask"].ToString()); - if (profileData["wanttext"] != null) - props.WantToText = profileData["wanttext"].ToString(); - - if (profileData["skillsmask"] != null) - props.SkillsMask = Convert.ToInt32(profileData["skillsmask"].ToString()); - if (profileData["skillstext"] != null) - props.SkillsText = profileData["skillstext"].ToString(); - - if (profileData["languages"] != null) - props.Language = profileData["languages"].ToString(); - - return true; - } - - private Hashtable GenericXMLRPCRequest(Hashtable ReqParams, string method, string server) - { - ArrayList SendParams = new ArrayList(); - SendParams.Add(ReqParams); - - XmlRpcResponse Resp; - try - { - XmlRpcRequest Req = new XmlRpcRequest(method, SendParams); - Resp = Req.Send(server, 30000); - } - catch (WebException ex) - { - m_log.ErrorFormat("[PROFILE]: Unable to connect to Profile " + - "Server {0}. Exception {1}", server, ex); - - Hashtable ErrorHash = new Hashtable(); - ErrorHash["success"] = false; - ErrorHash["errorMessage"] = "Unable to fetch profile data at this time. "; - ErrorHash["errorURI"] = ""; - - return ErrorHash; - } - catch (SocketException ex) - { - m_log.ErrorFormat( - "[PROFILE]: Unable to connect to Profile Server {0}. Method {1}, params {2}. " + - "Exception {3}", server, method, ReqParams, ex); - - Hashtable ErrorHash = new Hashtable(); - ErrorHash["success"] = false; - ErrorHash["errorMessage"] = "Unable to fetch profile data at this time. "; - ErrorHash["errorURI"] = ""; - - return ErrorHash; - } - catch (XmlException ex) - { - m_log.ErrorFormat( - "[PROFILE]: Unable to connect to Profile Server {0}. Method {1}, params {2}. " + - "Exception {3}", server, method, ReqParams.ToString(), ex); - Hashtable ErrorHash = new Hashtable(); - ErrorHash["success"] = false; - ErrorHash["errorMessage"] = "Unable to fetch profile data at this time. "; - ErrorHash["errorURI"] = ""; - - return ErrorHash; - } - if (Resp.IsFault) - { - Hashtable ErrorHash = new Hashtable(); - ErrorHash["success"] = false; - ErrorHash["errorMessage"] = "Unable to fetch profile data at this time. "; - ErrorHash["errorURI"] = ""; - return ErrorHash; - } - Hashtable RespData = (Hashtable)Resp.Value; - - return RespData; - } - } -} diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index d05b1f6..3d45f1d 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -47,6 +47,7 @@ using OpenSim.Services.Interfaces; using Mono.Addins; using OpenSim.Services.Connectors.Hypergrid; using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Services.UserProfilesService; namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { -- cgit v1.1 From e8a2eff2e83cba74e84970136dd486beededc1de Mon Sep 17 00:00:00 2001 From: Oren Hurvitz Date: Thu, 24 Apr 2014 14:20:48 +0300 Subject: Changed how UserProfile performs a fallback call using the OpenProfile API, because now JsonRpcRequest() returns an error result instead of throwing an exception --- .../Avatar/UserProfiles/UserProfileModule.cs | 67 ++++++++++++---------- 1 file changed, 37 insertions(+), 30 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 3d45f1d..1ee2a7b 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -65,6 +65,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles Dictionary m_classifiedCache = new Dictionary(); Dictionary m_classifiedInterest = new Dictionary(); + private JsonRpcRequestManager rpc = new JsonRpcRequestManager(); + public Scene Scene { get; private set; @@ -114,7 +116,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles set; } - JsonRpcRequestManager rpc = new JsonRpcRequestManager(); #region IRegionModuleBase implementation /// @@ -920,7 +921,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles public void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID) { - if ( String.IsNullOrEmpty(avatarID.ToString()) || String.IsNullOrEmpty(remoteClient.AgentId.ToString())) + if (String.IsNullOrEmpty(avatarID.ToString()) || String.IsNullOrEmpty(remoteClient.AgentId.ToString())) { // Looking for a reason that some viewers are sending null Id's m_log.DebugFormat("[PROFILES]: This should not happen remoteClient.AgentId {0} - avatarID {1}", remoteClient.AgentId, avatarID); @@ -998,29 +999,10 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles props.UserId = avatarID; - try - { - GetProfileData(ref props, out result); - } - catch (Exception e) + if (!GetProfileData(ref props, foreign, out result)) { - if (foreign) - { - // Check if the foreign grid is using OpenProfile. - // If any error occurs then discard it, and report the original error. - try - { - OpenProfileClient client = new OpenProfileClient(serverURI); - if (!client.RequestAvatarPropertiesUsingOpenProfile(ref props)) - throw e; - } - catch (Exception) - { - throw e; - } - } - else - throw; + m_log.DebugFormat("Error getting profile for {0}: {1}", avatarID, result); + return; } remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, charterMember , props.FirstLifeText, flags, @@ -1074,10 +1056,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles /// /// The profile data. /// - /// - /// User I. - /// - bool GetProfileData(ref UserProfileProperties properties, out string message) + bool GetProfileData(ref UserProfileProperties properties, bool foreign, out string message) { // Can't handle NPC yet... ScenePresence p = FindPresence(properties.UserId); @@ -1096,14 +1075,42 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles // This is checking a friend on the home grid // Not HG friend - if ( String.IsNullOrEmpty(serverURI)) + if (String.IsNullOrEmpty(serverURI)) { message = "No Presence - foreign friend"; return false; } object Prop = (object)properties; - rpc.JsonRpcRequest(ref Prop, "avatar_properties_request", serverURI, UUID.Random().ToString()); + if (!rpc.JsonRpcRequest(ref Prop, "avatar_properties_request", serverURI, UUID.Random().ToString())) + { + // If it's a foreign user then try again using OpenProfile, in case that's what the grid is using + bool secondChanceSuccess = false; + if (foreign) + { + try + { + OpenProfileClient client = new OpenProfileClient(serverURI); + if (client.RequestAvatarPropertiesUsingOpenProfile(ref properties)) + secondChanceSuccess = true; + } + catch (Exception e) + { + m_log.Debug(string.Format("Request using the OpenProfile API to {0} failed", serverURI), e); + // Allow the return 'message' to say "JsonRpcRequest" and not "OpenProfile", because + // the most likely reason that OpenProfile failed is that the remote server + // doesn't support OpenProfile, and that's not very interesting. + } + } + + if (!secondChanceSuccess) + { + message = string.Format("JsonRpcRequest to {0} failed", serverURI); + return false; + } + // else, continue below + } + properties = (UserProfileProperties)Prop; message = "Success"; -- cgit v1.1