From 3507005d9decdbf579fb2b7b9928a7d97bd6cf5b Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 01:16:16 +0000 Subject: Remove CreateUserAccount. Rename SetUserAccount to StoreUserAccount. Implement the fetch operations fully. Rename one last UserService file to UserAccountService --- .../LocalUserAccountServiceConnector.cs | 10 +- .../UserAccounts/UserAccountServerPostHandler.cs | 25 +---- .../UserAccounts/UserAccountServiceConnector.cs | 15 +-- OpenSim/Services/Interfaces/IUserAccountService.cs | 103 ++++++++++++++++++++ OpenSim/Services/Interfaces/IUserService.cs | 105 --------------------- .../UserAccountService/UserAccountService.cs | 82 +++++++++++++--- 6 files changed, 176 insertions(+), 164 deletions(-) create mode 100644 OpenSim/Services/Interfaces/IUserAccountService.cs delete mode 100644 OpenSim/Services/Interfaces/IUserService.cs (limited to 'OpenSim') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs index ce8c3a5..f55de5a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs @@ -159,15 +159,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts // Update all updatable fields // - public bool SetUserAccount(UserAccount data) + public bool StoreUserAccount(UserAccount data) { - return m_UserService.SetUserAccount(data); - } - - // Creates a user data record - public bool CreateUserAccount(UserAccount data) - { - return m_UserService.CreateUserAccount(data); + return m_UserService.StoreUserAccount(data); } #endregion diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs index a92148c..544ffea 100644 --- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs +++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs @@ -85,10 +85,8 @@ namespace OpenSim.Server.Handlers.UserAccounts return GetAccount(request); case "getaccounts": return GetAccounts(request); - case "createaccount": - return CreateAccount(request); case "setaccount": - return SetAccount(request); + return StoreAccount(request); } m_log.DebugFormat("[PRESENCE HANDLER]: unknown method request: {0}", method); } @@ -174,24 +172,7 @@ namespace OpenSim.Server.Handlers.UserAccounts return encoding.GetBytes(xmlString); } - byte[] CreateAccount(Dictionary request) - { - if (!request.ContainsKey("account")) - return FailureResult(); - if (request["account"] == null) - return FailureResult(); - if (!(request["account"] is Dictionary)) - return FailureResult(); - - UserAccount account = new UserAccount((Dictionary) request["account"]); - - if (m_UserAccountService.CreateUserAccount(account)) - return SuccessResult(); - - return FailureResult(); - } - - byte[] SetAccount(Dictionary request) + byte[] StoreAccount(Dictionary request) { if (!request.ContainsKey("account")) return FailureResult(); @@ -202,7 +183,7 @@ namespace OpenSim.Server.Handlers.UserAccounts UserAccount account = new UserAccount((Dictionary)request["account"]); - if (m_UserAccountService.SetUserAccount(account)) + if (m_UserAccountService.StoreUserAccount(account)) return SuccessResult(); return FailureResult(); diff --git a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs index d4b906a..46313d9 100644 --- a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs @@ -186,7 +186,7 @@ namespace OpenSim.Services.Connectors return accounts; } - public bool SetUserAccount(UserAccount data) + public bool StoreUserAccount(UserAccount data) { Dictionary sendData = new Dictionary(); //sendData["SCOPEID"] = scopeID.ToString(); @@ -199,19 +199,6 @@ namespace OpenSim.Services.Connectors return SendAndGetBoolReply(sendData); } - public bool CreateUserAccount(UserAccount data) - { - Dictionary sendData = new Dictionary(); - //sendData["SCOPEID"] = scopeID.ToString(); - sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); - sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); - sendData["METHOD"] = "createaccount"; - - sendData["account"] = data.ToKeyValuePairs(); - - return SendAndGetBoolReply(sendData); - } - private UserAccount SendAndGetReply(Dictionary sendData) { string reply = string.Empty; diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs new file mode 100644 index 0000000..b2d5d48 --- /dev/null +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -0,0 +1,103 @@ +/* + * 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; + +namespace OpenSim.Services.Interfaces +{ + public class UserAccount + { + public UserAccount() + { + } + + public UserAccount(UUID principalID) + { + PrincipalID = principalID; + } + + public string FirstName; + public string LastName; + public string Email; + public UUID PrincipalID; + public UUID ScopeID; + + public Dictionary ServiceURLs; + + public int Created; + + public UserAccount(Dictionary kvp) + { + if (kvp.ContainsKey("FirstName")) + FirstName = kvp["FirstName"].ToString(); + if (kvp.ContainsKey("LastName")) + LastName = kvp["LastName"].ToString(); + if (kvp.ContainsKey("Email")) + Email = kvp["Email"].ToString(); + if (kvp.ContainsKey("PrincipalID")) + UUID.TryParse(kvp["PrincipalID"].ToString(), out PrincipalID); + if (kvp.ContainsKey("ScopeID")) + UUID.TryParse(kvp["ScopeID"].ToString(), out ScopeID); + if (kvp.ContainsKey("Created")) + Convert.ToInt32(kvp["Created"].ToString()); + if (kvp.ContainsKey("ServiceURLs") && kvp["ServiceURLs"] != null && (kvp["ServiceURLs"] is Dictionary)) + ServiceURLs = (Dictionary)kvp["ServiceURLs"]; + } + + public Dictionary ToKeyValuePairs() + { + Dictionary result = new Dictionary(); + result["FirstName"] = FirstName; + result["LastName"] = LastName; + result["Email"] = Email; + result["PrincipalID"] = PrincipalID.ToString(); + result["ScopeID"] = ScopeID.ToString(); + result["Created"] = Created.ToString(); + result["ServiceURLs"] = ServiceURLs; + + return result; + } + }; + + public interface IUserAccountService + { + UserAccount GetUserAccount(UUID scopeID, UUID userID); + UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName); + UserAccount GetUserAccount(UUID scopeID, string Email); + // Returns the list of avatars that matches both the search + // criterion and the scope ID passed + // + List GetUserAccounts(UUID scopeID, string query); + + // Store the data given, wich replaces the sotred data, therefore + // must be complete. + // + bool StoreUserAccount(UserAccount data); + } +} diff --git a/OpenSim/Services/Interfaces/IUserService.cs b/OpenSim/Services/Interfaces/IUserService.cs deleted file mode 100644 index 1bdaaab..0000000 --- a/OpenSim/Services/Interfaces/IUserService.cs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using OpenMetaverse; - -namespace OpenSim.Services.Interfaces -{ - public class UserAccount - { - public UserAccount() - { - } - - public UserAccount(UUID principalID) - { - PrincipalID = principalID; - } - - public string FirstName; - public string LastName; - public string Email; - public UUID PrincipalID; - public UUID ScopeID; - - public Dictionary ServiceURLs; - - public int Created; - - public UserAccount(Dictionary kvp) - { - if (kvp.ContainsKey("FirstName")) - FirstName = kvp["FirstName"].ToString(); - if (kvp.ContainsKey("LastName")) - LastName = kvp["LastName"].ToString(); - if (kvp.ContainsKey("Email")) - Email = kvp["Email"].ToString(); - if (kvp.ContainsKey("PrincipalID")) - UUID.TryParse(kvp["PrincipalID"].ToString(), out PrincipalID); - if (kvp.ContainsKey("ScopeID")) - UUID.TryParse(kvp["ScopeID"].ToString(), out ScopeID); - if (kvp.ContainsKey("Created")) - Convert.ToInt32(kvp["Created"].ToString()); - if (kvp.ContainsKey("ServiceURLs") && kvp["ServiceURLs"] != null && (kvp["ServiceURLs"] is Dictionary)) - ServiceURLs = (Dictionary)kvp["ServiceURLs"]; - } - - public Dictionary ToKeyValuePairs() - { - Dictionary result = new Dictionary(); - result["FirstName"] = FirstName; - result["LastName"] = LastName; - result["Email"] = Email; - result["PrincipalID"] = PrincipalID.ToString(); - result["ScopeID"] = ScopeID.ToString(); - result["Created"] = Created.ToString(); - result["ServiceURLs"] = ServiceURLs; - - return result; - } - }; - - public interface IUserAccountService - { - UserAccount GetUserAccount(UUID scopeID, UUID userID); - UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName); - UserAccount GetUserAccount(UUID scopeID, string Email); - // Returns the list of avatars that matches both the search - // criterion and the scope ID passed - // - List GetUserAccounts(UUID scopeID, string query); - - // Update all updatable fields - // - bool SetUserAccount(UserAccount data); - - // Creates a user data record - bool CreateUserAccount(UserAccount data); - } -} diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 0270f9d..706da84 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -62,33 +62,85 @@ namespace OpenSim.Services.UserAccountService if (d.Length < 1) return null; + return MakeUserAccount(d[0]); + } + + private UserAccount MakeUserAccount(UserAccountData d) + { UserAccount u = new UserAccount(); - u.FirstName = d[0].FirstName; - u.LastName = d[0].LastName; - u.PrincipalID = d[0].PrincipalID; - u.ScopeID = d[0].ScopeID; - u.Email = d[0].Data["Email"].ToString(); - u.Created = Convert.ToInt32(d[0].Data["Created"].ToString()); + u.FirstName = d.FirstName; + u.LastName = d.LastName; + u.PrincipalID = d.PrincipalID; + u.ScopeID = d.ScopeID; + u.Email = d.Data["Email"].ToString(); + u.Created = Convert.ToInt32(d.Data["Created"].ToString()); - return null; + string[] URLs = d.Data["ServiceURLs"].ToString().Split(new char[] {' '}); + u.ServiceURLs = new Dictionary(); + + foreach(string url in URLs) + { + string[] parts = url.Split(new char[] {'='}); + + if (parts.Length != 2) + continue; + + string name = System.Web.HttpUtility.UrlDecode(parts[0]); + string val = System.Web.HttpUtility.UrlDecode(parts[1]); + + u.ServiceURLs[name] = val; + } + + return u; } public UserAccount GetUserAccount(UUID scopeID, string email) { - return null; + UserAccountData[] d; + + if (scopeID != UUID.Zero) + { + d = m_Database.Get( + new string[] {"ScopeID", "Email"}, + new string[] {scopeID.ToString(), email}); + } + else + { + d = m_Database.Get( + new string[] {"Email"}, + new string[] {email}); + } + + if (d.Length < 1) + return null; + + return MakeUserAccount(d[0]); } - public UserAccount GetUserAccount(UUID scopeID, UUID userID) + public UserAccount GetUserAccount(UUID scopeID, UUID principalID) { - return null; - } + UserAccountData[] d; - public bool SetUserAccount(UserAccount data) - { - return false; + if (scopeID != UUID.Zero) + { + d = m_Database.Get( + new string[] {"ScopeID", "PrincipalID"}, + new string[] {scopeID.ToString(), principalID.ToString()}); + } + else + { + d = m_Database.Get( + new string[] {"PrincipalID"}, + new string[] {principalID.ToString()}); + } + + if (d.Length < 1) + return null; + + return MakeUserAccount(d[0]); } - public bool CreateUserAccount(UserAccount data) + public bool StoreUserAccount(UserAccount data) { return false; } -- cgit v1.1 From 99ad7aac7f854eaae075e93880c39796183ba7e4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 01:34:03 +0000 Subject: Implement saving user account data --- OpenSim/Data/IUserAccountData.cs | 4 ++-- OpenSim/Data/MSSQL/MSSQLUserAccountData.cs | 2 +- OpenSim/Data/MySQL/MySQLUserAccountData.cs | 2 +- .../UserAccountService/UserAccountService.cs | 23 +++++++++++++++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs index 5ebe7d3..e350a18 100644 --- a/OpenSim/Data/IUserAccountData.cs +++ b/OpenSim/Data/IUserAccountData.cs @@ -38,7 +38,7 @@ namespace OpenSim.Data public UUID ScopeID; public string FirstName; public string LastName; - public Dictionary Data; + public Dictionary Data; } /// @@ -47,6 +47,6 @@ namespace OpenSim.Data public interface IUserAccountData { UserAccountData[] Get(string[] fields, string[] values); - bool Store(UserAccountData data, UUID principalID, string token); + bool Store(UserAccountData data); } } diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs index 01750d8..ca09029 100644 --- a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs +++ b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs @@ -65,7 +65,7 @@ namespace OpenSim.Data.MSSQL public UserAccountData Get(UUID principalID, UUID scopeID) { UserAccountData ret = new UserAccountData(); - ret.Data = new Dictionary(); + ret.Data = new Dictionary(); string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm); if (scopeID != UUID.Zero) diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs index e2ce6d1..ae7d5ca 100644 --- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs @@ -42,7 +42,7 @@ namespace OpenSim.Data.MySQL { } - public bool Store(UserAccountData data, UUID principalID, string token) + public bool Store(UserAccountData data) { return Store(data); } diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 706da84..2954589 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -142,7 +142,28 @@ namespace OpenSim.Services.UserAccountService public bool StoreUserAccount(UserAccount data) { - return false; + UserAccountData d = new UserAccountData(); + + d.FirstName = data.FirstName; + d.LastName = data.LastName; + d.PrincipalID = data.PrincipalID; + d.ScopeID = data.ScopeID; + d.Data = new Dictionary(); + d.Data["Email"] = data.Email; + d.Data["Created"] = data.Created.ToString(); + + List parts = new List(); + + foreach (KeyValuePair kvp in data.ServiceURLs) + { + string key = System.Web.HttpUtility.UrlEncode(kvp.Key); + string val = System.Web.HttpUtility.UrlEncode(kvp.Value.ToString()); + parts.Add(key + "=" + val); + } + + d.Data["ServiceURLs"] = string.Join(" ", parts.ToArray()); + + return m_Database.Store(d); } public List GetUserAccounts(UUID scopeID, string query) -- cgit v1.1 From 01f6aee020eddb46893cbfbcf3b1e114a85ac261 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 02:26:00 +0000 Subject: Implement avatar picker queries --- OpenSim/Data/IUserAccountData.cs | 1 + OpenSim/Data/MSSQL/MSSQLUserAccountData.cs | 5 +++ OpenSim/Data/MySQL/MySQLUserAccountData.cs | 38 ++++++++++++++++++++-- .../UserAccountService/UserAccountService.cs | 12 ++++++- 4 files changed, 53 insertions(+), 3 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs index e350a18..6ee5995 100644 --- a/OpenSim/Data/IUserAccountData.cs +++ b/OpenSim/Data/IUserAccountData.cs @@ -48,5 +48,6 @@ namespace OpenSim.Data { UserAccountData[] Get(string[] fields, string[] values); bool Store(UserAccountData data); + UserAccountData[] GetUsers(UUID scopeID, string query); } } diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs index ca09029..01c64dc 100644 --- a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs +++ b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs @@ -194,5 +194,10 @@ namespace OpenSim.Data.MSSQL { return null; } + + public UserAccountData[] GetUsers(UUID scopeID, string query) + { + return null; + } } } diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs index ae7d5ca..aa69d68 100644 --- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs @@ -42,9 +42,43 @@ namespace OpenSim.Data.MySQL { } - public bool Store(UserAccountData data) + public UserAccountData[] GetUsers(UUID scopeID, string query) { - return Store(data); + string[] words = query.Split(new char[] {' '}); + + for (int i = 0 ; i < words.Length ; i++) + { + if (words[i].Length < 3) + { + if (i != words.Length - 1) + Array.Copy(words, i + 1, words, i, words.Length - i - 1); + Array.Resize(ref words, words.Length - 1); + } + } + + if (words.Length == 0) + return new UserAccountData[0]; + + if (words.Length > 2) + return new UserAccountData[0]; + + MySqlCommand cmd = new MySqlCommand(); + + if (words.Length == 1) + { + cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search)", m_Realm); + cmd.Parameters.AddWithValue("?search", "%" + words[0] + "%"); + cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); + } + else + { + cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?searchFirst or LastName like ?searchLast)", m_Realm); + cmd.Parameters.AddWithValue("?searchFirst", "%" + words[0] + "%"); + cmd.Parameters.AddWithValue("?searchLast", "%" + words[1] + "%"); + cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); + } + + return DoQuery(cmd); } } } diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 2954589..c14651d 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -168,7 +168,17 @@ namespace OpenSim.Services.UserAccountService public List GetUserAccounts(UUID scopeID, string query) { - return null; + UserAccountData[] d = m_Database.GetUsers(scopeID, query); + + if (d == null) + return new List(); + + List ret = new List(); + + foreach (UserAccountData data in d) + ret.Add(MakeUserAccount(data)); + + return ret; } } } -- cgit v1.1