package com.kokakiwi.mclauncher.core;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import com.kokakiwi.mclauncher.MCLauncher;
public class Loginer
{
private final MCLauncher main;
private Login lastLogin = new Login();
private String storedUsername = null;
private String storedPassword = null;
public Loginer(MCLauncher main)
{
this.main = main;
}
public void init()
{
try
{
readLogin();
}
catch (final Exception e)
{
e.printStackTrace();
}
}
// Actions
public String doLogin(String username, String password, boolean rememberMe)
{
String result = null;
final String url = main.getConfig().getString("login.url");
final Map<String, String> params = new LinkedHashMap<String, String>();
params.put("user", username);
params.put("password", password);
params.put("version",
main.getConfig().getString("login.launcherVersion"));
final String request = main.getApi().postUrl(url, params);
if (request.contains(":"))
{
final String[] parts = request.split(":");
lastLogin = new Login();
lastLogin.setTimestamp(Long.parseLong(parts[0]));
lastLogin.setDownloadTicket(parts[1]);
lastLogin.setUsername(parts[2]);
lastLogin.setSessionId(parts[3]);
}
else
{
result = request;
}
if (result == null)
{
if (rememberMe)
{
try
{
storedUsername = username;
storedPassword = password;
storeLogin(username, password);
}
catch (final Exception e)
{
e.printStackTrace();
}
}
else
{
deleteLogin();
}
}
return result;
}
// Utils
public void storeLogin(String username, String password) throws Exception
{
final File file = new File(main.getApi().getMinecraftDirectory(),
"lastlogin");
final Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, main.getConfig()
.getString("login.encryptionKey"));
final DataOutputStream out = new DataOutputStream(
new CipherOutputStream(new FileOutputStream(file), cipher));
out.writeUTF(username);
out.writeUTF(password);
out.close();
}
public void readLogin() throws Exception
{
final File file = new File(main.getApi().getMinecraftDirectory(),
"lastlogin");
if (file.exists())
{
final Cipher cipher = getCipher(Cipher.DECRYPT_MODE, main
.getConfig().getString("login.encryptionKey"));
final DataInputStream in = new DataInputStream(
new CipherInputStream(new FileInputStream(file), cipher));
storedUsername = in.readUTF();
storedPassword = in.readUTF();
in.close();
}
}
private void deleteLogin()
{
final File file = new File(main.getApi().getMinecraftDirectory(),
"bin/lastlogin");
file.delete();
}
private Cipher getCipher(int mode, String password) throws Exception
{
final Random random = new Random(43287234L);
final byte[] salt = new byte[8];
random.nextBytes(salt);
final PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 5);
final SecretKey pbeKey = SecretKeyFactory.getInstance(
"PBEWithMD5AndDES").generateSecret(
new PBEKeySpec(password.toCharArray()));
final Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
cipher.init(mode, pbeKey, pbeParamSpec);
return cipher;
}
// Getter / Setter
public MCLauncher getMain()
{
return main;
}
public Login getLastLogin()
{
return lastLogin;
}
public String getStoredUsername()
{
return storedUsername;
}
public String getStoredPassword()
{
return storedPassword;
}
public static class Login
{
private long timestamp;
private String downloadTicket;
private String username;
private String sessionId;
public long getTimestamp()
{
return timestamp;
}
public void setTimestamp(long timestamp)
{
this.timestamp = timestamp;
}
public String getDownloadTicket()
{
return downloadTicket;
}
public void setDownloadTicket(String downloadTicket)
{
this.downloadTicket = downloadTicket;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getSessionId()
{
return sessionId;
}
public void setSessionId(String sessionId)
{
this.sessionId = sessionId;
}
}
}