public void TestVerifyFalseKey()
        {
            Dictionary<string, string> insertedData = createRequestData();

            insertedData.Remove("secret");
            insertedData.Add("secret", "shk5");

            String value = "";
            insertedData.TryGetValue("email", out value);
            string authorization = value;
            insertedData.TryGetValue("secret", out value);
            authorization += value + "mg24";

            Request request = new Request(null, RestService.Web_Service.RestMethods.GET, insertedData, null, authorization);

            try
            {
                Authenticator.VerifyHash(request);
                Assert.Fail("No exception was thrown");
            }
            catch (Exception e)
            {
                Assert.AreEqual("No such clientKey exists", e.Message);
            }
        }
        public void TestTokenHandler()
        {
            DatabaseConnection db = new DatabaseConnection("SMU");
            PreparedStatement stmt = db.Prepare("SELECT * FROM user_account WHERE id = 14");

            SqlDataReader reader = db.Query(null, stmt); ;

            User user = null;
            while (reader.Read())
            {
                int id = reader.GetInt32(reader.GetOrdinal("id"));
                string userEmail = reader.GetString(reader.GetOrdinal("email"));
                string userPassword = reader.GetString(reader.GetOrdinal("password_hash"));

                //TODO userdata has to be fetched witht he rast of the data
                user = new User(id, userEmail, userPassword, null);
            }

            Token token = TokenHandler.getToken(user.email, user.password);

            Console.WriteLine(token.token);

            Request preRequest = new Request(null, 0, null, null, token.token);

            Request postRequest = TokenHandler.validateTokenAndGetUser(preRequest);

            Assert.IsTrue(user.id == postRequest.user.id);
        }
        public void TestVerifyFalseHash()
        {
            Dictionary<string, string> insertedData = createRequestData();

            String value = "";
            insertedData.TryGetValue("email", out value);
            string authorization = value;
            insertedData.TryGetValue("secret", out value);
            authorization += value + "mg24";

            authorization = SHAEncrypter.SHAEncrypt(authorization);

            insertedData.Remove("email");
            insertedData.Add("email", "*****@*****.**");

            Request request = new Request(null, RestService.Web_Service.RestMethods.GET, insertedData, null, authorization);

            Assert.IsFalse(Authenticator.VerifyHash(request));
        }
        public static Request validateTokenAndGetUser(Request request)
        {
            string emailAndPassword = DecryptToken(request.authorization);

            string [] emailAndPasswordArray = emailAndPassword.Split(new string[] { ":::" }, StringSplitOptions.None);

            string email = emailAndPasswordArray[0];
            string password = emailAndPasswordArray[1];
            DateTime expires;
            try
            {
                expires = DateTime.Parse(emailAndPasswordArray[2]);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw new Exception("Token is invalid");
            }

            if (DateTime.Now.CompareTo(expires) > 0)
            {
                Exception ex = new Exception("The token is expired");
                ex.Data.Add("errorCode", 201);

                throw ex;
            }
            else
            {
                User user = GetUser(email, password);

                if (user == null)
                {
                    throw new Exception("Token is invalid");
                }
                else
                {
                    request.user = user;
                    return request;
                }
            }
        }
        /**
         * The method will return false if it at any point is unable to verify
         * the hash. This can be due to the hash not being present in the request,
         * or the requestHash not matching the verificationHash.
         */
        public static bool VerifyHash(Request request)
        {
            string requestHash = request.authorization;

            /**
             * Declaring verificationString here as part of creating the correct
             * string using an unknown amount of data.
             */
            string verificationString = "";
            foreach (KeyValuePair<string, string> dataPair in request.data)
            { verificationString += dataPair.Value; }

            string hashKey = "";
            if (request.data.TryGetValue("secret", out hashKey))
            { verificationString += GetSecretKey(hashKey); }
            else
            { throw new Exception("Hashkey not found. Cannot look up secretKey"); }

            string verificationHash = SHAEncrypter.SHAEncrypt(verificationString);

            if (verificationHash.Equals(requestHash)) { return true; }
            return false;
        }