protected static LoginResponse authenticateWithAuthlib (String user, String pass, String mojangData, String selectedProfileName) {
String displayName;
boolean hasMojangData = false;
boolean hasPassword = false;
GameProfile selectedProfile = null;
YggdrasilUserAuthentication authentication = (YggdrasilUserAuthentication) new YggdrasilAuthenticationService(Proxy.NO_PROXY, "1").createUserAuthentication(Agent.MINECRAFT);
if (user != null) {
Logger.logDebug(user.contains("@") ? "Email address given" : "Username given" + " Not 100% sure, mojangdata might contain different username");
Logger.logInfo("Beginning authlib authentication attempt");
Logger.logInfo("successfully created YggdrasilAuthenticationService");
authentication.setUsername(user);
if (pass != null && !pass.isEmpty()) {
authentication.setPassword(pass);
hasPassword = true;
}
if (mojangData != null && !mojangData.isEmpty()) {
Logger.logDebug("mojangData was passed to current method");
Map<String, Object> m = decode(mojangData);
if (m != null) {
Logger.logDebug("Loading mojangData into authlib");
authentication.loadFromStorage(m);
hasMojangData = true;
}
} else {
Logger.logDebug("mojangData is null or empty");
}
if (authentication.canLogIn()) {
try {
authentication.logIn();
} catch (UserMigratedException e) {
Logger.logError(e.toString());
ErrorUtils.tossError("Invalid credentials. You have migrated your account. Use account email instead of username");
return null;
} catch (InvalidCredentialsException e) {
Logger.logError("Invalid credentials recieved for user: " + user, e);
if (hasMojangData && hasPassword) {
uniqueID = authentication.getSelectedProfile().getId().toString();
//could be bad or expired keys, etc. will re-run w/o auth data to refresh and error after password was entered
} else {
if (user.contains("@")) {
ErrorUtils.tossError("Invalid username or password. You need use your official and paid minecraft.net account credentials.");
} else {
ErrorUtils.tossError("Invalid username or password. You need use your official and paid minecraft.net account credentials. \nAlso try email address instead of username");
}
return null;
}
} catch (AuthenticationUnavailableException e) {
Logger.logDebug("Error while authenticating, trying offline mode");
if (hasMojangData) {
//if the UUID is valid we can proceed to offline mode later
uniqueID = authentication.getSelectedProfile().getId().toString();
if (uniqueID != null && !uniqueID.isEmpty()) {
Logger.logDebug("Setting UUID");
}
UserManager.setUUID(user, uniqueID);
}
if (uniqueID != null && !uniqueID.isEmpty()) {
UserManager.setUUID(user, uniqueID);
Logger.logDebug("Setting UUID and creating and returning new LoginResponse");
return new LoginResponse(Integer.toString(authentication.getAgent().getVersion()), "token", user, null, uniqueID, authentication);
}
ErrorUtils.tossError("Minecraft authentication servers might be down. Check @ help.mojang.com");
Logger.logDebug("failed", e);
Logger.logDebug("AuthenticationUnavailableException caused by", e.getCause());
return null;
} catch (AuthenticationException e) {
Logger.logError("Unknown error from authlib:", e);
Logger.logDebug("AuthenticationException caused by", e.getCause());
} catch (Exception e) {
Logger.logError("Unknown error from authlib: ", e);
Logger.logDebug("Exception caused by", e.getCause());
}
} else {
Logger.logDebug("authentication.canLogIn() returned false");
}
if (isValid(authentication)) {
Logger.logDebug("Authentication is valid ");
displayName = authentication.getSelectedProfile().getName();
if ((authentication.isLoggedIn()) && (authentication.canPlayOnline())) {
Logger.logDebug("loggedIn() && CanPlayOnline()");
if ((authentication instanceof YggdrasilUserAuthentication)) {
UserManager.setStore(user, encode(authentication.saveForStorage()));
UserManager.setUUID(user, authentication.getSelectedProfile().getId().toString());//enables use of offline mode later if needed on newer MC Versions
Logger.logDebug("Authentication done, returning LoginResponse");
return new LoginResponse(Integer.toString(authentication.getAgent().getVersion()), "token", displayName, authentication.getAuthenticatedToken(), authentication
.getSelectedProfile().getId().toString(), authentication);
}
}
Logger.logDebug("this should never happen: isLoggedIn: " + authentication.isLoggedIn() + " canPlayOnline(): " + authentication.canPlayOnline());
} else if (authentication.getSelectedProfile() == null && (authentication.getAvailableProfiles() != null && authentication.getAvailableProfiles().length != 0)) {
// user has more than one profile in his mojang acoount
Logger.logInfo("You seem to have multiple profiles in your account. Please contact FTB Launcher team if profiles are not working!");
Logger.logDebug("User has more than one profile: " + toString(authentication));
for (GameProfile profile : authentication.getAvailableProfiles()) {
if (selectedProfileName.equals(profile.getName())) {
Logger.logInfo("Selected profile: " + profile.getName());
selectedProfile = profile;
}
}
if (selectedProfile == null) {
Logger.logInfo("Profile not found, defaulting to first");
selectedProfile = authentication.getAvailableProfiles()[0];
}
Logger.logDebug("Authentication done, returning LoginResponse");
return new LoginResponse(Integer.toString(authentication.getAgent().getVersion()), "token", selectedProfile.getName(), authentication.getAuthenticatedToken(),
selectedProfile.getId().toString(), authentication);
} else if (authentication.getSelectedProfile() == null && (authentication.getAvailableProfiles() != null && authentication.getAvailableProfiles().length == 0)) {
// user has 0 paid profiles in mojang account
Logger.logDebug("No paid profiles in mojang account: " + toString(authentication));
Logger.logError("You need paid minecraft to play FTB Modpacks...");
ErrorUtils.showClickableMessage("You need paid minecraft to play FTB Modpacks:"
+ "<ul>"