aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim.RegionServer/UserServer/LoginServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim.RegionServer/UserServer/LoginServer.cs')
-rw-r--r--OpenSim.RegionServer/UserServer/LoginServer.cs307
1 files changed, 0 insertions, 307 deletions
diff --git a/OpenSim.RegionServer/UserServer/LoginServer.cs b/OpenSim.RegionServer/UserServer/LoginServer.cs
deleted file mode 100644
index 4c77389..0000000
--- a/OpenSim.RegionServer/UserServer/LoginServer.cs
+++ /dev/null
@@ -1,307 +0,0 @@
1/*
2* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
3*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are met:
6* * Redistributions of source code must retain the above copyright
7* notice, this list of conditions and the following disclaimer.
8* * Redistributions in binary form must reproduce the above copyright
9* notice, this list of conditions and the following disclaimer in the
10* documentation and/or other materials provided with the distribution.
11* * Neither the name of the <organization> nor the
12* names of its contributors may be used to endorse or promote products
13* derived from this software without specific prior written permission.
14*
15* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
16* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
19* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*
26*/
27
28using Nwc.XmlRpc;
29using System;
30using System.IO;
31using System.Net;
32using System.Net.Sockets;
33using System.Text;
34using System.Text.RegularExpressions;
35using System.Threading;
36using System.Collections;
37using System.Security.Cryptography;
38using System.Xml;
39using libsecondlife;
40using OpenSim;
41using OpenSim.Framework.Interfaces;
42using OpenSim.Framework.Grid;
43using OpenSim.Framework.Inventory;
44using OpenSim.Framework.User;
45using OpenSim.Framework.Utilities;
46
47namespace OpenSim.UserServer
48{
49
50 /// <summary>
51 /// When running in local (default) mode , handles client logins.
52 /// </summary>
53 public class LoginServer : LoginService, IUserServer
54 {
55 private IGridServer m_gridServer;
56 private ushort _loginPort = 8080;
57 public IPAddress clientAddress = IPAddress.Loopback;
58 public IPAddress remoteAddress = IPAddress.Any;
59 private Socket loginServer;
60 private int NumClients;
61 private string _defaultResponse;
62 private bool userAccounts = false;
63 private string _mpasswd;
64 private bool _needPasswd = false;
65 private LocalUserProfileManager userManager;
66 private int m_simPort;
67 private string m_simAddr;
68
69 public LocalUserProfileManager LocalUserManager
70 {
71 get
72 {
73 return userManager;
74 }
75 }
76
77 public LoginServer(IGridServer gridServer, string simAddr, int simPort, bool useAccounts)
78 {
79 m_gridServer = gridServer;
80 m_simPort = simPort;
81 m_simAddr = simAddr;
82 this.userAccounts = useAccounts;
83 }
84
85 public void Startup()
86 {
87 this._needPasswd = false;
88 //read in default response string
89 StreamReader SR;
90 string lines;
91 SR = File.OpenText("new-login.dat");
92
93 while (!SR.EndOfStream)
94 {
95 lines = SR.ReadLine();
96 _defaultResponse += lines;
97 }
98 SR.Close();
99 this._mpasswd = EncodePassword("testpass");
100
101 userManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr);
102 userManager.InitUserProfiles();
103 userManager.SetKeys("", "", "", "Welcome to OpenSim");
104 }
105
106 public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
107 {
108 Console.WriteLine("login attempt");
109 Hashtable requestData = (Hashtable)request.Params[0];
110 string first;
111 string last;
112 string passwd;
113 LLUUID Agent;
114 LLUUID Session;
115
116 XmlRpcResponse response = new XmlRpcResponse();
117
118 //get login name
119 if (requestData.Contains("first"))
120 {
121 first = (string)requestData["first"];
122 }
123 else
124 {
125 first = "test";
126 }
127
128 if (requestData.Contains("last"))
129 {
130 last = (string)requestData["last"];
131 }
132 else
133 {
134 last = "User" + NumClients.ToString();
135 }
136
137 if (requestData.Contains("passwd"))
138 {
139 passwd = (string)requestData["passwd"];
140 }
141 else
142 {
143 passwd = "notfound";
144 }
145
146 if (!Authenticate(first, last, passwd))
147 {
148 Hashtable loginError = new Hashtable();
149 loginError["reason"] = "key"; ;
150 loginError["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
151 loginError["login"] = "false";
152 response.Value = loginError;
153 }
154
155 NumClients++;
156
157 //create a agent and session LLUUID
158 Agent = GetAgentId(first, last);
159 int SessionRand = Util.RandomClass.Next(1, 999);
160 Session = new LLUUID("aaaabbbb-0200-" + SessionRand.ToString("0000") + "-8664-58f53e442797");
161 LLUUID secureSess = LLUUID.Random();
162 //create some login info
163 Hashtable LoginFlagsHash = new Hashtable();
164 LoginFlagsHash["daylight_savings"] = "N";
165 LoginFlagsHash["stipend_since_login"] = "N";
166 LoginFlagsHash["gendered"] = "Y";
167 LoginFlagsHash["ever_logged_in"] = "Y";
168 ArrayList LoginFlags = new ArrayList();
169 LoginFlags.Add(LoginFlagsHash);
170
171 Hashtable GlobalT = new Hashtable();
172 GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
173 GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
174 GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
175 ArrayList GlobalTextures = new ArrayList();
176 GlobalTextures.Add(GlobalT);
177
178 response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
179 Hashtable responseData = (Hashtable)response.Value;
180
181 responseData["sim_port"] = m_simPort;
182 responseData["sim_ip"] = m_simAddr;
183 responseData["agent_id"] = Agent.ToStringHyphenated();
184 responseData["session_id"] = Session.ToStringHyphenated();
185 responseData["secure_session_id"] = secureSess.ToStringHyphenated();
186 responseData["circuit_code"] = (Int32)(Util.RandomClass.Next());
187 responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
188 responseData["login-flags"] = LoginFlags;
189 responseData["global-textures"] = GlobalTextures;
190
191 //inventory
192 ArrayList InventoryList = (ArrayList)responseData["inventory-skeleton"];
193 Hashtable Inventory1 = (Hashtable)InventoryList[0];
194 Hashtable Inventory2 = (Hashtable)InventoryList[1];
195 LLUUID BaseFolderID = LLUUID.Random();
196 LLUUID InventoryFolderID = LLUUID.Random();
197 Inventory2["name"] = "Textures";
198 Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
199 Inventory2["type_default"] = 0;
200 Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
201
202 ArrayList InventoryRoot = (ArrayList)responseData["inventory-root"];
203 Hashtable Inventoryroot = (Hashtable)InventoryRoot[0];
204 Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated();
205
206 CustomiseLoginResponse(responseData, first, last);
207
208 Login _login = new Login();
209 //copy data to login object
210 _login.First = first;
211 _login.Last = last;
212 _login.Agent = Agent;
213 _login.Session = Session;
214 _login.SecureSession = secureSess;
215 _login.BaseFolder = BaseFolderID;
216 _login.InventoryFolder = InventoryFolderID;
217
218 //working on local computer if so lets add to the gridserver's list of sessions?
219 if (m_gridServer.GetName() == "Local")
220 {
221 ((LocalGridBase)m_gridServer).AddNewSession(_login);
222 }
223
224 return response;
225 }
226
227 protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last)
228 {
229 }
230
231 protected virtual LLUUID GetAgentId(string firstName, string lastName)
232 {
233 LLUUID Agent;
234 int AgentRand = Util.RandomClass.Next(1, 9999);
235 Agent = new LLUUID("99998888-0100-" + AgentRand.ToString("0000") + "-8ec1-0b1d5cd6aead");
236 return Agent;
237 }
238
239 protected virtual bool Authenticate(string first, string last, string passwd)
240 {
241 if (this._needPasswd)
242 {
243 //every user needs the password to login
244 string encodedPass = passwd.Remove(0, 3); //remove $1$
245 if (encodedPass == this._mpasswd)
246 {
247 return true;
248 }
249 else
250 {
251 return false;
252 }
253 }
254 else
255 {
256 //do not need password to login
257 return true;
258 }
259 }
260
261 private static string EncodePassword(string passwd)
262 {
263 Byte[] originalBytes;
264 Byte[] encodedBytes;
265 MD5 md5;
266
267 md5 = new MD5CryptoServiceProvider();
268 originalBytes = ASCIIEncoding.Default.GetBytes(passwd);
269 encodedBytes = md5.ComputeHash(originalBytes);
270
271 return Regex.Replace(BitConverter.ToString(encodedBytes), "-", "").ToLower();
272 }
273
274 public bool CreateUserAccount(string firstName, string lastName, string password)
275 {
276 Console.WriteLine("creating new user account");
277 string mdPassword = EncodePassword(password);
278 Console.WriteLine("with password: " + mdPassword);
279 this.userManager.CreateNewProfile(firstName, lastName, mdPassword);
280 return true;
281 }
282
283 //IUserServer implementation
284 public AgentInventory RequestAgentsInventory(LLUUID agentID)
285 {
286 AgentInventory aInventory = null;
287 if (this.userAccounts)
288 {
289 aInventory = this.userManager.GetUsersInventory(agentID);
290 }
291
292 return aInventory;
293 }
294
295 public bool UpdateAgentsInventory(LLUUID agentID, AgentInventory inventory)
296 {
297 return true;
298 }
299
300 public void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
301 {
302
303 }
304 }
305
306
307}