diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
index 6c18d06e45..8111add447 100644
--- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
+++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
@@ -44,35 +44,35 @@ namespace OpenSim.Framework.Communications.Tests
/// Test the login service. For now, most of this will be done through the LocalLoginService as LoginService
/// is abstract
///
- [TestFixture]
+ [TestFixture]
public class LoginServiceTests
- {
+ {
///
/// Test the normal response to a login. Does not test authentication.
- ///
+ ///
[Test]
- public void TestNormalLoginResponse()
+ public void T010_NormalLoginResponse()
{
//log4net.Config.XmlConfigurator.Configure();
-
+
string firstName = "Timmy";
string lastName = "Mallet";
string regionExternalName = "localhost";
IPEndPoint capsEndPoint = new IPEndPoint(IPAddress.Loopback, 9123);
- CommunicationsManager commsManager
+ CommunicationsManager commsManager
= new TestCommunicationsManager(new OpenSim.Framework.NetworkServersInfo(42, 43));
-
+
commsManager.GridService.RegisterRegion(
new RegionInfo(42, 43, capsEndPoint, regionExternalName));
commsManager.GridService.RegionLoginsEnabled = true;
-
- LoginService loginService
+
+ LoginService loginService
= new LocalLoginService(
- (UserManagerBase)commsManager.UserService, "Hello folks", commsManager.InterServiceInventoryService,
- (LocalBackEndServices)commsManager.GridService,
+ (UserManagerBase)commsManager.UserService, "Hello folks", commsManager.InterServiceInventoryService,
+ (LocalBackEndServices)commsManager.GridService,
commsManager.NetworkServersInfo, false, new LibraryRootFolder(String.Empty));
-
+
Hashtable loginParams = new Hashtable();
loginParams["first"] = firstName;
loginParams["last"] = lastName;
@@ -85,20 +85,199 @@ namespace OpenSim.Framework.Communications.Tests
XmlRpcResponse response = loginService.XmlRpcLoginMethod(request);
Hashtable responseData = (Hashtable)response.Value;
-
- // TODO: Not check inventory part of response yet.
- // TODO: Not checking all of login response thoroughly yet.
-
+
Assert.That(responseData["first_name"], Is.EqualTo(firstName));
Assert.That(responseData["last_name"], Is.EqualTo(lastName));
Assert.That(
responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(System.Int32.MaxValue));
-
- Regex capsSeedPattern
- = new Regex("^http://" + regionExternalName + ":" + NetworkServersInfo.DefaultHttpListenerPort
- + "/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$");
- Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True);
+ Regex capsSeedPattern
+ = new Regex("^http://"
+ + regionExternalName
+ + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$");
+
+ Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True);
+ }
+
+ [Test]
+ public void T011_Auth_Login()
+ {
+ string firstName = "Adam";
+ string lastName = "West";
+ string regionExternalName = "localhost";
+ IPEndPoint capsEndPoint = new IPEndPoint(IPAddress.Loopback, 9123);
+
+ CommunicationsManager commsManager
+ = new TestCommunicationsManager(new OpenSim.Framework.NetworkServersInfo(42, 43));
+
+ commsManager.GridService.RegisterRegion(
+ new RegionInfo(42, 43, capsEndPoint, regionExternalName));
+ commsManager.GridService.RegionLoginsEnabled = true;
+
+ LocalUserServices lus = (LocalUserServices)commsManager.UserService;
+
+ lus.AddUser(firstName,lastName,"boingboing","abc@ftw.com",42,43);
+
+
+ LoginService loginService
+ = new LocalLoginService(
+ (UserManagerBase)lus, "Hello folks", commsManager.InterServiceInventoryService,
+ (LocalBackEndServices)commsManager.GridService,
+ commsManager.NetworkServersInfo, true, new LibraryRootFolder(String.Empty));
+
+
+ // TODO: Not check inventory part of response yet.
+ // TODO: Not checking all of login response thoroughly yet.
+
+ // 1) Test for positive authentication
+
+ Hashtable loginParams = new Hashtable();
+ loginParams["first"] = firstName;
+ loginParams["last"] = lastName;
+ loginParams["passwd"] = "boingboing";
+
+ ArrayList sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ XmlRpcResponse response = loginService.XmlRpcLoginMethod(request);
+ Hashtable responseData = (Hashtable)response.Value;
+
+ UserProfileData uprof = lus.GetUserProfile(firstName,lastName);
+
+ UserAgentData uagent = uprof.CurrentAgent;
+ Assert.That(uagent,Is.Not.Null);
+
+ Assert.That(responseData["first_name"], Is.Not.Null);
+ Assert.That(responseData["first_name"], Is.EqualTo(firstName));
+ Assert.That(responseData["last_name"], Is.EqualTo(lastName));
+ Assert.That(responseData["agent_id"], Is.EqualTo(uagent.ProfileID.ToString()));
+ Assert.That(responseData["session_id"], Is.EqualTo(uagent.SessionID.ToString()));
+ Assert.That(responseData["secure_session_id"], Is.EqualTo(uagent.SecureSessionID.ToString()));
+ ArrayList invlibroot = (ArrayList) responseData["inventory-lib-root"];
+ Hashtable invlibroothash = (Hashtable) invlibroot[0];
+ Assert.That(invlibroothash["folder_id"],Is.EqualTo("00000112-000f-0000-0000-000100bba000"));
+ Assert.That(
+ responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(System.Int32.MaxValue));
+ Assert.That(responseData["message"], Is.EqualTo("Hello folks"));
+ Assert.That(responseData["buddy-list"], Is.Empty);
+ Assert.That(responseData["start_location"], Is.EqualTo("last"));
+
+ Regex capsSeedPattern
+ = new Regex("^http://"
+ + regionExternalName
+ + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$");
+
+ Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True);
+
+ // 1.1) Test for budddies!
+ lus.AddUser("Friend","Number1","boingboing","abc@ftw.com",42,43);
+ lus.AddUser("Friend","Number2","boingboing","abc@ftw.com",42,43);
+
+ UserProfileData friend1 = lus.GetUserProfile("Friend","Number1");
+ UserProfileData friend2 = lus.GetUserProfile("Friend","Number2");
+ lus.AddNewUserFriend(friend1.ID,uprof.ID,1);
+ lus.AddNewUserFriend(friend1.ID,friend2.ID,2);
+
+ loginParams = new Hashtable();
+ loginParams["first"] = "Friend";
+ loginParams["last"] = "Number1";
+ loginParams["passwd"] = "boingboing";
+
+ sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+
+ ArrayList friendslist = (ArrayList) responseData["buddy-list"];
+
+ Assert.That(friendslist,Is.Not.Null);
+
+
+ Hashtable buddy1 = (Hashtable) friendslist[0];
+ Hashtable buddy2 = (Hashtable) friendslist[1];
+ Assert.That(friendslist.Count, Is.EqualTo(2));
+ Assert.That(uprof.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"]));
+ Assert.That(friend2.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"]));
+
+ // 2) Test for negative authentication
+ //
+ string error_auth_message = "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.";
+ string error_xml_message = "Error connecting to grid. Could not percieve credentials from login XML.";
+ string error_already_logged = "You appear to be already logged in. " +
+ "If this is not the case please wait for your session to timeout. " +
+ "If this takes longer than a few minutes please contact the grid owner. " +
+ "Please wait 5 minutes if you are going to connect to a region nearby to the region you were at previously.";
+ string error_region_unavailable = "The region you are attempting to log into is not responding. Please select another region and try again.";
+ // 2.1) Test for wrong user name
+ loginParams = new Hashtable();
+ loginParams["first"] = lastName;
+ loginParams["last"] = firstName;
+ loginParams["passwd"] = "boingboing";
+
+ sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+ Assert.That(responseData["message"], Is.EqualTo(error_auth_message));
+
+ // 2.2) Test for wrong password
+ loginParams = new Hashtable();
+ loginParams["first"] = "Friend";
+ loginParams["last"] = "Number2";
+ loginParams["passwd"] = "boing";
+
+ sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+ Assert.That(responseData["message"], Is.EqualTo(error_auth_message));
+
+ // 2.3) Bad XML
+ loginParams = new Hashtable();
+ loginParams["first"] = "Friend";
+ loginParams["banana"] = "Banana";
+ loginParams["passwd"] = "boingboing";
+
+ sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+ Assert.That(responseData["message"], Is.EqualTo(error_xml_message));
+
+ // 2.4) Already logged in and sucessfull post login
+ loginParams = new Hashtable();
+ loginParams["first"] = "Adam";
+ loginParams["last"] = "West";
+ loginParams["passwd"] = "boingboing";
+
+ sendParams = new ArrayList();
+ sendParams.Add(loginParams);
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+ Assert.That(responseData["message"], Is.EqualTo(error_already_logged));
+
+ request = new XmlRpcRequest("login_to_simulator", sendParams);
+
+ response = loginService.XmlRpcLoginMethod(request);
+ responseData = (Hashtable)response.Value;
+ Assert.That(responseData["message"], Is.EqualTo("Hello folks"));
}
}
}
diff --git a/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs
index 6be7b3db8c..8dccacc6dd 100644
--- a/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs
+++ b/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs
@@ -38,7 +38,7 @@ namespace OpenSim.Tests.Common.Mock
/// tests are single threaded.
///
public class TestUserDataPlugin : IUserDataPlugin
- {
+ {
public string Version { get { return "0"; } }
public string Name { get { return "TestUserDataPlugin"; } }
@@ -49,64 +49,146 @@ namespace OpenSim.Tests.Common.Mock
///
/// User profiles keyed by uuid
- ///
+ ///
private Dictionary m_userProfilesByUuid = new Dictionary();
+ ///
+ /// User profiles and their agents
+ ///
+ private Dictionary m_agentByProfileUuid = new Dictionary();
+
+ ///
+ /// Friends list by uuid
+ ///
+ private Dictionary> m_friendsListByUuid = new Dictionary>();
+
public void Initialise() {}
public void Dispose() {}
-
- public void AddNewUserProfile(UserProfileData user)
+
+ public void AddNewUserProfile(UserProfileData user)
{
UpdateUserProfile(user);
}
-
- public UserProfileData GetUserByUUID(UUID user)
+
+ public UserProfileData GetUserByUUID(UUID user)
{
UserProfileData userProfile = null;
m_userProfilesByUuid.TryGetValue(user, out userProfile);
-
- return userProfile;
+
+ return userProfile;
}
- public UserProfileData GetUserByName(string fname, string lname)
- {
+ public UserProfileData GetUserByName(string fname, string lname)
+ {
UserProfileData userProfile = null;
m_userProfilesByName.TryGetValue(fname + " " + lname, out userProfile);
-
- return userProfile;
- }
- public bool UpdateUserProfile(UserProfileData user)
- {
+ return userProfile;
+ }
+
+ public bool UpdateUserProfile(UserProfileData user)
+ {
m_userProfilesByUuid[user.ID] = user;
m_userProfilesByName[user.FirstName + " " + user.SurName] = user;
-
+
return true;
}
public List GeneratePickerResults(UUID queryID, string query) { return null; }
- public UserAgentData GetAgentByUUID(UUID user) { return null; }
+ public UserAgentData GetAgentByUUID(UUID user)
+ {
+ UserAgentData userAgent = null;
+ m_agentByProfileUuid.TryGetValue(user, out userAgent);
- public UserAgentData GetAgentByName(string name) { return null; }
+ return userAgent;
+ }
- public UserAgentData GetAgentByName(string fname, string lname) { return null; }
+ public UserAgentData GetAgentByName(string name)
+ {
+ UserProfileData userProfile = null;
+ m_userProfilesByName.TryGetValue(name, out userProfile);
+ UserAgentData userAgent = null;
+ m_agentByProfileUuid.TryGetValue(userProfile.ID, out userAgent);
+
+ return userAgent;
+ }
+
+ public UserAgentData GetAgentByName(string fname, string lname)
+ {
+ UserProfileData userProfile = GetUserByName(fname,lname);
+ UserAgentData userAgent = null;
+ m_agentByProfileUuid.TryGetValue(userProfile.ID, out userAgent);
+
+ return userAgent;
+ }
public void StoreWebLoginKey(UUID agentID, UUID webLoginKey) {}
- public void AddNewUserAgent(UserAgentData agent) {}
-
- public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) {}
-
- public void RemoveUserFriend(UUID friendlistowner, UUID friend) {}
-
- public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) {}
-
- public List GetUserFriendList(UUID friendlistowner)
+ public void AddNewUserAgent(UserAgentData agent)
{
- return new List();
+ m_agentByProfileUuid[agent.ProfileID] = agent;
}
-
+ public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms)
+ {
+ FriendListItem newfriend = new FriendListItem();
+ newfriend.FriendPerms = perms;
+ newfriend.Friend = friend;
+ newfriend.FriendListOwner = friendlistowner;
+
+ if (!m_friendsListByUuid.ContainsKey(friendlistowner))
+ {
+ List friendslist = new List();
+ m_friendsListByUuid[friendlistowner] = friendslist;
+
+ }
+ m_friendsListByUuid[friendlistowner].Add(newfriend);
+ }
+
+ public void RemoveUserFriend(UUID friendlistowner, UUID friend)
+ {
+ if (m_friendsListByUuid.ContainsKey(friendlistowner))
+ {
+ List friendslist = m_friendsListByUuid[friendlistowner];
+ foreach (FriendListItem frienditem in friendslist)
+ {
+ if (frienditem.Friend == friend)
+ {
+ friendslist.Remove(frienditem);
+ break;
+ }
+ }
+ }
+ }
+
+ public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms)
+ {
+ if (m_friendsListByUuid.ContainsKey(friendlistowner))
+ {
+ List friendslist = m_friendsListByUuid[friendlistowner];
+ foreach (FriendListItem frienditem in friendslist)
+ {
+ if (frienditem.Friend == friend)
+ {
+ frienditem.FriendPerms = perms;
+ break;
+ }
+ }
+ }
+ }
+
+ public List GetUserFriendList(UUID friendlistowner)
+ {
+ if (m_friendsListByUuid.ContainsKey(friendlistowner))
+ {
+ return m_friendsListByUuid[friendlistowner];
+ }
+ else
+ return new List();
+
+
+ }
+
public Dictionary GetFriendRegionInfos(List uuids) { return null; }
public bool MoneyTransferRequest(UUID from, UUID to, uint amount) { return false; }