Rewrite authentication handling

Fix logout not working until restart
This commit is contained in:
johni0702
2015-08-31 16:16:22 +02:00
parent d72d12783f
commit aee9d6b232
14 changed files with 210 additions and 180 deletions

View File

@@ -10,11 +10,14 @@ import eu.crushedpixel.replaymod.gui.online.GuiReplayDownloading;
import eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay; import eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay;
import eu.crushedpixel.replaymod.holders.KeyframeSet; import eu.crushedpixel.replaymod.holders.KeyframeSet;
import eu.crushedpixel.replaymod.localization.LocalizedResourcePack; import eu.crushedpixel.replaymod.localization.LocalizedResourcePack;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler; import eu.crushedpixel.replaymod.online.authentication.ConfigurationAuthData;
import eu.crushedpixel.replaymod.online.urischeme.UriScheme; import eu.crushedpixel.replaymod.online.urischeme.UriScheme;
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
import eu.crushedpixel.replaymod.registry.*; import eu.crushedpixel.replaymod.registry.*;
import eu.crushedpixel.replaymod.renderer.*; import eu.crushedpixel.replaymod.renderer.CustomObjectRenderer;
import eu.crushedpixel.replaymod.renderer.InvisibilityRender;
import eu.crushedpixel.replaymod.renderer.PathPreviewRenderer;
import eu.crushedpixel.replaymod.renderer.SpectatorRenderer;
import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.replay.ReplayProcess; import eu.crushedpixel.replaymod.replay.ReplayProcess;
import eu.crushedpixel.replaymod.replay.ReplaySender; import eu.crushedpixel.replaymod.replay.ReplaySender;
@@ -83,7 +86,6 @@ public class ReplayMod {
} }
public static final String MODID = "replaymod"; public static final String MODID = "replaymod";
public static final ApiClient apiClient = new ApiClient();
private static final Minecraft mc = Minecraft.getMinecraft(); private static final Minecraft mc = Minecraft.getMinecraft();
public static GuiEventHandler guiEventHandler; public static GuiEventHandler guiEventHandler;
public static GuiReplayOverlay overlay; public static GuiReplayOverlay overlay;
@@ -107,6 +109,7 @@ public class ReplayMod {
public static CustomObjectRenderer customObjectRenderer; public static CustomObjectRenderer customObjectRenderer;
public static SoundHandler soundHandler = new SoundHandler(); public static SoundHandler soundHandler = new SoundHandler();
public static CrosshairRenderHandler crosshairRenderHandler; public static CrosshairRenderHandler crosshairRenderHandler;
public static ApiClient apiClient;
@Getter @Getter
private static boolean latestModVersion = true; private static boolean latestModVersion = true;
@@ -134,7 +137,9 @@ public class ReplayMod {
config = new Configuration(event.getSuggestedConfigurationFile()); config = new Configuration(event.getSuggestedConfigurationFile());
config.load(); config.load();
AuthenticationHandler.loadAuthkeyFromConfig(); ConfigurationAuthData authData = new ConfigurationAuthData(config);
apiClient = new ApiClient(authData);
authData.load(apiClient);
uploadedFileHandler = new UploadedFileHandler(event.getModConfigurationDirectory()); uploadedFileHandler = new UploadedFileHandler(event.getModConfigurationDirectory());

View File

@@ -27,28 +27,66 @@ public class ApiClient {
private static final Gson gson = new Gson(); private static final Gson gson = new Gson();
private static final JsonParser jsonParser = new JsonParser(); private static final JsonParser jsonParser = new JsonParser();
public AuthKey getLogin(String username, String password) throws IOException, ApiException { private final AuthData authData;
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.login);
builder.put("user", username); public ApiClient(AuthData authData) {
builder.put("pw", password); this.authData = authData;
builder.put("mod", true);
return invokeAndReturn(builder, AuthKey.class);
} }
public AuthKey register(String username, String mail, String password, String uuid) public boolean isLoggedIn() {
throws IOException, ApiException, AuthenticationException { return authData.getUserName() != null && authData.getAuthKey() != null;
}
public String getAuthKey() {
return authData.getAuthKey();
}
public void register(String userName, String eMail, String password) throws AuthenticationException, IOException, ApiException {
AuthenticationHash authenticationHash = sessionserverJoin(); AuthenticationHash authenticationHash = sessionserverJoin();
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.register); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.register);
builder.put("username", username); builder.put("username", userName);
builder.put("email", mail); builder.put("email", eMail);
builder.put("password", password); builder.put("password", password);
builder.put("uuid", uuid); builder.put("uuid", mc.getSession().getProfile().getId().toString());
builder.put("mcusername", authenticationHash.username); builder.put("mcusername", authenticationHash.username);
builder.put("timelong", authenticationHash.currentTime); builder.put("timelong", authenticationHash.currentTime);
builder.put("randomlong", authenticationHash.randomLong); builder.put("randomlong", authenticationHash.randomLong);
return invokeAndReturn(builder, AuthKey.class); AuthKey auth = invokeAndReturn(builder, AuthKey.class);
authData.setData(userName, auth.getAuth());
}
public AuthData.AuthResult login(String userName, String password) {
try {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.login);
builder.put("user", userName);
builder.put("pw", password);
builder.put("mod", true);
AuthKey result = invokeAndReturn(builder, AuthKey.class);
authData.setData(userName, result.getAuth());
return AuthData.AuthResult.SUCCESS;
} catch(ApiException e) {
return AuthData.AuthResult.INVALID_DATA;
} catch(Exception e) {
return AuthData.AuthResult.IO_ERROR;
}
}
public AuthData.AuthResult logout() {
try {
authData.setData(null, null);
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.logout);
builder.put("auth", authData.getAuthKey());
builder.put("mod", true);
invokeAndReturn(builder, Success.class);
return AuthData.AuthResult.SUCCESS;
} catch(ApiException e) {
return AuthData.AuthResult.INVALID_DATA;
} catch(Exception e) {
return AuthData.AuthResult.IO_ERROR;
}
} }
private AuthenticationHash sessionserverJoin() throws AuthenticationException { private AuthenticationHash sessionserverJoin() throws AuthenticationException {
@@ -70,21 +108,6 @@ public class ApiClient {
} }
} }
public boolean logout(String auth) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.logout);
builder.put("auth", auth);
builder.put("mod", true);
Success succ = invokeAndReturn(builder, Success.class);
return succ.isSuccess();
}
public boolean hasDonated(String uuid) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.check_auth);
builder.put("uuid", uuid);
Donated succ = invokeAndReturn(builder, Donated.class);
return succ.hasDonated();
}
public FileInfo[] getFileInfo(List<Integer> ids) throws IOException, ApiException { public FileInfo[] getFileInfo(List<Integer> ids) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.file_details); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.file_details);
builder.put("id", buildListString(ids)); builder.put("id", buildListString(ids));
@@ -111,11 +134,11 @@ public class ApiClient {
private boolean cancelDownload = false; private boolean cancelDownload = false;
public void downloadFile(String auth, int file, File target, ProgressUpdateListener listener) throws IOException, ApiException { public void downloadFile(int file, File target, ProgressUpdateListener listener) throws IOException, ApiException {
cancelDownload = false; cancelDownload = false;
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.download_file); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.download_file);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
builder.put("id", file); builder.put("id", file);
String url = builder.toString(); String url = builder.toString();
URL website = new URL(url); URL website = new URL(url);
@@ -167,40 +190,40 @@ public class ApiClient {
this.cancelDownload = true; this.cancelDownload = true;
} }
public void rateFile(String auth, int file, Rating.RatingType rating) throws IOException, ApiException { public void rateFile(int file, Rating.RatingType rating) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.rate_file); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.rate_file);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
builder.put("id", file); builder.put("id", file);
builder.put("rating", rating.getKey()); builder.put("rating", rating.getKey());
invokeAndReturn(builder, Success.class); invokeAndReturn(builder, Success.class);
} }
public FileRating[] getRatedFiles(String auth) throws IOException, ApiException { public FileRating[] getRatedFiles() throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.get_ratings); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.get_ratings);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
return invokeAndReturn(builder, RatedFiles.class).getRated(); return invokeAndReturn(builder, RatedFiles.class).getRated();
} }
public void favFile(String auth, int file, boolean fav) throws IOException, ApiException { public void favFile(int file, boolean fav) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.fav_file); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.fav_file);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
builder.put("id", file); builder.put("id", file);
builder.put("fav", fav); builder.put("fav", fav);
invokeAndReturn(builder, Success.class); invokeAndReturn(builder, Success.class);
} }
public int[] getFavorites(String auth) throws IOException, ApiException { public int[] getFavorites() throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.get_favorites); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.get_favorites);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
return invokeAndReturn(builder, Favorites.class).getFavorited(); return invokeAndReturn(builder, Favorites.class).getFavorited();
} }
@Api @Api
public void removeFile(String auth, int file) throws IOException, ApiException { public void removeFile(int file) throws IOException, ApiException {
QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.remove_file); QueryBuilder builder = new QueryBuilder(ReplayModApiMethods.remove_file);
builder.put("auth", auth); builder.put("auth", authData.getAuthKey());
builder.put("id", file); builder.put("id", file);
invokeAndReturn(builder, Success.class); invokeAndReturn(builder, Success.class);
} }

