summary refs log tree commit diff
path: root/static/client
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2015-02-23 17:09:11 +0000
committerKegan Dougal <kegan@matrix.org>2015-02-23 17:09:11 +0000
commite36b18ad5b271ebba7620dff74647fec8ff55fbf (patch)
tree33fb884cd321d9011fc69dc4708f3f99242e857d /static/client
parentAdd core registration html/js (diff)
downloadsynapse-e36b18ad5b271ebba7620dff74647fec8ff55fbf.tar.xz
Get everything working
Diffstat (limited to 'static/client')
-rw-r--r--static/client/register/index.html14
-rw-r--r--static/client/register/js/register.js123
2 files changed, 113 insertions, 24 deletions
diff --git a/static/client/register/index.html b/static/client/register/index.html
index 2248d6e5a8..d7ed8a1fe7 100644
--- a/static/client/register/index.html
+++ b/static/client/register/index.html
@@ -2,6 +2,7 @@
 <head>
 <title> Registration </title>
 <link rel="stylesheet" href="style.css">
+<script src="js/jquery-2.1.3.min.js"></script>
 <script src="js/recaptcha_ajax.js"></script>
 <script src="register_config.js"></script>
 <script src="js/register.js"></script>
@@ -18,16 +19,11 @@
         	<br/>
         	<input id="pwd2" size="32" type="password" placeholder="Confirm your password"/>
         	<br/>
+            <span id="feedback" style="color: #f00"></span>
+            <br/>
+        	<div id="regcaptcha"></div>
 
-        	<div id="regcaptcha" />
-
-        	<button style="margin: 10px">Sign up</button>
-        </div>
-
-        <div id="serverConfig" ng-show="!wait_3pid_code">
-            <label for="homeserver">Home Server:</label> 
-            <input id="homeserver" size="32" type="text" placeholder="URL (e.g. http://matrix.org:8080)"/>
-            <div class="smallPrint">Your home server stores all your conversation and account data.</div>
+        	<button type="button" style="margin: 10px" onclick="matrixRegistration.signUp()">Sign up</button>
         </div>
     </div>
 </form>
diff --git a/static/client/register/js/register.js b/static/client/register/js/register.js
index b8a9247e6d..38408f731f 100644
--- a/static/client/register/js/register.js
+++ b/static/client/register/js/register.js
@@ -1,23 +1,116 @@
-window.matrixRegistration = {};
+window.matrixRegistration = {
+    endpoint: location.origin + "/_matrix/client/api/v1/register"
+};
 
 var setupCaptcha = function() {
-	if (!window.matrixRegistrationConfig) {
-		return;
-	}
-    console.log("Setting up ReCaptcha");
-    var public_key = window.matrixRegistrationConfig.recaptcha_public_key;
-    if (public_key === undefined) {
-        console.error("No public key defined for captcha!");
+    if (!window.matrixRegistrationConfig) {
         return;
     }
-    Recaptcha.create(public_key,
-    "regcaptcha",
-    {
-      theme: "red",
-      callback: Recaptcha.focus_response_field
+    $.get(matrixRegistration.endpoint, function(response) {
+        var serverExpectsCaptcha = false;
+        for (var i=0; i<response.flows.length; i++) {
+            var flow = response.flows[i];
+            if ("m.login.recaptcha" === flow.type) {
+                serverExpectsCaptcha = true;
+                break;
+            }
+        }
+        if (!serverExpectsCaptcha) {
+            console.log("This server does not require a captcha.");
+            return;
+        }
+        console.log("Setting up ReCaptcha for "+matrixRegistration.endpoint);
+        var public_key = window.matrixRegistrationConfig.recaptcha_public_key;
+        if (public_key === undefined) {
+            console.error("No public key defined for captcha!");
+            return;
+        }
+        Recaptcha.create(public_key,
+        "regcaptcha",
+        {
+            theme: "red",
+            callback: Recaptcha.focus_response_field
+        });
+        window.matrixRegistration.isUsingRecaptcha = true;
+    }).error(errorFunc);
+    
+};
+
+var submitCaptcha = function(user, pwd) {
+    var challengeToken = Recaptcha.get_challenge();
+    var captchaEntry = Recaptcha.get_response();
+    var data = {
+        type: "m.login.recaptcha",
+        challenge: challengeToken,
+        response: captchaEntry
+    };
+    console.log("Submitting captcha");
+    $.post(matrixRegistration.endpoint, JSON.stringify(data), function(response) {
+        console.log("Success -> "+JSON.stringify(response));
+        submitPassword(user, pwd, response.session);
+    }).error(function(err) {
+        Recaptcha.reload();
+        errorFunc(err);
     });
 };
 
+var submitPassword = function(user, pwd, session) {
+    console.log("Registering...");
+    var data = {
+        type: "m.login.password",
+        user: user,
+        password: pwd,
+        session: session
+    };
+    $.post(matrixRegistration.endpoint, JSON.stringify(data), function(response) {
+        matrixRegistration.onRegistered(
+            response.home_server, response.user_id, response.access_token
+        );
+    }).error(errorFunc);
+};
+
+var errorFunc = function(err) {
+    if (err.responseJSON && err.responseJSON.error) {
+        setFeedbackString(err.responseJSON.error + " (" + err.responseJSON.errcode + ")");
+    }
+    else {
+        setFeedbackString("Request failed: " + err.status);
+    }
+};
+
+var setFeedbackString = function(text) {
+    $("#feedback").text(text);
+};
+
 matrixRegistration.onLoad = function() {
-	setupCaptcha();
-};
\ No newline at end of file
+    setupCaptcha();
+};
+
+matrixRegistration.signUp = function() {
+    var user = $("#desired_user_id").val();
+    if (user.length == 0) {
+        setFeedbackString("Must specify a username.");
+        return;
+    }
+    var pwd1 = $("#pwd1").val();
+    var pwd2 = $("#pwd2").val();
+    if (pwd1.length < 6) {
+        setFeedbackString("Password: min. 6 characters.");
+        return;
+    }
+    if (pwd1 != pwd2) {
+        setFeedbackString("Passwords do not match.");
+        return;
+    }
+    if (window.matrixRegistration.isUsingRecaptcha) {
+        submitCaptcha(user, pwd1);
+    }
+    else {
+        submitPassword(user, pwd1);
+    }
+};
+
+matrixRegistration.onRegistered = function(hs_url, user_id, access_token) {
+    // clobber this function
+    console.log("onRegistered - This function should be replaced to proceed.");
+};