· 9 years ago · Jul 11, 2017, 11:14 PM
1using DarkRift;
2using DarkRift.ConfigTools;
3using DarkRift.Storage;
4using System;
5using System.Collections.Generic;
6
7
8namespace LoginPlugin
9{
10 public class LoginPlugin : Plugin
11 {
12 /// Plugin Discription
13
14 public override string name { get { return "LoginPlugin"; } }
15 public override string version { get { return "1.0"; } }
16 public override string author { get { return "Ken McClelland"; } }
17 public override string supportEmail { get { return "admin@knktech.com"; } }
18
19 public override Command[] commands
20 {
21 get
22 {
23 return new Command[]
24 {
25 new Command("UserCreate", "Turns ON and OFF User creation [on / off]", new Action<string[]>(UserCreateCommand)),
26 new Command("AddUser", "Adds a User To the DB [AddUser name password]", new Action<string[]>(AddUserCommand)),
27 new Command("LPDebug", "Turns on Plugin Debug", new Action<string[]>(DebugCommand))
28
29 };
30 }
31 }
32
33 /// All Variables we going to Read out of the Config File
34 private ConfigReader _settings;
35
36 private byte _loginT;
37 private ushort _loginSUserLogin;
38 private ushort _loginSLogoutUser;
39 private ushort _loginSAddUser;
40 private ushort _loginSLoginSuccess;
41 private ushort _loginSLoginFailed;
42 private ushort _loginSLogoutSuccess;
43 private ushort _loginSAddUserSuccess;
44 private ushort _loginSAddUserFailed;
45
46 private bool _allowAddUser = false;
47 private bool _debug = false;
48
49 private object _obj;
50
51 private int _reason;
52
53 public LoginPlugin()
54 {
55 /// <summary> If not Installed Make Plugin Directory under ./Plugins/Pluginname Also Create Database Table for this.
56 if (!IsInstalled())
57 {
58 InstallSubdirectory(
59 new Dictionary<string, byte[]>()
60 {
61 {"settings.cnf", System.Text.ASCIIEncoding.ASCII.GetBytes("LoginTag:\t\t\t\t\t10\n"+
62 "LoginSubjectUserLogin:\t\t1\n"+
63 "LoginSubjectLogoutUser:\t\t2\n"+
64 "LoginSubjectAddUser:\t\t3\n"+
65 "LoginSubjectLoginSuccess:\t4\n"+
66 "LoginSubjectLoginFailed:\t5\n"+
67 "LoginSubjectLogoutSuccess:\t6\n"+
68 "LoginSubjectAddUserSuccess:\t7\n"+
69 "LoginSubjectAddUserFailed:\t7\n"+
70 "AllowAddUser:\t\t\tTrue\n"+
71 "Debug:\t\t\t\t\t\tTrue") }
72 }
73 );
74 try
75 {
76 DarkRiftServer.database.ExecuteNonQuery(
77 "CREATE TABLE IF NOT EXISTS tblPlayer(" +
78 "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, " +
79 "username VARCHAR(50) NOT NULL, " +
80 "password VARCHAR(200) NOT NULL ) ", new QueryParameter[0]
81 );
82 }
83 catch (DatabaseException e)
84 {
85 Interface.LogError("[LoginPlugin] SQL error during step:" + e.ToString());
86
87 if (_debug)
88 Interface.Log("[LoginPlugin] SQL error during setup:");
89 }
90 }
91
92 /// Read Settings from settings.cnf
93
94 _settings = new ConfigReader(GetSubdirectory() + "/settings.cnf");
95
96 /// Read Variables
97
98 if (!byte.TryParse(_settings["LoginTag"], out _loginT))
99 {
100 Interface.LogFatal("[LoginPlugin] Plugin Tag could not be found in settings.cnf");
101 DarkRiftServer.Close(true);
102 }
103 if (!ushort.TryParse(_settings["LoginSubjectUserLogin"], out _loginSUserLogin))
104 {
105 Interface.LogFatal("[LoginPlugin] User Login Subject could not be found in settings.cnf");
106 DarkRiftServer.Close(true);
107 }
108 if (!ushort.TryParse(_settings["LoginSubjectLogoutUser"], out _loginSLogoutUser))
109 {
110 Interface.LogFatal("[LoginPlugin] User Logout Subject could not be found in settings.cnf");
111 DarkRiftServer.Close(true);
112 }
113 if (!ushort.TryParse(_settings["LoginSubjectAddUser"], out _loginSAddUser))
114 {
115 Interface.LogFatal("[LoginPlugin] Add User Subject could not be found in settings.cnf");
116 DarkRiftServer.Close(true);
117 }
118 if (!ushort.TryParse(_settings["LoginSubjectLoginSuccess"], out _loginSLoginSuccess))
119 {
120 Interface.LogFatal("[LoginPlugin] User Login Success Subject could not be found in settings.cnf");
121 DarkRiftServer.Close(true);
122 }
123 if (!ushort.TryParse(_settings["LoginSubjectLoginFailed"], out _loginSLoginFailed))
124 {
125 Interface.LogFatal("[LoginPlugin] User Login Failed Subject could not be found in settings.cnf");
126 DarkRiftServer.Close(true);
127 }
128 if (!ushort.TryParse(_settings["LoginSubjectLogoutSuccess"], out _loginSLogoutSuccess))
129 {
130 Interface.LogFatal("[LoginPlugin] User Logout Success Subject could not be found in settings.cnf");
131 DarkRiftServer.Close(true);
132 }
133 if (!ushort.TryParse(_settings["LoginSubjectAddUserSuccess"], out _loginSAddUserSuccess))
134 {
135 Interface.LogFatal("[LoginPlugin] Add User Success Subject could not be found in settings.cnf");
136 DarkRiftServer.Close(true);
137 }
138 if (!ushort.TryParse(_settings["LoginSubjectAddUserFailed"], out _loginSAddUserFailed))
139 {
140 Interface.LogFatal("[LoginPlugin] Add User Failed Subject could not be found in settings.cnf");
141 DarkRiftServer.Close(true);
142 }
143 if (!bool.TryParse(_settings["AllowAddUser"], out _allowAddUser))
144 {
145 Interface.LogFatal("[LoginPlugin] Allow Add User could not be found in settings.cnf");
146 DarkRiftServer.Close(true);
147 }
148 if (!bool.TryParse(_settings["Debug"], out _debug))
149 {
150 Interface.LogFatal("[LoginPlugin] Debug Setting could not be found in settings.cnf");
151 DarkRiftServer.Close(true);
152 }
153
154 /// Add us to the one Server message Event
155
156 ConnectionService.onServerMessage += OnServerMessage;
157 }
158
159 private void OnServerMessage(ConnectionService con, NetworkMessage data)
160 {
161 if (data.tag == _loginT)
162 {
163 /// Did we get an User Login Message
164 if (data.subject == _loginSUserLogin)
165 {
166 #region Login
167
168 bool isloggedin = false;
169 if (con.HasData(name, "IsLoggedIn"))
170 isloggedin = (bool)con.GetData(name, "IsLoggedIn");
171
172 if (!isloggedin)
173 {
174 try
175 {
176 using (DarkRiftReader reader = (DarkRiftReader)data.data)
177 {
178 string _username = reader.ReadString();
179 string _password = reader.ReadString();
180
181 DatabaseRow[] rows = DarkRiftServer.database.ExecuteQuery(
182 "SELECT id FROM tblPlayer WHERE username = @username AND password = @password LIMIT 1 ",
183 new QueryParameter("username", _username),
184 new QueryParameter("password", _password)
185 );
186 if (rows.Length == 1)
187 {
188 bool _hasuma = false;
189 int id = Convert.ToInt32(rows[0]["id"]);
190
191 con.SetData(name, "IsLoggedIn", true);
192 con.SetData(name, "UserID", id);
193 DarkRiftWriter writer = new DarkRiftWriter();
194
195 writer.Write(_hasuma);
196 writer.Write(id);
197
198 con.SendReply(_loginT, _loginSLoginSuccess, writer);
199
200 if (_debug)
201 Interface.Log("[LoginPlugin] Successfull login (" + id + ").");
202 }
203 else
204 {
205 if (_debug)
206 Interface.Log("[LoginPlugin] User " + _username + " could not login");
207 _reason = 0;
208 con.SendReply(_loginT, _loginSLoginFailed, _reason);
209 }
210 }
211 }
212 catch (InvalidCastException)
213 {
214 if (_debug)
215 Interface.Log("[LoginPlugin] Invalid data receieved in a Login request.");
216 _reason = -1;
217 con.SendReply(_loginT, _loginSLoginFailed, _reason);
218 }
219 }
220
221 #endregion Login
222 }
223 /// Did we get an User Logout Message
224 if (data.subject == _loginSLogoutUser)
225 {
226 Interface.Log("Logout");
227 }
228 /// Did we get an Add User Message
229 if (data.subject == _loginSAddUser)
230 {
231
232 #region AddUser
233
234 if (_allowAddUser)
235 {
236 try
237 {
238 using (DarkRiftReader reader = (DarkRiftReader)data.data)
239 {
240 string _username = reader.ReadString();
241 string _password = reader.ReadString();
242
243 if (!CheckUser(_username, _password))
244 {
245 AddUser(_username, _password);
246 }
247 _reason = 1;
248 con.SendReply(_loginT, _loginSAddUserSuccess, _reason);
249 }
250 }
251 catch (InvalidCastException)
252 {
253 if (_debug)
254 Interface.Log("[LoginPlugin] Add user Failed, Invalid data recieved. ");
255 _reason = -1;
256 con.SendReply(_loginT, _loginSAddUserFailed, _reason);
257 }
258 }
259
260 #endregion AddUser
261 }
262
263 }
264 }
265
266 private void UserCreateCommand(String[] _commandStr)
267 {
268 if (_commandStr.Length != 1)
269 {
270 LogColor("You need to call this command with [UserCreate on] or [UserCreate off]", ConsoleColor.DarkMagenta);
271 return;
272 }
273 if (_commandStr[0] == "on")
274 {
275 this._allowAddUser = true;
276 LogColor("Add User creation is " + _commandStr[0], ConsoleColor.Yellow);
277 }
278 else if (_commandStr[0] == "off")
279 {
280 this._allowAddUser = false;
281 LogColor("Add User creation is " + _commandStr[0], ConsoleColor.Yellow);
282 }
283
284 }
285
286 private void AddUser(String _username, String _password)
287 {
288 try
289 {
290 DarkRiftServer.database.ExecuteNonQuery(
291 "INSERT INTO tblPlayer(username, password) VALUES(@username, @password)",
292 new QueryParameter("username", _username),
293 new QueryParameter("password", _password)
294 );
295 if (_debug)
296 Interface.Log("[LoginPlugin] New User : " + _username);
297 }
298 catch (DatabaseException e)
299 {
300 if (_debug)
301 {
302 Interface.Log("[LoginPlugin] Add user failed. \n" + e.ToString());
303 }
304 }
305 }
306
307 private void AddUserCommand(String[] _commandStr)
308 {
309 if (_commandStr.Length != 2) return;
310
311 string _username = _commandStr[0];
312 string _password = HashHelper.ReturnHash(_commandStr[1], HashType.SHA256);
313
314 if (!CheckUser(_username, _password))
315 {
316 AddUser(_username, _password);
317 }
318 }
319
320 private void DebugCommand(String[] _commandStr)
321 {
322 _debug = !_debug;
323 Interface.Log("[LoginPlugin] Debug is " + _debug);
324 }
325
326 private bool CheckUser(String _username, String _password)
327 {
328 try
329 {
330 _obj = DarkRiftServer.database.ExecuteScalar(
331 "SELECT EXISTS(SELECT 1 FROM tblPlayer WHERE username = @username ) ",
332 new QueryParameter("username", _username)
333 );
334 return Convert.ToBoolean(_obj);
335 }
336 catch (DatabaseException e)
337 {
338 if (_debug)
339 {
340 Interface.Log("[LoginPlugin] Add user failed." + e.ToString());
341 }
342 return true;
343 }
344 }
345
346 private void LogColor(String _text, ConsoleColor _color)
347 {
348 Console.ForegroundColor = _color;
349 Interface.Log(_text);
350 Console.ForegroundColor = ConsoleColor.White;
351 }
352 }
353}