From 7d9d8eb90f1aae353e6e0a649875a9506892a6cc Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 5 Sep 2009 16:56:33 -0700 Subject: This should get rid of the infinite loop upon looking up users/agents by UUID in grid mode. Grr. --- OpenSim/Region/Communications/Hypergrid/HGUserServices.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs index aaa1c78..f1a56ef 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs @@ -313,7 +313,7 @@ namespace OpenSim.Region.Communications.Hypergrid public bool IsForeignUser(UUID userID, out string userServerURL) { - userServerURL = string.Empty; + userServerURL = m_commsManager.NetworkServersInfo.UserURL; CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID); if (uinfo != null) { -- cgit v1.1 From babe392709a7f7a65540485a641916d6e0194b5d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 5 Sep 2009 17:16:43 -0700 Subject: uh-hum. It might help if I remembered to save the file. --- OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs index 92e6ae3..ec8512a 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs @@ -112,7 +112,7 @@ namespace OpenSim.Region.Communications.OGS1 parameters.Add(param); XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); - XmlRpcResponse resp = req.Send(GetUserServerURL(userId), 6000); + XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000); Hashtable respData = (Hashtable)resp.Value; if (respData.Contains("error_type")) { -- cgit v1.1 From 2a8f66b221e93fb2d693c1c273c2dee85439f835 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 Sep 2009 04:28:42 +0100 Subject: Revising the user account data interfaces. No user functionality yet --- OpenSim/Data/IUserAccountData.cs | 55 +++++++ OpenSim/Data/MySQL/MySQLUserAccountData.cs | 180 +++++++++++++++++++++ OpenSim/Data/MySQL/Resources/008_UserStore.sql | 5 + .../User/LocalUserServiceConnector.cs | 6 +- .../User/RemoteUserServiceConnector.cs | 4 +- .../Connectors/User/UserServiceConnector.cs | 145 ++--------------- OpenSim/Services/Interfaces/IUserService.cs | 35 ++-- OpenSim/Services/UserService/UserService.cs | 14 +- 8 files changed, 275 insertions(+), 169 deletions(-) create mode 100644 OpenSim/Data/IUserAccountData.cs create mode 100644 OpenSim/Data/MySQL/MySQLUserAccountData.cs create mode 100644 OpenSim/Data/MySQL/Resources/008_UserStore.sql diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs new file mode 100644 index 0000000..6bec188 --- /dev/null +++ b/OpenSim/Data/IUserAccountData.cs @@ -0,0 +1,55 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Data +{ + public class UserAccountData + { + public UUID PrincipalID; + public UUID ScopeID; + public Dictionary Data; + } + + /// + /// An interface for connecting to the authentication datastore + /// + public interface IUserAccountData + { + UserAccountData Get(UUID principalID, UUID ScopeID); + + List Query(UUID principalID, UUID ScopeID, string query); + + bool Store(UserAccountData data); + + bool SetDataItem(UUID principalID, string item, string value); + } +} diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs new file mode 100644 index 0000000..39d60ca --- /dev/null +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs @@ -0,0 +1,180 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using OpenMetaverse; +using OpenSim.Framework; +using MySql.Data.MySqlClient; + +namespace OpenSim.Data.MySQL +{ + public class MySqlUserAccountData : MySqlFramework, IUserAccountData + { + private string m_Realm; + private List m_ColumnNames = null; + private int m_LastExpire = 0; + + public MySqlUserAccountData(string connectionString, string realm) + : base(connectionString) + { + m_Realm = realm; + + Migration m = new Migration(m_Connection, GetType().Assembly, "UserStore"); + m.Update(); + } + + public List Query(UUID principalID, UUID scopeID, string query) + { + return null; + } + + public UserAccountData Get(UUID principalID, UUID scopeID) + { + UserAccountData ret = new UserAccountData(); + ret.Data = new Dictionary(); + + string command = "select * from `"+m_Realm+"` where UUID = ?principalID"; + if (scopeID != UUID.Zero) + command += " and ScopeID = ?scopeID"; + + MySqlCommand cmd = new MySqlCommand(command); + + cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); + cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); + + IDataReader result = ExecuteReader(cmd); + + if (result.Read()) + { + ret.PrincipalID = principalID; + UUID scope; + UUID.TryParse(result["ScopeID"].ToString(), out scope); + ret.ScopeID = scope; + + if (m_ColumnNames == null) + { + m_ColumnNames = new List(); + + DataTable schemaTable = result.GetSchemaTable(); + foreach (DataRow row in schemaTable.Rows) + m_ColumnNames.Add(row["ColumnName"].ToString()); + } + + foreach (string s in m_ColumnNames) + { + if (s == "UUID") + continue; + if (s == "ScopeID") + continue; + + ret.Data[s] = result[s].ToString(); + } + + result.Close(); + CloseReaderCommand(cmd); + + return ret; + } + + result.Close(); + CloseReaderCommand(cmd); + + return null; + } + + public bool Store(UserAccountData data) + { + if (data.Data.ContainsKey("UUID")) + data.Data.Remove("UUID"); + if (data.Data.ContainsKey("ScopeID")) + data.Data.Remove("ScopeID"); + + string[] fields = new List(data.Data.Keys).ToArray(); + + MySqlCommand cmd = new MySqlCommand(); + + string update = "update `"+m_Realm+"` set "; + bool first = true; + foreach (string field in fields) + { + if (!first) + update += ", "; + update += "`" + field + "` = ?"+field; + + first = false; + + cmd.Parameters.AddWithValue("?"+field, data.Data[field]); + } + + update += " where UUID = ?principalID"; + + if (data.ScopeID != UUID.Zero) + update += " and ScopeID = ?scopeID"; + + cmd.CommandText = update; + cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); + cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); + + if (ExecuteNonQuery(cmd) < 1) + { + string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" + + String.Join("`, `", fields) + + "`) values ( ?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")"; + + cmd.CommandText = insert; + + if (ExecuteNonQuery(cmd) < 1) + { + cmd.Dispose(); + return false; + } + } + + cmd.Dispose(); + + return true; + } + + public bool SetDataItem(UUID principalID, string item, string value) + { + MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + + "` set `" + item + "` = ?" + item + " where UUID = ?UUID"); + + + cmd.Parameters.AddWithValue("?"+item, value); + cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); + + if (ExecuteNonQuery(cmd) > 0) + return true; + + return false; + } + } +} diff --git a/OpenSim/Data/MySQL/Resources/008_UserStore.sql b/OpenSim/Data/MySQL/Resources/008_UserStore.sql new file mode 100644 index 0000000..4500bd5 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/008_UserStore.sql @@ -0,0 +1,5 @@ +BEGIN; + +ALTER TABLE users add scopeID char(36) not null default '00000000-0000-0000-0000-000000000000'; + +COMMIT; diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs index fcd0304..cca5bb4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs @@ -42,7 +42,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - private IUserAccountDataService m_UserService; + private IUserAccountService m_UserService; private bool m_Enabled = false; @@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User Object[] args = new Object[] { source }; m_UserService = - ServerUtils.LoadPlugin(serviceDll, + ServerUtils.LoadPlugin(serviceDll, args); if (m_UserService == null) @@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User if (!m_Enabled) return; - scene.RegisterModuleInterface(m_UserService); + scene.RegisterModuleInterface(m_UserService); } public void RemoveRegion(Scene scene) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs index a2b854b..cef9129 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs @@ -37,7 +37,7 @@ using OpenSim.Services.Connectors; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User { public class RemoteUserServicesConnector : UserServicesConnector, - ISharedRegionModule, IUserAccountDataService + ISharedRegionModule, IUserAccountService { private static readonly ILog m_log = LogManager.GetLogger( @@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User if (!m_Enabled) return; - scene.RegisterModuleInterface(this); + scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) diff --git a/OpenSim/Services/Connectors/User/UserServiceConnector.cs b/OpenSim/Services/Connectors/User/UserServiceConnector.cs index fb03844..d418938 100644 --- a/OpenSim/Services/Connectors/User/UserServiceConnector.cs +++ b/OpenSim/Services/Connectors/User/UserServiceConnector.cs @@ -39,7 +39,7 @@ using OpenMetaverse; namespace OpenSim.Services.Connectors { - public class UserServicesConnector : IUserAccountDataService + public class UserServicesConnector : IUserAccountService { private static readonly ILog m_log = LogManager.GetLogger( @@ -81,153 +81,34 @@ namespace OpenSim.Services.Connectors m_ServerURI = serviceURI; } - public UserAccountData GetUserAccountData(UUID scopeID, string firstName, string lastName) + public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) { - string uri = m_ServerURI + "/users/"; - UserAccountData data = new UserAccountData(); - data.FirstName = firstName; - data.LastName = lastName; - data.ScopeID = scopeID; - data.UserID = UUID.Zero; - - try - { - data = SynchronousRestObjectRequester. - MakeRequest("POST", uri, data); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return null; - } - - if (data.UserID == UUID.Zero) - return null; - - return data; + return null; } - public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) + public UserAccount GetUserAccount(UUID scopeID, UUID userID) { - string uri = m_ServerURI + "/users/"; - UserAccountData data = new UserAccountData(); - data.FirstName = String.Empty; - data.LastName = String.Empty; - data.ScopeID = scopeID; - data.UserID = userID; - - try - { - data = SynchronousRestObjectRequester. - MakeRequest("POST", uri, data); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return null; - } - - if (data.UserID == UUID.Zero) - return null; - - return data; + return null; } - public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) + public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) { - string uri = m_ServerURI + "/user/"; - bool result = false; - - UserAccountDataMessage msg = new UserAccountDataMessage(); - - msg.Data = data; - msg.RegionID = regionID; - msg.RegionSecret = regionSecret; - - try - { - result = SynchronousRestObjectRequester. - MakeRequest("POST", uri, msg); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return false; - } - - return result; + return false; } - public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) + public bool SetUserAccount(UserAccount data, UUID principalID, string token) { - string uri = m_ServerURI + "/user/"; - bool result = false; - - UserAccountDataMessage msg = new UserAccountDataMessage(); - - msg.Data = data; - msg.PrincipalID = principalID; - msg.SessionID = sessionID; - - try - { - result = SynchronousRestObjectRequester. - MakeRequest("POST", uri, msg); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return false; - } - - return result; + return false; } - public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) + public bool CreateUserAccount(UserAccount data, UUID principalID, string token) { - string uri = m_ServerURI + "/newuser/"; - bool result = false; - - UserAccountDataMessage msg = new UserAccountDataMessage(); - - msg.Data = data; - msg.PrincipalID = principalID; - msg.SessionID = sessionID; - - try - { - result = SynchronousRestObjectRequester. - MakeRequest("POST", uri, msg); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return false; - } - - return result; + return false; } - public List GetUserAccountData(UUID scopeID, string query) + public List GetUserAccount(UUID scopeID, string query) { - string uri = m_ServerURI + "/userlist/"; - UserAccountData data = new UserAccountData(); - data.FirstName = query; - data.ScopeID = scopeID; - List result; - - try - { - result = SynchronousRestObjectRequester. - MakeRequest>("POST", uri, data); - } - catch (Exception e) - { - m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); - return null; - } - - return result; + return null; } } } diff --git a/OpenSim/Services/Interfaces/IUserService.cs b/OpenSim/Services/Interfaces/IUserService.cs index 35254a1..92bd8ef 100644 --- a/OpenSim/Services/Interfaces/IUserService.cs +++ b/OpenSim/Services/Interfaces/IUserService.cs @@ -30,13 +30,13 @@ using OpenMetaverse; namespace OpenSim.Services.Interfaces { - public class UserAccountData + public class UserAccount { - public UserAccountData() + public UserAccount() { } - public UserAccountData(UUID userID, UUID homeRegionID, float homePositionX, + public UserAccount(UUID userID, UUID homeRegionID, float homePositionX, float homePositionY, float homePositionZ, float homeLookAtX, float homeLookAtY, float homeLookAtZ) { @@ -78,41 +78,26 @@ namespace OpenSim.Services.Interfaces }; - public class UserAccountDataMessage + public interface IUserAccountService { - public UserAccountData Data; - - // Set to the region's ID and secret when updating home location - // - public UUID RegionID; - public UUID RegionSecret; - - // Set to the auth info of the user requesting creation/update - // - public UUID PrincipalID; - public UUID SessionID; - }; - - public interface IUserAccountDataService - { - UserAccountData GetUserAccountData(UUID scopeID, UUID userID); - UserAccountData GetUserAccountData(UUID scopeID, string FirstName, string LastName); + UserAccount GetUserAccount(UUID scopeID, UUID userID); + UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName); // Returns the list of avatars that matches both the search // criterion and the scope ID passed // - List GetUserAccountData(UUID scopeID, string query); + List GetUserAccount(UUID scopeID, string query); // This will set only the home region portion of the data! // Can't be used to set god level, flags, type or change the name! // - bool SetHomePosition(UserAccountData data, UUID RegionID, UUID RegionSecret); + bool SetHomePosition(UserAccount data, UUID RegionID, UUID RegionSecret); // Update all updatable fields // - bool SetUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); + bool SetUserAccount(UserAccount data, UUID PrincipalID, string token); // Creates a user data record - bool CreateUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); + bool CreateUserAccount(UserAccount data, UUID PrincipalID, string token); } } diff --git a/OpenSim/Services/UserService/UserService.cs b/OpenSim/Services/UserService/UserService.cs index 78793657..e8b9fc3 100644 --- a/OpenSim/Services/UserService/UserService.cs +++ b/OpenSim/Services/UserService/UserService.cs @@ -35,39 +35,39 @@ using OpenMetaverse; namespace OpenSim.Services.UserAccountService { - public class UserAccountService : UserAccountServiceBase, IUserAccountDataService + public class UserAccountService : UserAccountServiceBase, IUserAccountService { public UserAccountService(IConfigSource config) : base(config) { } - public UserAccountData GetUserAccountData(UUID scopeID, string firstName, + public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) { return null; } - public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) + public UserAccount GetUserAccount(UUID scopeID, UUID userID) { return null; } - public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) + public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) { return false; } - public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) + public bool SetUserAccount(UserAccount data, UUID principalID, string token) { return false; } - public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) + public bool CreateUserAccount(UserAccount data, UUID principalID, string token) { return false; } - public List GetUserAccountData(UUID scopeID, + public List GetUserAccount(UUID scopeID, string query) { return null; -- cgit v1.1 From bb1d4d23c4703cde5c3f7f7d2d123a8abaac3cfa Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 Sep 2009 04:44:08 +0100 Subject: Change the loader to actually load the user service data module --- OpenSim/Services/UserService/UserServiceBase.cs | 8 ++++---- bin/OpenSim.Server.ini.example | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/UserService/UserServiceBase.cs b/OpenSim/Services/UserService/UserServiceBase.cs index c982c1a..fea8b01 100644 --- a/OpenSim/Services/UserService/UserServiceBase.cs +++ b/OpenSim/Services/UserService/UserServiceBase.cs @@ -36,7 +36,7 @@ namespace OpenSim.Services.UserAccountService { public class UserAccountServiceBase: ServiceBase { - protected IUserDataPlugin m_Database = null; + protected IUserAccountData m_Database = null; public UserAccountServiceBase(IConfigSource config) : base(config) { @@ -53,12 +53,12 @@ namespace OpenSim.Services.UserAccountService string connString = userConfig.GetString("ConnectionString", String.Empty); - m_Database = LoadPlugin(dllName); + string realm = userConfig.GetString("Realm", "users"); + + m_Database = LoadPlugin(dllName, new Object[] {connString, realm}); if (m_Database == null) throw new Exception("Could not find a storage interface in the given module"); - - m_Database.Initialise(connString); } } } diff --git a/bin/OpenSim.Server.ini.example b/bin/OpenSim.Server.ini.example index 545d6ce..5696f07 100644 --- a/bin/OpenSim.Server.ini.example +++ b/bin/OpenSim.Server.ini.example @@ -60,3 +60,13 @@ StorageProvider = "OpenSim.Data.MySQL.dll" ConnectionString = "Data Source=localhost;Database=grid;User ID=grid;Password=grid;" ; Realm = "auth" +; * This is the new style user service. +; * "Realm" is the table that is used for user lookup. +; * It defaults to "users", which uses the legacy tables +; * +[UserAccountService] +AuthenticationServiceModule = "OpenSim.Services.UserService.dll:UserAccountService" +StorageProvider = "OpenSim.Data.MySQL.dll" +ConnectionString = "Data Source=localhost;Database=grid;User ID=grid;Password=grid;" +; Realm = "users" + -- cgit v1.1 From 25313c21053edf4cb44fc00d82b7c5456640c1ce Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sun, 6 Sep 2009 21:52:11 +1000 Subject: * Debugging why region loading is occurring so slowly on a setup with 64 regions in a Regions.ini (took 38 minutes on my test box) --- OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs | 10 ++++++++++ .../RegionLoader/Filesystem/RegionLoaderFileSystem.cs | 1 + 2 files changed, 11 insertions(+) diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index dff4d48..6fd3d30 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -94,14 +94,24 @@ namespace OpenSim.ApplicationPlugins.LoadRegions regionLoader = new RegionLoaderWebServer(); } + m_log.Info("[LOADREGIONSPLUGIN]: Loading region configurations..."); + regionLoader.SetIniConfigSource(m_openSim.ConfigSource.Source); RegionInfo[] regionsToLoad = regionLoader.LoadRegions(); + m_log.Info("[LOADREGIONSPLUGIN]: Loading specific shared modules..."); + m_log.Info("[LOADREGIONSPLUGIN]: DynamicTextureModule..."); m_openSim.ModuleLoader.LoadDefaultSharedModule(new DynamicTextureModule()); + m_log.Info("[LOADREGIONSPLUGIN]: InstantMessageModule..."); m_openSim.ModuleLoader.LoadDefaultSharedModule(new InstantMessageModule()); + m_log.Info("[LOADREGIONSPLUGIN]: LoadImageURLModule..."); m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule()); + m_log.Info("[LOADREGIONSPLUGIN]: XMLRPCModule..."); m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule()); + m_log.Info("[LOADREGIONSPLUGIN]: AssetTransactionModule..."); m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule()); + m_log.Info("[LOADREGIONSPLUGIN]: Done."); + if (!CheckRegionsForSanity(regionsToLoad)) { m_log.Error("[LOADREGIONS]: Halting startup due to conflicts in region configurations"); diff --git a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs index 44f44fe..42f3934 100644 --- a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs +++ b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs @@ -78,6 +78,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem foreach (IConfig config in source.Configs) { + m_log.Info("[REGIONLOADERFILESYSTEM]: Creating RegionInfo for " + config.Name); RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource, config.Name); regionInfos.Add(regionInfo); i++; -- cgit v1.1 From 5e4b7be7120b60a133338ea98ef4e7effd321e76 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sun, 6 Sep 2009 21:53:03 +1000 Subject: * Typo in previous commit. --- OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs index 42f3934..63e09ae 100644 --- a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs +++ b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs @@ -78,7 +78,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem foreach (IConfig config in source.Configs) { - m_log.Info("[REGIONLOADERFILESYSTEM]: Creating RegionInfo for " + config.Name); + //m_log.Info("[REGIONLOADERFILESYSTEM]: Creating RegionInfo for " + config.Name); RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource, config.Name); regionInfos.Add(regionInfo); i++; -- cgit v1.1 From dcebbc3f1b27cf01ae28cb522c5180c195729823 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 Sep 2009 15:55:14 +0100 Subject: Remove the encryption from the IAuthenticationService interface. That is too high up for that type of stuff. It needs to be at the connector/handler level --- OpenSim/Region/Framework/Scenes/Scene.cs | 30 ++++++++++++++++-- .../AuthenticationServiceBase.cs | 15 --------- .../PasswordAuthenticationService.cs | 5 --- .../WebkeyAuthenticationService.cs | 5 --- .../Services/Interfaces/IAuthenticationService.cs | 36 ---------------------- 5 files changed, 27 insertions(+), 64 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c25ae10..8cd77f8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -220,7 +220,7 @@ namespace OpenSim.Region.Framework.Scenes private bool m_scripts_enabled = true; private string m_defaultScriptEngine; private int m_LastLogin = 0; - private Thread HeartbeatThread; + private Thread HeartbeatThread = null; private volatile bool shuttingdown = false; private int m_lastUpdate = Environment.TickCount; @@ -876,6 +876,13 @@ namespace OpenSim.Region.Framework.Scenes //m_heartbeatTimer.Enabled = true; //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); + if (HeartbeatThread != null) + { + ThreadTracker.Remove(HeartbeatThread); + HeartbeatThread.Abort(); + HeartbeatThread = null; + } + m_lastUpdate = Environment.TickCount; HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat)); HeartbeatThread.SetApartmentState(ApartmentState.MTA); HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName); @@ -912,9 +919,15 @@ namespace OpenSim.Region.Framework.Scenes /// private void Heartbeat(object sender) { - Update(); + try + { + Update(); - m_lastUpdate = Environment.TickCount; + m_lastUpdate = Environment.TickCount; + } + catch (ThreadAbortException) + { + } } /// @@ -2307,6 +2320,7 @@ namespace OpenSim.Region.Framework.Scenes /// public override void AddNewClient(IClientAPI client) { + CheckHeartbeat(); SubscribeToClientEvents(client); ScenePresence presence; @@ -2831,6 +2845,7 @@ namespace OpenSim.Region.Framework.Scenes /// protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) { + CheckHeartbeat(); AvatarAppearance appearance = null; GetAvatarAppearance(client, out appearance); @@ -2873,6 +2888,7 @@ namespace OpenSim.Region.Framework.Scenes /// public override void RemoveClient(UUID agentID) { + CheckHeartbeat(); bool childagentYN = false; ScenePresence avatar = GetScenePresence(agentID); if (avatar != null) @@ -4374,6 +4390,8 @@ namespace OpenSim.Region.Framework.Scenes else return health; + CheckHeartbeat(); + return health; } @@ -4559,5 +4577,11 @@ namespace OpenSim.Region.Framework.Scenes return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; } + + private void CheckHeartbeat() + { + if (System.Environment.TickCount - m_lastUpdate > 2000) + StartTimer(); + } } } diff --git a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs index 2ed177c..8904461 100644 --- a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs +++ b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs @@ -90,31 +90,16 @@ namespace OpenSim.Services.AuthenticationService throw new Exception("Could not find a storage interface in the given module"); } - public virtual byte[] GetPublicKey() - { - return new byte[0]; - } - public bool Verify(UUID principalID, string token, int lifetime) { return m_Database.CheckToken(principalID, token, lifetime); } - public bool VerifyEncrypted(byte[] cyphertext, byte[] key) - { - return false; - } - public virtual bool Release(UUID principalID, string token) { return m_Database.CheckToken(principalID, token, 0); } - public virtual bool ReleaseEncrypted(byte[] cyphertext, byte[] key) - { - return false; - } - protected string GetToken(UUID principalID, int lifetime) { UUID token = UUID.Random(); diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs index 7fdbbf6..6c99b66 100644 --- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs @@ -76,10 +76,5 @@ namespace OpenSim.Services.AuthenticationService return String.Empty; } - - public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) - { - return new byte[0]; - } } } diff --git a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs index 0118c91..8831c8a 100644 --- a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs @@ -56,10 +56,5 @@ namespace OpenSim.Services.AuthenticationService { return String.Empty; } - - public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) - { - return new byte[0]; - } } } diff --git a/OpenSim/Services/Interfaces/IAuthenticationService.cs b/OpenSim/Services/Interfaces/IAuthenticationService.cs index b448a14..9225773 100644 --- a/OpenSim/Services/Interfaces/IAuthenticationService.cs +++ b/OpenSim/Services/Interfaces/IAuthenticationService.cs @@ -39,39 +39,12 @@ namespace OpenSim.Services.Interfaces public interface IAuthenticationService { ////////////////////////////////////////////////////// - // PKI Zone! - // - // HG2 authentication works by using a cryptographic - // exchange. - // This method must provide a public key, the other - // crypto methods must understand hoow to deal with - // messages encrypted to it. - // - // If the public key is of zero length, you will - // get NO encryption and NO security. - // - // For non-HG installations, this is not relevant - // - // Implementors who are not using PKI can treat the - // cyphertext as a string and provide a zero-length - // key. Encryptionless implementations will not - // interoperate with implementations using encryption. - // If one side uses encryption, both must do so. - // - byte[] GetPublicKey(); - - ////////////////////////////////////////////////////// // Authentication // // These methods will return a token, which can be used to access // various services. // - // The encrypted versions take the received cyphertext and - // the public key of the peer, which the connector must have - // obtained using a remote GetPublicKey call. - // string Authenticate(UUID principalID, string password, int lifetime); - byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key); ////////////////////////////////////////////////////// // Verification @@ -81,12 +54,7 @@ namespace OpenSim.Services.Interfaces // Tokens expire after 30 minutes and can be refreshed by // re-verifying. // - // If encrypted authentication was used, encrypted verification - // must be used to refresh. Unencrypted verification is still - // performed, but doesn't refresh token lifetime. - // bool Verify(UUID principalID, string token, int lifetime); - bool VerifyEncrypted(byte[] cyphertext, byte[] key); ////////////////////////////////////////////////////// // Teardown @@ -95,11 +63,7 @@ namespace OpenSim.Services.Interfaces // invalidates it and it can not subsequently be used // or refreshed. // - // Tokens created by encrypted authentication must - // be returned by encrypted release calls; - // bool Release(UUID principalID, string token); - bool ReleaseEncrypted(byte[] cyphertext, byte[] key); ////////////////////////////////////////////////////// // Grid -- cgit v1.1 From 998624544c5120676e3048990ef74956210be959 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 6 Sep 2009 16:14:45 +0100 Subject: Addendum to last commit. With the last commit, some other code that should have been in this commit slipped in. If the last heartbeat is more than 2 seconds ago, kill that thread and start a new one. Untested. his commit adds support to let the first heartbeat complete unconditionally, since it is almost always longer. --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 8cd77f8..8f3ba97 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -225,6 +225,7 @@ namespace OpenSim.Region.Framework.Scenes private int m_lastUpdate = Environment.TickCount; private int m_maxPrimsPerFrame = 200; + private bool m_firstHeartbeat = true; private object m_deleting_scene_object = new object(); @@ -924,6 +925,7 @@ namespace OpenSim.Region.Framework.Scenes Update(); m_lastUpdate = Environment.TickCount; + m_firstHeartbeat = false; } catch (ThreadAbortException) { @@ -4580,6 +4582,9 @@ namespace OpenSim.Region.Framework.Scenes private void CheckHeartbeat() { + if (m_firstHeartbeat) + return; + if (System.Environment.TickCount - m_lastUpdate > 2000) StartTimer(); } -- cgit v1.1