More on HG Friends. Added Delete(string, string) across the board. Added security to friendship identifiers so that they can safely be deleted across worlds. Had to change Get(string) to use LIKE because the secret in the identifier is not always known -- affects only HG visitors. BOTTOM LINE SO FAR: HG friendships established and deleted safely across grids, local rights working but not (yet?) being transmitted back.

This commit is contained in:
Diva Canto
2011-05-22 16:51:03 -07:00
parent fed3cc630e
commit 336665e035
18 changed files with 396 additions and 214 deletions

View File

@@ -211,6 +211,16 @@ namespace OpenSim.Services.Connectors.Friends
}
public bool Delete(string PrincipalID, string Friend)
{
Dictionary<string, object> sendData = new Dictionary<string, object>();
sendData["PRINCIPALID"] = PrincipalID.ToString();
sendData["FRIEND"] = Friend;
sendData["METHOD"] = "deletefriend_string";
return Delete(sendData, PrincipalID, Friend);
}
public bool Delete(UUID PrincipalID, string Friend)
{
Dictionary<string, object> sendData = new Dictionary<string, object>();
@@ -218,6 +228,11 @@ namespace OpenSim.Services.Connectors.Friends
sendData["FRIEND"] = Friend;
sendData["METHOD"] = "deletefriend";
return Delete(sendData, PrincipalID.ToString(), Friend);
}
public bool Delete(Dictionary<string, object> sendData, string PrincipalID, string Friend)
{
string reply = string.Empty;
try
{

View File

@@ -54,6 +54,11 @@ namespace OpenSim.Services.Connectors.Hypergrid
{
}
public HGFriendsServicesConnector(string serverURI)
{
m_ServerURI = serverURI.TrimEnd('/');
}
public HGFriendsServicesConnector(string serverURI, UUID sessionID, string serviceKey)
{
m_ServerURI = serverURI.TrimEnd('/');
@@ -151,6 +156,51 @@ namespace OpenSim.Services.Connectors.Hypergrid
}
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;
try
{
reply = SynchronousRestFormsRequester.MakeRequest("POST",
m_ServerURI + "/hgfriends",
ServerUtils.BuildQueryString(sendData));
}
catch (Exception e)
{
m_log.DebugFormat("[HGFRIENDS 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("[HGFRIENDS CONNECTOR]: Delete {0} {1} received null response",
PrincipalID, Friend);
}
else
m_log.DebugFormat("[HGFRIENDS CONNECTOR]: DeleteFriend received null reply");
return false;
}
#endregion
}
}

View File

@@ -103,7 +103,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
if (!UUID.TryParse(principalID, out friend.PrincipalID))
{
string tmp = string.Empty;
if (!Util.ParseUniversalUserIdentifier(principalID, out friend.PrincipalID, out tmp, out tmp, out tmp))
if (!Util.ParseUniversalUserIdentifier(principalID, out friend.PrincipalID, out tmp, out tmp, out tmp, out tmp))
// bad record. ignore this entry
continue;
}
@@ -163,6 +163,11 @@ namespace OpenSim.Services.Connectors.SimianGrid
}
public bool Delete(UUID principalID, string friend)
{
return Delete(principalID.ToString(), friend);
}
public bool Delete(string principalID, string friend)
{
if (String.IsNullOrEmpty(m_serverUrl))
return true;

View File

@@ -75,7 +75,7 @@ namespace OpenSim.Services.Friends
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))
if (!Util.ParseUniversalUserIdentifier(d.PrincipalID, out i.PrincipalID, out tmp, out tmp, out tmp, out tmp))
// bad record. ignore this entry
continue;
}
@@ -101,6 +101,11 @@ namespace OpenSim.Services.Friends
return m_Database.Store(d);
}
public bool Delete(string principalID, string friend)
{
return m_Database.Delete(principalID, friend);
}
public virtual bool Delete(UUID PrincipalID, string Friend)
{
return m_Database.Delete(PrincipalID, Friend);

View File

@@ -1,86 +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 OpenMetaverse;
using OpenSim.Framework;
using System;
using System.Collections.Generic;
using OpenSim.Services.Interfaces;
using OpenSim.Services.Friends;
using OpenSim.Data;
using Nini.Config;
using log4net;
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
namespace OpenSim.Services.HypergridService
{
public class HGFriendsService : FriendsService, IFriendsService
{
public HGFriendsService(IConfigSource config) : base(config)
{
}
/// <summary>
/// Overrides base.
/// Storing new friendships from the outside is a tricky, sensitive operation, and it
/// needs to be done under certain restrictions.
/// First of all, if the friendship already exists, this is a no-op. In other words,
/// we cannot change just the flags, it needs to be a new friendship.
/// Second, we store it as flags=0 always, independent of what the caller sends. The
/// owner of the friendship needs to confirm when it gets back home.
/// </summary>
/// <param name="PrincipalID"></param>
/// <param name="Friend"></param>
/// <param name="flags"></param>
/// <returns></returns>
public override bool StoreFriend(string PrincipalID, string Friend, int flags)
{
UUID userID;
if (UUID.TryParse(PrincipalID, out userID))
{
FriendsData[] friendsData = m_Database.GetFriends(userID.ToString());
List<FriendsData> fList = new List<FriendsData>(friendsData);
if (fList.Find(delegate(FriendsData fdata)
{
return fdata.Friend == Friend;
}) != null)
return false;
}
else
return false;
FriendsData d = new FriendsData();
d.PrincipalID = PrincipalID;
d.Friend = Friend;
d.Data = new Dictionary<string, string>();
d.Data["Flags"] = "0";
return m_Database.Store(d);
}
}
}

View File

@@ -77,5 +77,6 @@ namespace OpenSim.Services.Interfaces
FriendInfo[] GetFriends(string PrincipalID);
bool StoreFriend(string PrincipalID, string Friend, int flags);
bool Delete(UUID PrincipalID, string Friend);
bool Delete(string PrincipalID, string Friend);
}
}

View File

@@ -628,7 +628,7 @@ namespace OpenSim.Services.LLLoginService
else
{
string tmp;
if (Util.ParseUniversalUserIdentifier(finfo.Friend, out friendID, out tmp, out tmp, out tmp))
if (Util.ParseUniversalUserIdentifier(finfo.Friend, out friendID, out tmp, out tmp, out tmp, out tmp))
buddyitem.BuddyID = friendID.ToString();
else
// junk entry