Microsoft Authentication (#216)
This commit is contained in:
@@ -4,6 +4,7 @@ const semver = require('semver')
|
||||
|
||||
const { JavaGuard } = require('./assets/js/assetguard')
|
||||
const DropinModUtil = require('./assets/js/dropinmodutil')
|
||||
const { MSFT_OPCODE, MSFT_REPLY_TYPE, MSFT_ERROR } = require('./assets/js/ipcconstants')
|
||||
|
||||
const settingsState = {
|
||||
invalid: new Set()
|
||||
@@ -314,8 +315,11 @@ settingsNavDone.onclick = () => {
|
||||
* Account Management Tab
|
||||
*/
|
||||
|
||||
// Bind the add account button.
|
||||
document.getElementById('settingsAddAccount').onclick = (e) => {
|
||||
const msftLoginLogger = LoggerUtil.getLogger('Microsoft Login')
|
||||
const msftLogoutLogger = LoggerUtil.getLogger('Microsoft Logout')
|
||||
|
||||
// Bind the add mojang account button.
|
||||
document.getElementById('settingsAddMojangAccount').onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||
loginViewOnCancel = VIEWS.settings
|
||||
loginViewOnSuccess = VIEWS.settings
|
||||
@@ -323,6 +327,102 @@ document.getElementById('settingsAddAccount').onclick = (e) => {
|
||||
})
|
||||
}
|
||||
|
||||
// Bind the add microsoft account button.
|
||||
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGIN, VIEWS.settings, VIEWS.settings)
|
||||
})
|
||||
}
|
||||
|
||||
// Bind reply for Microsoft Login.
|
||||
ipcRenderer.on(MSFT_OPCODE.REPLY_LOGIN, (_, ...arguments_) => {
|
||||
if (arguments_[0] === MSFT_REPLY_TYPE.ERROR) {
|
||||
|
||||
const viewOnClose = arguments_[2]
|
||||
console.log(arguments_)
|
||||
switchView(getCurrentView(), viewOnClose, 500, 500, () => {
|
||||
|
||||
if(arguments_[1] === MSFT_ERROR.NOT_FINISHED) {
|
||||
// User cancelled.
|
||||
msftLoginLogger.info('Login cancelled by user.')
|
||||
return
|
||||
}
|
||||
|
||||
// Unexpected error.
|
||||
setOverlayContent(
|
||||
'Something Went Wrong',
|
||||
'Microsoft authentication failed. Please try again.',
|
||||
'OK'
|
||||
)
|
||||
setOverlayHandler(() => {
|
||||
toggleOverlay(false)
|
||||
})
|
||||
toggleOverlay(true)
|
||||
})
|
||||
} else if(arguments_[0] === MSFT_REPLY_TYPE.SUCCESS) {
|
||||
const queryMap = arguments_[1]
|
||||
const viewOnClose = arguments_[2]
|
||||
|
||||
// Error from request to Microsoft.
|
||||
if (Object.prototype.hasOwnProperty.call(queryMap, 'error')) {
|
||||
switchView(getCurrentView(), viewOnClose, 500, 500, () => {
|
||||
// TODO Dont know what these errors are. Just show them I guess.
|
||||
// This is probably if you messed up the app registration with Azure.
|
||||
console.log('Error getting authCode, is Azure application registered correctly?')
|
||||
console.log(error)
|
||||
console.log(error_description)
|
||||
console.log('Full query map', queryMap)
|
||||
let error = queryMap.error // Error might be 'access_denied' ?
|
||||
let errorDesc = queryMap.error_description
|
||||
setOverlayContent(
|
||||
error,
|
||||
errorDesc,
|
||||
'OK'
|
||||
)
|
||||
setOverlayHandler(() => {
|
||||
toggleOverlay(false)
|
||||
})
|
||||
toggleOverlay(true)
|
||||
|
||||
})
|
||||
} else {
|
||||
|
||||
msftLoginLogger.info('Acquired authCode, proceeding with authentication.')
|
||||
|
||||
const authCode = queryMap.code
|
||||
AuthManager.addMicrosoftAccount(authCode).then(value => {
|
||||
updateSelectedAccount(value)
|
||||
switchView(getCurrentView(), viewOnClose, 500, 500, () => {
|
||||
prepareSettings()
|
||||
})
|
||||
})
|
||||
.catch((displayableError) => {
|
||||
|
||||
let actualDisplayableError
|
||||
if(isDisplayableError(displayableError)) {
|
||||
msftLoginLogger.error('Error while logging in.', displayableError)
|
||||
actualDisplayableError = displayableError
|
||||
} else {
|
||||
// Uh oh.
|
||||
msftLoginLogger.error('Unhandled error during login.', displayableError)
|
||||
actualDisplayableError = {
|
||||
title: 'Unknown Error During Login',
|
||||
desc: 'An unknown error has occurred. Please see the console for details.'
|
||||
}
|
||||
}
|
||||
|
||||
switchView(getCurrentView(), viewOnClose, 500, 500, () => {
|
||||
setOverlayContent(actualDisplayableError.title, actualDisplayableError.desc, Lang.queryJS('login.tryAgain'))
|
||||
setOverlayHandler(() => {
|
||||
toggleOverlay(false)
|
||||
})
|
||||
toggleOverlay(true)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Bind functionality for the account selection buttons. If another account
|
||||
* is selected, the UI of the previously selected account will be updated.
|
||||
@@ -367,7 +467,6 @@ function bindAuthAccountLogOut(){
|
||||
setOverlayHandler(() => {
|
||||
processLogOut(val, isLastAccount)
|
||||
toggleOverlay(false)
|
||||
switchView(getCurrentView(), VIEWS.login)
|
||||
})
|
||||
setDismissHandler(() => {
|
||||
toggleOverlay(false)
|
||||
@@ -381,6 +480,7 @@ function bindAuthAccountLogOut(){
|
||||
})
|
||||
}
|
||||
|
||||
let msAccDomElementCache
|
||||
/**
|
||||
* Process a log out.
|
||||
*
|
||||
@@ -391,19 +491,91 @@ function processLogOut(val, isLastAccount){
|
||||
const parent = val.closest('.settingsAuthAccount')
|
||||
const uuid = parent.getAttribute('uuid')
|
||||
const prevSelAcc = ConfigManager.getSelectedAccount()
|
||||
AuthManager.removeAccount(uuid).then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
updateSelectedAccount(selAcc)
|
||||
validateSelectedAccount()
|
||||
}
|
||||
})
|
||||
$(parent).fadeOut(250, () => {
|
||||
parent.remove()
|
||||
})
|
||||
const targetAcc = ConfigManager.getAuthAccount(uuid)
|
||||
if(targetAcc.type === 'microsoft') {
|
||||
msAccDomElementCache = parent
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
||||
})
|
||||
} else {
|
||||
AuthManager.removeMojangAccount(uuid).then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
updateSelectedAccount(selAcc)
|
||||
validateSelectedAccount()
|
||||
}
|
||||
if(isLastAccount) {
|
||||
loginOptionsCancelEnabled(false)
|
||||
loginOptionsViewOnLoginSuccess = VIEWS.settings
|
||||
loginOptionsViewOnLoginCancel = VIEWS.loginOptions
|
||||
switchView(getCurrentView(), VIEWS.loginOptions)
|
||||
}
|
||||
})
|
||||
$(parent).fadeOut(250, () => {
|
||||
parent.remove()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Bind reply for Microsoft Logout.
|
||||
ipcRenderer.on(MSFT_OPCODE.REPLY_LOGOUT, (_, ...arguments_) => {
|
||||
if (arguments_[0] === MSFT_REPLY_TYPE.ERROR) {
|
||||
switchView(getCurrentView(), VIEWS.settings, 500, 500, () => {
|
||||
|
||||
if(arguments_.length > 1 && arguments_[1] === MSFT_ERROR.NOT_FINISHED) {
|
||||
// User cancelled.
|
||||
msftLogoutLogger.info('Logout cancelled by user.')
|
||||
return
|
||||
}
|
||||
|
||||
// Unexpected error.
|
||||
setOverlayContent(
|
||||
'Something Went Wrong',
|
||||
'Microsoft logout failed. Please try again.',
|
||||
'OK'
|
||||
)
|
||||
setOverlayHandler(() => {
|
||||
toggleOverlay(false)
|
||||
})
|
||||
toggleOverlay(true)
|
||||
})
|
||||
} else if(arguments_[0] === MSFT_REPLY_TYPE.SUCCESS) {
|
||||
|
||||
const uuid = arguments_[1]
|
||||
const isLastAccount = arguments_[2]
|
||||
const prevSelAcc = ConfigManager.getSelectedAccount()
|
||||
|
||||
msftLogoutLogger.info('Logout Successful. uuid:', uuid)
|
||||
|
||||
AuthManager.removeMicrosoftAccount(uuid)
|
||||
.then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
updateSelectedAccount(selAcc)
|
||||
validateSelectedAccount()
|
||||
}
|
||||
if(isLastAccount) {
|
||||
loginOptionsCancelEnabled(false)
|
||||
loginOptionsViewOnLoginSuccess = VIEWS.settings
|
||||
loginOptionsViewOnLoginCancel = VIEWS.loginOptions
|
||||
switchView(getCurrentView(), VIEWS.loginOptions)
|
||||
}
|
||||
if(msAccDomElementCache) {
|
||||
msAccDomElementCache.remove()
|
||||
msAccDomElementCache = null
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
if(!isLastAccount) {
|
||||
switchView(getCurrentView(), VIEWS.settings, 500, 500)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Refreshes the status of the selected account on the auth account
|
||||
* elements.
|
||||
@@ -425,7 +597,8 @@ function refreshAuthAccountSelected(uuid){
|
||||
})
|
||||
}
|
||||
|
||||
const settingsCurrentAccounts = document.getElementById('settingsCurrentAccounts')
|
||||
const settingsCurrentMicrosoftAccounts = document.getElementById('settingsCurrentMicrosoftAccounts')
|
||||
const settingsCurrentMojangAccounts = document.getElementById('settingsCurrentMojangAccounts')
|
||||
|
||||
/**
|
||||
* Add auth account elements for each one stored in the authentication database.
|
||||
@@ -438,11 +611,13 @@ function populateAuthAccounts(){
|
||||
}
|
||||
const selectedUUID = ConfigManager.getSelectedAccount().uuid
|
||||
|
||||
let authAccountStr = ''
|
||||
let microsoftAuthAccountStr = ''
|
||||
let mojangAuthAccountStr = ''
|
||||
|
||||
authKeys.map((val) => {
|
||||
authKeys.forEach((val) => {
|
||||
const acc = authAccounts[val]
|
||||
authAccountStr += `<div class="settingsAuthAccount" uuid="${acc.uuid}">
|
||||
|
||||
const accHtml = `<div class="settingsAuthAccount" uuid="${acc.uuid}">
|
||||
<div class="settingsAuthAccountLeft">
|
||||
<img class="settingsAuthAccountImage" alt="${acc.displayName}" src="https://mc-heads.net/body/${acc.uuid}/60">
|
||||
</div>
|
||||
@@ -465,9 +640,17 @@ function populateAuthAccounts(){
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
|
||||
if(acc.type === 'microsoft') {
|
||||
microsoftAuthAccountStr += accHtml
|
||||
} else {
|
||||
mojangAuthAccountStr += accHtml
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
settingsCurrentAccounts.innerHTML = authAccountStr
|
||||
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
|
||||
settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user