FILE: C:\Windows\SystemApps\Microsoft.Windows.CloudExperienceHost_cw5n1h2txyewy\js\msaUIHandler.js

--
// // Copyright (C) Microsoft. All rights reserved. // /// JS2085.EnableStrictMode, JS2055.DoNotReferenceBannedTerms "use strict"; var CloudExperienceHost; (function (CloudExperienceHost) { var Crypto = Windows.Security.Cryptography; class MSAUIHandlerInternal { constructor(appView, tokenOperation) { this._webAppTelemetry = CloudExperienceHost.Telemetry.WebAppTelemetry.getInstance(); if (!this._webAppTelemetry.isStarted()) { this._webAppTelemetry.start("msaUIHandler"); } this._appView = appView; this._registerNgcOperation = null; this._tokenBrokerOperation = tokenOperation; // Passed by tokenProviderManager WinJS.Namespace.define("CloudExperienceHost.MSAUIHandler", { saveAuthenticationState: this.saveAuthenticationState.bind(this), saveAuthStateAndCompleteWebFlow: this.saveAuthStateAndCompleteWebFlow.bind(this), getVerificationCode: this.getVerificationCode.bind(this), updateLogonCache: this.updateLogonCache.bind(this), completeWebFlow: this.completeWebFlow.bind(this) }); } getTokenOperation() { return this._tokenBrokerOperation; } _buildTicketRequest(target, policy, onComplete, onError) { // Set PostTicketToUrlOperation let webFlowRequest; webFlowRequest = new MicrosoftAccount.TokenProvider.Core.PostTicketToUrlOperation(); webFlowRequest.url = target; webFlowRequest.policy = policy; webFlowRequest.onComplete = onComplete; webFlowRequest.onError = onError; webFlowRequest.isRequestTicketForUrlScenario = false; // Set TokenProviderOperation let tokenOperation; let user = null; if (CloudExperienceHostAPI.FeatureStaging.isOobeFeatureEnabled("MsaMuaFlows")) { user = CloudExperienceHost.IUserManager.getInstance().getIUser(); } tokenOperation = new MicrosoftAccount.TokenProvider.Core.TokenBrokerOperation(user); tokenOperation.isRequestFromWebFlow = true; tokenOperation.isRequestFromUIFlow = true; tokenOperation.webFlowRequest = webFlowRequest; return tokenOperation; } requestTicketForUrl(data, msaTicketContext, navigate) { return new WinJS.Promise(function (completeDispatch, errorDispatch /*, progressDispatch */) { this._appView.showProgress().then(function () { this._webAppTelemetry.logEvent("postTicketToReturnUrl"); if (this._tokenBrokerOperation) { // Concurrent WAM operations are banned. Return ERROR_OPERATION_IN_PROGRESS errorDispatch({ number: -2147024567 }); return; } var tokenOperation; tokenOperation = this._buildTicketRequest(data.targetUrl, data.policy, // On success, navigate to target function (returnUrl, result) { this._tokenBrokerOperation = null; completeDispatch(new CloudExperienceHost.RedirectEventArgs(returnUrl, null, result, result ? "POST" : "GET")); }.bind(this), // On failure, invoke parent error handler in a manner consistent with exceptions. function (error) { this._tokenBrokerOperation = null; errorDispatch({ number: error }); }.bind(this)); this._tokenBrokerOperation = tokenOperation; tokenOperation.loadUrlInWebView = navigate; tokenOperation.webFlowRequest.isRequestTicketForUrlScenario = true; if (msaTicketContext) { tokenOperation.scenarioId = msaTicketContext; } // Request ticket var executor; executor = new MicrosoftAccount.TokenProvider.Core.TokenProviderExecutor(tokenOperation); executor.requestTicketForUrl(); }.bind(this)); }.bind(this)); } requestLPTForUser(data, msaTicketContext, experienceName, navigate) { return new WinJS.Promise(function (completeDispatch, errorDispatch /*, progressDispatch */) { this._appView.showProgress().then(function () { if (this._registerNgcOperation) { // Concurrent NGC operations are banned. Return ERROR_OPERATION_IN_PROGRESS this._webAppTelemetry.logEvent("concurrentNgcRequest", JSON.stringify({ correlationId: this._webAppTelemetry.getId() })); errorDispatch({ number: -2147024567 }); return; } this._webAppTelemetry.logEvent("requestLPTForUser", JSON.stringify({ returnUrl: data.returnUrl, useStrongAuth: data.useStrongAuth, experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), })); var purpose = data.useStrongAuth == true ? "PURPOSE_KEYREGISTER" : "PURPOSE_KEYREGISTER_WEAK"; var tokenOperation; tokenOperation = this._buildTicketRequest("http://passport.net/purpose", purpose, // On success, return LPT function (ignoredUrl, logonProofToken) { this._registerNgcOperation = null; this._webAppTelemetry.logEvent("requestLPTForUser", JSON.stringify({ experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: 0 })); completeDispatch(logonProofToken); }.bind(this), // On failure, invoke parent error handler in a manner consistent with exceptions. function (error) { this._registerNgcOperation = null; this._webAppTelemetry.logEvent("requestLPTForUser", JSON.stringify({ experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: error })); errorDispatch({ number: error }); }.bind(this)); this._registerNgcOperation = tokenOperation; tokenOperation.loadUrlInWebView = navigate; if (msaTicketContext) { tokenOperation.scenarioId = msaTicketContext; } // Request ticket var executor; executor = new MicrosoftAccount.TokenProvider.Core.TokenProviderExecutor(tokenOperation); executor.requestLPTForUser(data.puid || "", data.username || "", data.flowToken || ""); }.bind(this)); }.bind(this)); } registerNGCForUser(data, msaTicketContext, experienceName, navigate) { return new WinJS.Promise(function (completeDispatch, /* _onTicketRequestComplete */ errorDispatch /*, progressDispatch */) { this.requestLPTForUser(data, msaTicketContext, experienceName, navigate).done(function (logonProofToken) { // Create NGC var extension = new MicrosoftAccount.UserOperations.ExtensionForUser(); let user = null; if (CloudExperienceHostAPI.FeatureStaging.isOobeFeatureEnabled("MsaMuaFlows")) { user = CloudExperienceHost.IUserManager.getInstance().getIUser(); } let logonProofTokenBuffer = null; if (logonProofToken) { logonProofTokenBuffer = Crypto.CryptographicBuffer.convertStringToBinary(logonProofToken, Crypto.BinaryStringEncoding.utf8); } extension.createUserIdKeyForUserAsync(user, data.useStrongAuth, data.isNoPassword == true, data.username || "", data.puid || "", logonProofTokenBuffer).done(function () { // Finish this._webAppTelemetry.logEvent("registerNGCForUser", JSON.stringify({ useStrongAuth: data.useStrongAuth, isNoPassword: (data.isNoPassword == true), experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: 0 })); completeDispatch(data.returnUrl); }.bind(this), function (error) { // Error for createUserIdkeyAsync this._webAppTelemetry.logEvent("registerNGCForUser", JSON.stringify({ useStrongAuth: data.useStrongAuth, isNoPassword: (data.isNoPassword == true), experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: error.number })); errorDispatch(error); }.bind(this)); }.bind(this), errorDispatch /* Error for requestLPTForUser */); }.bind(this)); } resetNGCForUser(data, msaTicketContext, experienceName, navigate) { return new WinJS.Promise(function (completeDispatch, /* _onTicketRequestComplete */ errorDispatch /*, progressDispatch */) { this.requestLPTForUser(data, msaTicketContext, experienceName, navigate).done(function (logonProofToken) { // Reset NGC var extension = new MicrosoftAccount.Extension.ExtensionWorkerForUser(); let user = null; if (CloudExperienceHostAPI.FeatureStaging.isOobeFeatureEnabled("MsaMuaFlows")) { user = CloudExperienceHost.IUserManager.getInstance().getIUser(); } let logonProofTokenBuffer = null; if (logonProofToken) { logonProofTokenBuffer = Crypto.CryptographicBuffer.convertStringToBinary(logonProofToken, Crypto.BinaryStringEncoding.utf8); } extension.resetUserIdKeyForUserAsync(user, data.useStrongAuth, data.isNoPassword == true, msaTicketContext, data.username || "", data.puid || "", logonProofTokenBuffer).done(function () { // Finish this._webAppTelemetry.logEvent("resetNGCForUser", JSON.stringify({ useStrongAuth: data.useStrongAuth, isNoPassword: (data.isNoPassword == true), experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: 0 })); completeDispatch(data.returnUrl); }.bind(this), function (error) { // Error for resetUserIdkeyAsync this._webAppTelemetry.logEvent("resetNGCForUser", JSON.stringify({ useStrongAuth: data.useStrongAuth, isNoPassword: (data.isNoPassword == true), experienceName: experienceName, correlationId: this._webAppTelemetry.getId(), hr: error.number })); errorDispatch(error); }.bind(this)); }.bind(this), errorDispatch /* Error for requestLPTForUser */); }.bind(this)); } updateLogonCache(requestId, puid, encryptedPassword) { } getVerificationCode() { let verificationCode = null; if (this._tokenBrokerOperation) { verificationCode = this._tokenBrokerOperation.receivedVerificationCode; } else { verificationCode = CloudExperienceHost.MSA.getVerificationCode(); } if ((typeof (verificationCode) === 'undefined') || verificationCode == "") { verificationCode = null; } return verificationCode; } saveAuthenticationState(data) { let tokenOperation = this._registerNgcOperation || this._tokenBrokerOperation; let dataFromWeb = new MicrosoftAccount.TokenProvider.Core.WebFlowResultData(); let daTokenBuffer = null; if (data.daToken) { daTokenBuffer = Crypto.CryptographicBuffer.convertStringToBinary(data.daToken, Crypto.BinaryStringEncoding.utf8); } let sessionKeyBuffer = null; if (data.sessionKey) { sessionKeyBuffer = Crypto.CryptographicBuffer.decodeFromBase64String(data.sessionKey); } dataFromWeb.daTokenBuffer = daTokenBuffer; dataFromWeb.sessionKeyBuffer = sessionKeyBuffer; dataFromWeb.sessionKeyType = data.sessionKeyType || ""; dataFromWeb.daTokenCreationTime = data.daTokenCreationTime || ""; dataFromWeb.daTokenExpiryTime = data.daTokenExpiryTime || ""; dataFromWeb.puid = data.puid || ""; dataFromWeb.username = data.username || ""; dataFromWeb.isCompleteWebFlow = false; var msaTokenProvider; msaTokenProvider = new MicrosoftAccount.TokenProvider.Core.TokenProviderExecutor(tokenOperation); return msaTokenProvider.saveAuthenticationState(dataFromWeb); } saveAuthStateAndCompleteWebFlow(status, requestId, puid, username, daToken, daTokenCreationTime, daTokenExpiryTime, sessionKey, flowToken, hr, hrInternal, sessionKeyType) { this._webAppTelemetry.logEvent("saveAuthStateAndCompleteWebFlow", hr); var tokenOperation = this._registerNgcOperation || this._tokenBrokerOperation; if (!tokenOperation) { this._webAppTelemetry.logEvent("undefinedTokenOperation"); // The unhandled exception handler in tokenProviderManager calls this function, so throwing would cause infinite recursion. // The TokenProvider error handler page calls this function on "OK", so that would cause an infinite loop. // Nothing we can do here if the caller was WAM. return; } this._appView.showProgress().then(function () { if (tokenOperation.stopListeningForVerificationCode != null) { // This will not exist in non-Token Broker flows. In those cases, we don't have to worry about cancelling anyway. tokenOperation.stopListeningForVerificationCode(); } var msaTokenProvider; msaTokenProvider = new MicrosoftAccount.TokenProvider.Core.TokenProviderExecutor(tokenOperation); if (this._isUndefined("status", status) === true) { msaTokenProvider.failAuthentication("0xc0000163", "0xc0000163"); // 0xc0000163 - TYPE_E_UNDEFINEDTYPE this._webAppTelemetry.logEvent("saveAuthStateAndCompleteStatus", "0xc0000163"); return; } if (status == CloudExperienceHost.AppResult.success) { let dataFromWeb = new MicrosoftAccount.TokenProvider.Core.WebFlowResultData(); let daTokenBuffer = null; if (daToken) { daTokenBuffer = Crypto.CryptographicBuffer.convertStringToBinary(daToken, Crypto.BinaryStringEncoding.utf8); } let sessionKeyBuffer = null; if (sessionKey) { sessionKeyBuffer = Crypto.CryptographicBuffer.decodeFromBase64String(sessionKey); } dataFromWeb.daTokenBuffer = daTokenBuffer; dataFromWeb.sessionKeyBuffer = sessionKeyBuffer; dataFromWeb.sessionKeyType = sessionKeyType; dataFromWeb.daTokenCreationTime = daTokenCreationTime; dataFromWeb.daTokenExpiryTime = daTokenExpiryTime; dataFromWeb.flowToken = flowToken; dataFromWeb.puid = puid; dataFromWeb.username = username; dataFromWeb.isCompleteWebFlow = false; msaTokenProvider.resumeAuthentication(dataFromWeb); } else { if (this._isUndefined("hr", hr) === true) { hr = "0xc0000163"; // STATUS_UNDEFINED_CHARACTER } msaTokenProvider.failAuthentication(hr, hrInternal); this._isUndefined("hrInternal", hrInternal); } this._webAppTelemetry.logEvent("saveAuthStateAndCompleteStatus", JSON.stringify(status)); }.bind(this)); } completeWebFlow(data) { this._webAppTelemetry.logEvent("completeWebFlow", JSON.stringify(data.hr)); var tokenOperation = this._registerNgcOperation || this._tokenBrokerOperation; if (!tokenOperation) { this._webAppTelemetry.logEvent("undefinedTokenOperation"); // The unhandled exception handler in tokenProviderManager calls this function, so throwing would cause infinite recursion. // The TokenProvider error handler page calls this function on "OK", so that would cause an infinite loop. // Nothing we can do here if the caller was WAM. return; } this._appView.showProgress().then(function () { if (tokenOperation.stopListeningForVerificationCode != null) { // This will not exist in non-Token Broker flows. In those cases, we don't have to worry about cancelling anyway. tokenOperation.stopListeningForVerificationCode(); } var msaTokenProvider; msaTokenProvider = new MicrosoftAccount.TokenProvider.Core.TokenProviderExecutor(tokenOperation); if (data.hr.toLowerCase() == "0x0") { var dataFromWeb = new MicrosoftAccount.TokenProvider.Core.WebFlowResultData(); dataFromWeb.flowToken = data.flowToken || ""; dataFromWeb.puid = data.puid || ""; dataFromWeb.username = data.username || ""; dataFromWeb.isCompleteWebFlow = true; msaTokenProvider.resumeAuthentication(dataFromWeb); } else { msaTokenProvider.failAuthentication(data.hr, data.hrInternal); } this._webAppTelemetry.logEvent("completeWebFlow done"); }.bind(this)); } _isUndefined(paramName, param) { if ((typeof (param) === 'undefined')) { this._webAppTelemetry.logEvent("isUndefined", paramName); return true; } return false; } } CloudExperienceHost.MSAUIHandlerInternal = MSAUIHandlerInternal; })(CloudExperienceHost || (CloudExperienceHost = {})); //# sourceMappingURL=msauihandler.js.map
--