From 9d59b285bbc84aa620200e7da69be0f347dd69f4 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Wed, 19 Oct 2011 00:06:40 +0100 Subject: Allow an http call to set account details if AllowSetAccount = true in [UserAccountService]. As before, default is false to not allow these calls. --- .../UserAccounts/UserAccountServerPostHandler.cs | 62 ++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-) (limited to 'OpenSim/Server') diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs index deadce2..aba4f7b 100644 --- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs +++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs @@ -51,6 +51,7 @@ namespace OpenSim.Server.Handlers.UserAccounts private IUserAccountService m_UserAccountService; private bool m_AllowCreateUser = false; + private bool m_AllowSetAccount = false; public UserAccountServerPostHandler(IUserAccountService service) : this(service, null) {} @@ -61,7 +62,10 @@ namespace OpenSim.Server.Handlers.UserAccounts m_UserAccountService = service; if (config != null) + { m_AllowCreateUser = config.GetBoolean("AllowCreateUser", m_AllowCreateUser); + m_AllowSetAccount = config.GetBoolean("AllowSetAccount", m_AllowSetAccount); + } } public override byte[] Handle(string path, Stream requestData, @@ -99,8 +103,12 @@ namespace OpenSim.Server.Handlers.UserAccounts case "getaccounts": return GetAccounts(request); case "setaccount": - return StoreAccount(request); + if (m_AllowSetAccount) + return StoreAccount(request); + else + break; } + m_log.DebugFormat("[USER SERVICE HANDLER]: unknown method request: {0}", method); } catch (Exception e) @@ -193,8 +201,56 @@ namespace OpenSim.Server.Handlers.UserAccounts byte[] StoreAccount(Dictionary request) { - // No can do. No changing user accounts from remote sims - return FailureResult(); + UUID principalID = UUID.Zero; + if (!(request.ContainsKey("UserID") && UUID.TryParse(request["UserID"].ToString(), out principalID))) + return FailureResult(); + + UUID scopeID = UUID.Zero; + if (request.ContainsKey("ScopeID") && !UUID.TryParse(request["ScopeID"].ToString(), out scopeID)) + return FailureResult(); + + UserAccount existingAccount = m_UserAccountService.GetUserAccount(scopeID, principalID); + if (existingAccount == null) + return FailureResult(); + + Dictionary result = new Dictionary(); + + if (request.ContainsKey("FirstName")) + existingAccount.FirstName = request["FirstName"].ToString(); + + if (request.ContainsKey("LastName")) + existingAccount.LastName = request["LastName"].ToString(); + + if (request.ContainsKey("Email")) + existingAccount.Email = request["Email"].ToString(); + + int created = 0; + if (request.ContainsKey("Created") && int.TryParse(request["Created"].ToString(), out created)) + existingAccount.Created = created; + + int userLevel = 0; + if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel)) + existingAccount.UserFlags = userLevel; + + int userFlags = 0; + if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags)) + existingAccount.UserFlags = userFlags; + + if (request.ContainsKey("UserTitle")) + existingAccount.UserTitle = request["UserTitle"].ToString(); + + if (!m_UserAccountService.StoreUserAccount(existingAccount)) + { + m_log.ErrorFormat( + "[USER ACCOUNT SERVER POST HANDLER]: Account store failed for account {0} {1} {2}", + existingAccount.FirstName, existingAccount.LastName, existingAccount.PrincipalID); + + return FailureResult(); + } + + result["result"] = existingAccount.ToKeyValuePairs(); + + return ResultToBytes(result); } byte[] CreateUser(Dictionary request) -- cgit v1.1