зеркало из https://github.com/mozilla/gecko-dev.git
267 строки
8.4 KiB
JavaScript
267 строки
8.4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
|
|
|
// This is the parent process corresponding to nsDOMIdentity.
|
|
let EXPORTED_SYMBOLS = ["DOMIdentity"];
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "IdentityService",
|
|
"resource://gre/modules/identity/Identity.jsm");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this,
|
|
"Logger",
|
|
"resource://gre/modules/identity/LogUtils.jsm");
|
|
|
|
function log(...aMessageArgs) {
|
|
Logger.log.apply(Logger, ["DOMIdentity"].concat(aMessageArgs));
|
|
}
|
|
|
|
function IDDOMMessage(aID) {
|
|
this.id = aID;
|
|
}
|
|
|
|
function IDPProvisioningContext(aID, aOrigin, aTargetMM) {
|
|
this._id = aID;
|
|
this._origin = aOrigin;
|
|
this._mm = aTargetMM;
|
|
}
|
|
|
|
IDPProvisioningContext.prototype = {
|
|
get id() this._id,
|
|
get origin() this._origin,
|
|
|
|
doBeginProvisioningCallback: function IDPPC_doBeginProvCB(aID, aCertDuration) {
|
|
let message = new IDDOMMessage(this.id);
|
|
message.identity = aID;
|
|
message.certDuration = aCertDuration;
|
|
this._mm.sendAsyncMessage("Identity:IDP:CallBeginProvisioningCallback",
|
|
message);
|
|
},
|
|
|
|
doGenKeyPairCallback: function IDPPC_doGenKeyPairCallback(aPublicKey) {
|
|
log("doGenKeyPairCallback");
|
|
let message = new IDDOMMessage(this.id);
|
|
message.publicKey = aPublicKey;
|
|
this._mm.sendAsyncMessage("Identity:IDP:CallGenKeyPairCallback", message);
|
|
},
|
|
|
|
doError: function(msg) {
|
|
log("Provisioning ERROR: " + msg);
|
|
},
|
|
};
|
|
|
|
function IDPAuthenticationContext(aID, aOrigin, aTargetMM) {
|
|
this._id = aID;
|
|
this._origin = aOrigin;
|
|
this._mm = aTargetMM;
|
|
}
|
|
|
|
IDPAuthenticationContext.prototype = {
|
|
get id() this._id,
|
|
get origin() this._origin,
|
|
|
|
doBeginAuthenticationCallback: function IDPAC_doBeginAuthCB(aIdentity) {
|
|
let message = new IDDOMMessage(this.id);
|
|
message.identity = aIdentity;
|
|
this._mm.sendAsyncMessage("Identity:IDP:CallBeginAuthenticationCallback",
|
|
message);
|
|
},
|
|
|
|
doError: function IDPAC_doError(msg) {
|
|
log("Authentication ERROR: " + msg);
|
|
},
|
|
};
|
|
|
|
function RPWatchContext(aID, aOrigin, aLoggedInEmail, aTargetMM) {
|
|
this._id = aID;
|
|
this._origin = aOrigin;
|
|
this._loggedInEmail = aLoggedInEmail;
|
|
this._mm = aTargetMM;
|
|
}
|
|
|
|
RPWatchContext.prototype = {
|
|
get id() this._id,
|
|
get origin() this._origin,
|
|
get loggedInEmail() this._loggedInEmail,
|
|
|
|
doLogin: function RPWatchContext_onlogin(aAssertion) {
|
|
log("doLogin: " + this.id);
|
|
let message = new IDDOMMessage(this.id);
|
|
message.assertion = aAssertion;
|
|
this._mm.sendAsyncMessage("Identity:RP:Watch:OnLogin", message);
|
|
},
|
|
|
|
doLogout: function RPWatchContext_onlogout() {
|
|
log("doLogout :" + this.id);
|
|
let message = new IDDOMMessage(this.id);
|
|
this._mm.sendAsyncMessage("Identity:RP:Watch:OnLogout", message);
|
|
},
|
|
|
|
doReady: function RPWatchContext_onready() {
|
|
log("doReady: " + this.id);
|
|
let message = new IDDOMMessage(this.id);
|
|
this._mm.sendAsyncMessage("Identity:RP:Watch:OnReady", message);
|
|
},
|
|
|
|
doError: function RPWatchContext_onerror(aMessage) {
|
|
log("doError: " + aMessage);
|
|
}
|
|
};
|
|
|
|
let DOMIdentity = {
|
|
// nsIMessageListener
|
|
receiveMessage: function DOMIdentity_receiveMessage(aMessage) {
|
|
let msg = aMessage.json;
|
|
|
|
// Target is the frame message manager that called us and is
|
|
// used to send replies back to the proper window.
|
|
let targetMM = aMessage.target
|
|
.QueryInterface(Ci.nsIFrameLoaderOwner)
|
|
.frameLoader.messageManager;
|
|
|
|
switch (aMessage.name) {
|
|
// RP
|
|
case "Identity:RP:Watch":
|
|
this._watch(msg, targetMM);
|
|
break;
|
|
case "Identity:RP:Request":
|
|
this._request(msg);
|
|
break;
|
|
case "Identity:RP:Logout":
|
|
this._logout(msg);
|
|
break;
|
|
// IDP
|
|
case "Identity:IDP:BeginProvisioning":
|
|
this._beginProvisioning(msg, targetMM);
|
|
break;
|
|
case "Identity:IDP:GenKeyPair":
|
|
this._genKeyPair(msg);
|
|
break;
|
|
case "Identity:IDP:RegisterCertificate":
|
|
this._registerCertificate(msg);
|
|
break;
|
|
case "Identity:IDP:ProvisioningFailure":
|
|
this._provisioningFailure(msg);
|
|
break;
|
|
case "Identity:IDP:BeginAuthentication":
|
|
this._beginAuthentication(msg, targetMM);
|
|
break;
|
|
case "Identity:IDP:CompleteAuthentication":
|
|
this._completeAuthentication(msg);
|
|
break;
|
|
case "Identity:IDP:AuthenticationFailure":
|
|
this._authenticationFailure(msg);
|
|
break;
|
|
}
|
|
},
|
|
|
|
// nsIObserver
|
|
observe: function DOMIdentity_observe(aSubject, aTopic, aData) {
|
|
switch (aTopic) {
|
|
case "domwindowopened":
|
|
case "domwindowclosed":
|
|
let win = aSubject.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDOMWindow);
|
|
this._configureMessages(win, aTopic == "domwindowopened");
|
|
break;
|
|
|
|
case "xpcom-shutdown":
|
|
Services.ww.unregisterNotification(this);
|
|
Services.obs.removeObserver(this, "xpcom-shutdown");
|
|
break;
|
|
}
|
|
},
|
|
|
|
messages: ["Identity:RP:Watch", "Identity:RP:Request", "Identity:RP:Logout",
|
|
"Identity:IDP:BeginProvisioning", "Identity:IDP:ProvisioningFailure",
|
|
"Identity:IDP:RegisterCertificate", "Identity:IDP:GenKeyPair",
|
|
"Identity:IDP:BeginAuthentication",
|
|
"Identity:IDP:CompleteAuthentication",
|
|
"Identity:IDP:AuthenticationFailure"],
|
|
|
|
// Private.
|
|
_init: function DOMIdentity__init() {
|
|
Services.ww.registerNotification(this);
|
|
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
|
},
|
|
|
|
_configureMessages: function DOMIdentity__configureMessages(aWindow, aRegister) {
|
|
if (!aWindow.messageManager)
|
|
return;
|
|
|
|
let func = aWindow.messageManager[aRegister ? "addMessageListener"
|
|
: "removeMessageListener"];
|
|
|
|
for (let message of this.messages) {
|
|
func.call(aWindow.messageManager, message, this);
|
|
}
|
|
},
|
|
|
|
_resetFrameState: function(aContext) {
|
|
log("_resetFrameState: ", aContext.id);
|
|
if (!aContext._mm) {
|
|
throw new Error("ERROR: Trying to reset an invalid context");
|
|
}
|
|
let message = new IDDOMMessage(aContext.id);
|
|
aContext._mm.sendAsyncMessage("Identity:ResetState", message);
|
|
},
|
|
|
|
_watch: function DOMIdentity__watch(message, targetMM) {
|
|
log("DOMIdentity__watch: " + message.id);
|
|
// Pass an object with the watch members to Identity.jsm so it can call the
|
|
// callbacks.
|
|
let context = new RPWatchContext(message.id, message.origin,
|
|
message.loggedInEmail, targetMM);
|
|
IdentityService.RP.watch(context);
|
|
},
|
|
|
|
_request: function DOMIdentity__request(message) {
|
|
IdentityService.RP.request(message.id, message);
|
|
},
|
|
|
|
_logout: function DOMIdentity__logout(message) {
|
|
IdentityService.RP.logout(message.id, message.origin);
|
|
},
|
|
|
|
_beginProvisioning: function DOMIdentity__beginProvisioning(message, targetMM) {
|
|
let context = new IDPProvisioningContext(message.id, message.origin,
|
|
targetMM);
|
|
IdentityService.IDP.beginProvisioning(context);
|
|
},
|
|
|
|
_genKeyPair: function DOMIdentity__genKeyPair(message) {
|
|
IdentityService.IDP.genKeyPair(message.id);
|
|
},
|
|
|
|
_registerCertificate: function DOMIdentity__registerCertificate(message) {
|
|
IdentityService.IDP.registerCertificate(message.id, message.cert);
|
|
},
|
|
|
|
_provisioningFailure: function DOMIdentity__provisioningFailure(message) {
|
|
IdentityService.IDP.raiseProvisioningFailure(message.id, message.reason);
|
|
},
|
|
|
|
_beginAuthentication: function DOMIdentity__beginAuthentication(message, targetMM) {
|
|
let context = new IDPAuthenticationContext(message.id, message.origin,
|
|
targetMM);
|
|
IdentityService.IDP.beginAuthentication(context);
|
|
},
|
|
|
|
_completeAuthentication: function DOMIdentity__completeAuthentication(message) {
|
|
IdentityService.IDP.completeAuthentication(message.id);
|
|
},
|
|
|
|
_authenticationFailure: function DOMIdentity__authenticationFailure(message) {
|
|
IdentityService.IDP.cancelAuthentication(message.id);
|
|
},
|
|
};
|
|
|
|
// Object is initialized by nsIDService.js
|