From 7b806ac8479b660bba4ad030988085c1113d0103 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Tue, 13 Oct 2015 22:03:08 +0200 Subject: [PATCH] Encode/decode password. Added Length options to protocol. --- ErgometerLibrary/Helper.cs | 12 +++ ErgometerLibrary/NetCommand.cs | 105 +++++++++++++++----- ErgometerLibrary/Properties/AssemblyInfo.cs | 4 +- 3 files changed, 93 insertions(+), 28 deletions(-) diff --git a/ErgometerLibrary/Helper.cs b/ErgometerLibrary/Helper.cs index c5b196e..51c7a9e 100644 --- a/ErgometerLibrary/Helper.cs +++ b/ErgometerLibrary/Helper.cs @@ -16,5 +16,17 @@ namespace ErgometerLibrary string timestr = time.AddMilliseconds(millis) + ""; return timestr; } + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } } } diff --git a/ErgometerLibrary/NetCommand.cs b/ErgometerLibrary/NetCommand.cs index ccd66c8..8da7c53 100644 --- a/ErgometerLibrary/NetCommand.cs +++ b/ErgometerLibrary/NetCommand.cs @@ -8,10 +8,11 @@ namespace ErgometerLibrary { public class NetCommand { - public enum CommandType { LOGIN, DATA, CHAT, LOGOUT, SESSION, VALUESET, USER, RESPONSE, REQUEST } + public enum CommandType { LOGIN, DATA, CHAT, LOGOUT, SESSION, VALUESET, USER, RESPONSE, REQUEST, LENGTH, SESSIONDATA } public enum RequestType { USERS, ALLSESSIONS, CURRENTSESSIONS, OLDDATA, SESSIONDATA } public enum ResponseType { LOGINOK, LOGINWRONG, ERROR, NOTLOGGEDIN } public enum ValueType { TIME, POWER, ENERGY, DISTANCE } + public enum LengthType { USERS, SESSIONS, SESSIONDATA, DATA, CURRENTSESSIONS} public double Timestamp { get; set; } public int Session { get; set; } @@ -19,13 +20,14 @@ namespace ErgometerLibrary public ResponseType Response { get; set; } public ValueType Value { get; set; } public RequestType Request { get; set; } + public LengthType Length { get; set; } public double SetValue { get; set; } public string DisplayName { get; set; } public bool IsDoctor { get; set; } public string Password { get; set; } public string ChatMessage { get; set; } public Meting Meting { get; set; } - public Dictionary users; + public int LengthValue { get; set; } //SESSION public NetCommand(int session) @@ -35,6 +37,15 @@ namespace ErgometerLibrary Timestamp = Helper.Now; } + //SESSIONDATA + public NetCommand(string name, bool foo, int session) + { + Type = CommandType.SESSIONDATA; + Session = session; + Timestamp = Helper.Now; + DisplayName = name; + } + //RESPONSE public NetCommand(ResponseType response, int session) { @@ -44,6 +55,16 @@ namespace ErgometerLibrary Response = response; } + //Length + public NetCommand(LengthType lengthtype, int length, int session) + { + Type = CommandType.LENGTH; + Length = lengthtype; + Session = session; + Timestamp = Helper.Now; + LengthValue = length; + } + //REQUEST public NetCommand(RequestType request, int session) { @@ -90,12 +111,12 @@ namespace ErgometerLibrary SetValue = val; } - //USERS - public NetCommand(Dictionary users, int session) + //USER + public NetCommand(string username, string password, int session) { Type = CommandType.USER; Session = session; - this.users = users; + DisplayName = username; } //LOGIN @@ -146,14 +167,50 @@ namespace ErgometerLibrary case 7: return ParseValue(session, args); case 8: - return ParseUsers(session, args); + return ParseUser(session, args); case 9: return ParseRequest(session, args); + case 10: + return ParseLength(session, args); + case 11: + return ParseSessionData(session, args); default: throw new FormatException("Error in NetCommand: " + comType + " is not a valid command type."); } } + private static NetCommand ParseSessionData(int session, string[] args) + { + if (args.Length != 1) + throw new MissingFieldException("Error in NetCommand: Session Data is missing arguments"); + + NetCommand temp = new NetCommand(args[0], false, session); + + return temp; + } + + private static NetCommand ParseLength(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: Length is missing arguments"); + + switch (args[0]) + { + case "users": + return new NetCommand(LengthType.USERS, int.Parse(args[1]), session); + case "sessiondata": + return new NetCommand(LengthType.SESSIONDATA, int.Parse(args[1]), session); + case "sessions": + return new NetCommand(LengthType.SESSIONS, int.Parse(args[1]), session); + case "data": + return new NetCommand(LengthType.DATA, int.Parse(args[1]), session); + case "currentsessions": + return new NetCommand(LengthType.CURRENTSESSIONS, int.Parse(args[1]), session); + default: + throw new FormatException("Error in NetCommand: Length type not recognised"); + } + } + private static NetCommand ParseRequest(int session, string[] args) { if (args.Length != 1) @@ -176,22 +233,14 @@ namespace ErgometerLibrary } } - private static NetCommand ParseUsers(int session, string[] args) + private static NetCommand ParseUser(int session, string[] args) { - if (args.Length < 2) - throw new MissingFieldException("Error in NetCommand: Users is missing arguments"); + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: User is missing arguments"); - Dictionary users = new Dictionary(); + NetCommand temp = new NetCommand(args[0], Helper.Base64Decode(args[1]), session); - foreach(string str in args) - { - string[] temp = str.Split('|'); - string name = temp[0]; - string password = temp[1]; - users.Add(name, password); - } - - return new NetCommand(users, session); + return temp; } private static NetCommand ParseValue(int session, string[] args) @@ -227,6 +276,8 @@ namespace ErgometerLibrary return new NetCommand(ResponseType.LOGINWRONG, session); case "notloggedin": return new NetCommand(ResponseType.NOTLOGGEDIN, session); + case "error": + return new NetCommand(ResponseType.ERROR, session); default: throw new FormatException("Error in NetCommand: Response type not recognised"); } @@ -281,7 +332,7 @@ namespace ErgometerLibrary NetCommand temp = new NetCommand(CommandType.LOGIN, session); temp.IsDoctor = doctor; temp.DisplayName = args[0]; - temp.Password = args[1]; + temp.Password = Helper.Base64Decode(args[1]); return temp; } @@ -293,7 +344,7 @@ namespace ErgometerLibrary switch (Type) { case CommandType.LOGIN: - command += "1»ses" + Session + "»" + DisplayName + "»" + Password + "»" + IsDoctor; + command += "1»ses" + Session + "»" + DisplayName + "»" + Helper.Base64Encode(Password) + "»" + IsDoctor; break; case CommandType.DATA: command += "2»ses" + Session + "»" + Meting.ToCommand(); @@ -314,15 +365,17 @@ namespace ErgometerLibrary command += "7»ses" + Session + "»" + Value.ToString().ToLower() + "»" + SetValue; break; case CommandType.USER: - command += "8»ses" + Session; - foreach(KeyValuePair keys in users) - { - command += "»" + keys.Key + "|" + keys.Value; - } + command += "8»ses" + Session + "»" + DisplayName + "»" + Helper.Base64Encode(Password); break; case CommandType.REQUEST: command += "9»ses" + Session + "»" + Request.ToString().ToLower(); break; + case CommandType.LENGTH: + command += "10»ses" + Session + "»" + Length.ToString().ToLower() + "»" + LengthValue; + break; + case CommandType.SESSIONDATA: + command += "11»ses" + Session + "»" + DisplayName; + break; default: throw new FormatException("Error in NetCommand: Cannot find type of command"); diff --git a/ErgometerLibrary/Properties/AssemblyInfo.cs b/ErgometerLibrary/Properties/AssemblyInfo.cs index fa69407..d767043 100644 --- a/ErgometerLibrary/Properties/AssemblyInfo.cs +++ b/ErgometerLibrary/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.2.8")] -[assembly: AssemblyFileVersion("1.0.2.8")] +[assembly: AssemblyVersion("1.0.3.0")] +[assembly: AssemblyFileVersion("1.0.3.0")]