Refactored MSL

This refactored MSL should help with the authentication token issues that happen way too frequently.
This commit is contained in:
Peter 2021-09-30 14:25:56 +01:00
parent fb287eaaec
commit bacbbe35d7
11 changed files with 655 additions and 429 deletions

View File

@ -869,28 +869,31 @@ body, button {
} }
#loginMSButton { #loginMSButton {
background: none; background-color: #006EFA;
border: none; border: none;
margin-top: 5px; margin-top: 5px;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 20px; font-size: 20px;
display: flex;
padding: 16px;
gap: 15px;
font-weight: bold;
align-items: center;
cursor: pointer;
} }
#loginMSButton:disabled { #loginMSButton:disabled {
color: rgba(255, 255, 255, 0.75); color: rgba(255, 255, 255, 0.75);
pointer-events: none; pointer-events: none;
} }
#loginMSButton:hover, #loginMSButton:hover,
#loginMSButton:focus { #loginMSButton:focus {
text-shadow: 0px 0px 20px #fff; text-shadow: 0px 0px 20px #fff;
outline: none; outline: none;
} }
#loginMSButton:active { #loginMSButton:active {
color: #c7c7c7; color: #c7c7c7;
text-shadow: 0px 0px 20px #c7c7c7; text-shadow: 0px 0px 20px #c7c7c7;
} }
/* /*
#login_filter { #login_filter {
height: calc(100% - 22px); height: calc(100% - 22px);

View File

@ -19,14 +19,14 @@ const loggerSuccess = LoggerUtil('%c[AuthManager]', 'color: #209b07; font-weight
async function validateSelectedMojang() { async function validateSelectedMojang() {
const current = ConfigManager.getSelectedAccount() const current = ConfigManager.getSelectedAccount()
const isValid = await Mojang.validate(current.accessToken, ConfigManager.getClientToken()) const isValid = await Mojang.validate(current.accessToken, ConfigManager.getClientToken())
if(!isValid){ if (!isValid) {
try { try {
const session = await Mojang.refresh(current.accessToken, ConfigManager.getClientToken()) const session = await Mojang.refresh(current.accessToken, ConfigManager.getClientToken())
ConfigManager.updateAuthAccount(current.uuid, session.accessToken) ConfigManager.updateAuthAccount(current.uuid, session.accessToken)
ConfigManager.save() ConfigManager.save()
} catch(err) { } catch (err) {
logger.debug('Error while validating selected profile:', err) logger.debug('Error while validating selected profile:', err)
if(err && err.error === 'ForbiddenOperationException'){ if (err && err.error === 'ForbiddenOperationException') {
// What do we do? // What do we do?
} }
logger.log('Account access token is invalid.') logger.log('Account access token is invalid.')
@ -41,13 +41,15 @@ async function validateSelectedMojang() {
} }
async function validateSelectedMicrosoft() { async function validateSelectedMicrosoft() {
try {
const current = ConfigManager.getSelectedAccount() const current = ConfigManager.getSelectedAccount()
const now = new Date().getTime() const now = new Date().getTime()
const MCExpiresAt = Date.parse(current.expiresAt) const MCExpiresAt = Date.parse(current.expiresAt)
const MCExpired = now > MCExpiresAt const MCExpired = now > MCExpiresAt
if(MCExpired) { if (!MCExpired) {
return true
}
const MSExpiresAt = Date.parse(current.microsoft.expires_at) const MSExpiresAt = Date.parse(current.microsoft.expires_at)
const MSExpired = now > MSExpiresAt const MSExpired = now > MSExpiresAt
@ -63,12 +65,6 @@ async function validateSelectedMicrosoft() {
ConfigManager.save() ConfigManager.save()
return true return true
} else {
return true
}
} catch (error) {
return Promise.reject(error)
}
} }
// Exports // Exports
@ -109,21 +105,18 @@ exports.addAccount = async function(username, password){
* @param {string} uuid The UUID of the account to be removed. * @param {string} uuid The UUID of the account to be removed.
* @returns {Promise.<void>} Promise which resolves to void when the action is complete. * @returns {Promise.<void>} Promise which resolves to void when the action is complete.
*/ */
exports.removeAccount = async function(uuid){ exports.removeAccount = async function(uuid){
try {
const authAcc = ConfigManager.getAuthAccount(uuid) const authAcc = ConfigManager.getAuthAccount(uuid)
if(authAcc.type === 'microsoft'){ if (authAcc.type === 'microsoft') {
ConfigManager.removeAuthAccount(uuid) ConfigManager.removeAuthAccount(uuid)
ConfigManager.save() ConfigManager.save()
return Promise.resolve() return
} }
await Mojang.invalidate(authAcc.accessToken, ConfigManager.getClientToken()) await Mojang.invalidate(authAcc.accessToken, ConfigManager.getClientToken())
ConfigManager.removeAuthAccount(uuid) ConfigManager.removeAuthAccount(uuid)
ConfigManager.save() ConfigManager.save()
return Promise.resolve() return
} catch (err){
return Promise.reject(err)
}
} }
/** /**
@ -139,8 +132,10 @@ exports.removeAccount = async function(uuid){
exports.validateSelected = async function(){ exports.validateSelected = async function(){
const current = ConfigManager.getSelectedAccount() const current = ConfigManager.getSelectedAccount()
const isValid = await Mojang.validate(current.accessToken, ConfigManager.getClientToken()) const isValid = await Mojang.validate(current.accessToken, ConfigManager.getClientToken())
if(!isValid){ if (isValid) {
try{ return true
}
if (ConfigManager.getSelectedAccount() === 'microsoft') { if (ConfigManager.getSelectedAccount() === 'microsoft') {
const validate = await validateSelectedMicrosoft() const validate = await validateSelectedMicrosoft()
return validate return validate
@ -148,27 +143,20 @@ exports.validateSelected = async function(){
const validate = await validateSelectedMojang() const validate = await validateSelectedMojang()
return validate return validate
} }
} catch (error) {
return Promise.reject(error)
}
} else return true
} }
exports.addMSAccount = async authCode => { exports.addMSAccount = async authCode => {
try {
const accessToken = await Microsoft.getAccessToken(authCode) const accessToken = await Microsoft.getAccessToken(authCode)
const MCAccessToken = await Microsoft.authMinecraft(accessToken.access_token) const MCAccessToken = await Microsoft.authMinecraft(accessToken.access_token)
const minecraftBuyed = await Microsoft.checkMCStore(MCAccessToken.access_token) const minecraftBuyed = await Microsoft.checkMCStore(MCAccessToken.access_token)
if(!minecraftBuyed) if (!minecraftBuyed)
return Promise.reject({ throw {
message: 'You didn\'t buy Minecraft! Please use another Microsoft account or buy Minecraft.' message: 'You didn\'t buy Minecraft! Please use another Microsoft account or buy Minecraft.'
}) }
const MCProfile = await Microsoft.getMCProfile(MCAccessToken.access_token) const MCProfile = await Microsoft.getMCProfile(MCAccessToken.access_token)
const ret = ConfigManager.addMsAuthAccount(MCProfile.id, MCAccessToken.access_token, MCProfile.name, MCAccessToken.expires_at, accessToken.access_token, accessToken.refresh_token) const result = ConfigManager.addMsAuthAccount(MCProfile.id, MCAccessToken.access_token, MCProfile.name, MCAccessToken.expires_at, accessToken.access_token, accessToken.refresh_token)
ConfigManager.save() ConfigManager.save()
return ret return result
} catch(error) {
return Promise.reject(error)
}
} }

View File

@ -382,7 +382,7 @@ exports.updateAuthAccount = function(uuid, accessToken){
* *
* @returns {Object} The authenticated account object created by this action. * @returns {Object} The authenticated account object created by this action.
*/ */
exports.updateAuthAccount = function(uuid, accessToken, msAccessToken, msRefreshToken, msExpires, mcExpires){ exports.updateAuthAccount = function (uuid, accessToken, msAccessToken, msRefreshToken, msExpires, mcExpires) {
config.authenticationDatabase[uuid].accessToken = accessToken config.authenticationDatabase[uuid].accessToken = accessToken
config.authenticationDatabase[uuid].expiresAt = mcExpires config.authenticationDatabase[uuid].expiresAt = mcExpires
config.authenticationDatabase[uuid].microsoft.access_token = msAccessToken config.authenticationDatabase[uuid].microsoft.access_token = msAccessToken
@ -426,7 +426,7 @@ exports.addAuthAccount = function(uuid, accessToken, username, displayName){
* *
* @returns {Object} The authenticated account object created by this action. * @returns {Object} The authenticated account object created by this action.
*/ */
exports.addMsAuthAccount = function(uuid, accessToken, name, mcExpires, msAccessToken, msRefreshToken, msExpires){ exports.addMsAuthAccount = function (uuid, accessToken, name, mcExpires, msAccessToken, msRefreshToken, msExpires) {
config.selectedAccount = uuid config.selectedAccount = uuid
config.authenticationDatabase[uuid] = { config.authenticationDatabase[uuid] = {
accessToken, accessToken,

View File

@ -1,36 +1,22 @@
// Requirements const got = require('got').extend({
const request = require('request') responseType: 'json',
resolveBodyOnly: true
})
// Constants // TODO: Add client ID (https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade)
const clientId = '71a6e661-ee73-4166-a21a-26ce6e15b3de' const CLIENT_ID = '71a6e661-ee73-4166-a21a-26ce6e15b3de'
const tokenUri = 'https://login.microsoftonline.com/consumers/oauth2/v2.0/token' const TOKEN_URI = 'https://login.microsoftonline.com/consumers/oauth2/v2.0/token'
const authXBLUri = 'https://user.auth.xboxlive.com/user/authenticate' const AUTH_XBL_URI = 'https://user.auth.xboxlive.com/user/authenticate'
const authXSTSUri = 'https://xsts.auth.xboxlive.com/xsts/authorize' const AUTH_XSTS_URI = 'https://xsts.auth.xboxlive.com/xsts/authorize'
const authMCUri = 'https://api.minecraftservices.com/authentication/login_with_xbox' const AUTH_MC_URI = 'https://api.minecraftservices.com/authentication/login_with_xbox'
const profileURI = 'https://api.minecraftservices.com/minecraft/profile' const PROFILE_URI = 'https://api.minecraftservices.com/minecraft/profile'
// Functions async function getXBLToken(accessToken) {
function requestPromise(uri, options) { const {
return new Promise((resolve, reject) => { Token: token,
request(uri, options, (error, response, body) => { DisplayClaims: displayClaims
if (error) { } = await got.post(AUTH_XBL_URI, {
reject(error)
} else if (response.statusCode !== 200) {
reject([response.statusCode, response.statusMessage, response])
} else {
resolve(response)
}
})
})
}
function getXBLToken(accessToken) {
return new Promise((resolve, reject) => {
const data = new Object()
const options = {
method: 'post',
json: { json: {
Properties: { Properties: {
AuthMethod: 'RPS', AuthMethod: 'RPS',
@ -40,24 +26,16 @@ function getXBLToken(accessToken) {
RelyingParty: 'http://auth.xboxlive.com', RelyingParty: 'http://auth.xboxlive.com',
TokenType: 'JWT' TokenType: 'JWT'
} }
})
return {
token,
uhs: displayClaims.xui[0].uhs
} }
requestPromise(authXBLUri, options).then(response => {
const body = response.body
data.token = body.Token
data.uhs = body.DisplayClaims.xui[0].uhs
resolve(data)
}).catch(error => {
reject(error)
})
})
} }
function getXSTSToken(XBLToken) { async function getXSTSToken(XBLToken) {
return new Promise((resolve, reject) => { const data = await got.post(AUTH_XSTS_URI, {
const options = {
method: 'post',
json: { json: {
Properties: { Properties: {
SandboxId: 'RETAIL', SandboxId: 'RETAIL',
@ -66,160 +44,119 @@ function getXSTSToken(XBLToken) {
RelyingParty: 'rp://api.minecraftservices.com/', RelyingParty: 'rp://api.minecraftservices.com/',
TokenType: 'JWT' TokenType: 'JWT'
} }
} })
requestPromise(authXSTSUri, options).then(response => {
if (response.body.XErr) { if (data.XErr) {
switch (response.body.XErr) { switch (data.XErr) {
case 2148916233: case 2148916233:
reject({ throw {
message: 'Your Microsoft account is not connected to an Xbox account. Please create one.<br>' message: 'Your Microsoft account is not connected to an Xbox account. Please create one.<br>'
}) }
return
case 2148916238: case 2148916238:
reject({ throw {
message: 'Since you are not yet 18 years old, an adult must add you to a family in order for you to use Helios Launcher!' message: 'Since you are not yet 18 years old, an adult must add you to a family in order for you to use Helios Launcher!'
}) }
return }
throw data
}
} return data.Token
reject(response.body)
}
resolve(response.body.Token)
}).catch(error => {
reject(error)
})
})
} }
function getMCAccessToken(UHS, XSTSToken) { async function getMCAccessToken(UHS, XSTSToken) {
return new Promise((resolve, reject) => { const data = await got.post(AUTH_MC_URI, {
const data = new Object()
const expiresAt = new Date()
const options = {
method: 'post',
json: { json: {
identityToken: `XBL3.0 x=${UHS};${XSTSToken}` identityToken: `XBL3.0 x=${UHS};${XSTSToken}`
} }
})
const expiresAt = new Date()
expiresAt.setSeconds(expiresAt.getSeconds() + data.expires_in)
return {
expired_at: expiresAt,
access_token: data.access_token
} }
requestPromise(authMCUri, options).then(response => {
const body = response.body
expiresAt.setSeconds(expiresAt.getSeconds() + body.expires_in)
data.access_token = body.access_token
data.expires_at = expiresAt
resolve(data)
}).catch(error => {
reject(error)
})
})
} }
// Exports exports.getAccessToken = async authCode => {
exports.getAccessToken = authCode => { const {
return new Promise((resolve, reject) => { expires_in,
const expiresAt = new Date() access_token,
const data = new Object() refresh_token
} = await got.post(TOKEN_URI, {
const options = { form: {
method: 'post', client_id: CLIENT_ID,
formData: {
client_id: clientId,
code: authCode, code: authCode,
scope: 'XboxLive.signin', scope: 'XboxLive.signin',
redirect_uri: 'https://login.microsoftonline.com/common/oauth2/nativeclient', redirect_uri: 'https://login.microsoftonline.com/common/oauth2/nativeclient',
grant_type: 'authorization_code' grant_type: 'authorization_code'
} }
} })
requestPromise(tokenUri, options).then(response => {
const body = JSON.parse(response.body)
expiresAt.setSeconds(expiresAt.getSeconds() + body.expires_in)
data.expires_at = expiresAt
data.access_token = body.access_token
data.refresh_token = body.refresh_token
resolve(data) const expiresAt = new Date()
}).catch(error => { expiresAt.setSeconds(expiresAt.getSeconds() + expires_in)
reject(error)
}) return {
}) expires_at: expiresAt,
access_token,
refresh_token
}
} }
exports.refreshAccessToken = refreshToken => { exports.refreshAccessToken = async refreshToken => {
return new Promise((resolve, reject) => { const {
const expiresAt = new Date() expires_in,
const data = new Object() access_token
} = await got.post(TOKEN_URI, {
const options = { form: {
method: 'post', client_id: CLIENT_ID,
formData: {
client_id: clientId,
refresh_token: refreshToken, refresh_token: refreshToken,
scope: 'XboxLive.signin', scope: 'XboxLive.signin',
redirect_uri: 'https://login.microsoftonline.com/common/oauth2/nativeclient', redirect_uri: 'https://login.microsoftonline.com/common/oauth2/nativeclient',
grant_type: 'refresh_token' grant_type: 'refresh_token'
} },
} responseType: 'json'
requestPromise(tokenUri, options).then(response => { })
const body = JSON.parse(response.body)
expiresAt.setSeconds(expiresAt.getSeconds() + body.expires_in)
data.expires_at = expiresAt
data.access_token = body.access_token
resolve(data) const expiresAt = new Date()
}).catch(error => { expiresAt.setSeconds(expiresAt.getSeconds() + expires_in)
reject(error)
}) return {
}) expires_at: expiresAt,
access_token
}
} }
exports.authMinecraft = async accessToken => { exports.authMinecraft = async accessToken => {
try {
const XBLToken = await getXBLToken(accessToken) const XBLToken = await getXBLToken(accessToken)
const XSTSToken = await getXSTSToken(XBLToken.token) const XSTSToken = await getXSTSToken(XBLToken.token)
const MCToken = await getMCAccessToken(XBLToken.uhs, XSTSToken) const MCToken = await getMCAccessToken(XBLToken.uhs, XSTSToken)
return MCToken return MCToken
} catch (error) {
Promise.reject(error)
}
} }
exports.checkMCStore = async function(access_token){ exports.checkMCStore = async access_token => {
return new Promise((resolve, reject) => { try {
request.get({ const {items} = await got('https://api.minecraftservices.com/entitlements/mcstore', {
url: 'https://api.minecraftservices.com/entitlements/mcstore',
json: true,
headers: { headers: {
Authorization: 'Bearer ' + access_token Authorization: 'Bearer ' + access_token
} },
}, (err, res, body) => { responseType: 'json'
if (err) {
resolve(false)
return
}
if(body.items && body.items.length > 0) resolve(true)
else resolve(false)
})
}) })
return items && items.length > 0
} catch {
return false
}
} }
exports.getMCProfile = MCAccessToken => { exports.getMCProfile = async MCAccessToken => {
return new Promise((resolve, reject) => { const data = await got(PROFILE_URI, {
const options = {
method: 'get',
headers: { headers: {
Authorization: `Bearer ${MCAccessToken}` Authorization: `Bearer ${MCAccessToken}`
} }
} })
requestPromise(profileURI, options).then(response => {
const body = JSON.parse(response.body)
resolve(body) return data
}).catch(error => {
reject(error)
})
})
} }

View File

@ -330,19 +330,18 @@ loginButton.addEventListener('click', () => {
}) })
loginMSButton.addEventListener('click', (event) => { loginMSButton.addEventListener('click', () => {
// Show loading stuff. // Show loading stuff.
toggleOverlay(true, false, 'msOverlay') toggleOverlay(true, false, 'msOverlay')
loginMSButton.disabled = true loginMSButton.disabled = true
ipcRenderer.send('openMSALoginWindow', 'open') ipcRenderer.send('openMSALoginWindow', 'open')
}) })
ipcRenderer.on('MSALoginWindowReply', (event, ...args) => { ipcRenderer.on('MSALoginWindowReply', (_, ...arguments_) => {
if (args[0] === 'error') { if (arguments_[0] === 'error') {
loginMSButton.disabled = false loginMSButton.disabled = false
loginLoading(false) loginLoading(false)
switch (args[1]){ switch (arguments_[1]) {
case 'AlreadyOpenException': { case 'AlreadyOpenException': {
setOverlayContent('ERROR', 'There is already a login window open!', 'OK') setOverlayContent('ERROR', 'There is already a login window open!', 'OK')
setOverlayHandler(() => { setOverlayHandler(() => {
@ -365,13 +364,13 @@ ipcRenderer.on('MSALoginWindowReply', (event, ...args) => {
} }
toggleOverlay(false, false, 'msOverlay') toggleOverlay(false, false, 'msOverlay')
const queryMap = args[0] const queryMap = arguments_[0]
if (queryMap.has('error')) { if (queryMap.has('error')) {
let error = queryMap.get('error') let error = queryMap.get('error')
let errorDesc = queryMap.get('error_description') let errorDesc = queryMap.get('error_description')
if(error === 'access_denied'){ if (error === 'access_denied') {
error = 'ERRPR' error = 'ERRPR'
errorDesc = 'To use the Vicarious Network Launcher, you must agree to the required permissions! Otherwise you can\'t use this launcher with Microsoft accounts.<br><br>Despite agreeing to the permissions you don\'t give us the possibility to do anything with your account, because all data will always be sent back to you (the launcher) IMMEDIATELY and WITHOUT WAY.' errorDesc = 'To use the Helios Launcher, you must agree to the required permissions! Otherwise you can\'t use this launcher with Microsoft accounts.<br><br>Despite agreeing to the permissions you don\'t give us the possibility to do anything with your account, because all data will always be sent back to you (the launcher) IMMEDIATELY and WITHOUT WAY.'
} }
setOverlayContent(error, errorDesc, 'OK') setOverlayContent(error, errorDesc, 'OK')
setOverlayHandler(() => { setOverlayHandler(() => {
@ -407,8 +406,9 @@ ipcRenderer.on('MSALoginWindowReply', (event, ...args) => {
loginLoading(false) loginLoading(false)
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.success'), Lang.queryJS('login.login')) loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.success'), Lang.queryJS('login.login'))
formDisabled(false) formDisabled(false)
})
toggleOverlay(false) toggleOverlay(false)
toggleOverlay(false, false, 'msOverlay')
})
}, 1000) }, 1000)
}).catch(error => { }).catch(error => {
loginMSButton.disabled = false loginMSButton.disabled = false
@ -421,5 +421,4 @@ ipcRenderer.on('MSALoginWindowReply', (event, ...args) => {
toggleOverlay(true) toggleOverlay(true)
loggerLogin.error(error) loggerLogin.error(error)
}) })
}) })

View File

@ -463,7 +463,7 @@ let data = null
* @param {Element} val The log out button element. * @param {Element} val The log out button element.
* @param {boolean} isLastAccount If this logout is on the last added account. * @param {boolean} isLastAccount If this logout is on the last added account.
*/ */
function processLogOut(val, isLastAccount, skip = false) { function processLogOut(val, isLastAccount, skip = false) {
data = { data = {
val, val,
isLastAccount isLastAccount
@ -479,7 +479,9 @@ function processLogOut(val, isLastAccount, skip = false) {
ipcRenderer.send('openMSALogoutWindow', 'open') ipcRenderer.send('openMSALogoutWindow', 'open')
} }
} }
const prevSelAcc = ConfigManager.getSelectedAccount() const prevSelAcc = ConfigManager.getSelectedAccount()
AuthManager.removeAccount(uuid).then(() => { AuthManager.removeAccount(uuid).then(() => {
if (!isLastAccount && uuid === prevSelAcc.uuid) { if (!isLastAccount && uuid === prevSelAcc.uuid) {
const selAcc = ConfigManager.getSelectedAccount() const selAcc = ConfigManager.getSelectedAccount()
@ -488,6 +490,7 @@ function processLogOut(val, isLastAccount, skip = false) {
validateSelectedAccount() validateSelectedAccount()
} }
}) })
$(parent).fadeOut(150, () => { $(parent).fadeOut(150, () => {
parent.remove() parent.remove()
}) })

View File

@ -63,15 +63,16 @@
or <br /> or <br />
<button id="loginMSButton">Login with<br> <button id="loginMSButton">Login with<br>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 604 129" style="width: auto; height: 30px"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 604 129" style="width: auto; height: 30px">
<title>Microsoft Logo</title> <title>Microsoft</title>
<path <path
d="M213.2 74.3l-3.6 10.2h-.3c-.6-2.3-1.7-5.8-3.5-10l-19.3-48.5h-18.9v77.3h12.5v-47.7c0-3 0-6.4-.1-10.6-.1-2.1-.3-3.7-.4-4.9h.3c.6 3 1.3 5.2 1.8 6.6l23.2 56.4h8.8l23-56.9c.5-1.3 1-3.9 1.5-6.1h.3c-.3 5.7-.5 10.8-.6 13.9v49h13.3v-77.2h-18.2l-19.8 48.5zM263.8 47.6h13v55.4h-13zM270.4 24.2c-2.2 0-4 .8-5.5 2.2-1.5 1.4-2.3 3.2-2.3 5.4 0 2.1.8 3.9 2.3 5.3 1.5 1.4 3.3 2.1 5.5 2.1s4.1-.8 5.5-2.1c1.5-1.4 2.3-3.2 2.3-5.3s-.8-3.9-2.3-5.4c-1.3-1.4-3.2-2.2-5.5-2.2M322.9 47.1c-2.4-.5-4.9-.8-7.3-.8-5.9 0-11.3 1.3-15.8 3.9-4.5 2.6-8.1 6.2-10.4 10.7-2.4 4.6-3.6 9.9-3.6 16 0 5.3 1.2 10 3.5 14.3 2.3 4.2 5.5 7.6 9.8 9.9 4.1 2.3 8.9 3.5 14.3 3.5 6.2 0 11.5-1.3 15.7-3.7l.1-.1v-12l-.5.4c-1.9 1.4-4.1 2.6-6.3 3.3-2.3.8-4.4 1.2-6.2 1.2-5.2 0-9.3-1.5-12.2-4.8-3-3.2-4.5-7.6-4.5-13.1 0-5.7 1.5-10.2 4.6-13.5 3.1-3.3 7.2-5 12.2-5 4.2 0 8.5 1.4 12.4 4.2l.5.4v-12.7l-.1-.1c-1.7-.7-3.6-1.5-6.2-2M365.8 46.7c-3.2 0-6.2 1-8.8 3.1-2.2 1.8-3.7 4.4-5 7.5h-.1v-9.7h-13v55.4h13v-28.3c0-4.8 1-8.8 3.2-11.7 2.2-3 5-4.5 8.4-4.5 1.2 0 2.4.3 3.9.5 1.4.4 2.4.8 3.1 1.3l.5.4v-13l-.3-.1c-.9-.6-2.7-.9-4.9-.9M401.2 46.4c-9.1 0-16.4 2.7-21.5 8-5.2 5.3-7.7 12.6-7.7 21.8 0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6m10.4 42.6c-2.4 3.1-6.2 4.6-10.9 4.6s-8.5-1.5-11.2-4.8c-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.6 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5-.2 6-1.3 10.7-3.8 13.8M457.7 70.6c-4.1-1.7-6.7-3-7.9-4.1-1-1-1.5-2.4-1.5-4.2 0-1.5.6-3 2.1-4s3.2-1.5 5.7-1.5c2.2 0 4.5.4 6.7 1s4.2 1.5 5.8 2.7l.5.4v-12.2l-.3-.1c-1.5-.6-3.5-1.2-5.9-1.7-2.4-.4-4.6-.6-6.4-.6-6.2 0-11.3 1.5-15.3 4.8-4 3.1-5.9 7.3-5.9 12.2 0 2.6.4 4.9 1.3 6.8.9 1.9 2.2 3.7 4 5.2 1.8 1.4 4.4 3 8 4.5 3 1.3 5.3 2.3 6.7 3.1 1.4.8 2.3 1.7 3 2.4.5.8.8 1.8.8 3.1 0 3.7-2.8 5.5-8.5 5.5-2.2 0-4.5-.4-7.2-1.3s-5.2-2.2-7.3-3.7l-.5-.4v12.7l.3.1c1.9.9 4.2 1.5 7 2.2 2.8.5 5.3.9 7.5.9 6.7 0 12.2-1.5 16.1-4.8 4-3.2 6.1-7.3 6.1-12.6 0-3.7-1-7-3.2-9.5-2.9-2.4-6.5-4.9-11.7-6.9M506.9 46.4c-9.1 0-16.4 2.7-21.5 8s-7.7 12.6-7.7 21.8c0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6m10.3 42.6c-2.4 3.1-6.2 4.6-10.9 4.6-4.8 0-8.5-1.5-11.2-4.8-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.5 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5 0 6-1.3 10.7-3.8 13.8M603.9 58.3v-10.7h-13.1v-16.4l-.4.1-12.4 3.7-.3.1v12.5h-19.6v-7c0-3.2.8-5.7 2.2-7.3s3.5-2.4 6.1-2.4c1.8 0 3.7.4 5.8 1.3l.5.3v-11.3l-.3-.1c-1.8-.6-4.2-1-7.3-1-3.9 0-7.3.9-10.4 2.4-3.1 1.7-5.4 4-7.1 7.1-1.7 3-2.6 6.4-2.6 10.3v7.7h-9.1v10.6h9.1v44.8h13.1v-44.7h19.6v28.5c0 11.7 5.5 17.6 16.5 17.6 1.8 0 3.7-.3 5.5-.6 1.9-.4 3.3-.9 4.1-1.3l.1-.1v-10.7l-.5.4c-.8.5-1.5.9-2.7 1.2-1 .3-1.9.4-2.6.4-2.6 0-4.4-.6-5.7-2.1-1.2-1.4-1.8-3.7-1.8-7.1v-26.2h13.3z" d="M213.2 74.3l-3.6 10.2h-.3c-.6-2.3-1.7-5.8-3.5-10l-19.3-48.5h-18.9v77.3h12.5v-47.7c0-3 0-6.4-.1-10.6-.1-2.1-.3-3.7-.4-4.9h.3c.6 3 1.3 5.2 1.8 6.6l23.2 56.4h8.8l23-56.9c.5-1.3 1-3.9 1.5-6.1h.3c-.3 5.7-.5 10.8-.6 13.9v49h13.3v-77.2h-18.2l-19.8 48.5zM263.8 47.6h13v55.4h-13zM270.4 24.2c-2.2 0-4 .8-5.5 2.2-1.5 1.4-2.3 3.2-2.3 5.4 0 2.1.8 3.9 2.3 5.3 1.5 1.4 3.3 2.1 5.5 2.1s4.1-.8 5.5-2.1c1.5-1.4 2.3-3.2 2.3-5.3s-.8-3.9-2.3-5.4c-1.3-1.4-3.2-2.2-5.5-2.2M322.9 47.1c-2.4-.5-4.9-.8-7.3-.8-5.9 0-11.3 1.3-15.8 3.9-4.5 2.6-8.1 6.2-10.4 10.7-2.4 4.6-3.6 9.9-3.6 16 0 5.3 1.2 10 3.5 14.3 2.3 4.2 5.5 7.6 9.8 9.9 4.1 2.3 8.9 3.5 14.3 3.5 6.2 0 11.5-1.3 15.7-3.7l.1-.1v-12l-.5.4c-1.9 1.4-4.1 2.6-6.3 3.3-2.3.8-4.4 1.2-6.2 1.2-5.2 0-9.3-1.5-12.2-4.8-3-3.2-4.5-7.6-4.5-13.1 0-5.7 1.5-10.2 4.6-13.5 3.1-3.3 7.2-5 12.2-5 4.2 0 8.5 1.4 12.4 4.2l.5.4v-12.7l-.1-.1c-1.7-.7-3.6-1.5-6.2-2M365.8 46.7c-3.2 0-6.2 1-8.8 3.1-2.2 1.8-3.7 4.4-5 7.5h-.1v-9.7h-13v55.4h13v-28.3c0-4.8 1-8.8 3.2-11.7 2.2-3 5-4.5 8.4-4.5 1.2 0 2.4.3 3.9.5 1.4.4 2.4.8 3.1 1.3l.5.4v-13l-.3-.1c-.9-.6-2.7-.9-4.9-.9M401.2 46.4c-9.1 0-16.4 2.7-21.5 8-5.2 5.3-7.7 12.6-7.7 21.8 0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6m10.4 42.6c-2.4 3.1-6.2 4.6-10.9 4.6s-8.5-1.5-11.2-4.8c-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.6 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5-.2 6-1.3 10.7-3.8 13.8M457.7 70.6c-4.1-1.7-6.7-3-7.9-4.1-1-1-1.5-2.4-1.5-4.2 0-1.5.6-3 2.1-4s3.2-1.5 5.7-1.5c2.2 0 4.5.4 6.7 1s4.2 1.5 5.8 2.7l.5.4v-12.2l-.3-.1c-1.5-.6-3.5-1.2-5.9-1.7-2.4-.4-4.6-.6-6.4-.6-6.2 0-11.3 1.5-15.3 4.8-4 3.1-5.9 7.3-5.9 12.2 0 2.6.4 4.9 1.3 6.8.9 1.9 2.2 3.7 4 5.2 1.8 1.4 4.4 3 8 4.5 3 1.3 5.3 2.3 6.7 3.1 1.4.8 2.3 1.7 3 2.4.5.8.8 1.8.8 3.1 0 3.7-2.8 5.5-8.5 5.5-2.2 0-4.5-.4-7.2-1.3s-5.2-2.2-7.3-3.7l-.5-.4v12.7l.3.1c1.9.9 4.2 1.5 7 2.2 2.8.5 5.3.9 7.5.9 6.7 0 12.2-1.5 16.1-4.8 4-3.2 6.1-7.3 6.1-12.6 0-3.7-1-7-3.2-9.5-2.9-2.4-6.5-4.9-11.7-6.9M506.9 46.4c-9.1 0-16.4 2.7-21.5 8s-7.7 12.6-7.7 21.8c0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6m10.3 42.6c-2.4 3.1-6.2 4.6-10.9 4.6-4.8 0-8.5-1.5-11.2-4.8-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.5 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5 0 6-1.3 10.7-3.8 13.8M603.9 58.3v-10.7h-13.1v-16.4l-.4.1-12.4 3.7-.3.1v12.5h-19.6v-7c0-3.2.8-5.7 2.2-7.3s3.5-2.4 6.1-2.4c1.8 0 3.7.4 5.8 1.3l.5.3v-11.3l-.3-.1c-1.8-.6-4.2-1-7.3-1-3.9 0-7.3.9-10.4 2.4-3.1 1.7-5.4 4-7.1 7.1-1.7 3-2.6 6.4-2.6 10.3v7.7h-9.1v10.6h9.1v44.8h13.1v-44.7h19.6v28.5c0 11.7 5.5 17.6 16.5 17.6 1.8 0 3.7-.3 5.5-.6 1.9-.4 3.3-.9 4.1-1.3l.1-.1v-10.7l-.5.4c-.8.5-1.5.9-2.7 1.2-1 .3-1.9.4-2.6.4-2.6 0-4.4-.6-5.7-2.1-1.2-1.4-1.8-3.7-1.8-7.1v-26.2h13.3z"
fill="#737373" /> fill="#FFFFFF" />
<path fill="#F25022" d="M0 0h61.3v61.3h-61.3z" /> <path fill="#F25022" d="M0 0h61.3v61.3h-61.3z" />
<path fill="#7FBA00" d="M67.7 0h61.3v61.3h-61.3z" /> <path fill="#7FBA00" d="M67.7 0h61.3v61.3h-61.3z" />
<path fill="#00A4EF" d="M0 67.7h61.3v61.3h-61.3z" /> <path fill="#00A4EF" d="M0 67.7h61.3v61.3h-61.3z" />
<path fill="#FFB900" d="M67.7 67.7h61.3v61.3h-61.3z" /> <path fill="#FFB900" d="M67.7 67.7h61.3v61.3h-61.3z" />
</svg></button> </svg>
</button>
<div id="loginDisclaimer"> <div id="loginDisclaimer">
<span class="loginSpanDim" id="loginRegisterSpan"> <span class="loginSpanDim" id="loginRegisterSpan">
<a href="https://minecraft.net/store/minecraft-java-edition/">Need an Account?</a> <a href="https://minecraft.net/store/minecraft-java-edition/">Need an Account?</a>

View File

@ -39,8 +39,10 @@
</div> </div>
</div> </div>
<div id="msOverlay" style="display: none;"> <div id="msOverlay" style="display: none;">
<span><div class="circle-loader-big"></div></span><br> <span>
<span style="font-size: 2em;">Waiting on Microsoft...</span> <div class="circle-loader-big"></div>
</span><br>
<span style="font-size: 2em;">Waiting for Microsoft...</span>
</div> </div>
<script src="./assets/js/scripts/overlay.js"></script> <script src="./assets/js/scripts/overlay.js"></script>
</div> </div>

View File

@ -10,8 +10,9 @@ const path = require('path')
const semver = require('semver') const semver = require('semver')
const { pathToFileURL } = require('url') const { pathToFileURL } = require('url')
const redirectUriPrefix = 'https://login.microsoftonline.com/common/oauth2/nativeclient?' const redirectUriPrefix = 'https://login.microsoftonline.com/common/oauth2/nativeclient?'
const clientID = '71a6e661-ee73-4166-a21a-26ce6e15b3de' const CLIENT_ID = '71a6e661-ee73-4166-a21a-26ce6e15b3de' // TODO: Add client ID (https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade)
if(isDev) { if(isDev) {
console.log('Is in dev mode!') console.log('Is in dev mode!')
@ -98,11 +99,11 @@ ipcMain.on('cachedDistributionNotification', (event, res) => {
// https://electronjs.org/docs/tutorial/offscreen-rendering // https://electronjs.org/docs/tutorial/offscreen-rendering
app.disableHardwareAcceleration() app.disableHardwareAcceleration()
let MSALoginWindow = null let MSALoginWindow
// Open the Microsoft Account Login window // Open the Microsoft Account Login window
ipcMain.on('openMSALoginWindow', (ipcEvent, args) => { ipcMain.on('openMSALoginWindow', (ipcEvent) => {
if (MSALoginWindow != null) { if (MSALoginWindow) {
ipcEvent.reply('MSALoginWindowReply', 'error', 'AlreadyOpenException') ipcEvent.reply('MSALoginWindowReply', 'error', 'AlreadyOpenException')
return return
} }
@ -116,23 +117,21 @@ ipcMain.on('openMSALoginWindow', (ipcEvent, args) => {
}) })
MSALoginWindow.on('closed', () => { MSALoginWindow.on('closed', () => {
MSALoginWindow = undefined
MSALoginWindow = null
}) })
MSALoginWindow.on('close', event => { MSALoginWindow.on('close', () => {
ipcEvent.reply('MSALoginWindowReply', 'error', 'AuthNotFinished') ipcEvent.reply('MSALoginWindowReply', 'error', 'AuthNotFinished')
}) })
MSALoginWindow.webContents.on('did-navigate', (event, uri, responseCode, statusText) => { MSALoginWindow.webContents.on('did-navigate', (_, uri) => {
if (uri.startsWith(redirectUriPrefix)) { if (uri.startsWith(redirectUriPrefix)) {
let querys = uri.substring(redirectUriPrefix.length).split('#', 1).toString().split('&') let queries = uri.substring(redirectUriPrefix.length).split('#', 1).toString().split('&')
let queryMap = new Map() let queryMap = new Map()
querys.forEach(query => { queries.forEach(query => {
let arr = query.split('=') const [name, value] = query.split('=')
queryMap.set(arr[0], decodeURI(arr[1])) queryMap.set(name, decodeURI(value))
}) })
ipcEvent.reply('MSALoginWindowReply', queryMap) ipcEvent.reply('MSALoginWindowReply', queryMap)
@ -143,13 +142,13 @@ ipcMain.on('openMSALoginWindow', (ipcEvent, args) => {
}) })
MSALoginWindow.removeMenu() MSALoginWindow.removeMenu()
MSALoginWindow.loadURL('https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?prompt=select_account&client_id=' + clientID + '&response_type=code&scope=XboxLive.signin%20offline_access&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient') MSALoginWindow.loadURL('https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?prompt=select_account&client_id=' + CLIENT_ID + '&response_type=code&scope=XboxLive.signin%20offline_access&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient')
}) })
let MSALogoutWindow = null let MSALogoutWindow
ipcMain.on('openMSALogoutWindow', (ipcEvent, args) => { ipcMain.on('openMSALogoutWindow', (ipcEvent) => {
if (MSALogoutWindow == null) { if (!MSALogoutWindow) {
MSALogoutWindow = new BrowserWindow({ MSALogoutWindow = new BrowserWindow({
title: 'Microsoft Logout', title: 'Microsoft Logout',
backgroundColor: '#222222', backgroundColor: '#222222',
@ -158,12 +157,12 @@ ipcMain.on('openMSALogoutWindow', (ipcEvent, args) => {
frame: true, frame: true,
icon: getPlatformIcon('SealCircle') icon: getPlatformIcon('SealCircle')
}) })
MSALogoutWindow.removeMenu()
MSALogoutWindow.loadURL('https://login.microsoftonline.com/common/oauth2/v2.0/logout') MSALogoutWindow.loadURL('https://login.microsoftonline.com/common/oauth2/v2.0/logout')
MSALogoutWindow.webContents.on('did-navigate', (e) => { MSALogoutWindow.webContents.on('did-navigate', () => {
setTimeout(() => { setTimeout(() => {
ipcEvent.reply('MSALogoutWindowReply') ipcEvent.reply('MSALogoutWindowReply')
}, 5000) }, 5000)
}) })
} }
}) })

485
package-lock.json generated
View File

@ -63,6 +63,68 @@
"sumchecker": "^3.0.1" "sumchecker": "^3.0.1"
}, },
"dependencies": { "dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"dev": true,
"requires": {
"defer-to-connect": "^1.0.1"
}
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
"fs-extra": { "fs-extra": {
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
@ -74,6 +136,40 @@
"universalify": "^0.1.0" "universalify": "^0.1.0"
} }
}, },
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"jsonfile": { "jsonfile": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@ -83,6 +179,42 @@
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6"
} }
}, },
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"dev": true,
"requires": {
"json-buffer": "3.0.0"
}
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"dev": true
},
"normalize-url": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
"dev": true
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"dev": true,
"requires": {
"lowercase-keys": "^1.0.0"
}
},
"semver": { "semver": {
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@ -215,18 +347,27 @@
} }
}, },
"@sindresorhus/is": { "@sindresorhus/is": {
"version": "0.14.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g=="
"dev": true
}, },
"@szmarczak/http-timer": { "@szmarczak/http-timer": {
"version": "1.1.2", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"requires": { "requires": {
"defer-to-connect": "^1.0.1" "defer-to-connect": "^2.0.0"
}
},
"@types/cacheable-request": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
"integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
"requires": {
"@types/http-cache-semantics": "*",
"@types/keyv": "*",
"@types/node": "*",
"@types/responselike": "*"
} }
}, },
"@types/debug": { "@types/debug": {
@ -255,6 +396,19 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/http-cache-semantics": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
"integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
},
"@types/keyv": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz",
"integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==",
"requires": {
"@types/node": "*"
}
},
"@types/minimatch": { "@types/minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
@ -265,8 +419,7 @@
"@types/node": { "@types/node": {
"version": "14.17.4", "version": "14.17.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
"integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==", "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A=="
"dev": true
}, },
"@types/plist": { "@types/plist": {
"version": "3.0.2", "version": "3.0.2",
@ -279,6 +432,14 @@
"xmlbuilder": ">=11.0.1" "xmlbuilder": ">=11.0.1"
} }
}, },
"@types/responselike": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
"integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
"requires": {
"@types/node": "*"
}
},
"@types/semver": { "@types/semver": {
"version": "7.3.6", "version": "7.3.6",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.6.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.6.tgz",
@ -757,36 +918,23 @@
"sax": "^1.2.4" "sax": "^1.2.4"
} }
}, },
"cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="
},
"cacheable-request": { "cacheable-request": {
"version": "6.1.0", "version": "7.0.2",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
"dev": true,
"requires": { "requires": {
"clone-response": "^1.0.2", "clone-response": "^1.0.2",
"get-stream": "^5.1.0", "get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0", "http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0", "keyv": "^4.0.0",
"lowercase-keys": "^2.0.0", "lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0", "normalize-url": "^6.0.1",
"responselike": "^1.0.2" "responselike": "^2.0.0"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
} }
}, },
"callsites": { "callsites": {
@ -922,7 +1070,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
"requires": { "requires": {
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
} }
@ -1090,12 +1237,18 @@
} }
}, },
"decompress-response": { "decompress-response": {
"version": "3.3.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"requires": { "requires": {
"mimic-response": "^1.0.0" "mimic-response": "^3.1.0"
},
"dependencies": {
"mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
}
} }
}, },
"deep-extend": { "deep-extend": {
@ -1111,10 +1264,9 @@
"dev": true "dev": true
}, },
"defer-to-connect": { "defer-to-connect": {
"version": "1.1.3", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
"dev": true
}, },
"define-properties": { "define-properties": {
"version": "1.1.3", "version": "1.1.3",
@ -1932,10 +2084,9 @@
"dev": true "dev": true
}, },
"get-stream": { "get-stream": {
"version": "4.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": { "requires": {
"pump": "^3.0.0" "pump": "^3.0.0"
} }
@ -2050,22 +2201,21 @@
} }
}, },
"got": { "got": {
"version": "9.6.0", "version": "11.8.2",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==",
"dev": true,
"requires": { "requires": {
"@sindresorhus/is": "^0.14.0", "@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^1.1.2", "@szmarczak/http-timer": "^4.0.5",
"cacheable-request": "^6.0.0", "@types/cacheable-request": "^6.0.1",
"decompress-response": "^3.3.0", "@types/responselike": "^1.0.0",
"duplexer3": "^0.1.4", "cacheable-lookup": "^5.0.3",
"get-stream": "^4.1.0", "cacheable-request": "^7.0.1",
"lowercase-keys": "^1.0.1", "decompress-response": "^6.0.0",
"mimic-response": "^1.0.1", "http2-wrapper": "^1.0.0-beta.5.2",
"p-cancelable": "^1.0.0", "lowercase-keys": "^2.0.0",
"to-readable-stream": "^1.0.0", "p-cancelable": "^2.0.0",
"url-parse-lax": "^3.0.0" "responselike": "^2.0.0"
} }
}, },
"graceful-fs": { "graceful-fs": {
@ -2116,8 +2266,7 @@
"http-cache-semantics": { "http-cache-semantics": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
"dev": true
}, },
"http-signature": { "http-signature": {
"version": "1.2.0", "version": "1.2.0",
@ -2129,6 +2278,15 @@
"sshpk": "^1.7.0" "sshpk": "^1.7.0"
} }
}, },
"http2-wrapper": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"requires": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0"
}
},
"iconv-corefoundation": { "iconv-corefoundation": {
"version": "1.1.6", "version": "1.1.6",
"resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz",
@ -2338,10 +2496,9 @@
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
}, },
"json-buffer": { "json-buffer": {
"version": "3.0.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
"dev": true
}, },
"json-schema": { "json-schema": {
"version": "0.2.3", "version": "0.2.3",
@ -2394,12 +2551,11 @@
} }
}, },
"keyv": { "keyv": {
"version": "3.1.0", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
"dev": true,
"requires": { "requires": {
"json-buffer": "3.0.0" "json-buffer": "3.0.1"
} }
}, },
"latest-version": { "latest-version": {
@ -2461,10 +2617,9 @@
"dev": true "dev": true
}, },
"lowercase-keys": { "lowercase-keys": {
"version": "1.0.1", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
"dev": true
}, },
"lru-cache": { "lru-cache": {
"version": "6.0.0", "version": "6.0.0",
@ -2531,8 +2686,7 @@
"mimic-response": { "mimic-response": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
"dev": true
}, },
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
@ -2586,10 +2740,9 @@
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
}, },
"normalize-url": { "normalize-url": {
"version": "4.5.1", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
"dev": true
}, },
"npm-conf": { "npm-conf": {
"version": "1.1.3", "version": "1.1.3",
@ -2637,10 +2790,9 @@
} }
}, },
"p-cancelable": { "p-cancelable": {
"version": "1.1.0", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="
"dev": true
}, },
"package-json": { "package-json": {
"version": "6.5.0", "version": "6.5.0",
@ -2654,6 +2806,138 @@
"semver": "^6.2.0" "semver": "^6.2.0"
}, },
"dependencies": { "dependencies": {
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"dev": true
},
"@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"dev": true,
"requires": {
"defer-to-connect": "^1.0.1"
}
},
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"dependencies": {
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
}
}
},
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"dev": true
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"dev": true,
"requires": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
}
},
"json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
"dev": true
},
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"dev": true,
"requires": {
"json-buffer": "3.0.0"
}
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"dev": true
},
"normalize-url": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
"dev": true
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
"dev": true,
"requires": {
"lowercase-keys": "^1.0.0"
}
},
"semver": { "semver": {
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@ -2786,6 +3070,11 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}, },
"quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
},
"rc": { "rc": {
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@ -2884,6 +3173,11 @@
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true "dev": true
}, },
"resolve-alpn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.0.tgz",
"integrity": "sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA=="
},
"resolve-from": { "resolve-from": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -2891,12 +3185,11 @@
"dev": true "dev": true
}, },
"responselike": { "responselike": {
"version": "1.0.2", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
"dev": true,
"requires": { "requires": {
"lowercase-keys": "^1.0.0" "lowercase-keys": "^2.0.0"
} }
}, },
"rimraf": { "rimraf": {
@ -3616,9 +3909,9 @@
} }
}, },
"ws": { "ws": {
"version": "7.5.2", "version": "7.5.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz",
"integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==" "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg=="
}, },
"xdg-basedir": { "xdg-basedir": {
"version": "4.0.0", "version": "4.0.0",

View File

@ -32,6 +32,7 @@
"electron-updater": "^4.3.9", "electron-updater": "^4.3.9",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"github-syntax-dark": "^0.5.0", "github-syntax-dark": "^0.5.0",
"got": "^11.8.2",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"request": "^2.88.2", "request": "^2.88.2",
"semver": "^7.3.5", "semver": "^7.3.5",