View File

@@ -0,0 +1,45 @@
package eu.crushedpixel.replaymod.api;
/**
* Represents a set of persistent authentication data.
*/
public interface AuthData {
/**
* Returns the user name of the authenticated user.
* @return user name or {@code null} if not logged in
*/
String getUserName();
/**
* Returns the authentication key of the authenticated user.
* @return auth key or {@code null} if not logged in
*/
String getAuthKey();
/**
* Store the authentication data after login.
* @param userName The user name
* @param authKey The authentication key
*/
void setData(String userName, String authKey);
/**
* Result of authentication operations.
*/
enum AuthResult {
/**
* The operation succeeded without errors.
*/
SUCCESS,
/**
* The data provided got rejected due to it being invalid.
*/
INVALID_DATA,
/**
* Operation could not be performed due to connectivity problems.
*/
IO_ERROR,
}
}

View File

@@ -1,6 +1,7 @@
package eu.crushedpixel.replaymod.api.replay; package eu.crushedpixel.replaymod.api.replay;
import com.google.gson.Gson; import com.google.gson.Gson;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.api.replay.holders.ApiError; import eu.crushedpixel.replaymod.api.replay.holders.ApiError;
import eu.crushedpixel.replaymod.api.replay.holders.Category; import eu.crushedpixel.replaymod.api.replay.holders.Category;
import eu.crushedpixel.replaymod.gui.online.GuiUploadFile; import eu.crushedpixel.replaymod.gui.online.GuiUploadFile;
@@ -23,7 +24,7 @@ public class FileUploader {
private GuiUploadFile parent; private GuiUploadFile parent;
public void uploadFile(GuiUploadFile gui, String auth, String filename, List<String> tags, File file, Category category, String description) { public void uploadFile(GuiUploadFile gui, String filename, List<String> tags, File file, Category category, String description) {
boolean success = false; boolean success = false;
String info = null; String info = null;
@@ -35,7 +36,7 @@ public class FileUploader {
if(uploading) throw new RuntimeException("FileUploader is already uploading"); if(uploading) throw new RuntimeException("FileUploader is already uploading");
uploading = true; uploading = true;
String postData = "?auth=" + auth + "&category=" + category.getId(); String postData = "?auth=" + ReplayMod.apiClient.getAuthKey() + "&category=" + category.getId();
if(tags.size() > 0) { if(tags.size() > 0) {
postData += "&tags="; postData += "&tags=";

View File

@@ -7,7 +7,6 @@ import eu.crushedpixel.replaymod.gui.online.GuiLoginPrompt;
import eu.crushedpixel.replaymod.gui.online.GuiReplayCenter; import eu.crushedpixel.replaymod.gui.online.GuiReplayCenter;
import eu.crushedpixel.replaymod.gui.replayeditor.GuiReplayEditor; import eu.crushedpixel.replaymod.gui.replayeditor.GuiReplayEditor;
import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer; import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.replay.ReplayProcess; import eu.crushedpixel.replaymod.replay.ReplayProcess;
import eu.crushedpixel.replaymod.studio.VersionValidator; import eu.crushedpixel.replaymod.studio.VersionValidator;
@@ -43,7 +42,7 @@ public class GuiEventHandler {
if(event.gui instanceof GuiMainMenu) { if(event.gui instanceof GuiMainMenu) {
if(ReplayMod.firstMainMenu) { if(ReplayMod.firstMainMenu) {
ReplayMod.firstMainMenu = false; ReplayMod.firstMainMenu = false;
if(!AuthenticationHandler.isAuthenticated()) { if(!ReplayMod.apiClient.isLoggedIn()) {
event.gui = new GuiLoginPrompt(event.gui, event.gui, false).toMinecraft(); event.gui = new GuiLoginPrompt(event.gui, event.gui, false).toMinecraft();
return; return;
} }
@@ -57,7 +56,7 @@ public class GuiEventHandler {
if(ReplayHandler.isInReplay()) ReplayHandler.setInReplay(false); if(ReplayHandler.isInReplay()) ReplayHandler.setInReplay(false);
} }
if(!AuthenticationHandler.isAuthenticated()) return; if(!ReplayMod.apiClient.isLoggedIn()) return;
if(event.gui instanceof GuiChat || event.gui instanceof GuiInventory) { if(event.gui instanceof GuiChat || event.gui instanceof GuiInventory) {
if(ReplayHandler.isInReplay()) { if(ReplayHandler.isInReplay()) {
@@ -74,7 +73,7 @@ public class GuiEventHandler {
public void onDraw(DrawScreenEvent e) { public void onDraw(DrawScreenEvent e) {
if(e.gui instanceof GuiMainMenu) { if(e.gui instanceof GuiMainMenu) {
e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.title")+":", 5, 5, Color.WHITE.getRGB()); e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.title")+":", 5, 5, Color.WHITE.getRGB());
if(AuthenticationHandler.isAuthenticated()) { if(ReplayMod.apiClient.isLoggedIn()) {
e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.gui.loggedin").toUpperCase(), 5, 15, DARK_GREEN.getRGB()); e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.gui.loggedin").toUpperCase(), 5, 15, DARK_GREEN.getRGB());
} else { } else {
e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.gui.loggedout").toUpperCase(), 5, 15, DARK_RED.getRGB()); e.gui.drawString(mc.fontRendererObj, I18n.format("replaymod.gui.loggedout").toUpperCase(), 5, 15, DARK_RED.getRGB());
@@ -174,7 +173,7 @@ public class GuiEventHandler {
if(event.button.id == GuiConstants.REPLAY_MANAGER_BUTTON_ID) { if(event.button.id == GuiConstants.REPLAY_MANAGER_BUTTON_ID) {
mc.displayGuiScreen(new GuiReplayViewer()); mc.displayGuiScreen(new GuiReplayViewer());
} else if(event.button.id == GuiConstants.REPLAY_CENTER_BUTTON_ID) { } else if(event.button.id == GuiConstants.REPLAY_CENTER_BUTTON_ID) {
if(AuthenticationHandler.isAuthenticated()) { if(ReplayMod.apiClient.isLoggedIn()) {
mc.displayGuiScreen(new GuiReplayCenter()); mc.displayGuiScreen(new GuiReplayCenter());
} else { } else {
mc.displayGuiScreen(new GuiLoginPrompt(event.gui, new GuiReplayCenter(), true).toMinecraft()); mc.displayGuiScreen(new GuiLoginPrompt(event.gui, new GuiReplayCenter(), true).toMinecraft());

View File

@@ -6,8 +6,8 @@ import de.johni0702.minecraft.gui.element.GuiLabel;
import de.johni0702.minecraft.gui.element.GuiPasswordField; import de.johni0702.minecraft.gui.element.GuiPasswordField;
import de.johni0702.minecraft.gui.element.GuiTextField; import de.johni0702.minecraft.gui.element.GuiTextField;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.gui.GuiConstants; import eu.crushedpixel.replaymod.gui.GuiConstants;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
public class GuiLoginPrompt extends AbstractGuiScreen<GuiLoginPrompt> { public class GuiLoginPrompt extends AbstractGuiScreen<GuiLoginPrompt> {
@@ -34,8 +34,8 @@ public class GuiLoginPrompt extends AbstractGuiScreen<GuiLoginPrompt> {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
switch(AuthenticationHandler.authenticate(username.getText(), password.getText())) { switch(ReplayMod.apiClient.login(username.getText(), password.getText())) {
case AuthenticationHandler.SUCCESS: case SUCCESS:
statusLabel.setText(""); statusLabel.setText("");
getMinecraft().addScheduledTask(new Runnable() { getMinecraft().addScheduledTask(new Runnable() {
@Override @Override
@@ -44,10 +44,10 @@ public class GuiLoginPrompt extends AbstractGuiScreen<GuiLoginPrompt> {
} }
}); });
break; break;
case AuthenticationHandler.INVALID: case INVALID_DATA:
statusLabel.setI18nText("replaymod.gui.login.incorrect"); statusLabel.setI18nText("replaymod.gui.login.incorrect");
break; break;
case AuthenticationHandler.NO_CONNECTION: case IO_ERROR:
statusLabel.setI18nText("replaymod.gui.login.connectionerror"); statusLabel.setI18nText("replaymod.gui.login.connectionerror");
break; break;
} }

View File

@@ -7,9 +7,9 @@ import de.johni0702.minecraft.gui.element.*;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.api.ApiException; import eu.crushedpixel.replaymod.api.ApiException;
import eu.crushedpixel.replaymod.gui.GuiConstants; import eu.crushedpixel.replaymod.gui.GuiConstants;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import eu.crushedpixel.replaymod.utils.EmailAddressUtils; import eu.crushedpixel.replaymod.utils.EmailAddressUtils;
import eu.crushedpixel.replaymod.utils.RegexUtils; import eu.crushedpixel.replaymod.utils.RegexUtils;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
@@ -80,7 +80,7 @@ public class GuiRegister extends AbstractGuiScreen<GuiRegister> {
String username = usernameInput.getText().trim(); String username = usernameInput.getText().trim();
String mail = mailInput.getText().trim(); String mail = mailInput.getText().trim();
String password = passwordInput.getText(); String password = passwordInput.getText();
AuthenticationHandler.register(username, mail, password); ReplayMod.apiClient.register(username, mail, password);
getMinecraft().addScheduledTask(new Runnable() { getMinecraft().addScheduledTask(new Runnable() {
@Override @Override

View File

@@ -14,7 +14,6 @@ import eu.crushedpixel.replaymod.gui.GuiConstants;
import eu.crushedpixel.replaymod.gui.elements.*; import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer; import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer;
import eu.crushedpixel.replaymod.holders.GuiEntryListStringEntry; import eu.crushedpixel.replaymod.holders.GuiEntryListStringEntry;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import net.minecraft.client.gui.*; import net.minecraft.client.gui.*;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
@@ -22,8 +21,9 @@ import org.lwjgl.input.Keyboard;
import java.awt.*; import java.awt.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback { public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback {
@@ -59,7 +59,7 @@ public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback {
Keyboard.enableRepeatEvents(true); Keyboard.enableRepeatEvents(true);
if(!initialized) { if(!initialized) {
if(!AuthenticationHandler.isAuthenticated()) { if(!ReplayMod.apiClient.isLoggedIn()) {
mc.displayGuiScreen(new GuiLoginPrompt(new GuiMainMenu(), this, true).toMinecraft()); mc.displayGuiScreen(new GuiLoginPrompt(new GuiMainMenu(), this, true).toMinecraft());
} }
@@ -73,11 +73,11 @@ public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback {
topBar.add(bestButton); topBar.add(bestButton);
GuiButton downloadedReplayButton = new GuiButton(GuiConstants.CENTER_DOWNLOADED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.downloaded")); GuiButton downloadedReplayButton = new GuiButton(GuiConstants.CENTER_DOWNLOADED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.downloaded"));
downloadedReplayButton.enabled = AuthenticationHandler.isAuthenticated(); downloadedReplayButton.enabled = ReplayMod.apiClient.isLoggedIn();
topBar.add(downloadedReplayButton); topBar.add(downloadedReplayButton);
GuiButton favoritedReplayButton = new GuiButton(GuiConstants.CENTER_FAVORITED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.favorited")); GuiButton favoritedReplayButton = new GuiButton(GuiConstants.CENTER_FAVORITED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.favorited"));
favoritedReplayButton.enabled = AuthenticationHandler.isAuthenticated(); favoritedReplayButton.enabled = ReplayMod.apiClient.isLoggedIn();
topBar.add(favoritedReplayButton); topBar.add(favoritedReplayButton);
GuiButton searchButton = new GuiButton(GuiConstants.CENTER_SEARCH_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.search")); GuiButton searchButton = new GuiButton(GuiConstants.CENTER_SEARCH_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.search"));
@@ -382,7 +382,7 @@ public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback {
mc.addScheduledTask(new Runnable() { mc.addScheduledTask(new Runnable() {
@Override @Override
public void run() { public void run() {
AuthenticationHandler.logout(); ReplayMod.apiClient.logout();
mc.displayGuiScreen(new GuiMainMenu()); mc.displayGuiScreen(new GuiMainMenu());
} }
}); });

View File

@@ -7,7 +7,6 @@ import eu.crushedpixel.replaymod.gui.GuiConstants;
import eu.crushedpixel.replaymod.gui.elements.*; import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.elements.listeners.ProgressUpdateListener; import eu.crushedpixel.replaymod.gui.elements.listeners.ProgressUpdateListener;
import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer; import eu.crushedpixel.replaymod.gui.replayviewer.GuiReplayViewer;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import eu.crushedpixel.replaymod.recording.ReplayMetaData; import eu.crushedpixel.replaymod.recording.ReplayMetaData;
import eu.crushedpixel.replaymod.registry.KeybindRegistry; import eu.crushedpixel.replaymod.registry.KeybindRegistry;
import eu.crushedpixel.replaymod.registry.ResourceHelper; import eu.crushedpixel.replaymod.registry.ResourceHelper;
@@ -135,7 +134,7 @@ public class GuiUploadFile extends GuiScreen implements ProgressUpdateListener {
return; return;
} }
if(!AuthenticationHandler.isAuthenticated()) { if(!ReplayMod.apiClient.isLoggedIn()) {
mc.displayGuiScreen(new GuiLoginPrompt(parent, this, true).toMinecraft()); mc.displayGuiScreen(new GuiLoginPrompt(parent, this, true).toMinecraft());
return; return;
} }
@@ -320,12 +319,12 @@ public class GuiUploadFile extends GuiScreen implements ProgressUpdateListener {
FileUtils.copyFile(replayFile, tmp); FileUtils.copyFile(replayFile, tmp);
ReplayFileIO.addFilesToZip(tmp, toAdd); ReplayFileIO.addFilesToZip(tmp, toAdd);
uploader.uploadFile(GuiUploadFile.this, AuthenticationHandler.getKey(), name, tags, tmp, category, desc); uploader.uploadFile(GuiUploadFile.this, name, tags, tmp, category, desc);
FileUtils.deleteQuietly(tmpMeta); FileUtils.deleteQuietly(tmpMeta);
FileUtils.deleteQuietly(tmp); FileUtils.deleteQuietly(tmp);
} else { } else {
uploader.uploadFile(GuiUploadFile.this, AuthenticationHandler.getKey(), name, tags, replayFile, category, desc); uploader.uploadFile(GuiUploadFile.this, name, tags, replayFile, category, desc);
} }
ReplayMod.uploadedFileHandler.markAsUploaded(replayFile); ReplayMod.uploadedFileHandler.markAsUploaded(replayFile);

View File

@@ -1,102 +0,0 @@
package eu.crushedpixel.replaymod.online.authentication;
import com.mojang.authlib.exceptions.AuthenticationException;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.api.ApiClient;
import eu.crushedpixel.replaymod.api.ApiException;
import eu.crushedpixel.replaymod.api.replay.holders.AuthConfirmation;
import eu.crushedpixel.replaymod.api.replay.holders.AuthKey;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.config.Property;
import java.io.IOException;
public class AuthenticationHandler {
public static final int SUCCESS = 1;
public static final int INVALID = 2;
public static final int NO_CONNECTION = 3;
private static final ApiClient apiClient = new ApiClient();
private static String authkey = null;
private static String username = null;
public static boolean isAuthenticated() {
return authkey != null;
}
public static String getKey() {
return authkey;
}
public static String getUsername() { return username; }
@SuppressWarnings("unused")
public static boolean hasDonated(String uuid) throws IOException, ApiException {
return apiClient.hasDonated(uuid);
}
private static Minecraft mc = Minecraft.getMinecraft();
public static void register(String usrname, String mail, String password)
throws IOException, ApiException, AuthenticationException {
AuthKey auth = apiClient.register(usrname, mail, password,
mc.getSession().getProfile().getId().toString());
username = usrname;
authkey = auth.getAuth();
saveAuthkey(authkey);
}
public static void loadAuthkeyFromConfig() {
Property p = ReplayMod.config.get("authkey", "authkey", "null");
String key = null;
if(!(p.getString().equals("null"))) {
key = p.getString();
}
if(key != null) {
AuthConfirmation conf = apiClient.checkAuthkey(key);
if(conf != null) {
authkey = key;
username = conf.getUsername();
} else {
saveAuthkey("null");
username = null;
}
}
}
public static int authenticate(String usrname, String password) {
try {
authkey = ReplayMod.apiClient.getLogin(usrname, password).getAuth();
username = usrname;
saveAuthkey(authkey);
return SUCCESS;
} catch(ApiException e) {
return INVALID;
} catch(Exception e) {
return NO_CONNECTION;
}
}
public static int logout() {
try {
ReplayMod.apiClient.logout(authkey);
authkey = null;
username = null;
saveAuthkey("null");
return SUCCESS;
} catch(ApiException e) {
return INVALID;
} catch(Exception e) {
return NO_CONNECTION;
}
}
private static void saveAuthkey(String authkey) {
ReplayMod.config.removeCategory(ReplayMod.config.getCategory("authkey"));
ReplayMod.config.get("authkey", "authkey", authkey);
ReplayMod.config.save();
}
}

View File

@@ -0,0 +1,63 @@
package eu.crushedpixel.replaymod.online.authentication;
import eu.crushedpixel.replaymod.api.ApiClient;
import eu.crushedpixel.replaymod.api.AuthData;
import eu.crushedpixel.replaymod.api.replay.holders.AuthConfirmation;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
/**
* Auth data stored in a {@link Configuration}.
*/
public class ConfigurationAuthData implements AuthData {
private final Configuration config;
private String userName;
private String authKey;
public ConfigurationAuthData(Configuration config) {
this.config = config;
}
/**
* Loads the data from the configuration and checks for its validity.
* If the data is invalid, it is removed from the config.
* @param apiClient Api client used for validating the auth data
*/
public void load(ApiClient apiClient) {
Property property = config.get("authkey", "authkey", (String) null);
if (property != null) {
String authKey = property.getString();
AuthConfirmation result = apiClient.checkAuthkey(authKey);
if (result != null) {
this.authKey = authKey;
this.userName = result.getUsername();
} else {
setData(null, null);
}
}
}
@Override
public String getUserName() {
return userName;
}
@Override
public String getAuthKey() {
return authKey;
}
@Override
public void setData(String userName, String authKey) {
this.userName = userName;
this.authKey = authKey;
config.removeCategory(config.getCategory("authkey"));
if (authKey != null) {
// Note: .get() actually creates the entry with the default value if it doesn't exist
config.get("authkey", "authkey", authKey);
}
config.save();
}
}

View File

@@ -2,7 +2,6 @@ package eu.crushedpixel.replaymod.registry;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.gui.elements.listeners.ProgressUpdateListener; import eu.crushedpixel.replaymod.gui.elements.listeners.ProgressUpdateListener;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFile;
import eu.crushedpixel.replaymod.utils.ReplayFileIO; import eu.crushedpixel.replaymod.utils.ReplayFileIO;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@@ -59,7 +58,7 @@ public class DownloadedFileHandler {
f = generateFileForID(id); f = generateFileForID(id);
try { try {
ReplayMod.apiClient.downloadFile(AuthenticationHandler.getKey(), id, f, progressUpdateListener); ReplayMod.apiClient.downloadFile(id, f, progressUpdateListener);
if(f.exists()) { if(f.exists()) {
addToIndex(id); addToIndex(id);
} }

View File

@@ -3,7 +3,6 @@ package eu.crushedpixel.replaymod.registry;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.api.ApiException; import eu.crushedpixel.replaymod.api.ApiException;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -26,20 +25,20 @@ public class FavoritedFileHandler {
} }
public void addToFavorites(Integer id) throws IOException, ApiException { public void addToFavorites(Integer id) throws IOException, ApiException {
ReplayMod.apiClient.favFile(AuthenticationHandler.getKey(), id, true); ReplayMod.apiClient.favFile(id, true);
favorited.remove(id); favorited.remove(id);
favorited.add(id); favorited.add(id);
} }
public void removeFromFavorites(Integer id) throws IOException, ApiException { public void removeFromFavorites(Integer id) throws IOException, ApiException {
ReplayMod.apiClient.favFile(AuthenticationHandler.getKey(), id, false); ReplayMod.apiClient.favFile(id, false);
favorited.remove(id); favorited.remove(id);
} }
public void reloadFavorites() { public void reloadFavorites() {
if(AuthenticationHandler.isAuthenticated()) { if(ReplayMod.apiClient.isLoggedIn()) {
try { try {
int[] ids = ReplayMod.apiClient.getFavorites(AuthenticationHandler.getKey()); int[] ids = ReplayMod.apiClient.getFavorites();
favorited = new ArrayList<Integer>(Ints.asList(ids)); favorited = new ArrayList<Integer>(Ints.asList(ids));
retrieved = true; retrieved = true;
} catch(Exception e) { } catch(Exception e) {

View File

@@ -4,7 +4,6 @@ import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.api.ApiException; import eu.crushedpixel.replaymod.api.ApiException;
import eu.crushedpixel.replaymod.api.replay.holders.FileRating; import eu.crushedpixel.replaymod.api.replay.holders.FileRating;
import eu.crushedpixel.replaymod.api.replay.holders.Rating; import eu.crushedpixel.replaymod.api.replay.holders.Rating;
import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
@@ -24,7 +23,7 @@ public class RatedFileHandler {
} }
public void rateFile(int id, Rating.RatingType type) throws IOException, ApiException { public void rateFile(int id, Rating.RatingType type) throws IOException, ApiException {
ReplayMod.apiClient.rateFile(AuthenticationHandler.getKey(), id, type); ReplayMod.apiClient.rateFile(id, type);
if(type == Rating.RatingType.LIKE || type == Rating.RatingType.DISLIKE) { if(type == Rating.RatingType.LIKE || type == Rating.RatingType.DISLIKE) {
rated.put(id, type == Rating.RatingType.LIKE); rated.put(id, type == Rating.RatingType.LIKE);
} else { } else {
@@ -33,9 +32,9 @@ public class RatedFileHandler {
} }
public void reloadRatings() { public void reloadRatings() {
if(AuthenticationHandler.isAuthenticated()) { if(ReplayMod.apiClient.isLoggedIn()) {
try { try {
FileRating[] ratings = ReplayMod.apiClient.getRatedFiles(AuthenticationHandler.getKey()); FileRating[] ratings = ReplayMod.apiClient.getRatedFiles();
rated = new HashMap<Integer, Boolean>(); rated = new HashMap<Integer, Boolean>();
for(FileRating fr : ratings) { for(FileRating fr : ratings) {