mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
107 lines
2.8 KiB
JavaScript
107 lines
2.8 KiB
JavaScript
(function(global) {
|
|
"use strict";
|
|
|
|
function IDPJS() {
|
|
this.domain = window.location.host;
|
|
this.username = "someone@" + this.domain;
|
|
// so rather than create a million different IdP configurations and litter
|
|
// the world with files all containing near-identical code, let's use the
|
|
// hash/URL fragment as a way of generating instructions for the IdP
|
|
this.instructions = window.location.hash.replace("#", "").split(":");
|
|
this.port = window.rtcwebIdentityPort;
|
|
this.port.onmessage = this.receiveMessage.bind(this);
|
|
this.sendResponse({
|
|
type : "READY"
|
|
});
|
|
}
|
|
|
|
IDPJS.prototype.getDelay = function() {
|
|
// instructions in the form "delay123" have that many milliseconds
|
|
// added before sending the response
|
|
var delay = 0;
|
|
function addDelay(instruction) {
|
|
var m = instruction.match(/^delay(\d+)$/);
|
|
if (m) {
|
|
delay += parseInt(m[1], 10);
|
|
}
|
|
}
|
|
this.instructions.forEach(addDelay);
|
|
return delay;
|
|
};
|
|
|
|
function is(target) {
|
|
return function(instruction) {
|
|
return instruction === target;
|
|
};
|
|
}
|
|
|
|
IDPJS.prototype.sendResponse = function(response) {
|
|
// we don't touch the READY message unless told to
|
|
if (response.type === "READY" && !this.instructions.some(is("ready"))) {
|
|
this.port.postMessage(response);
|
|
return;
|
|
}
|
|
|
|
// if any instruction is "error", return an error.
|
|
if (this.instructions.some(is("error"))) {
|
|
response.type = "ERROR";
|
|
}
|
|
|
|
window.setTimeout(function() {
|
|
this.port.postMessage(response);
|
|
}.bind(this), this.getDelay());
|
|
};
|
|
|
|
IDPJS.prototype.receiveMessage = function(ev) {
|
|
var message = ev.data;
|
|
switch (message.type) {
|
|
case "SIGN":
|
|
if (message.username) {
|
|
var at = message.username.indexOf("@");
|
|
if (at < 0) {
|
|
this.username = message.username + "@" + this.domain;
|
|
} else if (message.username.substring(at + 1) === this.domain) {
|
|
this.username = message.username;
|
|
}
|
|
}
|
|
this.sendResponse({
|
|
type : "SUCCESS",
|
|
id : message.id,
|
|
message : {
|
|
idp : {
|
|
domain : this.domain,
|
|
protocol : "idp.html"
|
|
},
|
|
assertion : JSON.stringify({
|
|
username : this.username,
|
|
contents : message.message
|
|
})
|
|
}
|
|
});
|
|
break;
|
|
|
|
case "VERIFY":
|
|
var payload = JSON.parse(message.message);
|
|
this.sendResponse({
|
|
type : "SUCCESS",
|
|
id : message.id,
|
|
message : {
|
|
identity : payload.username,
|
|
contents : payload.contents
|
|
}
|
|
});
|
|
break;
|
|
|
|
default:
|
|
this.sendResponse({
|
|
type : "ERROR",
|
|
id : message.id,
|
|
error : JSON.stringify(message)
|
|
});
|
|
break;
|
|
}
|
|
};
|
|
|
|
global.idp = new IDPJS();
|
|
}(this));
|