suppression en gros
This commit is contained in:
parent
f87399fbea
commit
454b3d0a15
21
LICENSE.txt
21
LICENSE.txt
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2022 Daniel D. Scalzi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
Binary file not shown.
@ -12,7 +12,6 @@
|
||||
const ConfigManager = require('./configmanager')
|
||||
const { LoggerUtil } = require('helios-core')
|
||||
const { RestResponseStatus } = require('helios-core/common')
|
||||
const { MojangRestAPI, mojangErrorDisplayable, MojangErrorCode } = require('helios-core/mojang')
|
||||
const { MicrosoftAuth, microsoftErrorDisplayable, MicrosoftErrorCode } = require('helios-core/microsoft')
|
||||
const { AZURE_CLIENT_ID } = require('./ipcconstants')
|
||||
|
||||
@ -20,43 +19,6 @@ const log = LoggerUtil.getLogger('AuthManager')
|
||||
|
||||
// Functions
|
||||
|
||||
/**
|
||||
* Add a Mojang account. This will authenticate the given credentials with Mojang's
|
||||
* authserver. The resultant data will be stored as an auth account in the
|
||||
* configuration database.
|
||||
*
|
||||
* @param {string} username The account username (email if migrated).
|
||||
* @param {string} password The account password.
|
||||
* @returns {Promise.<Object>} Promise which resolves the resolved authenticated account object.
|
||||
*/
|
||||
exports.addMojangAccount = async function(username, password) {
|
||||
try {
|
||||
const response = await MojangRestAPI.authenticate(username, password, ConfigManager.getClientToken())
|
||||
console.log(response)
|
||||
if(response.responseStatus === RestResponseStatus.SUCCESS) {
|
||||
|
||||
const session = response.data
|
||||
if(session.selectedProfile != null){
|
||||
const ret = ConfigManager.addMojangAuthAccount(session.selectedProfile.id, session.accessToken, username, session.selectedProfile.name)
|
||||
if(ConfigManager.getClientToken() == null){
|
||||
ConfigManager.setClientToken(session.clientToken)
|
||||
}
|
||||
ConfigManager.save()
|
||||
return ret
|
||||
} else {
|
||||
return Promise.reject(mojangErrorDisplayable(MojangErrorCode.ERROR_NOT_PAID))
|
||||
}
|
||||
|
||||
} else {
|
||||
return Promise.reject(mojangErrorDisplayable(response.mojangErrorCode))
|
||||
}
|
||||
|
||||
} catch (err){
|
||||
log.error(err)
|
||||
return Promise.reject(mojangErrorDisplayable(MojangErrorCode.UNKNOWN))
|
||||
}
|
||||
}
|
||||
|
||||
const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
|
||||
|
||||
/**
|
||||
@ -156,31 +118,6 @@ exports.addMicrosoftAccount = async function(authCode) {
|
||||
return ret
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Mojang account. This will invalidate the access token associated
|
||||
* with the account and then remove it from the database.
|
||||
*
|
||||
* @param {string} uuid The UUID of the account to be removed.
|
||||
* @returns {Promise.<void>} Promise which resolves to void when the action is complete.
|
||||
*/
|
||||
exports.removeMojangAccount = async function(uuid){
|
||||
try {
|
||||
const authAcc = ConfigManager.getAuthAccount(uuid)
|
||||
const response = await MojangRestAPI.invalidate(authAcc.accessToken, ConfigManager.getClientToken())
|
||||
if(response.responseStatus === RestResponseStatus.SUCCESS) {
|
||||
ConfigManager.removeAuthAccount(uuid)
|
||||
ConfigManager.save()
|
||||
return Promise.resolve()
|
||||
} else {
|
||||
log.error('Error while removing account', response.error)
|
||||
return Promise.reject(response.error)
|
||||
}
|
||||
} catch (err){
|
||||
log.error('Error while removing account', err)
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Microsoft account. It is expected that the caller will invoke the OAuth logout
|
||||
* through the ipc renderer.
|
||||
@ -199,41 +136,6 @@ exports.removeMicrosoftAccount = async function(uuid){
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the selected account with Mojang's authserver. If the account is not valid,
|
||||
* we will attempt to refresh the access token and update that value. If that fails, a
|
||||
* new login will be required.
|
||||
*
|
||||
* @returns {Promise.<boolean>} Promise which resolves to true if the access token is valid,
|
||||
* otherwise false.
|
||||
*/
|
||||
async function validateSelectedMojangAccount(){
|
||||
const current = ConfigManager.getSelectedAccount()
|
||||
const response = await MojangRestAPI.validate(current.accessToken, ConfigManager.getClientToken())
|
||||
|
||||
if(response.responseStatus === RestResponseStatus.SUCCESS) {
|
||||
const isValid = response.data
|
||||
if(!isValid){
|
||||
const refreshResponse = await MojangRestAPI.refresh(current.accessToken, ConfigManager.getClientToken())
|
||||
if(refreshResponse.responseStatus === RestResponseStatus.SUCCESS) {
|
||||
const session = refreshResponse.data
|
||||
ConfigManager.updateMojangAuthAccount(current.uuid, session.accessToken)
|
||||
ConfigManager.save()
|
||||
} else {
|
||||
log.error('Error while validating selected profile:', refreshResponse.error)
|
||||
log.info('Account access token is invalid.')
|
||||
return false
|
||||
}
|
||||
log.info('Account access token validated.')
|
||||
return true
|
||||
} else {
|
||||
log.info('Account access token validated.')
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the selected account with Microsoft's authserver. If the account is not valid,
|
||||
* we will attempt to refresh the access token and update that value. If that fails, a
|
||||
@ -304,12 +206,5 @@ async function validateSelectedMicrosoftAccount(){
|
||||
* otherwise false.
|
||||
*/
|
||||
exports.validateSelected = async function(){
|
||||
const current = ConfigManager.getSelectedAccount()
|
||||
|
||||
if(current.type === 'microsoft') {
|
||||
return await validateSelectedMicrosoftAccount()
|
||||
} else {
|
||||
return await validateSelectedMojangAccount()
|
||||
}
|
||||
|
||||
return await validateSelectedMicrosoftAccount()
|
||||
}
|
@ -213,34 +213,6 @@ exports.getTempNativeFolder = function(){
|
||||
|
||||
// System Settings (Unconfigurable on UI)
|
||||
|
||||
/**
|
||||
* Retrieve the news cache to determine
|
||||
* whether or not there is newer news.
|
||||
*
|
||||
* @returns {Object} The news cache object.
|
||||
*/
|
||||
exports.getNewsCache = function(){
|
||||
return config.newsCache
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the new news cache object.
|
||||
*
|
||||
* @param {Object} newsCache The new news cache object.
|
||||
*/
|
||||
exports.setNewsCache = function(newsCache){
|
||||
config.newsCache = newsCache
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether or not the news has been dismissed (checked)
|
||||
*
|
||||
* @param {boolean} dismissed Whether or not the news has been dismissed (checked).
|
||||
*/
|
||||
exports.setNewsCacheDismissed = function(dismissed){
|
||||
config.newsCache.dismissed = dismissed
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the common directory for shared
|
||||
* game files (assets, libraries, etc).
|
||||
@ -319,42 +291,6 @@ exports.getAuthAccount = function(uuid){
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the access token of an authenticated mojang account.
|
||||
*
|
||||
* @param {string} uuid The uuid of the authenticated account.
|
||||
* @param {string} accessToken The new Access Token.
|
||||
*
|
||||
* @returns {Object} The authenticated account object created by this action.
|
||||
*/
|
||||
exports.updateMojangAuthAccount = function(uuid, accessToken){
|
||||
config.authenticationDatabase[uuid].accessToken = accessToken
|
||||
config.authenticationDatabase[uuid].type = 'mojang' // For gradual conversion.
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an authenticated mojang account to the database to be stored.
|
||||
*
|
||||
* @param {string} uuid The uuid of the authenticated account.
|
||||
* @param {string} accessToken The accessToken of the authenticated account.
|
||||
* @param {string} username The username (usually email) of the authenticated account.
|
||||
* @param {string} displayName The in game name of the authenticated account.
|
||||
*
|
||||
* @returns {Object} The authenticated account object created by this action.
|
||||
*/
|
||||
exports.addMojangAuthAccount = function(uuid, accessToken, username, displayName){
|
||||
config.selectedAccount = uuid
|
||||
config.authenticationDatabase[uuid] = {
|
||||
type: 'mojang',
|
||||
accessToken,
|
||||
username: username.trim(),
|
||||
uuid: uuid.trim(),
|
||||
displayName: displayName.trim()
|
||||
}
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the tokens of an authenticated microsoft account.
|
||||
*
|
||||
|
@ -680,94 +680,3 @@ function dlAsync(login = true){
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* News Loading Functions
|
||||
*/
|
||||
|
||||
// DOM Cache
|
||||
const newsContent = document.getElementById('newsContent')
|
||||
const newsArticleTitle = document.getElementById('newsArticleTitle')
|
||||
const newsArticleDate = document.getElementById('newsArticleDate')
|
||||
const newsArticleAuthor = document.getElementById('newsArticleAuthor')
|
||||
const newsArticleComments = document.getElementById('newsArticleComments')
|
||||
const newsNavigationStatus = document.getElementById('newsNavigationStatus')
|
||||
const newsArticleContentScrollable = document.getElementById('newsArticleContentScrollable')
|
||||
const nELoadSpan = document.getElementById('nELoadSpan')
|
||||
|
||||
// News slide caches.
|
||||
let newsActive = false
|
||||
let newsGlideCount = 0
|
||||
|
||||
/**
|
||||
* Show the news UI via a slide animation.
|
||||
*
|
||||
* @param {boolean} up True to slide up, otherwise false.
|
||||
*/
|
||||
function slide_(up){
|
||||
const lCUpper = document.querySelector('#landingContainer > #upper')
|
||||
const lCLLeft = document.querySelector('#landingContainer > #lower > #left')
|
||||
const lCLCenter = document.querySelector('#landingContainer > #lower > #center')
|
||||
const lCLRight = document.querySelector('#landingContainer > #lower > #right')
|
||||
const newsBtn = document.querySelector('#landingContainer > #lower > #center #content')
|
||||
const landingContainer = document.getElementById('landingContainer')
|
||||
const newsContainer = document.querySelector('#landingContainer > #newsContainer')
|
||||
|
||||
newsGlideCount++
|
||||
|
||||
if(up){
|
||||
lCUpper.style.top = '-200vh'
|
||||
lCLLeft.style.top = '-200vh'
|
||||
lCLCenter.style.top = '-200vh'
|
||||
lCLRight.style.top = '-200vh'
|
||||
newsBtn.style.top = '130vh'
|
||||
newsContainer.style.top = '0px'
|
||||
//date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'})
|
||||
//landingContainer.style.background = 'rgba(29, 29, 29, 0.55)'
|
||||
landingContainer.style.background = 'rgba(0, 0, 0, 0.50)'
|
||||
setTimeout(() => {
|
||||
if(newsGlideCount === 1){
|
||||
lCLCenter.style.transition = 'none'
|
||||
newsBtn.style.transition = 'none'
|
||||
}
|
||||
newsGlideCount--
|
||||
}, 2000)
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
newsGlideCount--
|
||||
}, 2000)
|
||||
landingContainer.style.background = null
|
||||
lCLCenter.style.transition = null
|
||||
newsBtn.style.transition = null
|
||||
newsContainer.style.top = '100%'
|
||||
lCUpper.style.top = '0px'
|
||||
lCLLeft.style.top = '0px'
|
||||
lCLCenter.style.top = '0px'
|
||||
lCLRight.style.top = '0px'
|
||||
newsBtn.style.top = '10px'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add keyboard controls to the news UI. Left and right arrows toggle
|
||||
* between articles. If you are on the landing page, the up arrow will
|
||||
* open the news UI.
|
||||
*/
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if(newsActive){
|
||||
if(e.key === 'ArrowRight' || e.key === 'ArrowLeft'){
|
||||
document.getElementById(e.key === 'ArrowRight' ? 'newsNavigateRight' : 'newsNavigateLeft').click()
|
||||
}
|
||||
// Interferes with scrolling an article using the down arrow.
|
||||
// Not sure of a straight forward solution at this point.
|
||||
// if(e.key === 'ArrowDown'){
|
||||
// document.getElementById('newsButton').click()
|
||||
// }
|
||||
} else {
|
||||
if(getCurrentView() === VIEWS.landing){
|
||||
if(e.key === 'ArrowUp'){
|
||||
document.getElementById('newsButton').click()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
@ -1,6 +1,5 @@
|
||||
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
|
||||
const loginOptionMicrosoft = document.getElementById('loginOptionMicrosoft')
|
||||
const loginOptionMojang = document.getElementById('loginOptionMojang')
|
||||
const loginOptionsCancelButton = document.getElementById('loginOptionCancelButton')
|
||||
|
||||
let loginOptionsCancellable = false
|
||||
@ -28,14 +27,6 @@ loginOptionMicrosoft.onclick = (e) => {
|
||||
})
|
||||
}
|
||||
|
||||
loginOptionMojang.onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
loginCancelEnabled(true)
|
||||
})
|
||||
}
|
||||
|
||||
loginOptionsCancelButton.onclick = (e) => {
|
||||
switchView(getCurrentView(), loginOptionsViewOnCancel, 500, 500, () => {
|
||||
// Clear login values (Mojang login)
|
||||
|
@ -318,15 +318,6 @@ settingsNavDone.onclick = () => {
|
||||
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
|
||||
loginCancelEnabled(true)
|
||||
})
|
||||
}
|
||||
|
||||
// Bind the add microsoft account button.
|
||||
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
@ -598,7 +589,6 @@ function refreshAuthAccountSelected(uuid){
|
||||
}
|
||||
|
||||
const settingsCurrentMicrosoftAccounts = document.getElementById('settingsCurrentMicrosoftAccounts')
|
||||
const settingsCurrentMojangAccounts = document.getElementById('settingsCurrentMojangAccounts')
|
||||
|
||||
/**
|
||||
* Add auth account elements for each one stored in the authentication database.
|
||||
@ -612,7 +602,6 @@ function populateAuthAccounts(){
|
||||
const selectedUUID = ConfigManager.getSelectedAccount().uuid
|
||||
|
||||
let microsoftAuthAccountStr = ''
|
||||
let mojangAuthAccountStr = ''
|
||||
|
||||
authKeys.forEach((val) => {
|
||||
const acc = authAccounts[val]
|
||||
@ -641,16 +630,12 @@ function populateAuthAccounts(){
|
||||
</div>
|
||||
</div>`
|
||||
|
||||
if(acc.type === 'microsoft') {
|
||||
microsoftAuthAccountStr += accHtml
|
||||
} else {
|
||||
mojangAuthAccountStr += accHtml
|
||||
}
|
||||
microsoftAuthAccountStr += accHtml
|
||||
|
||||
|
||||
})
|
||||
|
||||
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
|
||||
settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
|
||||
}
|
||||
|
||||
/**
|
||||
|
BIN
build/icon.icns
BIN
build/icon.icns
Binary file not shown.
@ -2,7 +2,7 @@ appId: 'lukienlivelauncher'
|
||||
productName: 'LukiEnLiveLauncher'
|
||||
artifactName: '${productName}-setup-${version}.${ext}'
|
||||
|
||||
copyright: 'Copyright © 2018-2022 Daniel Scalzi'
|
||||
copyright: 'Copyright © LukiEnLive'
|
||||
|
||||
asar: true
|
||||
compression: 'maximum'
|
||||
@ -26,26 +26,6 @@ nsis:
|
||||
allowElevation: true
|
||||
allowToChangeInstallationDirectory: true
|
||||
|
||||
# macOS Configuration
|
||||
mac:
|
||||
target:
|
||||
- target: 'dmg'
|
||||
arch:
|
||||
- 'x64'
|
||||
- 'arm64'
|
||||
artifactName: '${productName}-setup-${version}-${arch}.${ext}'
|
||||
category: 'public.app-category.games'
|
||||
|
||||
# Linux Configuration
|
||||
linux:
|
||||
target: 'AppImage'
|
||||
maintainer: 'Daniel Scalzi'
|
||||
vendor: 'Daniel Scalzi'
|
||||
synopsis: 'Modded Minecraft Launcher'
|
||||
description: 'Custom launcher which allows users to join modded servers. All mods, configurations, and updates are handled automatically.'
|
||||
category: 'Game'
|
||||
|
||||
|
||||
directories:
|
||||
buildResources: 'build'
|
||||
output: 'dist'
|
Loading…
Reference in New Issue
Block a user