Added UserAccountData and auth to the SQLite connector. Compiles, runs, but access to these tables doesn't work.
parent
845a390e93
commit
0ab6aac052
|
@ -0,0 +1,18 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
CREATE TABLE auth (
|
||||||
|
UUID char(36) NOT NULL,
|
||||||
|
passwordHash char(32) NOT NULL default '',
|
||||||
|
passwordSalt char(32) NOT NULL default '',
|
||||||
|
webLoginKey varchar(255) NOT NULL default '',
|
||||||
|
accountType VARCHAR(32) NOT NULL DEFAULT 'UserAccount',
|
||||||
|
PRIMARY KEY (`UUID`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE tokens (
|
||||||
|
UUID char(36) NOT NULL,
|
||||||
|
token varchar(255) NOT NULL,
|
||||||
|
validity datetime NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -0,0 +1,17 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
-- useraccounts table
|
||||||
|
CREATE TABLE UserAccounts (
|
||||||
|
PrincipalID CHAR(36) NOT NULL,
|
||||||
|
ScopeID CHAR(36) NOT NULL,
|
||||||
|
FirstName VARCHAR(64) NOT NULL,
|
||||||
|
LastName VARCHAR(64) NOT NULL,
|
||||||
|
Email VARCHAR(64),
|
||||||
|
ServiceURLs TEXT,
|
||||||
|
Created INT(11),
|
||||||
|
UserLevel integer NOT NULL DEFAULT 0,
|
||||||
|
UserFlags integer NOT NULL DEFAULT 0,
|
||||||
|
UserTitle varchar(64) NOT NULL DEFAULT ''
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -0,0 +1,5 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users;
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -0,0 +1,5 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, lastname AS LastName, email as Email, CONCAT('AssetServerURI=', userAssetURI, ' InventoryServerURI=', userInventoryURI, ' GatewayURI= HomeURI=') AS ServiceURLs, created as Created FROM users;
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
* 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 Mono.Data.SqliteClient;
|
||||||
|
|
||||||
|
namespace OpenSim.Data.SQLite
|
||||||
|
{
|
||||||
|
public class SQLiteAuthenticationData : SQLiteFramework, IAuthenticationData
|
||||||
|
{
|
||||||
|
private string m_Realm;
|
||||||
|
private List<string> m_ColumnNames;
|
||||||
|
private int m_LastExpire;
|
||||||
|
private string m_connectionString;
|
||||||
|
|
||||||
|
private static bool m_initialized = false;
|
||||||
|
|
||||||
|
public SQLiteAuthenticationData(string connectionString, string realm)
|
||||||
|
: base(connectionString)
|
||||||
|
{
|
||||||
|
m_Realm = realm;
|
||||||
|
m_connectionString = connectionString;
|
||||||
|
|
||||||
|
if (!m_initialized)
|
||||||
|
{
|
||||||
|
using (SqliteConnection dbcon = new SqliteConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
Migration m = new Migration(dbcon, GetType().Assembly, "AuthStore");
|
||||||
|
m.Update();
|
||||||
|
}
|
||||||
|
m_initialized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationData Get(UUID principalID)
|
||||||
|
{
|
||||||
|
AuthenticationData ret = new AuthenticationData();
|
||||||
|
ret.Data = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
using (SqliteConnection dbcon = new SqliteConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
SqliteCommand cmd = new SqliteCommand("select * from `" + m_Realm + "` where UUID = '" + principalID.ToString() + "'", dbcon);
|
||||||
|
|
||||||
|
IDataReader result = cmd.ExecuteReader();
|
||||||
|
|
||||||
|
if (result.Read())
|
||||||
|
{
|
||||||
|
ret.PrincipalID = principalID;
|
||||||
|
|
||||||
|
if (m_ColumnNames == null)
|
||||||
|
{
|
||||||
|
m_ColumnNames = new List<string>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
ret.Data[s] = result[s].ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Store(AuthenticationData data)
|
||||||
|
{
|
||||||
|
if (data.Data.ContainsKey("UUID"))
|
||||||
|
data.Data.Remove("UUID");
|
||||||
|
|
||||||
|
string[] fields = new List<string>(data.Data.Keys).ToArray();
|
||||||
|
string[] values = new string[data.Data.Count];
|
||||||
|
int i = 0;
|
||||||
|
foreach (object o in data.Data.Values)
|
||||||
|
values[i++] = o.ToString();
|
||||||
|
|
||||||
|
SqliteCommand cmd = new SqliteCommand();
|
||||||
|
|
||||||
|
string update = "update `"+m_Realm+"` set ";
|
||||||
|
bool first = true;
|
||||||
|
foreach (string field in fields)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
update += ", ";
|
||||||
|
update += "`" + field + "` = " + data.Data[field];
|
||||||
|
|
||||||
|
first = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
update += " where UUID = '" + data.PrincipalID.ToString() + "'";
|
||||||
|
|
||||||
|
cmd.CommandText = update;
|
||||||
|
|
||||||
|
if (ExecuteNonQuery(cmd) < 1)
|
||||||
|
{
|
||||||
|
string insert = "insert into `" + m_Realm + "` (`UUID`, `" +
|
||||||
|
String.Join("`, `", fields) +
|
||||||
|
"`) values ('" + data.PrincipalID.ToString() + "', " + String.Join(", '", values) + "')";
|
||||||
|
|
||||||
|
cmd.CommandText = insert;
|
||||||
|
|
||||||
|
if (ExecuteNonQuery(cmd) < 1)
|
||||||
|
{
|
||||||
|
cmd.Dispose();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Dispose();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SetDataItem(UUID principalID, string item, string value)
|
||||||
|
{
|
||||||
|
SqliteCommand cmd = new SqliteCommand("update `" + m_Realm +
|
||||||
|
"` set `" + item + "` = " + value + " where UUID = '" + principalID.ToString() + "'");
|
||||||
|
|
||||||
|
if (ExecuteNonQuery(cmd) > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SetToken(UUID principalID, string token, int lifetime)
|
||||||
|
{
|
||||||
|
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||||
|
DoExpire();
|
||||||
|
|
||||||
|
SqliteCommand cmd = new SqliteCommand("insert into tokens (UUID, token, validity) values ('" + principalID.ToString() +
|
||||||
|
"', '" + token + "', datetime('now, 'localtime', '+" + lifetime.ToString() + " minutes'))");
|
||||||
|
|
||||||
|
if (ExecuteNonQuery(cmd) > 0)
|
||||||
|
{
|
||||||
|
cmd.Dispose();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Dispose();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CheckToken(UUID principalID, string token, int lifetime)
|
||||||
|
{
|
||||||
|
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||||
|
DoExpire();
|
||||||
|
|
||||||
|
SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now, 'localtime', '+" + lifetime.ToString() +
|
||||||
|
" minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')");
|
||||||
|
|
||||||
|
if (ExecuteNonQuery(cmd) > 0)
|
||||||
|
{
|
||||||
|
cmd.Dispose();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Dispose();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DoExpire()
|
||||||
|
{
|
||||||
|
SqliteCommand cmd = new SqliteCommand("delete from tokens where validity < datetime('now, 'localtime')");
|
||||||
|
ExecuteNonQuery(cmd);
|
||||||
|
|
||||||
|
cmd.Dispose();
|
||||||
|
|
||||||
|
m_LastExpire = System.Environment.TickCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,12 +40,17 @@ namespace OpenSim.Data.SQLite
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SQLiteFramework
|
public class SQLiteFramework
|
||||||
{
|
{
|
||||||
protected SqliteConnection m_Connection;
|
protected static SqliteConnection m_Connection;
|
||||||
|
private bool m_initialized;
|
||||||
|
|
||||||
protected SQLiteFramework(string connectionString)
|
protected SQLiteFramework(string connectionString)
|
||||||
{
|
{
|
||||||
m_Connection = new SqliteConnection(connectionString);
|
if (!m_initialized)
|
||||||
m_Connection.Open();
|
{
|
||||||
|
m_Connection = new SqliteConnection(connectionString);
|
||||||
|
m_Connection.Open();
|
||||||
|
m_initialized = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -48,16 +48,23 @@ namespace OpenSim.Data.SQLite
|
||||||
protected string m_Realm;
|
protected string m_Realm;
|
||||||
protected FieldInfo m_DataField = null;
|
protected FieldInfo m_DataField = null;
|
||||||
|
|
||||||
|
private static bool m_initialized;
|
||||||
|
|
||||||
public SQLiteGenericTableHandler(string connectionString,
|
public SQLiteGenericTableHandler(string connectionString,
|
||||||
string realm, string storeName) : base(connectionString)
|
string realm, string storeName) : base(connectionString)
|
||||||
{
|
{
|
||||||
m_Realm = realm;
|
m_Realm = realm;
|
||||||
if (storeName != String.Empty)
|
|
||||||
{
|
|
||||||
Assembly assem = GetType().Assembly;
|
|
||||||
|
|
||||||
Migration m = new Migration(m_Connection, assem, storeName);
|
if (!m_initialized)
|
||||||
m.Update();
|
{
|
||||||
|
if (storeName != String.Empty)
|
||||||
|
{
|
||||||
|
Assembly assem = GetType().Assembly;
|
||||||
|
|
||||||
|
Migration m = new Migration(m_Connection, assem, storeName);
|
||||||
|
m.Update();
|
||||||
|
}
|
||||||
|
m_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Type t = typeof(T);
|
Type t = typeof(T);
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* 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 Mono.Data.SqliteClient;
|
||||||
|
|
||||||
|
namespace OpenSim.Data.SQLite
|
||||||
|
{
|
||||||
|
public class SQLiteUserAccountData : SQLiteGenericTableHandler<UserAccountData>, IUserAccountData
|
||||||
|
{
|
||||||
|
public SQLiteUserAccountData(string connectionString, string realm)
|
||||||
|
: base(connectionString, realm, "UserAccount")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
SqliteCommand cmd = new SqliteCommand();
|
||||||
|
|
||||||
|
if (words.Length == 1)
|
||||||
|
{
|
||||||
|
cmd.CommandText = String.Format("select * from {0} where ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')",
|
||||||
|
m_Realm, scopeID.ToString(), words[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{3}%')",
|
||||||
|
m_Realm, scopeID.ToString(), words[0], words[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DoQuery(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,7 +64,7 @@ namespace OpenSim.Services.Base
|
||||||
foreach (Type pluginType in pluginAssembly.GetTypes())
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
{
|
{
|
||||||
if (pluginType.IsPublic)
|
if (pluginType.IsPublic)
|
||||||
{
|
{
|
||||||
if (className != String.Empty &&
|
if (className != String.Empty &&
|
||||||
pluginType.ToString() !=
|
pluginType.ToString() !=
|
||||||
pluginType.Namespace + "." + className)
|
pluginType.Namespace + "." + className)
|
||||||
|
@ -84,8 +84,9 @@ namespace OpenSim.Services.Base
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("XXX Exception " + e.StackTrace);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,6 @@
|
||||||
;; which you can copy and change.
|
;; which you can copy and change.
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Includes]
|
|
||||||
Include-Common = "config-include/StandaloneCommon.ini"
|
|
||||||
|
|
||||||
[Modules]
|
[Modules]
|
||||||
AssetServices = "LocalAssetServicesConnector"
|
AssetServices = "LocalAssetServicesConnector"
|
||||||
InventoryServices = "LocalInventoryServicesConnector"
|
InventoryServices = "LocalInventoryServicesConnector"
|
||||||
|
@ -72,3 +69,8 @@
|
||||||
AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
|
AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
|
||||||
|
|
||||||
WelcomeMessage = "Welcome, Avatar!"
|
WelcomeMessage = "Welcome, Avatar!"
|
||||||
|
|
||||||
|
|
||||||
|
;; This should always be the very last thing on this file
|
||||||
|
[Includes]
|
||||||
|
Include-Common = "config-include/StandaloneCommon.ini"
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
;; All optional settings are in StandaloneCommon.ini.example,
|
;; All optional settings are in StandaloneCommon.ini.example,
|
||||||
;; which you can copy and change.
|
;; which you can copy and change.
|
||||||
;;
|
;;
|
||||||
|
|
||||||
[Includes]
|
|
||||||
Include-Common = "config-include/StandaloneCommon.ini"
|
|
||||||
|
|
||||||
[Modules]
|
[Modules]
|
||||||
AssetServices = "HGAssetBroker"
|
AssetServices = "HGAssetBroker"
|
||||||
|
@ -112,3 +109,8 @@
|
||||||
[HGInventoryService]
|
[HGInventoryService]
|
||||||
; For the InventoryServiceInConnector
|
; For the InventoryServiceInConnector
|
||||||
LocalServiceModule = "OpenSim.Services.InventoryService.dll:HGInventoryService"
|
LocalServiceModule = "OpenSim.Services.InventoryService.dll:HGInventoryService"
|
||||||
|
|
||||||
|
|
||||||
|
;; This should always be the very last thing on this file
|
||||||
|
[Includes]
|
||||||
|
Include-Common = "config-include/StandaloneCommon.ini"
|
||||||
|
|
Loading…
Reference in New Issue