From 3507005d9decdbf579fb2b7b9928a7d97bd6cf5b Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 01:16:16 +0000 Subject: [PATCH 1/3] Remove CreateUserAccount. Rename SetUserAccount to StoreUserAccount. Implement the fetch operations fully. Rename one last UserService file to UserAccountService --- .../LocalUserAccountServiceConnector.cs | 10 +-- .../UserAccountServerPostHandler.cs | 25 +----- .../UserAccountServiceConnector.cs | 15 +--- ...IUserService.cs => IUserAccountService.cs} | 8 +- .../UserAccountService/UserAccountService.cs | 86 +++++++++++++++---- prebuild.xml | 1 + 6 files changed, 79 insertions(+), 66 deletions(-) rename OpenSim/Services/Interfaces/{IUserService.cs => IUserAccountService.cs} (95%) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs index ce8c3a552d..f55de5aff7 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 a92148ca21..544ffea55f 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 d4b906ae27..46313d96b6 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/IUserService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs similarity index 95% rename from OpenSim/Services/Interfaces/IUserService.cs rename to OpenSim/Services/Interfaces/IUserAccountService.cs index 1bdaaab97d..b2d5d48632 100644 --- a/OpenSim/Services/Interfaces/IUserService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -95,11 +95,9 @@ namespace OpenSim.Services.Interfaces // List GetUserAccounts(UUID scopeID, string query); - // Update all updatable fields + // Store the data given, wich replaces the sotred data, therefore + // must be complete. // - bool SetUserAccount(UserAccount data); - - // Creates a user data record - bool CreateUserAccount(UserAccount data); + bool StoreUserAccount(UserAccount data); } } diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 0270f9d4e4..706da84d4d 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; - 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()); + return MakeUserAccount(d[0]); + } - return null; + private UserAccount MakeUserAccount(UserAccountData d) + { + UserAccount u = new UserAccount(); + 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()); + + 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; + + 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 SetUserAccount(UserAccount data) - { - return false; - } - - public bool CreateUserAccount(UserAccount data) + public bool StoreUserAccount(UserAccount data) { return false; } diff --git a/prebuild.xml b/prebuild.xml index 7e7ce288a4..19cd6af946 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1052,6 +1052,7 @@ ../../../bin/ + From 99ad7aac7f854eaae075e93880c39796183ba7e4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 01:34:03 +0000 Subject: [PATCH 2/3] 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(-) diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs index 5ebe7d3fa2..e350a18f38 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 01750d8f82..ca09029dc4 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 e2ce6d1ab7..ae7d5caa97 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 706da84d4d..29545893c5 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) From 01f6aee020eddb46893cbfbcf3b1e114a85ac261 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 31 Dec 2009 02:26:00 +0000 Subject: [PATCH 3/3] 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(-) diff --git a/OpenSim/Data/IUserAccountData.cs b/OpenSim/Data/IUserAccountData.cs index e350a18f38..6ee5995fd1 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 ca09029dc4..01c64dce86 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 ae7d5caa97..aa69d680a7 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 29545893c5..c14651df7e 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; } } }