mirror of
https://github.com/element-hq/synapse
synced 2024-09-02 01:00:23 +00:00
Merge pull request #89 from matrix-org/registration-fallback
Registration fallback
This commit is contained in:
commit
c0aaf9fe76
12 changed files with 433 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -41,3 +41,4 @@ media_store/
|
||||||
build/
|
build/
|
||||||
|
|
||||||
localhost-800*/
|
localhost-800*/
|
||||||
|
static/client/register/register_config.js
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
Changes in synapse vx.x.x (x-x-x)
|
||||||
|
=================================
|
||||||
|
|
||||||
|
* Add support for registration fallback. This is a page hosted on the server
|
||||||
|
which allows a user to register for an account, regardless of what client
|
||||||
|
they are using (e.g. mobile devices).
|
||||||
|
|
||||||
Changes in synapse v0.7.1 (2015-02-19)
|
Changes in synapse v0.7.1 (2015-02-19)
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
|
|
14
UPGRADE.rst
14
UPGRADE.rst
|
@ -1,3 +1,17 @@
|
||||||
|
Upgrading to vx.xx
|
||||||
|
==================
|
||||||
|
|
||||||
|
Servers which use captchas will need to add their public key to::
|
||||||
|
|
||||||
|
static/client/register/register_config.js
|
||||||
|
|
||||||
|
window.matrixRegistrationConfig = {
|
||||||
|
recaptcha_public_key: "YOUR_PUBLIC_KEY"
|
||||||
|
};
|
||||||
|
|
||||||
|
This is required in order to support registration fallback (typically used on
|
||||||
|
mobile devices).
|
||||||
|
|
||||||
Upgrading to v0.7.0
|
Upgrading to v0.7.0
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
|
31
static/client/register/index.html
Normal file
31
static/client/register/index.html
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<html>
|
||||||
|
<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>
|
||||||
|
</head>
|
||||||
|
<body onload="matrixRegistration.onLoad()">
|
||||||
|
<form id="registrationForm">
|
||||||
|
<div>
|
||||||
|
Create account:<br/>
|
||||||
|
|
||||||
|
<div style="text-align: center">
|
||||||
|
<input id="desired_user_id" size="32" type="text" placeholder="Matrix ID (e.g. bob)"/>
|
||||||
|
<br/>
|
||||||
|
<input id="pwd1" size="32" type="password" placeholder="Type a password"/>
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<button type="button" style="margin: 10px" onclick="matrixRegistration.signUp()">Sign up</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
4
static/client/register/js/jquery-2.1.3.min.js
vendored
Normal file
4
static/client/register/js/jquery-2.1.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
195
static/client/register/js/recaptcha_ajax.js
Normal file
195
static/client/register/js/recaptcha_ajax.js
Normal file
File diff suppressed because one or more lines are too long
117
static/client/register/js/register.js
Normal file
117
static/client/register/js/register.js
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
window.matrixRegistration = {
|
||||||
|
endpoint: location.origin + "/_matrix/client/api/v1/register"
|
||||||
|
};
|
||||||
|
|
||||||
|
var setupCaptcha = function() {
|
||||||
|
if (!window.matrixRegistrationConfig) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.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!");
|
||||||
|
setFeedbackString("Misconfigured captcha for server. Contact server admin.");
|
||||||
|
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();
|
||||||
|
};
|
||||||
|
|
||||||
|
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.");
|
||||||
|
};
|
3
static/client/register/register_config.sample.js
Normal file
3
static/client/register/register_config.sample.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
window.matrixRegistrationConfig = {
|
||||||
|
recaptcha_public_key: "YOUR_PUBLIC_KEY"
|
||||||
|
};
|
52
static/client/register/style.css
Normal file
52
static/client/register/style.css
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
font-family: "Myriad Pro", "Myriad", Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 12pt;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 20pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link { color: #666; }
|
||||||
|
a:visited { color: #666; }
|
||||||
|
a:hover { color: #000; }
|
||||||
|
a:active { color: #000; }
|
||||||
|
|
||||||
|
textarea, input {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.smallPrint {
|
||||||
|
color: #888;
|
||||||
|
font-size: 9pt ! important;
|
||||||
|
font-style: italic ! important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#recaptcha_area {
|
||||||
|
margin: auto
|
||||||
|
}
|
||||||
|
|
||||||
|
#registrationForm {
|
||||||
|
text-align: left;
|
||||||
|
padding: 1em;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
-webkit-border-radius: 10px;
|
||||||
|
-moz-border-radius: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.15);
|
||||||
|
-moz-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.15);
|
||||||
|
box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.15);
|
||||||
|
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px #ccc solid;
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
CLIENT_PREFIX = "/_matrix/client/api/v1"
|
CLIENT_PREFIX = "/_matrix/client/api/v1"
|
||||||
CLIENT_V2_ALPHA_PREFIX = "/_matrix/client/v2_alpha"
|
CLIENT_V2_ALPHA_PREFIX = "/_matrix/client/v2_alpha"
|
||||||
FEDERATION_PREFIX = "/_matrix/federation/v1"
|
FEDERATION_PREFIX = "/_matrix/federation/v1"
|
||||||
|
STATIC_PREFIX = "/_matrix/static"
|
||||||
WEB_CLIENT_PREFIX = "/_matrix/client"
|
WEB_CLIENT_PREFIX = "/_matrix/client"
|
||||||
CONTENT_REPO_PREFIX = "/_matrix/content"
|
CONTENT_REPO_PREFIX = "/_matrix/content"
|
||||||
SERVER_KEY_PREFIX = "/_matrix/key/v1"
|
SERVER_KEY_PREFIX = "/_matrix/key/v1"
|
||||||
|
|
|
@ -36,7 +36,8 @@ from synapse.http.server_key_resource import LocalKey
|
||||||
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
||||||
from synapse.api.urls import (
|
from synapse.api.urls import (
|
||||||
CLIENT_PREFIX, FEDERATION_PREFIX, WEB_CLIENT_PREFIX, CONTENT_REPO_PREFIX,
|
CLIENT_PREFIX, FEDERATION_PREFIX, WEB_CLIENT_PREFIX, CONTENT_REPO_PREFIX,
|
||||||
SERVER_KEY_PREFIX, MEDIA_PREFIX, CLIENT_V2_ALPHA_PREFIX, APP_SERVICE_PREFIX
|
SERVER_KEY_PREFIX, MEDIA_PREFIX, CLIENT_V2_ALPHA_PREFIX, APP_SERVICE_PREFIX,
|
||||||
|
STATIC_PREFIX
|
||||||
)
|
)
|
||||||
from synapse.config.homeserver import HomeServerConfig
|
from synapse.config.homeserver import HomeServerConfig
|
||||||
from synapse.crypto import context_factory
|
from synapse.crypto import context_factory
|
||||||
|
@ -81,6 +82,9 @@ class SynapseHomeServer(HomeServer):
|
||||||
webclient_path = os.path.join(syweb_path, "webclient")
|
webclient_path = os.path.join(syweb_path, "webclient")
|
||||||
return File(webclient_path) # TODO configurable?
|
return File(webclient_path) # TODO configurable?
|
||||||
|
|
||||||
|
def build_resource_for_static_content(self):
|
||||||
|
return File("static")
|
||||||
|
|
||||||
def build_resource_for_content_repo(self):
|
def build_resource_for_content_repo(self):
|
||||||
return ContentRepoResource(
|
return ContentRepoResource(
|
||||||
self, self.upload_dir, self.auth, self.content_addr
|
self, self.upload_dir, self.auth, self.content_addr
|
||||||
|
@ -124,7 +128,9 @@ class SynapseHomeServer(HomeServer):
|
||||||
(SERVER_KEY_PREFIX, self.get_resource_for_server_key()),
|
(SERVER_KEY_PREFIX, self.get_resource_for_server_key()),
|
||||||
(MEDIA_PREFIX, self.get_resource_for_media_repository()),
|
(MEDIA_PREFIX, self.get_resource_for_media_repository()),
|
||||||
(APP_SERVICE_PREFIX, self.get_resource_for_app_services()),
|
(APP_SERVICE_PREFIX, self.get_resource_for_app_services()),
|
||||||
|
(STATIC_PREFIX, self.get_resource_for_static_content()),
|
||||||
]
|
]
|
||||||
|
|
||||||
if web_client:
|
if web_client:
|
||||||
logger.info("Adding the web client.")
|
logger.info("Adding the web client.")
|
||||||
desired_tree.append((WEB_CLIENT_PREFIX,
|
desired_tree.append((WEB_CLIENT_PREFIX,
|
||||||
|
|
|
@ -73,6 +73,7 @@ class BaseHomeServer(object):
|
||||||
'resource_for_client',
|
'resource_for_client',
|
||||||
'resource_for_client_v2_alpha',
|
'resource_for_client_v2_alpha',
|
||||||
'resource_for_federation',
|
'resource_for_federation',
|
||||||
|
'resource_for_static_content',
|
||||||
'resource_for_web_client',
|
'resource_for_web_client',
|
||||||
'resource_for_content_repo',
|
'resource_for_content_repo',
|
||||||
'resource_for_server_key',
|
'resource_for_server_key',
|
||||||
|
|
Loading…
Reference in a new issue