2018-04-15 02:43:58 +00:00
|
|
|
/**
|
|
|
|
* AuthManager
|
|
|
|
*
|
|
|
|
* This module aims to abstract login procedures. Results from Mojang's REST api
|
|
|
|
* are retrieved through our Mojang module. These results are processed and stored,
|
|
|
|
* if applicable, in the config using the ConfigManager. All login procedures should
|
|
|
|
* be made through this module.
|
|
|
|
*
|
|
|
|
* @module authmanager
|
|
|
|
*/
|
|
|
|
// Requirements
|
2018-07-22 15:40:15 +00:00
|
|
|
const ConfigManager = require('./configmanager')
|
2022-02-06 23:23:44 +00:00
|
|
|
const { LoggerUtil } = require('helios-core')
|
|
|
|
const { MojangRestAPI, mojangErrorDisplayable, MojangErrorCode } = require('helios-core/mojang')
|
|
|
|
const { RestResponseStatus } = require('helios-core/common')
|
|
|
|
|
|
|
|
const log = LoggerUtil.getLogger('AuthManager')
|
2017-12-03 13:12:55 +00:00
|
|
|
|
2018-04-15 02:43:58 +00:00
|
|
|
// Functions
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add an 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.
|
2018-04-29 22:05:59 +00:00
|
|
|
* @returns {Promise.<Object>} Promise which resolves the resolved authenticated account object.
|
2018-04-15 02:43:58 +00:00
|
|
|
*/
|
2018-01-19 04:45:50 +00:00
|
|
|
exports.addAccount = async function(username, password){
|
2018-05-07 22:15:59 +00:00
|
|
|
try {
|
2022-02-06 23:23:44 +00:00
|
|
|
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.addAuthAccount(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))
|
2019-02-05 22:26:00 +00:00
|
|
|
}
|
2022-02-06 23:23:44 +00:00
|
|
|
|
2019-02-05 22:26:00 +00:00
|
|
|
} else {
|
2022-02-06 23:23:44 +00:00
|
|
|
return Promise.reject(mojangErrorDisplayable(response.mojangErrorCode))
|
2018-11-04 07:03:55 +00:00
|
|
|
}
|
2019-02-05 22:26:00 +00:00
|
|
|
|
2018-01-29 06:23:20 +00:00
|
|
|
} catch (err){
|
2022-02-06 23:23:44 +00:00
|
|
|
log.error(err)
|
|
|
|
return Promise.reject(mojangErrorDisplayable(MojangErrorCode.UNKNOWN))
|
2018-01-29 06:23:20 +00:00
|
|
|
}
|
2017-12-03 13:12:55 +00:00
|
|
|
}
|
|
|
|
|
2018-04-15 02:43:58 +00:00
|
|
|
/**
|
|
|
|
* Remove an 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.removeAccount = async function(uuid){
|
|
|
|
try {
|
|
|
|
const authAcc = ConfigManager.getAuthAccount(uuid)
|
2022-02-06 23:23:44 +00:00
|
|
|
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)
|
|
|
|
}
|
2018-04-15 02:43:58 +00:00
|
|
|
} catch (err){
|
2022-02-06 23:23:44 +00:00
|
|
|
log.error('Error while removing account', err)
|
2018-04-15 02:43:58 +00:00
|
|
|
return Promise.reject(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* **Function is WIP**
|
|
|
|
*
|
|
|
|
* @returns {Promise.<boolean>} Promise which resolves to true if the access token is valid,
|
|
|
|
* otherwise false.
|
|
|
|
*/
|
2018-01-19 04:45:50 +00:00
|
|
|
exports.validateSelected = async function(){
|
|
|
|
const current = ConfigManager.getSelectedAccount()
|
2022-02-06 23:23:44 +00:00
|
|
|
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.updateAuthAccount(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
|
2018-01-19 04:45:50 +00:00
|
|
|
}
|
2022-02-06 23:23:44 +00:00
|
|
|
log.info('Account access token validated.')
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
log.info('Account access token validated.')
|
|
|
|
return true
|
2017-12-03 13:12:55 +00:00
|
|
|
}
|
2018-01-19 04:45:50 +00:00
|
|
|
}
|
2022-02-06 23:23:44 +00:00
|
|
|
|
2017-12-03 13:12:55 +00:00
|
|
|
}
|