public FriendInfo[] GetFriends(UUID principalID) { List<FriendInfo> infos = new List<FriendInfo>(); List<string> query = GD.Query("PrincipalID", principalID, m_realm, "Friend,Flags"); //These are used to get the other flags below List<string> keys = new List<string>(); List<object> values = new List<object>(); for (int i = 0; i < query.Count; i += 2) { FriendInfo info = new FriendInfo(); info.PrincipalID = principalID; info.Friend = query[i]; info.MyFlags = int.Parse(query[i + 1]); infos.Add(info); keys.Add("PrincipalID"); keys.Add("Friend"); values.Add(info.Friend); values.Add(info.PrincipalID); List<string> query2 = GD.Query(keys.ToArray(), values.ToArray(), m_realm, "Flags"); if (query2.Count >= 1) infos[infos.Count - 1].TheirFlags = int.Parse(query2[0]); keys = new List<string>(); values = new List<object>(); } return infos.ToArray(); }
public RexLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, GridRegion home, IPEndPoint clientIP, string mapTileURL, string searchURL) : base(account, aCircuit, pinfo, destination, invSkel, friendsList, libService, where, startlocation, position, lookAt, gestures, message, home, clientIP, mapTileURL, searchURL) { }
public FriendInfo[] GetFriends(UUID PrincipalID) { Dictionary <string, object> sendData = new Dictionary <string, object>(); sendData["PRINCIPALID"] = PrincipalID.ToString(); sendData["METHOD"] = "getfriends"; string reqString = ServerUtils.BuildQueryString(sendData); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI + "/friends", reqString); if (reply != string.Empty) { Dictionary <string, object> replyData = ServerUtils.ParseXmlResponse(reply); if (replyData != null) { if (replyData.ContainsKey("result") && (replyData["result"].ToString().ToLower() == "null")) { return(new FriendInfo[0]); } List <FriendInfo> finfos = new List <FriendInfo>(); Dictionary <string, object> .ValueCollection finfosList = replyData.Values; //m_log.DebugFormat("[FRIENDS CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count); foreach (object f in finfosList) { if (f is Dictionary <string, object> ) { FriendInfo finfo = new FriendInfo((Dictionary <string, object>)f); finfos.Add(finfo); } else { m_log.DebugFormat("[FRIENDS CONNECTOR]: GetFriends {0} received invalid response type {1}", PrincipalID, f.GetType()); } } // Success return(finfos.ToArray()); } else { m_log.DebugFormat("[FRIENDS CONNECTOR]: GetFriends {0} received null response", PrincipalID); } } } catch (Exception e) { m_log.DebugFormat("[FRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); } return(new FriendInfo[0]); }
public override FriendInfo[] GetFriendsFromService(IClientAPI client) { // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); Boolean agentIsLocal = true; if (UserManagementModule != null) { agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); } if (agentIsLocal) { return(base.GetFriendsFromService(client)); } FriendInfo[] finfos = new FriendInfo[0]; // Foreigner AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); if (agentClientCircuit != null) { // Note that this is calling a different interface than base; this one calls with a string param! finfos = FriendsService.GetFriends(client.AgentId.ToString()); m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString()); } // m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); return(finfos); }
private void DeletePreviousRelations(UUID a1, UUID a2) { // Delete any previous friendship relations FriendInfo[] finfos = null; FriendInfo f = null; finfos = GetFriendsFromCache(a1); if (finfos != null) { f = GetFriend(finfos, a2); if (f != null) { FriendsService.Delete(a1, f.Friend); // and also the converse FriendsService.Delete(f.Friend, a1.ToString()); } } finfos = GetFriendsFromCache(a2); if (finfos != null) { f = GetFriend(finfos, a1); if (f != null) { FriendsService.Delete(a2, f.Friend); // and also the converse FriendsService.Delete(f.Friend, a2.ToString()); } } }
public FriendInfo[] GetFriends(UUID principalID) { List <FriendInfo> infos = new List <FriendInfo>(); List <string> query = GD.Query("PrincipalID", principalID, m_realm, "Friend,Flags"); //These are used to get the other flags below List <string> keys = new List <string>(); List <object> values = new List <object>(); for (int i = 0; i < query.Count; i += 2) { FriendInfo info = new FriendInfo(); info.PrincipalID = principalID; info.Friend = query[i]; info.MyFlags = int.Parse(query[i + 1]); infos.Add(info); keys.Add("PrincipalID"); keys.Add("Friend"); values.Add(info.Friend); values.Add(info.PrincipalID); List <string> query2 = GD.Query(keys.ToArray(), values.ToArray(), m_realm, "Flags"); if (query2.Count >= 1) { infos[infos.Count - 1].TheirFlags = int.Parse(query2[0]); } keys = new List <string>(); values = new List <object>(); } return(infos.ToArray()); }
private string GetUUI(UUID localUser, UUID foreignUser) { // Let's see if the user is here by any chance FriendInfo[] finfos = GetFriends(localUser); if (finfos != EMPTY_FRIENDS) // friend is here, cool { FriendInfo finfo = GetFriend(finfos, foreignUser); if (finfo != null) { return(finfo.Friend); } } else // user is not currently on this sim, need to get from the service { finfos = FriendsService.GetFriends(localUser); foreach (FriendInfo finfo in finfos) { if (finfo.Friend.StartsWith(foreignUser.ToString())) // found it! { return(finfo.Friend); } } } return(string.Empty); }
protected override FriendInfo[] GetFriendsFromService(IClientAPI client) { // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); Boolean agentIsLocal = true; if (UserManagementModule != null) { agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); } if (agentIsLocal) { return(base.GetFriendsFromService(client)); } FriendInfo[] finfos = new FriendInfo[0]; // Foreigner AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); if (agentClientCircuit != null) { string agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); finfos = FriendsService.GetFriends(agentUUI); m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, agentUUI); } // m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); return(finfos); }
public virtual FriendInfo[] GetFriends(string PrincipalID) { FriendsData[] data = m_Database.GetFriends(PrincipalID); List<FriendInfo> info = new List<FriendInfo>(); foreach (FriendsData d in data) { FriendInfo i = new FriendInfo(); if (!UUID.TryParse(d.PrincipalID, out i.PrincipalID)) { string tmp = string.Empty; if (!Util.ParseUniversalUserIdentifier(d.PrincipalID, out i.PrincipalID, out tmp, out tmp, out tmp, out tmp)) // bad record. ignore this entry continue; } i.Friend = d.Friend; i.MyFlags = Convert.ToInt32(d.Data["Flags"]); i.TheirFlags = Convert.ToInt32(d.Data["TheirFlags"]); info.Add(i); } return info.ToArray(); }
byte[] DeleteFriendship(Dictionary <string, object> request) { FriendInfo friend = new FriendInfo(request); string secret = string.Empty; if (request.ContainsKey("SECRET")) { secret = request["SECRET"].ToString(); } if (secret == string.Empty) { return(FailureResult()); } List <FriendInfo> finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { // We check the secret here if (finfo.Friend.StartsWith(friend.Friend) && finfo.Friend.EndsWith(secret)) { MainConsole.Instance.DebugFormat("[HGFRIENDS HANDLER]: Delete friendship {0} {1}", friend.PrincipalID, friend.Friend); m_FriendsService.Delete(friend.PrincipalID, finfo.Friend); m_FriendsService.Delete(UUID.Parse(finfo.Friend), friend.PrincipalID.ToString()); return(SuccessResult()); } } return(FailureResult()); }
public virtual FriendInfo[] GetFriends(string PrincipalID) { FriendsData[] data = m_Database.GetFriends(PrincipalID); List <FriendInfo> info = new List <FriendInfo>(); foreach (FriendsData d in data) { FriendInfo i = new FriendInfo(); if (!UUID.TryParse(d.PrincipalID, out i.PrincipalID)) { string tmp = string.Empty; if (!Util.ParseUniversalUserIdentifier(d.PrincipalID, out i.PrincipalID, out tmp, out tmp, out tmp, out tmp)) { // bad record. ignore this entry continue; } } i.Friend = d.Friend; i.MyFlags = Convert.ToInt32(d.Data["Flags"]); i.TheirFlags = Convert.ToInt32(d.Data["TheirFlags"]); info.Add(i); } return(info.ToArray()); }
protected virtual void OnInstantMessage(IClientAPI client, GridInstantMessage im) { if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) { // we got a friendship offer UUID principalID = new UUID(im.fromAgentID); UUID friendID = new UUID(im.toAgentID); m_log.DebugFormat("[FRIENDS]: {0} ({1}) offered friendship to {2} ({3})", principalID, client.FirstName + client.LastName, friendID, im.fromAgentName); // Check that the friendship doesn't exist yet FriendInfo[] finfos = GetFriendsFromCache(principalID); if (finfos != null) { FriendInfo f = GetFriend(finfos, friendID); if (f != null) { client.SendAgentAlertMessage("This person is already your friend. Please delete it first if you want to reestablish the friendship.", false); return; } } // This user wants to be friends with the other user. // Let's add the relation backwards, in case the other is not online StoreBackwards(friendID, principalID); // Now let's ask the other user to be friends with this user ForwardFriendshipOffer(principalID, friendID, im); } }
public FriendInfo[] GetFriends(UUID principalID) { if (String.IsNullOrEmpty(m_serverUrl)) { return(new FriendInfo[0]); } Dictionary <UUID, FriendInfo> friends = new Dictionary <UUID, FriendInfo>(); OSDArray friendsArray = GetFriended(principalID); OSDArray friendedMeArray = GetFriendedBy(principalID); // Load the list of friends and their granted permissions foreach (OSD t in friendsArray) { OSDMap friendEntry = t as OSDMap; if (friendEntry != null) { UUID friendID = friendEntry["Key"].AsUUID(); FriendInfo friend = new FriendInfo { PrincipalID = principalID, Friend = friendID.ToString(), MyFlags = friendEntry["Value"].AsInteger(), TheirFlags = -1 }; friends[friendID] = friend; } } // Load the permissions those friends have granted to this user foreach (OSD t in friendedMeArray) { OSDMap friendedMeEntry = t as OSDMap; if (friendedMeEntry != null) { UUID friendID = friendedMeEntry["OwnerID"].AsUUID(); FriendInfo friend; if (friends.TryGetValue(friendID, out friend)) { friend.TheirFlags = friendedMeEntry["Value"].AsInteger(); } } } // Convert the dictionary of friends to an array and return it FriendInfo[] array = new FriendInfo[friends.Count]; int j = 0; foreach (FriendInfo friend in friends.Values) { array[j++] = friend; } return(array); }
public FriendInfo[] GetFriends(UUID PrincipalID) { Dictionary <string, object> sendData = new Dictionary <string, object>(); sendData["PRINCIPALID"] = PrincipalID.ToString(); sendData["METHOD"] = "getfriends"; string reqString = WebUtils.BuildQueryString(sendData); List <FriendInfo> finfos = new List <FriendInfo>(); try { List <string> serverURIs = m_registry.RequestModuleInterface <IConfigurationService>().FindValueOf("FriendsServerURI"); foreach (Dictionary <string, object> replyData in from m_ServerURI in serverURIs select SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI, reqString) into reply where reply != string.Empty select WebUtils.ParseXmlResponse(reply)) { if (replyData != null) { if (replyData.ContainsKey("result") && (replyData["result"].ToString().ToLower() == "null")) { continue; } Dictionary <string, object> .ValueCollection finfosList = replyData.Values; //MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count); foreach (object f in finfosList) { if (f is Dictionary <string, object> ) { FriendInfo finfo = new FriendInfo((Dictionary <string, object>)f); finfos.Add(finfo); } else { MainConsole.Instance.DebugFormat( "[FRIENDS CONNECTOR]: GetFriends {0} received invalid response type {1}", PrincipalID, f.GetType()); } } } else { MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: GetFriends {0} received null response", PrincipalID); } } } catch (Exception e) { MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); } // Success return(finfos.ToArray()); }
public bool StoreFriend(UUID PrincipalID, string Friend, int flags) { FriendInfo finfo = new FriendInfo { PrincipalID = PrincipalID, Friend = Friend, MyFlags = flags }; Dictionary <string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "storefriend"; string reply = string.Empty; try { List <string> serverURIs = m_registry.RequestModuleInterface <IConfigurationService>().FindValueOf(PrincipalID.ToString(), "FriendsServerURI"); foreach (string m_ServerURI in serverURIs) { reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI, WebUtils.BuildQueryString(sendData)); if (reply != string.Empty) { Dictionary <string, object> replyData = WebUtils.ParseXmlResponse(reply); if ((replyData != null) && replyData.ContainsKey("Result") && (replyData["Result"] != null)) { bool success = false; Boolean.TryParse(replyData["Result"].ToString(), out success); if (replyData["Result"].ToString() == "Success") { return(true); } if (success) { return(success); } } else { MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: StoreFriend {0} {1} received null response", PrincipalID, Friend); } } else { MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: StoreFriend received null reply"); } } } catch (Exception e) { MainConsole.Instance.DebugFormat("[FRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); return(false); } return(false); }
/// <summary> /// Update local cache only /// </summary> /// <param name="userID"></param> /// <param name="friendID"></param> /// <param name="rights"></param> protected void UpdateLocalCache(UUID userID, UUID friendID, int rights) { // Update local cache FriendInfo[] friends = GetFriendsFromCache(friendID); FriendInfo finfo = GetFriend(friends, userID); finfo.TheirFlags = rights; }
private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) { m_log.DebugFormat("[FRIENDS MODULE]: User {0} changing rights to {1} for friend {2}", requester, rights, target); FriendInfo[] friends = GetFriends(remoteClient.AgentId); if (friends.Length == 0) { return; } // Let's find the friend in this user's friend list FriendInfo friend = GetFriend(friends, target); if (friend != null) // Found it { // Store it on the DB if (!StoreRights(requester, target, rights)) { remoteClient.SendAlertMessage("Unable to grant rights."); return; } // Store it in the local cache int myFlags = friend.MyFlags; friend.MyFlags = rights; // Always send this back to the original client remoteClient.SendChangeUserRights(requester, target, rights); // // Notify the friend // // Try local if (LocalGrantRights(requester, target, myFlags, rights)) { return; } PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { target.ToString() }); if (friendSessions != null && friendSessions.Length > 0) { PresenceInfo friendSession = friendSessions[0]; if (friendSession != null) { GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); // TODO: You might want to send the delta to save the lookup // on the other end!! m_FriendsSimConnector.GrantRights(region, requester, target, myFlags, rights); } } } else { m_log.DebugFormat("[FRIENDS MODULE]: friend {0} not found for {1}", target, requester); } }
public FriendInfo[] GetFriends(UUID PrincipalID) { Dictionary<string, object> sendData = new Dictionary<string, object>(); sendData["PRINCIPALID"] = PrincipalID.ToString(); sendData["METHOD"] = "getfriends"; string reqString = WebUtils.BuildQueryString(sendData); List<FriendInfo> finfos = new List<FriendInfo> (); try { List<string> serverURIs = m_registry.RequestModuleInterface<IConfigurationService>().FindValueOf("FriendsServerURI"); foreach (string m_ServerURI in serverURIs) { string reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI, reqString); if (reply != string.Empty) { Dictionary<string, object> replyData = WebUtils.ParseXmlResponse(reply); if (replyData != null) { if (replyData.ContainsKey("result") && (replyData["result"].ToString().ToLower() == "null")) continue; Dictionary<string, object>.ValueCollection finfosList = replyData.Values; //m_log.DebugFormat("[FRIENDS CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count); foreach (object f in finfosList) { if (f is Dictionary<string, object>) { FriendInfo finfo = new FriendInfo((Dictionary<string, object>)f); finfos.Add(finfo); } else m_log.DebugFormat("[FRIENDS CONNECTOR]: GetFriends {0} received invalid response type {1}", PrincipalID, f.GetType()); } } else m_log.DebugFormat("[FRIENDS CONNECTOR]: GetFriends {0} received null response", PrincipalID); } } } catch (Exception e) { m_log.DebugFormat("[FRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); } // Success return finfos.ToArray (); }
protected FriendInfo[] GetFriends(Dictionary <string, object> sendData, string PrincipalID) { string reqString = WebUtils.BuildQueryString(sendData); List <string> urls = m_registry.RequestModuleInterface <IConfigurationService>().FindValueOf("AvatarServerURI"); foreach (string uri in urls) { try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary <string, object> replyData = WebUtils.ParseXmlResponse(reply); if (replyData != null) { if (replyData.ContainsKey("result") && (replyData["result"].ToString().ToLower() == "null")) { return(new FriendInfo[0]); } List <FriendInfo> finfos = new List <FriendInfo>(); Dictionary <string, object> .ValueCollection finfosList = replyData.Values; //MainConsole.Instance.DebugFormat("[FRIENDS SERVICE CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count); foreach (object f in finfosList) { if (f is Dictionary <string, object> ) { FriendInfo finfo = new FriendInfo((Dictionary <string, object>)f); finfos.Add(finfo); } else { MainConsole.Instance.DebugFormat("[FRIENDS SERVICE CONNECTOR]: GetFriends {0} received invalid response type {1}", PrincipalID, f.GetType()); } } // Success return(finfos.ToArray()); } else { MainConsole.Instance.DebugFormat("[FRIENDS SERVICE CONNECTOR]: GetFriends {0} received null response", PrincipalID); } } } catch (Exception e) { MainConsole.Instance.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); } } return(new FriendInfo[0]); }
private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) { if (!m_Friends.ContainsKey(remoteClient.AgentId)) { return; } m_log.DebugFormat("[FRIENDS MODULE]: User {0} changing rights to {1} for friend {2}", requester, rights, target); // Let's find the friend in this user's friend list UserFriendData fd = m_Friends[remoteClient.AgentId]; FriendInfo friend = null; foreach (FriendInfo fi in fd.Friends) { if (fi.Friend == target.ToString()) { friend = fi; } } if (friend != null) // Found it { // Store it on the DB FriendsService.StoreFriend(requester, target.ToString(), rights); // Store it in the local cache int myFlags = friend.MyFlags; friend.MyFlags = rights; // Always send this back to the original client remoteClient.SendChangeUserRights(requester, target, rights); // // Notify the friend // // Try local if (LocalGrantRights(requester, target, myFlags, rights)) { return; } PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { target.ToString() }); if (friendSessions != null && friendSessions.Length > 0) { PresenceInfo friendSession = friendSessions[0]; if (friendSession != null) { GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); // TODO: You might want to send the delta to save the lookup // on the other end!! m_FriendsSimConnector.GrantRights(region, requester, target, myFlags, rights); } } } }
private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) { FriendInfo[] friends = GetFriends(remoteClient.AgentId); if (friends.Length == 0) { return; } MainConsole.Instance.DebugFormat("[FRIENDS MODULE]: User {0} changing rights to {1} for friend {2}", requester, rights, target); // Let's find the friend in this user's friend list FriendInfo friend = null; #if (!ISWIN) foreach (FriendInfo fi in friends) { if (fi.Friend == target.ToString()) { friend = fi; } } #else foreach (FriendInfo fi in friends.Where(fi => fi.Friend == target.ToString())) { friend = fi; } #endif if (friend != null) // Found it { // Store it on the DB FriendsService.StoreFriend(requester, target.ToString(), rights); // Store it in the local cache int myFlags = friend.MyFlags; friend.MyFlags = rights; // Always send this back to the original client remoteClient.SendChangeUserRights(requester, target, rights); // // Notify the friend // // Try local if (!LocalGrantRights(requester, target, myFlags, rights)) { SyncMessagePosterService.Post(SyncMessageHelper.FriendGrantRights( requester, target, myFlags, rights, m_Scenes[0].RegionInfo.RegionHandle), m_Scenes[0].RegionInfo.RegionHandle); } } }
public bool DeleteFriendship(UUID PrincipalID, UUID Friend, string secret) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = PrincipalID; finfo.Friend = Friend.ToString(); Dictionary <string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "deletefriendship"; sendData["SECRET"] = secret; string reply = string.Empty; string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return(false); } if (reply != string.Empty) { Dictionary <string, object> replyData = ServerUtils.ParseXmlResponse(reply); if (replyData.ContainsKey("RESULT")) { if (replyData["RESULT"].ToString().ToLower() == "true") { return(true); } else { return(false); } } else { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: reply data does not contain result field"); } } else { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: received empty reply"); } return(false); }
public virtual int GetRightsGrantedByFriend(UUID principalID, UUID friendID) { FriendInfo[] friends = GetFriendsFromCache(principalID); FriendInfo finfo = GetFriend(friends, friendID); if (finfo != null && finfo.TheirFlags != -1) { return(finfo.TheirFlags); } return(0); }
public virtual uint GetFriendPerms(UUID principalID, UUID friendID) { FriendInfo[] friends = GetFriends(principalID); FriendInfo finfo = GetFriend(friends, friendID); if (finfo != null) { return((uint)finfo.TheirFlags); } return(0); }
public bool NewFriendship(FriendInfo friend, bool verified) { UUID friendID; string tmp = string.Empty, url = String.Empty, first = String.Empty, last = String.Empty; if (!Util.ParseUniversalUserIdentifier(friend.Friend, out friendID, out url, out first, out last, out tmp)) { return(false); } m_log.DebugFormat("[HGFRIENDS SERVICE]: New friendship {0} {1} ({2})", friend.PrincipalID, friend.Friend, verified); // Does the friendship already exist? FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { if (finfo.Friend.StartsWith(friendID.ToString())) { return(false); } } // Verified user session. But the user needs to confirm friendship when he gets home if (verified) { return(m_FriendsService.StoreFriend(friend.PrincipalID.ToString(), friend.Friend, 0)); } // Does the reverted friendship exist? meaning that this user initiated the request finfos = m_FriendsService.GetFriends(friendID); bool userInitiatedOffer = false; foreach (FriendInfo finfo in finfos) { if (friend.Friend.StartsWith(finfo.PrincipalID.ToString()) && finfo.Friend.StartsWith(friend.PrincipalID.ToString()) && finfo.TheirFlags == -1) { userInitiatedOffer = true; // Let's delete the existing friendship relations that was stored m_FriendsService.Delete(friendID, finfo.Friend); break; } } if (userInitiatedOffer) { m_FriendsService.StoreFriend(friend.PrincipalID.ToString(), friend.Friend, 1); m_FriendsService.StoreFriend(friend.Friend, friend.PrincipalID.ToString(), 1); // notify the user ForwardToSim("ApproveFriendshipRequest", friendID, Util.UniversalName(first, last, url), "", friend.PrincipalID, ""); return(true); } return(false); }
public bool NewFriendship(UUID PrincipalID, string Friend) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = PrincipalID; finfo.Friend = Friend; Dictionary <string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "newfriendship"; sendData["KEY"] = m_ServiceKey; sendData["SESSIONID"] = m_SessionID.ToString(); string reply = string.Empty; string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return(false); } if (reply != string.Empty) { Dictionary <string, object> replyData = ServerUtils.ParseXmlResponse(reply); if ((replyData != null) && replyData.ContainsKey("Result") && (replyData["Result"] != null)) { bool success = false; Boolean.TryParse(replyData["Result"].ToString(), out success); return(success); } else { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: StoreFriend {0} {1} received null response", PrincipalID, Friend); } } else { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: StoreFriend received null reply"); } return(false); }
private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) { FriendInfo[] friends = GetFriends(remoteClient.AgentId); if (friends.Length == 0) { return; } m_log.DebugFormat("[FRIENDS MODULE]: User {0} changing rights to {1} for friend {2}", requester, rights, target); // Let's find the friend in this user's friend list FriendInfo friend = null; foreach (FriendInfo fi in friends) { if (fi.Friend == target.ToString()) { friend = fi; } } if (friend != null) // Found it { // Store it on the DB FriendsService.StoreFriend(requester, target.ToString(), rights); // Store it in the local cache int myFlags = friend.MyFlags; friend.MyFlags = rights; // Always send this back to the original client remoteClient.SendChangeUserRights(requester, target, rights); // // Notify the friend // // Try local if (!LocalGrantRights(requester, target, myFlags, rights)) { UserInfo friendSession = m_Scenes[0].RequestModuleInterface <IAgentInfoService>().GetUserInfo(target.ToString()); if (friendSession != null && friendSession.IsOnline) { GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.CurrentRegionID); AsyncMessagePostService.Post(region.RegionHandle, SyncMessageHelper.FriendGrantRights( requester, target, myFlags, rights, region.RegionHandle)); } } } }
byte[] ValidateFriendshipOffered(Dictionary <string, object> request) { FriendInfo friend = new FriendInfo(request); UUID friendID = UUID.Zero; if (!UUID.TryParse(friend.Friend, out friendID)) { return(BoolResult(false)); } bool success = m_TheService.ValidateFriendshipOffered(friend.PrincipalID, friendID); return(BoolResult(success)); }
public bool DeleteFriendship(UUID PrincipalID, UUID Friend, string secret) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = PrincipalID; finfo.Friend = Friend.ToString(); Dictionary <string, object> sendData = finfo.ToKVP(); sendData["METHOD"] = "deletefriendship"; sendData["SECRET"] = secret; string reply = string.Empty; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI + "/hgfriends", WebUtils.BuildQueryString(sendData)); } catch (Exception e) { MainConsole.Instance.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); return(false); } if (reply != string.Empty) { Dictionary <string, object> replyData = WebUtils.ParseXmlResponse(reply); if ((replyData != null) && replyData.ContainsKey("Result") && (replyData["Result"] != null)) { bool success = false; Boolean.TryParse(replyData["Result"].ToString(), out success); return(success); } else { MainConsole.Instance.DebugFormat("[HGFRIENDS CONNECTOR]: Delete {0} {1} received null response", PrincipalID, Friend); } } else { MainConsole.Instance.DebugFormat("[HGFRIENDS CONNECTOR]: DeleteFriend received null reply"); } return(false); }
private byte[] StoreFriend(Dictionary <string, object> request) { FriendInfo friend = new FriendInfo(request); bool success = m_FriendsService.StoreFriend(friend.PrincipalID, friend.Friend, friend.MyFlags); if (success) { return(SuccessResult()); } else { return(FailureResult()); } }
/// <summary> /// Update local cache only /// </summary> /// <param name="userID"></param> /// <param name="friendID"></param> /// <param name="rights"></param> protected void UpdateLocalCache(UUID userID, UUID friendID, int rights) { // Update local cache lock (m_Friends) { FriendInfo[] friends = GetFriendsFromCache(friendID); if (friends != EMPTY_FRIENDS) { FriendInfo finfo = GetFriend(friends, userID); if (finfo != null) { finfo.TheirFlags = rights; } } } }
public bool RemoteStatusNotification(FriendInfo friend, UUID userID, bool online) { string url, first, last, secret; UUID FriendToInform; if (HGUtil.ParseUniversalUserIdentifier(friend.Friend, out FriendToInform, out url, out first, out last, out secret)) { UserAgentServiceConnector connector = new UserAgentServiceConnector(url); List <UUID> informedFriends = connector.StatusNotification(new List <string> (new string[1] { FriendToInform.ToString() }), userID, online); return(informedFriends.Count > 0); } return(false); }
byte[] NewFriendship(Dictionary <string, object> request) { bool verified = VerifyServiceKey(request); FriendInfo friend = new FriendInfo(request); bool success = m_TheService.NewFriendship(friend, verified); if (success) { return(SuccessResult()); } else { return(FailureResult()); } }
public bool DeleteFriendship(FriendInfo friend, string secret) { FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { // We check the secret here. Or if the friendship request was initiated here, and was declined if (finfo.Friend.StartsWith(friend.Friend) && finfo.Friend.EndsWith(secret)) { m_log.DebugFormat("[HGFRIENDS SERVICE]: Delete friendship {0} {1}", friend.PrincipalID, friend.Friend); m_FriendsService.Delete(friend.PrincipalID, finfo.Friend); m_FriendsService.Delete(finfo.Friend, friend.PrincipalID.ToString()); return(true); } } return(false); }
public virtual FriendInfo[] GetFriends(UUID PrincipalID) { FriendsData[] data = m_Database.GetFriends(PrincipalID); List<FriendInfo> info = new List<FriendInfo>(); foreach (FriendsData d in data) { FriendInfo i = new FriendInfo(); i.PrincipalID = new UUID(d.PrincipalID); i.Friend = d.Friend; i.MyFlags = Convert.ToInt32(d.Data["Flags"]); i.TheirFlags = Convert.ToInt32(d.Data["TheirFlags"]); info.Add(i); } return info.ToArray(); }
public bool NewFriendship(FriendInfo friend, bool verified) { UUID friendID; string tmp = string.Empty, url = String.Empty, first = String.Empty, last = String.Empty; if (!Util.ParseUniversalUserIdentifier(friend.Friend, out friendID, out url, out first, out last, out tmp)) return false; m_log.DebugFormat("[HGFRIENDS SERVICE]: New friendship {0} {1} ({2})", friend.PrincipalID, friend.Friend, verified); // Does the friendship already exist? FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { if (finfo.Friend.StartsWith(friendID.ToString())) return false; } // Verified user session. But the user needs to confirm friendship when he gets home if (verified) return m_FriendsService.StoreFriend(friend.PrincipalID.ToString(), friend.Friend, 0); // Does the reverted friendship exist? meaning that this user initiated the request finfos = m_FriendsService.GetFriends(friendID); bool userInitiatedOffer = false; foreach (FriendInfo finfo in finfos) { if (friend.Friend.StartsWith(finfo.PrincipalID.ToString()) && finfo.Friend.StartsWith(friend.PrincipalID.ToString()) && finfo.TheirFlags == -1) { userInitiatedOffer = true; // Let's delete the existing friendship relations that was stored m_FriendsService.Delete(friendID, finfo.Friend); break; } } if (userInitiatedOffer) { m_FriendsService.StoreFriend(friend.PrincipalID.ToString(), friend.Friend, 1); m_FriendsService.StoreFriend(friend.Friend, friend.PrincipalID.ToString(), 1); // notify the user ForwardToSim("ApproveFriendshipRequest", friendID, Util.UniversalName(first, last, url), "", friend.PrincipalID, ""); return true; } return false; }
public bool DeleteFriendship(FriendInfo friend, string secret) { FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { // We check the secret here. Or if the friendship request was initiated here, and was declined if (finfo.Friend.StartsWith(friend.Friend) && finfo.Friend.EndsWith(secret)) { m_log.DebugFormat("[HGFRIENDS SERVICE]: Delete friendship {0} {1}", friend.PrincipalID, friend.Friend); m_FriendsService.Delete(friend.PrincipalID, finfo.Friend); m_FriendsService.Delete(finfo.Friend, friend.PrincipalID.ToString()); return true; } } return false; }
public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP) { bool success = false; UUID session = UUID.Random(); m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}", firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0); try { // // Check client // if (m_AllowedClients != string.Empty) { Regex arx = new Regex(m_AllowedClients); Match am = arx.Match(clientVersion); if (!am.Success) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: client {2} is not allowed", firstName, lastName, clientVersion); return LLFailedLoginResponse.LoginBlockedProblem; } } if (m_DeniedClients != string.Empty) { Regex drx = new Regex(m_DeniedClients); Match dm = drx.Match(clientVersion); if (dm.Success) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: client {2} is denied", firstName, lastName, clientVersion); return LLFailedLoginResponse.LoginBlockedProblem; } } // // Get the account and check that it exists // UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: user not found", firstName, lastName); return LLFailedLoginResponse.UserProblem; } if (account.UserLevel < m_MinLoginLevel) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: user level is {2} but minimum login level is {3}", firstName, lastName, account.UserLevel, m_MinLoginLevel); return LLFailedLoginResponse.LoginBlockedProblem; } // If a scope id is requested, check that the account is in // that scope, or unscoped. // if (scopeID != UUID.Zero) { if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed, reason: user {0} {1} not found", firstName, lastName); return LLFailedLoginResponse.UserProblem; } } else { scopeID = account.ScopeID; } // // Authenticate this user // if (!passwd.StartsWith("$1$")) passwd = "$1$" + Util.Md5Hash(passwd); passwd = passwd.Remove(0, 3); //remove $1$ string token = m_AuthenticationService.Authenticate(account.PrincipalID, passwd, 30); UUID secureSession = UUID.Zero; if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: authentication failed", firstName, lastName); return LLFailedLoginResponse.UserProblem; } // // Get the user's inventory // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: inventory service not set up", firstName, lastName); return LLFailedLoginResponse.InventoryProblem; } if (m_HGInventoryService != null) { // Give the Suitcase service a chance to create the suitcase folder. // (If we're not using the Suitcase inventory service then this won't do anything.) m_HGInventoryService.GetRootFolder(account.PrincipalID); } List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed, for {0} {1}, reason: unable to retrieve user inventory", firstName, lastName); return LLFailedLoginResponse.InventoryProblem; } // Get active gestures List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); // m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); // // Login the presence // if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); if (!success) { m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: could not login presence", firstName, lastName); return LLFailedLoginResponse.GridProblem; } } // // Change Online status and get the home region // GridRegion home = null; GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); // We are only going to complain about no home if the user actually tries to login there, to avoid // spamming the console. if (guinfo != null) { if (guinfo.HomeRegionID == UUID.Zero && startLocation == "home") { m_log.WarnFormat( "[LLOGIN SERVICE]: User {0} tried to login to a 'home' start location but they have none set", account.Name); } else if (m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); if (home == null && startLocation == "home") { m_log.WarnFormat( "[LLOGIN SERVICE]: User {0} tried to login to a 'home' start location with ID {1} but this was not found.", account.Name, guinfo.HomeRegionID); } } } else { // something went wrong, make something up, so that we don't have to test this anywhere else m_log.DebugFormat("{0} Failed to fetch GridUserInfo. Creating empty GridUserInfo as home", LogHeader); guinfo = new GridUserInfo(); guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; GridRegion gatekeeper = null; TeleportFlags flags; GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt, out flags); if (destination == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat( "[LLOGIN SERVICE]: Login failed for {0} {1}, reason: destination not found", firstName, lastName); return LLFailedLoginResponse.GridProblem; } else { m_log.DebugFormat( "[LLOGIN SERVICE]: Found destination {0}, endpoint {1} for {2} {3}", destination.RegionName, destination.ExternalEndPoint, firstName, lastName); } if (account.UserLevel >= 200) flags |= TeleportFlags.Godlike; // // Get the avatar // AvatarAppearance avatar = null; if (m_AvatarService != null) { avatar = m_AvatarService.GetAppearance(account.PrincipalID); } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; GridRegion dest; AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, channel, mac, id0, clientIP, flags, out where, out reason, out dest); destination = dest; if (aCircuit == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed for {0} {1}, reason: {2}", firstName, lastName, reason); return new LLFailedLoginResponse("key", reason, "false"); } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); // m_log.DebugFormat("[LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } // // Finally, fill out the response and return it // LLLoginResponse response = new LLLoginResponse( account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone, m_DestinationGuide, m_AvatarPicker, m_ClassifiedFee); m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName); return response; } catch (Exception e) { m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); if (m_PresenceService != null) m_PresenceService.LogoutAgent(session); return LLFailedLoginResponse.InternalError; } }
public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, IPEndPoint clientIP) { bool success = false; UUID session = UUID.Random(); try { // // Get the account and check that it exists // UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); return LLFailedLoginResponse.UserProblem; } if (account.UserLevel < m_MinLoginLevel) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: login is blocked for user level {0}", account.UserLevel); return LLFailedLoginResponse.LoginBlockedProblem; } // If a scope id is requested, check that the account is in // that scope, or unscoped. // if (scopeID != UUID.Zero) { if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: user not found"); return LLFailedLoginResponse.UserProblem; } } else { scopeID = account.ScopeID; } // // Authenticate this user // if (!passwd.StartsWith("$1$")) passwd = "$1$" + Util.Md5Hash(passwd); passwd = passwd.Remove(0, 3); //remove $1$ string token = m_AuthenticationService.Authenticate(account.PrincipalID, passwd, 30); UUID secureSession = UUID.Zero; if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: authentication failed"); return LLFailedLoginResponse.UserProblem; } // // Get the user's inventory // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); return LLFailedLoginResponse.InventoryProblem; } List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); return LLFailedLoginResponse.InventoryProblem; } // // Login the presence // if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); if (!success) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: could not login presence"); return LLFailedLoginResponse.GridProblem; } } // // Change Online status and get the home region // GridRegion home = null; GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); } if (guinfo == null) { // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new GridUserInfo(); guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; GridRegion gatekeeper = null; GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt); if (destination == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: destination not found"); return LLFailedLoginResponse.GridProblem; } // // Get the avatar // AvatarData avatar = null; if (m_AvatarService != null) { avatar = m_AvatarService.GetAvatar(account.PrincipalID); } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, out where, out reason); if (aCircuit == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); return LLFailedLoginResponse.AuthorizationProblem; } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); m_log.DebugFormat("[LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } // // Finally, fill out the response and return it // LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, m_WelcomeMessage, home, clientIP); m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); return response; } catch (Exception e) { m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); if (m_PresenceService != null) m_PresenceService.LogoutAgent(session); return LLFailedLoginResponse.InternalError; } }
protected virtual FriendInfo GetFriend(FriendInfo[] friends, UUID friendID) { foreach (FriendInfo fi in friends) { if (fi.Friend == friendID.ToString()) return fi; } return null; }
private byte[] PackageFriends(FriendInfo[] finfos) { Dictionary<string, object> result = new Dictionary<string, object>(); if ((finfos == null) || ((finfos != null) && (finfos.Length == 0))) result["result"] = "null"; else { int i = 0; foreach (FriendInfo finfo in finfos) { Dictionary<string, object> rinfoDict = finfo.ToKeyValuePairs(); result["friend" + i] = rinfoDict; i++; } } string xmlString = ServerUtils.BuildXmlResponse(result); //m_log.DebugFormat("[FRIENDS HANDLER]: resp string: {0}", xmlString); UTF8Encoding encoding = new UTF8Encoding(); return encoding.GetBytes(xmlString); }
public bool NewFriendship(UUID PrincipalID, string Friend) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = PrincipalID; finfo.Friend = Friend; Dictionary<string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "newfriendship"; sendData["KEY"] = m_ServiceKey; sendData["SESSIONID"] = m_SessionID.ToString(); string reply = string.Empty; string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } if (reply != string.Empty) { Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply); if ((replyData != null) && replyData.ContainsKey("Result") && (replyData["Result"] != null)) { bool success = false; Boolean.TryParse(replyData["Result"].ToString(), out success); return success; } else m_log.DebugFormat("[HGFRIENDS CONNECTOR]: StoreFriend {0} {1} received null response", PrincipalID, Friend); } else m_log.DebugFormat("[HGFRIENDS CONNECTOR]: StoreFriend received null reply"); return false; }
byte[] DeleteFriendship(Dictionary<string, object> request) { FriendInfo friend = new FriendInfo(request); string secret = string.Empty; if (request.ContainsKey("SECRET")) secret = request["SECRET"].ToString(); if (secret == string.Empty) return BoolResult(false); bool success = m_TheService.DeleteFriendship(friend, secret); return BoolResult(success); }
private static LLLoginResponse.BuddyList ConvertFriendListItem(FriendInfo[] friendsList) { LLLoginResponse.BuddyList buddylistreturn = new LLLoginResponse.BuddyList(); foreach (FriendInfo finfo in friendsList) { if (finfo.TheirFlags == -1) continue; LLLoginResponse.BuddyList.BuddyInfo buddyitem = new LLLoginResponse.BuddyList.BuddyInfo(finfo.Friend); // finfo.Friend may not be a simple uuid UUID friendID = UUID.Zero; if (UUID.TryParse(finfo.Friend, out friendID)) buddyitem.BuddyID = finfo.Friend; else { string tmp; if (Util.ParseUniversalUserIdentifier(finfo.Friend, out friendID, out tmp, out tmp, out tmp, out tmp)) buddyitem.BuddyID = friendID.ToString(); else // junk entry continue; } buddyitem.BuddyRightsHave = (int)finfo.TheirFlags; buddyitem.BuddyRightsGiven = (int)finfo.MyFlags; buddylistreturn.AddNewBuddy(buddyitem); } return buddylistreturn; }
byte[] ValidateFriendshipOffered(Dictionary<string, object> request) { FriendInfo friend = new FriendInfo(request); UUID friendID = UUID.Zero; if (!UUID.TryParse(friend.Friend, out friendID)) return BoolResult(false); bool success = m_TheService.ValidateFriendshipOffered(friend.PrincipalID, friendID); return BoolResult(success); }
public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, GridRegion home, IPEndPoint clientIP, string mapTileURL, string searchURL, string currency, string DSTZone, string destinationsURL, string avatarsURL, string classifiedFee, int maxAgentGroups) : this() { FillOutInventoryData(invSkel, libService); FillOutActiveGestures(gestures); CircuitCode = (int)aCircuit.circuitcode; Lastname = account.LastName; Firstname = account.FirstName; AgentID = account.PrincipalID; SessionID = aCircuit.SessionID; SecureSessionID = aCircuit.SecureSessionID; Message = message; BuddList = ConvertFriendListItem(friendsList); StartLocation = where; MapTileURL = mapTileURL; ProfileURL = profileURL; OpenIDURL = openIDURL; DestinationsURL = destinationsURL; AvatarsURL = avatarsURL; SearchURL = searchURL; Currency = currency; ClassifiedFee = classifiedFee; MaxAgentGroups = maxAgentGroups; FillOutHomeData(pinfo, home); LookAt = String.Format("[r{0},r{1},r{2}]", lookAt.X, lookAt.Y, lookAt.Z); FillOutRegionData(destination); m_log.DebugFormat("[LOGIN RESPONSE] LLLoginResponse create. sizeX={0}, sizeY={1}", RegionSizeX, RegionSizeY); FillOutSeedCap(aCircuit, destination, clientIP); switch (DSTZone) { case "none": DST = "N"; break; case "local": DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; break; default: TimeZoneInfo dstTimeZone = null; string[] tzList = DSTZone.Split(';'); foreach (string tzName in tzList) { try { dstTimeZone = TimeZoneInfo.FindSystemTimeZoneById(tzName); } catch { continue; } break; } if (dstTimeZone == null) { m_log.WarnFormat( "[LLOGIN RESPONSE]: No valid timezone found for DST in {0}, falling back to system time.", tzList); DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; } else { DST = dstTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; } break; } }
protected FriendInfo[] GetFriends(Dictionary<string, object> sendData, string PrincipalID) { string reqString = ServerUtils.BuildQueryString(sendData); string uri = m_ServerURI + "/friends"; try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); if (reply != string.Empty) { Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply); if (replyData != null) { if (replyData.ContainsKey("result") && (replyData["result"].ToString().ToLower() == "null")) { return new FriendInfo[0]; } List<FriendInfo> finfos = new List<FriendInfo>(); Dictionary<string, object>.ValueCollection finfosList = replyData.Values; //m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count); foreach (object f in finfosList) { if (f is Dictionary<string, object>) { FriendInfo finfo = new FriendInfo((Dictionary<string, object>)f); finfos.Add(finfo); } else m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: GetFriends {0} received invalid response type {1}", PrincipalID, f.GetType()); } // Success return finfos.ToArray(); } else m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: GetFriends {0} received null response", PrincipalID); } } catch (Exception e) { m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); } return new FriendInfo[0]; }
public override FriendInfo[] GetFriendsFromService(IClientAPI client) { // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); Boolean agentIsLocal = true; if (UserManagementModule != null) agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); if (agentIsLocal) return base.GetFriendsFromService(client); FriendInfo[] finfos = new FriendInfo[0]; // Foreigner AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); if (agentClientCircuit != null) { // Note that this is calling a different interface than base; this one calls with a string param! finfos = FriendsService.GetFriends(client.AgentId.ToString()); m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString()); } // m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); return finfos; }
/// <summary> /// Login procedure, as copied from superclass. /// </summary> /// <param name="firstName"></param> /// <param name="lastName"></param> /// <param name="passwd"></param> /// <param name="startLocation"></param> /// <param name="scopeID"></param> /// <param name="clientVersion"></param> /// <param name="clientIP">The very important TCP/IP EndPoint of the client</param> /// <returns></returns> /// <remarks>You need to change bits and pieces of this method</remarks> public new LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP) { bool success = false; UUID session = UUID.Random(); try { // // Get the account and check that it exists // UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { // Account doesn't exist. Is this a user from an external ID provider? // // <your code here> // // After verification, your code should create a UserAccount object, filled out properly. // Do not store that account object persistently; we don't want to be creating local accounts // for external users! Create and fill out a UserAccount object, because it has the information // that the rest of the code needs. m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: user not found"); return LLFailedLoginResponse.UserProblem; } if (account.UserLevel < m_MinLoginLevel) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: login is blocked for user level {0}", account.UserLevel); return LLFailedLoginResponse.LoginBlockedProblem; } // If a scope id is requested, check that the account is in // that scope, or unscoped. // if (scopeID != UUID.Zero) { if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: user not found"); return LLFailedLoginResponse.UserProblem; } } else { scopeID = account.ScopeID; } // // Authenticate this user // // Local users and external users will need completely different authentication procedures. // The piece of code below is for local users who authenticate with a password. // if (!passwd.StartsWith("$1$")) passwd = "$1$" + Util.Md5Hash(passwd); passwd = passwd.Remove(0, 3); //remove $1$ string token = m_AuthenticationService.Authenticate(account.PrincipalID, passwd, 30); UUID secureSession = UUID.Zero; if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: authentication failed"); return LLFailedLoginResponse.UserProblem; } // // Get the user's inventory // // m_RequireInventory is set to false in .ini, therefore inventory is not required for login. // If you want to change this state of affairs and let external users have local inventory, // you need to think carefully about how to do that. // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); return LLFailedLoginResponse.InventoryProblem; } List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); return LLFailedLoginResponse.InventoryProblem; } if (inventorySkel == null) inventorySkel = new List<InventoryFolderBase>(); // Get active gestures List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); // // From here on, things should be exactly the same for all users // // // Login the presence // if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); if (!success) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: could not login presence"); return LLFailedLoginResponse.GridProblem; } } // // Change Online status and get the home region // GridRegion home = null; GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); } if (guinfo == null) { // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new GridUserInfo(); guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; GridRegion gatekeeper = null; TeleportFlags flags = TeleportFlags.Default; GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt, out flags); if (destination == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: destination not found"); return LLFailedLoginResponse.GridProblem; } // // Get the avatar // AvatarAppearance avatar = null; if (m_AvatarService != null) { avatar = m_AvatarService.GetAppearance(account.PrincipalID); } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; GridRegion dest = null; AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, channel, mac, id0, clientIP, flags, out where, out reason, out dest); if (aCircuit == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: {0}", reason); return new LLFailedLoginResponse("key", reason, "false"); } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); m_log.DebugFormat("[DIVA LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } // // Finally, fill out the response and return it // LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_SearchURL); m_log.DebugFormat("[DIVA LLOGIN SERVICE]: All clear. Sending login response to client."); return response; } catch (Exception e) { m_log.WarnFormat("[DIVA LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); if (m_PresenceService != null) m_PresenceService.LogoutAgent(session); return LLFailedLoginResponse.InternalError; } }
public bool ValidateFriendshipOffered(UUID fromID, UUID toID) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = fromID; finfo.Friend = toID.ToString(); Dictionary<string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "validate_friendship_offered"; string reply = string.Empty; string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } if (reply != string.Empty) { Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply); if (replyData.ContainsKey("RESULT")) { if (replyData["RESULT"].ToString().ToLower() == "true") return true; else return false; } else m_log.DebugFormat("[HGFRIENDS CONNECTOR]: reply data does not contain result field"); } else m_log.DebugFormat("[HGFRIENDS CONNECTOR]: received empty reply"); return false; }
public LoginResponse Login(string Name, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP, Hashtable requestData, UUID secureSession) { UUID session = UUID.Random(); m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} from {1} with user agent {2} starting in {3}", Name, clientIP.Address.ToString(), clientVersion, startLocation); UserAccount account = m_UserAccountService.GetUserAccount (scopeID, Name); try { string DisplayName = account.Name; IAgentInfo agent = null; IAgentConnector agentData = DataManager.RequestPlugin<IAgentConnector>(); IProfileConnector profileData = DataManager.RequestPlugin<IProfileConnector>(); if (agentData != null) agent = agentData.GetAgent(account.PrincipalID); requestData["ip"] = clientIP.ToString(); foreach (ILoginModule module in LoginModules) { string message; if (!module.Login(requestData, account.PrincipalID, out message)) { LLFailedLoginResponse resp = new LLFailedLoginResponse(LoginResponseEnum.PasswordIncorrect, message, false); return resp; } } // // Get the user's inventory // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); return LLFailedLoginResponse.InventoryProblem; } List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_InventoryService.CreateUserInventory(account.PrincipalID, m_DefaultUserAvatarArchive == ""); inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); return LLFailedLoginResponse.InventoryProblem; } } if (m_InventoryService.CreateUserRootFolder (account.PrincipalID)) ///Gotta refetch... since something went wrong inventorySkel = m_InventoryService.GetInventorySkeleton (account.PrincipalID); if (profileData != null) { IUserProfileInfo UPI = profileData.GetUserProfile(account.PrincipalID); if (UPI == null) { profileData.CreateNewProfile(account.PrincipalID); UPI = profileData.GetUserProfile(account.PrincipalID); UPI.AArchiveName = m_DefaultUserAvatarArchive; UPI.IsNewUser = true; //profileData.UpdateUserProfile(UPI); //It gets hit later by the next thing } //Find which is set, if any string archiveName = (UPI.AArchiveName != "" && UPI.AArchiveName != " ") ? UPI.AArchiveName : m_DefaultUserAvatarArchive; if (UPI.IsNewUser && archiveName != "") { archiver.LoadAvatarArchive(archiveName, account.Name); UPI.AArchiveName = ""; } if (UPI.IsNewUser) { UPI.IsNewUser = false; profileData.UpdateUserProfile(UPI); } if(UPI.DisplayName != "") DisplayName = UPI.DisplayName; } // Get active gestures List<InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); //m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); //Reset logged in to true if the user was crashed, but don't fire the logged in event yet m_agentInfoService.SetLoggedIn (account.PrincipalID.ToString (), true, false, UUID.Zero); //Lock it as well m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), true); //Now get the logged in status, then below make sure to kill the previous agent if we crashed before UserInfo guinfo = m_agentInfoService.GetUserInfo (account.PrincipalID.ToString ()); // // Clear out any existing CAPS the user may have // if (m_CapsService != null) { IAgentProcessing agentProcessor = m_registry.RequestModuleInterface<IAgentProcessing>(); if (agentProcessor != null) { IClientCapsService clientCaps = m_CapsService.GetClientCapsService(account.PrincipalID); if (clientCaps != null) { IRegionClientCapsService rootRegionCaps = clientCaps.GetRootCapsService(); if (rootRegionCaps != null) agentProcessor.LogoutAgent(rootRegionCaps, !m_AllowDuplicateLogin); } } else m_CapsService.RemoveCAPS(account.PrincipalID); } // // Change Online status and get the home region // GridRegion home = null; if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); } bool GridUserInfoFound = true; if (guinfo == null) { GridUserInfoFound = false; // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new UserInfo(); guinfo.UserID = account.PrincipalID.ToString(); guinfo.CurrentPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; TeleportFlags tpFlags = TeleportFlags.ViaLogin; GridRegion destination = FindDestination (account, scopeID, guinfo, session, startLocation, home, out tpFlags, out where, out position, out lookAt); if (destination == null) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: destination not found"); return LLFailedLoginResponse.DeadRegionProblem; } if (!GridUserInfoFound || guinfo.HomeRegionID == UUID.Zero) //Give them a default home and last { List<GridRegion> DefaultRegions = m_GridService.GetDefaultRegions(account.ScopeID); GridRegion DefaultRegion = null; if (DefaultRegions.Count == 0) DefaultRegion = destination; else DefaultRegion = DefaultRegions[0]; if (m_DefaultHomeRegion != "" && guinfo.HomeRegionID == UUID.Zero) { GridRegion newHomeRegion = m_GridService.GetRegionByName(account.ScopeID, m_DefaultHomeRegion); if (newHomeRegion == null) guinfo.HomeRegionID = guinfo.CurrentRegionID = DefaultRegion.RegionID; else guinfo.HomeRegionID = guinfo.CurrentRegionID = newHomeRegion.RegionID; } else if (guinfo.HomeRegionID == UUID.Zero) guinfo.HomeRegionID = guinfo.CurrentRegionID = DefaultRegion.RegionID; //Z = 0 so that it fixes it on the region server and puts it on the ground guinfo.CurrentPosition = guinfo.HomePosition = new Vector3(128, 128, 25); guinfo.HomeLookAt = guinfo.CurrentLookAt = new Vector3(0, 0, 0); m_agentInfoService.SetLastPosition(guinfo.UserID, guinfo.CurrentRegionID, guinfo.CurrentPosition, guinfo.CurrentLookAt); m_agentInfoService.SetHomePosition(guinfo.UserID, guinfo.HomeRegionID, guinfo.HomePosition, guinfo.HomeLookAt); } // // Get the avatar // AvatarAppearance avappearance = new AvatarAppearance(account.PrincipalID); if (m_AvatarService != null) { avappearance = m_AvatarService.GetAppearance(account.PrincipalID); if (avappearance == null) { //Create an appearance for the user if one doesn't exist if (m_DefaultUserAvatarArchive != "") { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", loading the default avatar from " + m_DefaultUserAvatarArchive + "."); archiver.LoadAvatarArchive(m_DefaultUserAvatarArchive, account.Name); } else { m_log.Error("[LLoginService]: Cannot find an appearance for user " + account.Name + ", setting to the default avatar."); AvatarAppearance appearance = new AvatarAppearance(account.PrincipalID); m_AvatarService.SetAvatar(account.PrincipalID, new AvatarData(appearance)); } avappearance = m_AvatarService.GetAppearance(account.PrincipalID); } else { //Verify that all assets exist now for (int i = 0; i < avappearance.Wearables.Length; i++) { bool messedUp = false; foreach (KeyValuePair<UUID, UUID> item in avappearance.Wearables[i].GetItems()) { AssetBase asset = m_AssetService.Get(item.Value.ToString()); if (asset == null) { InventoryItemBase invItem = m_InventoryService.GetItem (new InventoryItemBase (item.Value)); if (invItem == null) { m_log.Warn ("Missing avatar appearance asset for user " + account.Name + " for item " + item.Value + ", asset should be " + item.Key + "!"); messedUp = true; } } } if (messedUp) avappearance.Wearables[i] = AvatarWearable.DefaultWearables[i]; } //Also verify that all baked texture indices exist foreach (byte BakedTextureIndex in AvatarAppearance.BAKE_INDICES) { if (BakedTextureIndex == 19) //Skirt isn't used unless you have a skirt continue; if (avappearance.Texture.GetFace(BakedTextureIndex).TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE) { m_log.Warn("Bad texture index for user " + account.Name + " for " + BakedTextureIndex + "!"); avappearance = new AvatarAppearance(account.PrincipalID); m_AvatarService.SetAvatar(account.PrincipalID, new AvatarData(avappearance)); break; } } } } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; AgentCircuitData aCircuit = LaunchAgentAtGrid (destination, tpFlags, account, avappearance, session, secureSession, position, where, clientIP, out where, out reason, out destination); if (aCircuit == null) { m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); return new LLFailedLoginResponse (LoginResponseEnum.InternalError, reason, false); } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); //m_log.DebugFormat("[LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } //Set them as logged in now, they are ready, and fire the logged in event now, as we're all done m_agentInfoService.SetLastPosition (account.PrincipalID.ToString (), destination.RegionID, position, lookAt); m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), false); //Unlock it now m_agentInfoService.SetLoggedIn(account.PrincipalID.ToString(), true, true, destination.RegionID); // // Finally, fill out the response and return it // string MaturityRating = "A"; string MaxMaturity = "A"; if (agent != null) { if (agent.MaturityRating == 0) MaturityRating = "P"; else if (agent.MaturityRating == 1) MaturityRating = "M"; else if (agent.MaturityRating == 2) MaturityRating = "A"; if (agent.MaxMaturity == 0) MaxMaturity = "P"; else if (agent.MaxMaturity == 1) MaxMaturity = "M"; else if (agent.MaxMaturity == 2) MaxMaturity = "A"; } LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_InventoryService, m_LibraryService, where, startLocation, position, lookAt, gestures, home, clientIP, MaxMaturity, MaturityRating, eventCategories, classifiedCategories, FillOutSeedCap (aCircuit, destination, clientIP, account.PrincipalID), m_config, DisplayName, m_registry); m_log.InfoFormat("[LLOGIN SERVICE]: All clear. Sending login response to client to login to region " + destination.RegionName + ", tried to login to " + startLocation + " at " + position.ToString() + "."); return response; } catch (Exception e) { m_log.WarnFormat ("[LLOGIN SERVICE]: Exception processing login for {0} : {1}", Name, e.ToString ()); if (account != null) { //Revert their logged in status if we got that far m_agentInfoService.LockLoggedInStatus (account.PrincipalID.ToString (), false); //Unlock it now m_agentInfoService.SetLoggedIn (account.PrincipalID.ToString (), false, false, UUID.Zero); } return LLFailedLoginResponse.InternalError; } }
byte[] NewFriendship(Dictionary<string, object> request) { if (!VerifyServiceKey(request)) return FailureResult(); // OK, can proceed FriendInfo friend = new FriendInfo(request); UUID friendID; string tmp = string.Empty; if (!Util.ParseUniversalUserIdentifier(friend.Friend, out friendID, out tmp, out tmp, out tmp, out tmp)) return FailureResult(); m_log.DebugFormat("[HGFRIENDS HANDLER]: New friendship {0} {1}", friend.PrincipalID, friend.Friend); // If the friendship already exists, return fail FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) if (finfo.Friend.StartsWith(friendID.ToString())) return FailureResult(); // the user needs to confirm when he gets home bool success = m_FriendsService.StoreFriend(friend.PrincipalID.ToString(), friend.Friend, 0); if (success) return SuccessResult(); else return FailureResult(); }
byte[] NewFriendship(Dictionary<string, object> request) { bool verified = VerifyServiceKey(request); FriendInfo friend = new FriendInfo(request); bool success = m_TheService.NewFriendship(friend, verified); if (success) return SuccessResult(); else return FailureResult(); }
byte[] DeleteFriendship(Dictionary<string, object> request) { FriendInfo friend = new FriendInfo(request); string secret = string.Empty; if (request.ContainsKey("SECRET")) secret = request["SECRET"].ToString(); if (secret == string.Empty) return FailureResult(); FriendInfo[] finfos = m_FriendsService.GetFriends(friend.PrincipalID); foreach (FriendInfo finfo in finfos) { // We check the secret here if (finfo.Friend.StartsWith(friend.Friend) && finfo.Friend.EndsWith(secret)) { m_log.DebugFormat("[HGFRIENDS HANDLER]: Delete friendship {0} {1}", friend.PrincipalID, friend.Friend); m_FriendsService.Delete(friend.PrincipalID, finfo.Friend); m_FriendsService.Delete(finfo.Friend, friend.PrincipalID.ToString()); return SuccessResult(); } } return FailureResult(); }
private void StatusNotify(FriendInfo friend, UUID userID, bool online) { UUID friendID; if (UUID.TryParse(friend.Friend, out friendID)) { // Try local if (LocalStatusNotification(userID, friendID, online)) return; // The friend is not here [as root]. Let's forward. string[] AgentLocations = PresenceService.GetAgentsLocations(new string[] { friendID.ToString() }); if (AgentLocations != null && (AgentLocations.Length != 1 && AgentLocations[0] != "Failure")) //If this is true, this doesn't exist on the presence server and we use the legacy way { try { //New style update! string http = AgentLocations[0].Remove(0, 7); string address = http.Split(':')[0]; string port = http.Split(':')[1]; //Create a fake GridRegion GridRegion region = new GridRegion() { ExternalHostName = address, HttpPort = uint.Parse(port) }; //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); return; } catch (Exception ex) { //If something goes wrong, let it fall back m_log.Warn("[FRIENDS]: Error in status update: " + ex); } } PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); if (friendSessions != null && friendSessions.Length > 0) { PresenceInfo friendSession = null; foreach (PresenceInfo pinfo in friendSessions) if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad { friendSession = pinfo; break; } if (friendSession != null) { GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); } } // Friend is not online. Ignore. } else { m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); } }
protected override FriendInfo GetFriend(FriendInfo[] friends, UUID friendID) { foreach (FriendInfo fi in friends) { if (fi.Friend.StartsWith(friendID.ToString())) return fi; } return null; }
private void StatusNotify(FriendInfo friend, UUID userID, bool online) { UUID friendID = UUID.Zero; if (UUID.TryParse(friend.Friend, out friendID)) { // Try local if (LocalStatusNotification(userID, friendID, online)) return; // The friend is not here [as root]. Let's forward. PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); if (friendSession != null) { GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); } // Friend is not online. Ignore. } }
protected override FriendInfo[] GetFriendsFromService(IClientAPI client) { // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, client.AgentId); if (account1 != null) return base.GetFriendsFromService(client); FriendInfo[] finfos = new FriendInfo[0]; // Foreigner AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); if (agentClientCircuit != null) { string agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); finfos = FriendsService.GetFriends(agentUUI); m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, agentUUI); } // m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); return finfos; }
public FriendInfo[] GetFriends(UUID principalID) { if (String.IsNullOrEmpty(m_serverUrl)) return new FriendInfo[0]; Dictionary<UUID, FriendInfo> friends = new Dictionary<UUID, FriendInfo>(); OSDArray friendsArray = GetFriended(principalID); OSDArray friendedMeArray = GetFriendedBy(principalID); // Load the list of friends and their granted permissions for (int i = 0; i < friendsArray.Count; i++) { OSDMap friendEntry = friendsArray[i] as OSDMap; if (friendEntry != null) { UUID friendID = friendEntry["Key"].AsUUID(); FriendInfo friend = new FriendInfo(); friend.PrincipalID = principalID; friend.Friend = friendID.ToString(); friend.MyFlags = friendEntry["Value"].AsInteger(); friend.TheirFlags = -1; friends[friendID] = friend; } } // Load the permissions those friends have granted to this user for (int i = 0; i < friendedMeArray.Count; i++) { OSDMap friendedMeEntry = friendedMeArray[i] as OSDMap; if (friendedMeEntry != null) { UUID friendID = friendedMeEntry["OwnerID"].AsUUID(); FriendInfo friend; if (friends.TryGetValue(friendID, out friend)) friend.TheirFlags = friendedMeEntry["Value"].AsInteger(); } } // Convert the dictionary of friends to an array and return it FriendInfo[] array = new FriendInfo[friends.Count]; int j = 0; foreach (FriendInfo friend in friends.Values) array[j++] = friend; return array; }
public bool StoreFriend(UUID PrincipalID, string Friend, int flags) { FriendInfo finfo = new FriendInfo(); finfo.PrincipalID = PrincipalID; finfo.Friend = Friend; finfo.MyFlags = flags; Dictionary<string, object> sendData = finfo.ToKeyValuePairs(); sendData["METHOD"] = "storefriend"; string reqString = ServerUtils.BuildQueryString(sendData); string reply = string.Empty; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI + "/friends", ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { m_log.DebugFormat("[FRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); return false; } if (reply != string.Empty) { Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply); if ((replyData != null) && replyData.ContainsKey("Result") && (replyData["Result"] != null)) { bool success = false; Boolean.TryParse(replyData["Result"].ToString(), out success); return success; } else m_log.DebugFormat("[FRIENDS CONNECTOR]: StoreFriend {0} {1} received null response", PrincipalID, Friend); } else m_log.DebugFormat("[FRIENDS CONNECTOR]: StoreFriend received null reply"); return false; }