From dc197856727c06b0b06488ab839409831af84865 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 14 Feb 2010 16:57:02 -0800 Subject: Added UserAccount, Avatar and Authentication to Data.Null, so that OpenSim can run out-of-the-box. #WaitingForSQLite --- OpenSim/Data/Null/NullUserAccountData.cs | 139 +++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 OpenSim/Data/Null/NullUserAccountData.cs (limited to 'OpenSim/Data/Null/NullUserAccountData.cs') diff --git a/OpenSim/Data/Null/NullUserAccountData.cs b/OpenSim/Data/Null/NullUserAccountData.cs new file mode 100644 index 0000000..fc2c5d5 --- /dev/null +++ b/OpenSim/Data/Null/NullUserAccountData.cs @@ -0,0 +1,139 @@ +/* + * 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 OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Data; + +namespace OpenSim.Data.Null +{ + public class NullUserAccountData : IUserAccountData + { + private static Dictionary m_DataByUUID = new Dictionary(); + private static Dictionary m_DataByName = new Dictionary(); + private static Dictionary m_DataByEmail = new Dictionary(); + + public NullUserAccountData(string connectionString, string realm) + { + } + + /// + /// Tries to implement the Get [] semantics, but it cuts corners like crazy. + /// Specifically, it relies on the knowledge that the only Gets used are + /// keyed on PrincipalID, Email, and FirstName+LastName. + /// + /// + /// + /// + public UserAccountData[] Get(string[] fields, string[] values) + { + List fieldsLst = new List(fields); + if (fieldsLst.Contains("PrincipalID")) + { + int i = fieldsLst.IndexOf("PrincipalID"); + UUID id = UUID.Zero; + if (UUID.TryParse(values[i], out id)) + if (m_DataByUUID.ContainsKey(id)) + return new UserAccountData[] { m_DataByUUID[id] }; + } + if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName")) + { + int findex = fieldsLst.IndexOf("FirstName"); + int lindex = fieldsLst.IndexOf("LastName"); + if (m_DataByName.ContainsKey(values[findex] + " " + values[lindex])) + return new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] }; + } + if (fieldsLst.Contains("Email")) + { + int i = fieldsLst.IndexOf("Email"); + if (m_DataByEmail.ContainsKey(values[i])) + return new UserAccountData[] { m_DataByEmail[values[i]] }; + } + + // Fail + return new UserAccountData[0]; + } + + public bool Store(UserAccountData data) + { + if (data == null) + return false; + + m_DataByUUID[data.PrincipalID] = data; + m_DataByName[data.FirstName + " " + data.LastName] = data; + if (data.Data.ContainsKey("Email") && data.Data["Email"] != string.Empty) + m_DataByEmail[data.Data["Email"]] = data; + + return true; + } + + public UserAccountData[] GetUsers(UUID scopeID, string query) + { + 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]; + + List lst = new List(m_DataByName.Keys); + if (words.Length == 1) + { + lst = lst.FindAll(delegate(string s) { return s.StartsWith(words[0]); }); + } + else + { + lst = lst.FindAll(delegate(string s) { return s.Contains(words[0]) || s.Contains(words[1]); }); + } + + if (lst == null || (lst != null && lst.Count == 0)) + return new UserAccountData[0]; + + UserAccountData[] result = new UserAccountData[lst.Count]; + int n = 0; + foreach (string key in lst) + result[n++] = m_DataByName[key]; + + return result; + } + + } +} -- cgit v1.1