diff options
author | Teravus Ovares (Dan Olivares) | 2009-09-06 16:15:20 -0400 |
---|---|---|
committer | Teravus Ovares (Dan Olivares) | 2009-09-06 16:15:20 -0400 |
commit | 8797a8209829c0a3fe7ff9edbe46e2d636a546a8 (patch) | |
tree | e0637dd04b59f4387e160e9d26887d94904588d8 /OpenSim/Services | |
parent | * Moves another Legacy avatar inbounds check to Border (diff) | |
parent | Addendum to last commit. With the last commit, some other code that should (diff) | |
download | opensim-SC-8797a8209829c0a3fe7ff9edbe46e2d636a546a8.zip opensim-SC-8797a8209829c0a3fe7ff9edbe46e2d636a546a8.tar.gz opensim-SC-8797a8209829c0a3fe7ff9edbe46e2d636a546a8.tar.bz2 opensim-SC-8797a8209829c0a3fe7ff9edbe46e2d636a546a8.tar.xz |
Merge branch 'master' of ssh://MyConnection/var/git/opensim
Diffstat (limited to 'OpenSim/Services')
8 files changed, 34 insertions, 229 deletions
diff --git a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs index 2ed177c..8904461 100644 --- a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs +++ b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs | |||
@@ -90,31 +90,16 @@ namespace OpenSim.Services.AuthenticationService | |||
90 | throw new Exception("Could not find a storage interface in the given module"); | 90 | throw new Exception("Could not find a storage interface in the given module"); |
91 | } | 91 | } |
92 | 92 | ||
93 | public virtual byte[] GetPublicKey() | ||
94 | { | ||
95 | return new byte[0]; | ||
96 | } | ||
97 | |||
98 | public bool Verify(UUID principalID, string token, int lifetime) | 93 | public bool Verify(UUID principalID, string token, int lifetime) |
99 | { | 94 | { |
100 | return m_Database.CheckToken(principalID, token, lifetime); | 95 | return m_Database.CheckToken(principalID, token, lifetime); |
101 | } | 96 | } |
102 | 97 | ||
103 | public bool VerifyEncrypted(byte[] cyphertext, byte[] key) | ||
104 | { | ||
105 | return false; | ||
106 | } | ||
107 | |||
108 | public virtual bool Release(UUID principalID, string token) | 98 | public virtual bool Release(UUID principalID, string token) |
109 | { | 99 | { |
110 | return m_Database.CheckToken(principalID, token, 0); | 100 | return m_Database.CheckToken(principalID, token, 0); |
111 | } | 101 | } |
112 | 102 | ||
113 | public virtual bool ReleaseEncrypted(byte[] cyphertext, byte[] key) | ||
114 | { | ||
115 | return false; | ||
116 | } | ||
117 | |||
118 | protected string GetToken(UUID principalID, int lifetime) | 103 | protected string GetToken(UUID principalID, int lifetime) |
119 | { | 104 | { |
120 | UUID token = UUID.Random(); | 105 | UUID token = UUID.Random(); |
diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs index 7fdbbf6..6c99b66 100644 --- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs | |||
@@ -76,10 +76,5 @@ namespace OpenSim.Services.AuthenticationService | |||
76 | 76 | ||
77 | return String.Empty; | 77 | return String.Empty; |
78 | } | 78 | } |
79 | |||
80 | public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) | ||
81 | { | ||
82 | return new byte[0]; | ||
83 | } | ||
84 | } | 79 | } |
85 | } | 80 | } |
diff --git a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs index 0118c91..8831c8a 100644 --- a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs +++ b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs | |||
@@ -56,10 +56,5 @@ namespace OpenSim.Services.AuthenticationService | |||
56 | { | 56 | { |
57 | return String.Empty; | 57 | return String.Empty; |
58 | } | 58 | } |
59 | |||
60 | public byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key) | ||
61 | { | ||
62 | return new byte[0]; | ||
63 | } | ||
64 | } | 59 | } |
65 | } | 60 | } |
diff --git a/OpenSim/Services/Connectors/User/UserServiceConnector.cs b/OpenSim/Services/Connectors/User/UserServiceConnector.cs index fb03844..d418938 100644 --- a/OpenSim/Services/Connectors/User/UserServiceConnector.cs +++ b/OpenSim/Services/Connectors/User/UserServiceConnector.cs | |||
@@ -39,7 +39,7 @@ using OpenMetaverse; | |||
39 | 39 | ||
40 | namespace OpenSim.Services.Connectors | 40 | namespace OpenSim.Services.Connectors |
41 | { | 41 | { |
42 | public class UserServicesConnector : IUserAccountDataService | 42 | public class UserServicesConnector : IUserAccountService |
43 | { | 43 | { |
44 | private static readonly ILog m_log = | 44 | private static readonly ILog m_log = |
45 | LogManager.GetLogger( | 45 | LogManager.GetLogger( |
@@ -81,153 +81,34 @@ namespace OpenSim.Services.Connectors | |||
81 | m_ServerURI = serviceURI; | 81 | m_ServerURI = serviceURI; |
82 | } | 82 | } |
83 | 83 | ||
84 | public UserAccountData GetUserAccountData(UUID scopeID, string firstName, string lastName) | 84 | public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) |
85 | { | 85 | { |
86 | string uri = m_ServerURI + "/users/"; | 86 | return null; |
87 | UserAccountData data = new UserAccountData(); | ||
88 | data.FirstName = firstName; | ||
89 | data.LastName = lastName; | ||
90 | data.ScopeID = scopeID; | ||
91 | data.UserID = UUID.Zero; | ||
92 | |||
93 | try | ||
94 | { | ||
95 | data = SynchronousRestObjectRequester. | ||
96 | MakeRequest<UserAccountData, UserAccountData>("POST", uri, data); | ||
97 | } | ||
98 | catch (Exception e) | ||
99 | { | ||
100 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
101 | return null; | ||
102 | } | ||
103 | |||
104 | if (data.UserID == UUID.Zero) | ||
105 | return null; | ||
106 | |||
107 | return data; | ||
108 | } | 87 | } |
109 | 88 | ||
110 | public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) | 89 | public UserAccount GetUserAccount(UUID scopeID, UUID userID) |
111 | { | 90 | { |
112 | string uri = m_ServerURI + "/users/"; | 91 | return null; |
113 | UserAccountData data = new UserAccountData(); | ||
114 | data.FirstName = String.Empty; | ||
115 | data.LastName = String.Empty; | ||
116 | data.ScopeID = scopeID; | ||
117 | data.UserID = userID; | ||
118 | |||
119 | try | ||
120 | { | ||
121 | data = SynchronousRestObjectRequester. | ||
122 | MakeRequest<UserAccountData, UserAccountData>("POST", uri, data); | ||
123 | } | ||
124 | catch (Exception e) | ||
125 | { | ||
126 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
127 | return null; | ||
128 | } | ||
129 | |||
130 | if (data.UserID == UUID.Zero) | ||
131 | return null; | ||
132 | |||
133 | return data; | ||
134 | } | 92 | } |
135 | 93 | ||
136 | public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) | 94 | public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) |
137 | { | 95 | { |
138 | string uri = m_ServerURI + "/user/"; | 96 | return false; |
139 | bool result = false; | ||
140 | |||
141 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
142 | |||
143 | msg.Data = data; | ||
144 | msg.RegionID = regionID; | ||
145 | msg.RegionSecret = regionSecret; | ||
146 | |||
147 | try | ||
148 | { | ||
149 | result = SynchronousRestObjectRequester. | ||
150 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
151 | } | ||
152 | catch (Exception e) | ||
153 | { | ||
154 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
155 | return false; | ||
156 | } | ||
157 | |||
158 | return result; | ||
159 | } | 97 | } |
160 | 98 | ||
161 | public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 99 | public bool SetUserAccount(UserAccount data, UUID principalID, string token) |
162 | { | 100 | { |
163 | string uri = m_ServerURI + "/user/"; | 101 | return false; |
164 | bool result = false; | ||
165 | |||
166 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
167 | |||
168 | msg.Data = data; | ||
169 | msg.PrincipalID = principalID; | ||
170 | msg.SessionID = sessionID; | ||
171 | |||
172 | try | ||
173 | { | ||
174 | result = SynchronousRestObjectRequester. | ||
175 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
176 | } | ||
177 | catch (Exception e) | ||
178 | { | ||
179 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
180 | return false; | ||
181 | } | ||
182 | |||
183 | return result; | ||
184 | } | 102 | } |
185 | 103 | ||
186 | public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 104 | public bool CreateUserAccount(UserAccount data, UUID principalID, string token) |
187 | { | 105 | { |
188 | string uri = m_ServerURI + "/newuser/"; | 106 | return false; |
189 | bool result = false; | ||
190 | |||
191 | UserAccountDataMessage msg = new UserAccountDataMessage(); | ||
192 | |||
193 | msg.Data = data; | ||
194 | msg.PrincipalID = principalID; | ||
195 | msg.SessionID = sessionID; | ||
196 | |||
197 | try | ||
198 | { | ||
199 | result = SynchronousRestObjectRequester. | ||
200 | MakeRequest<UserAccountDataMessage, bool>("POST", uri, msg); | ||
201 | } | ||
202 | catch (Exception e) | ||
203 | { | ||
204 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
205 | return false; | ||
206 | } | ||
207 | |||
208 | return result; | ||
209 | } | 107 | } |
210 | 108 | ||
211 | public List<UserAccountData> GetUserAccountData(UUID scopeID, string query) | 109 | public List<UserAccount> GetUserAccount(UUID scopeID, string query) |
212 | { | 110 | { |
213 | string uri = m_ServerURI + "/userlist/"; | 111 | return null; |
214 | UserAccountData data = new UserAccountData(); | ||
215 | data.FirstName = query; | ||
216 | data.ScopeID = scopeID; | ||
217 | List<UserAccountData> result; | ||
218 | |||
219 | try | ||
220 | { | ||
221 | result = SynchronousRestObjectRequester. | ||
222 | MakeRequest<UserAccountData, List<UserAccountData>>("POST", uri, data); | ||
223 | } | ||
224 | catch (Exception e) | ||
225 | { | ||
226 | m_log.WarnFormat("[USER CONNECTOR]: Unable to send request to user server. Reason: {1}", e.Message); | ||
227 | return null; | ||
228 | } | ||
229 | |||
230 | return result; | ||
231 | } | 112 | } |
232 | } | 113 | } |
233 | } | 114 | } |
diff --git a/OpenSim/Services/Interfaces/IAuthenticationService.cs b/OpenSim/Services/Interfaces/IAuthenticationService.cs index b448a14..9225773 100644 --- a/OpenSim/Services/Interfaces/IAuthenticationService.cs +++ b/OpenSim/Services/Interfaces/IAuthenticationService.cs | |||
@@ -39,39 +39,12 @@ namespace OpenSim.Services.Interfaces | |||
39 | public interface IAuthenticationService | 39 | public interface IAuthenticationService |
40 | { | 40 | { |
41 | ////////////////////////////////////////////////////// | 41 | ////////////////////////////////////////////////////// |
42 | // PKI Zone! | ||
43 | // | ||
44 | // HG2 authentication works by using a cryptographic | ||
45 | // exchange. | ||
46 | // This method must provide a public key, the other | ||
47 | // crypto methods must understand hoow to deal with | ||
48 | // messages encrypted to it. | ||
49 | // | ||
50 | // If the public key is of zero length, you will | ||
51 | // get NO encryption and NO security. | ||
52 | // | ||
53 | // For non-HG installations, this is not relevant | ||
54 | // | ||
55 | // Implementors who are not using PKI can treat the | ||
56 | // cyphertext as a string and provide a zero-length | ||
57 | // key. Encryptionless implementations will not | ||
58 | // interoperate with implementations using encryption. | ||
59 | // If one side uses encryption, both must do so. | ||
60 | // | ||
61 | byte[] GetPublicKey(); | ||
62 | |||
63 | ////////////////////////////////////////////////////// | ||
64 | // Authentication | 42 | // Authentication |
65 | // | 43 | // |
66 | // These methods will return a token, which can be used to access | 44 | // These methods will return a token, which can be used to access |
67 | // various services. | 45 | // various services. |
68 | // | 46 | // |
69 | // The encrypted versions take the received cyphertext and | ||
70 | // the public key of the peer, which the connector must have | ||
71 | // obtained using a remote GetPublicKey call. | ||
72 | // | ||
73 | string Authenticate(UUID principalID, string password, int lifetime); | 47 | string Authenticate(UUID principalID, string password, int lifetime); |
74 | byte[] AuthenticateEncrypted(byte[] cyphertext, byte[] key); | ||
75 | 48 | ||
76 | ////////////////////////////////////////////////////// | 49 | ////////////////////////////////////////////////////// |
77 | // Verification | 50 | // Verification |
@@ -81,12 +54,7 @@ namespace OpenSim.Services.Interfaces | |||
81 | // Tokens expire after 30 minutes and can be refreshed by | 54 | // Tokens expire after 30 minutes and can be refreshed by |
82 | // re-verifying. | 55 | // re-verifying. |
83 | // | 56 | // |
84 | // If encrypted authentication was used, encrypted verification | ||
85 | // must be used to refresh. Unencrypted verification is still | ||
86 | // performed, but doesn't refresh token lifetime. | ||
87 | // | ||
88 | bool Verify(UUID principalID, string token, int lifetime); | 57 | bool Verify(UUID principalID, string token, int lifetime); |
89 | bool VerifyEncrypted(byte[] cyphertext, byte[] key); | ||
90 | 58 | ||
91 | ////////////////////////////////////////////////////// | 59 | ////////////////////////////////////////////////////// |
92 | // Teardown | 60 | // Teardown |
@@ -95,11 +63,7 @@ namespace OpenSim.Services.Interfaces | |||
95 | // invalidates it and it can not subsequently be used | 63 | // invalidates it and it can not subsequently be used |
96 | // or refreshed. | 64 | // or refreshed. |
97 | // | 65 | // |
98 | // Tokens created by encrypted authentication must | ||
99 | // be returned by encrypted release calls; | ||
100 | // | ||
101 | bool Release(UUID principalID, string token); | 66 | bool Release(UUID principalID, string token); |
102 | bool ReleaseEncrypted(byte[] cyphertext, byte[] key); | ||
103 | 67 | ||
104 | ////////////////////////////////////////////////////// | 68 | ////////////////////////////////////////////////////// |
105 | // Grid | 69 | // Grid |
diff --git a/OpenSim/Services/Interfaces/IUserService.cs b/OpenSim/Services/Interfaces/IUserService.cs index 35254a1..92bd8ef 100644 --- a/OpenSim/Services/Interfaces/IUserService.cs +++ b/OpenSim/Services/Interfaces/IUserService.cs | |||
@@ -30,13 +30,13 @@ using OpenMetaverse; | |||
30 | 30 | ||
31 | namespace OpenSim.Services.Interfaces | 31 | namespace OpenSim.Services.Interfaces |
32 | { | 32 | { |
33 | public class UserAccountData | 33 | public class UserAccount |
34 | { | 34 | { |
35 | public UserAccountData() | 35 | public UserAccount() |
36 | { | 36 | { |
37 | } | 37 | } |
38 | 38 | ||
39 | public UserAccountData(UUID userID, UUID homeRegionID, float homePositionX, | 39 | public UserAccount(UUID userID, UUID homeRegionID, float homePositionX, |
40 | float homePositionY, float homePositionZ, float homeLookAtX, | 40 | float homePositionY, float homePositionZ, float homeLookAtX, |
41 | float homeLookAtY, float homeLookAtZ) | 41 | float homeLookAtY, float homeLookAtZ) |
42 | { | 42 | { |
@@ -78,41 +78,26 @@ namespace OpenSim.Services.Interfaces | |||
78 | 78 | ||
79 | }; | 79 | }; |
80 | 80 | ||
81 | public class UserAccountDataMessage | 81 | public interface IUserAccountService |
82 | { | 82 | { |
83 | public UserAccountData Data; | 83 | UserAccount GetUserAccount(UUID scopeID, UUID userID); |
84 | 84 | UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName); | |
85 | // Set to the region's ID and secret when updating home location | ||
86 | // | ||
87 | public UUID RegionID; | ||
88 | public UUID RegionSecret; | ||
89 | |||
90 | // Set to the auth info of the user requesting creation/update | ||
91 | // | ||
92 | public UUID PrincipalID; | ||
93 | public UUID SessionID; | ||
94 | }; | ||
95 | |||
96 | public interface IUserAccountDataService | ||
97 | { | ||
98 | UserAccountData GetUserAccountData(UUID scopeID, UUID userID); | ||
99 | UserAccountData GetUserAccountData(UUID scopeID, string FirstName, string LastName); | ||
100 | // Returns the list of avatars that matches both the search | 85 | // Returns the list of avatars that matches both the search |
101 | // criterion and the scope ID passed | 86 | // criterion and the scope ID passed |
102 | // | 87 | // |
103 | List<UserAccountData> GetUserAccountData(UUID scopeID, string query); | 88 | List<UserAccount> GetUserAccount(UUID scopeID, string query); |
104 | 89 | ||
105 | 90 | ||
106 | // This will set only the home region portion of the data! | 91 | // This will set only the home region portion of the data! |
107 | // Can't be used to set god level, flags, type or change the name! | 92 | // Can't be used to set god level, flags, type or change the name! |
108 | // | 93 | // |
109 | bool SetHomePosition(UserAccountData data, UUID RegionID, UUID RegionSecret); | 94 | bool SetHomePosition(UserAccount data, UUID RegionID, UUID RegionSecret); |
110 | 95 | ||
111 | // Update all updatable fields | 96 | // Update all updatable fields |
112 | // | 97 | // |
113 | bool SetUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); | 98 | bool SetUserAccount(UserAccount data, UUID PrincipalID, string token); |
114 | 99 | ||
115 | // Creates a user data record | 100 | // Creates a user data record |
116 | bool CreateUserAccountData(UserAccountData data, UUID PrincipalID, UUID SessionID); | 101 | bool CreateUserAccount(UserAccount data, UUID PrincipalID, string token); |
117 | } | 102 | } |
118 | } | 103 | } |
diff --git a/OpenSim/Services/UserService/UserService.cs b/OpenSim/Services/UserService/UserService.cs index 78793657..e8b9fc3 100644 --- a/OpenSim/Services/UserService/UserService.cs +++ b/OpenSim/Services/UserService/UserService.cs | |||
@@ -35,39 +35,39 @@ using OpenMetaverse; | |||
35 | 35 | ||
36 | namespace OpenSim.Services.UserAccountService | 36 | namespace OpenSim.Services.UserAccountService |
37 | { | 37 | { |
38 | public class UserAccountService : UserAccountServiceBase, IUserAccountDataService | 38 | public class UserAccountService : UserAccountServiceBase, IUserAccountService |
39 | { | 39 | { |
40 | public UserAccountService(IConfigSource config) : base(config) | 40 | public UserAccountService(IConfigSource config) : base(config) |
41 | { | 41 | { |
42 | } | 42 | } |
43 | 43 | ||
44 | public UserAccountData GetUserAccountData(UUID scopeID, string firstName, | 44 | public UserAccount GetUserAccount(UUID scopeID, string firstName, |
45 | string lastName) | 45 | string lastName) |
46 | { | 46 | { |
47 | return null; | 47 | return null; |
48 | } | 48 | } |
49 | 49 | ||
50 | public UserAccountData GetUserAccountData(UUID scopeID, UUID userID) | 50 | public UserAccount GetUserAccount(UUID scopeID, UUID userID) |
51 | { | 51 | { |
52 | return null; | 52 | return null; |
53 | } | 53 | } |
54 | 54 | ||
55 | public bool SetHomePosition(UserAccountData data, UUID regionID, UUID regionSecret) | 55 | public bool SetHomePosition(UserAccount data, UUID regionID, UUID regionSecret) |
56 | { | 56 | { |
57 | return false; | 57 | return false; |
58 | } | 58 | } |
59 | 59 | ||
60 | public bool SetUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 60 | public bool SetUserAccount(UserAccount data, UUID principalID, string token) |
61 | { | 61 | { |
62 | return false; | 62 | return false; |
63 | } | 63 | } |
64 | 64 | ||
65 | public bool CreateUserAccountData(UserAccountData data, UUID principalID, UUID sessionID) | 65 | public bool CreateUserAccount(UserAccount data, UUID principalID, string token) |
66 | { | 66 | { |
67 | return false; | 67 | return false; |
68 | } | 68 | } |
69 | 69 | ||
70 | public List<UserAccountData> GetUserAccountData(UUID scopeID, | 70 | public List<UserAccount> GetUserAccount(UUID scopeID, |
71 | string query) | 71 | string query) |
72 | { | 72 | { |
73 | return null; | 73 | return null; |
diff --git a/OpenSim/Services/UserService/UserServiceBase.cs b/OpenSim/Services/UserService/UserServiceBase.cs index c982c1a..fea8b01 100644 --- a/OpenSim/Services/UserService/UserServiceBase.cs +++ b/OpenSim/Services/UserService/UserServiceBase.cs | |||
@@ -36,7 +36,7 @@ namespace OpenSim.Services.UserAccountService | |||
36 | { | 36 | { |
37 | public class UserAccountServiceBase: ServiceBase | 37 | public class UserAccountServiceBase: ServiceBase |
38 | { | 38 | { |
39 | protected IUserDataPlugin m_Database = null; | 39 | protected IUserAccountData m_Database = null; |
40 | 40 | ||
41 | public UserAccountServiceBase(IConfigSource config) : base(config) | 41 | public UserAccountServiceBase(IConfigSource config) : base(config) |
42 | { | 42 | { |
@@ -53,12 +53,12 @@ namespace OpenSim.Services.UserAccountService | |||
53 | string connString = userConfig.GetString("ConnectionString", | 53 | string connString = userConfig.GetString("ConnectionString", |
54 | String.Empty); | 54 | String.Empty); |
55 | 55 | ||
56 | m_Database = LoadPlugin<IUserDataPlugin>(dllName); | 56 | string realm = userConfig.GetString("Realm", "users"); |
57 | |||
58 | m_Database = LoadPlugin<IUserAccountData>(dllName, new Object[] {connString, realm}); | ||
57 | 59 | ||
58 | if (m_Database == null) | 60 | if (m_Database == null) |
59 | throw new Exception("Could not find a storage interface in the given module"); | 61 | throw new Exception("Could not find a storage interface in the given module"); |
60 | |||
61 | m_Database.Initialise(connString); | ||
62 | } | 62 | } |
63 | } | 63 | } |
64 | } | 64 | } |