changeset 2578:bf17cc19c1c0

Merge branch 'master' into Dev_main
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Mon, 24 Oct 2016 11:23:02 +0100
parents 522f58e7773e (current diff) 22673a6cfcfb (diff)
children d83b38564fbb 278e6e54703b
files js/core.js php/keygen.php
diffstat 4 files changed, 98 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- a/js/core.js	Tue Oct 18 17:51:53 2016 +0100
+++ b/js/core.js	Mon Oct 24 11:23:02 2016 +0100
@@ -3127,7 +3127,7 @@
     this.initialise = function (existingStore) {
         if (existingStore == undefined) {
             // We need to get the sessionKey
-            this.SessionKey.generateKey();
+            this.SessionKey.requestKey();
             this.document = document.implementation.createDocument(null, "waetresult", null);
             this.root = this.document.childNodes[0];
             var projectDocument = specification.projectXML;
@@ -3156,9 +3156,8 @@
         handleEvent: function () {
             var parse = new DOMParser();
             var xml = parse.parseFromString(this.request.response, "text/xml");
-            var shouldGenerateKey = true;
             if (this.request.response.length == 0) {
-                console.log("Error: Server did not respond");
+                console.error("An unspecified error occured, no server key could be generated");
                 return;
             }
             if (xml.getElementsByTagName("state").length > 0) {
@@ -3166,22 +3165,26 @@
                     this.key = xml.getAllElementsByTagName("key")[0].textContent;
                     this.parent.root.setAttribute("key", this.key);
                     this.parent.root.setAttribute("state", "empty");
-                    shouldGenerateKey = false;
+                    this.update();
+                    return;
+                } else if (xml.getElementsByTagName("state")[0].textContent == "ERROR") {
+                    this.key = null;
+                    console.error("Could not generate server key. Server responded with error message: \"" + xml.getElementsByTagName("message")[0].textContent + "\"");
+                    return;
                 }
             }
-            if (shouldGenerateKey === true) {
-                this.generateKey();
-            }
+            this.key = null;
+            console.error("An unspecified error occured, no server key could be generated");
         },
-        generateKey: function () {
-            var temp_key = randomString(32);
+        requestKey: function () {
+            // For new servers, request a new key from the server
             var returnURL = "";
             if (typeof specification.projectReturn == "string") {
                 if (specification.projectReturn.substr(0, 4) == "http") {
                     returnURL = specification.projectReturn;
                 }
             }
-            this.request.open("GET", returnURL + "php/keygen.php?key=" + temp_key, true);
+            this.request.open("GET", returnURL + "php/requestKey.php", true);
             this.request.addEventListener("load", this);
             this.request.send();
         },
--- a/php/keygen.php	Tue Oct 18 17:51:53 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<?php
-header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
-header("Cache-Control: post-check=0, pre-check=0", false);
-header("Pragma: no-cache");
-// This checks the key sent by the JavaScript against the current bunch of saves
-// XML Saves location - assumes it will be saves/
-$saves = glob("../saves/*.xml");
-
-$key_requested = $_GET['key'];
-
-$xml_good = "<response><state>OK</state><key>".$key_requested."</key></response>";
-$xml_bad = "<response><state>NO</state><key>".$key_requested."</key></response>";
-$xml_error = "<response><state>ERROR</state><key>".$key_requested."</key></response>";
-if (is_array($saves))
-{
-    foreach($saves as $filename) {
-        $xml_string = file_get_contents($filename, FILE_TEXT);
-        $xml_object = simplexml_load_string($xml_string);
-        if ($xml_object != false) {
-            if (isset($value['key']))
-            {
-                if ($value['key'] == $key_requested) {
-                    echo $xml_bad;
-                    return;
-                }
-            }
-        }
-    }
-    echo $xml_good;
-    // TODO:
-    //  Generate the XML Base file and save it
-    $doc_struct = new SimpleXMLElement('<waetresult/>');
-    $doc_struct->addAttribute("key",$key_requested);
-    //  Add start time
-    //  Add IP Address information
-    //  Save the file
-    $doc_struct->asXML("saves/save-".$key_requested.".xml");
-    return;
-} else {
-    echo $xml_error;
-    return;
-}
-?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/php/requestKey.php	Mon Oct 24 11:23:02 2016 +0100
@@ -0,0 +1,61 @@
+<?php
+
+function generateRandomString($length = 32) {
+    // from http://stackoverflow.com/questions/4356289/php-random-string-generator
+    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    $charactersLength = strlen($characters);
+    $randomString = '';
+    for ($i = 0; $i < $length; $i++) {
+        $randomString .= $characters[rand(0, $charactersLength - 1)];
+    }
+    return $randomString;
+}
+
+// Request a new session key from the server
+header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
+header("Cache-Control: post-check=0, pre-check=0", false);
+header("Pragma: no-cache");
+
+$saves = glob("../saves/*.xml");
+
+$key = "";
+
+while ($key == "") {
+    $tempKey = generateRandomString(32);
+    $unique = true;
+    foreach($saves as $filename)
+    {
+        $xml_string = file_get_contents($filename, FILE_TEXT);
+        $xml_object = simplexml_load_string($xml_string);
+        if ($xml_object != false) {
+            if (isset($value['key']))
+            {
+                if ($value['key'] == $key_requested) {
+                    $unique = false;
+                }
+            }
+        }
+    }
+    if ($unique) {
+        $key = $tempKey;
+    }
+}
+
+$filename = "../saves/save-".$key.".xml";
+$fileHandle = fopen($filename, 'w');
+if ($fileHandle == FALSE) {
+    echo "<response><state>ERROR</state><key>".$key."</key><message>Could not open file for writing</message></response>";
+    return;
+}
+fclose($fileHandle);
+// TODO:
+//  Generate the XML Base file and save it
+$doc_struct = new SimpleXMLElement('<waetresult/>');
+$doc_struct->addAttribute("key",$key);
+//  Add start time
+//  Add IP Address information
+//  Save the file
+$doc_struct->asXML($filename);
+echo "<response><state>OK</state><key>".$key."</key></response>";
+return;
+?>
--- a/python/pythonServer.py	Tue Oct 18 17:51:53 2016 +0100
+++ b/python/pythonServer.py	Mon Oct 24 11:23:02 2016 +0100
@@ -11,6 +11,8 @@
 import operator
 import xml.etree.ElementTree as ET
 import copy
+import string
+import random
 
 if sys.version_info[0] == 2:
     # Version 2.x
@@ -109,27 +111,26 @@
         s.send_header("Content-Length", len(fileBytes))
         s.end_headers()
         s.wfile.write(fileBytes)
-
-def keygen(s):
-	reply = ""
-	options = s.path.rsplit('?')
-	options = options[1].rsplit('=')
-	key = options[1]
-	print("Registered key "+key)
-	if os.path.isfile("saves/save-"+key+".xml"):
-		reply = "<response><state>NO</state><key>"+key+"</key></response>"
-	else:
-		reply = "<response><state>OK</state><key>"+key+"</key></response>"
-	s.send_response(200)
-	s.send_header("Content-type", "application/xml")
-	s.end_headers()
-	if sys.version_info[0] == 2:
-		s.wfile.write(reply)
-	elif sys.version_info[0] == 3:
-		s.wfile.write(bytes(reply, "utf-8"))
-	file = open("../saves/save-"+key+".xml",'w')
-	file.write("<waetresult key="+key+"/>")
-	file.close();
+    
+def requestKey(s):
+    reply = ""
+    key = ''
+    while key == '':
+        tempKey = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(32));
+        if (os.path.isfile("saves/save-"+tempKey+".xml") == False):
+            key = tempKey
+    s.send_response(200)
+    s.send_header("Content-type", "application/xml");
+    s.end_headers()
+    reply = "<response><state>OK</state><key>"+key+"</key></response>"
+    if sys.version_info[0] == 2:
+        s.wfile.write(reply)
+    elif sys.version_info[0] == 3:
+        s.wfile.write(bytes(reply, "utf-8"))
+    file = open("../saves/save-"+key+".xml",'w')
+    file.write("<waetresult key="+key+"/>")
+    file.close()
+    
 
 def saveFile(self):
     global curFileName
@@ -226,8 +227,8 @@
     if(request.client_address[0] == "127.0.0.1"):
         if (request.path == "/favicon.ico"):
             send404(request)
-        elif (request.path.split('?',1)[0] == "/php/keygen.php"):
-            keygen(request);
+        elif (request.path.split('?',1)[0] == "/php/requestKey.php"):
+            requestKey(request);
         elif (request.path.split('?',1)[0] == "/php/pool.php"):
             poolXML(request);
         else: