package com.hackerchai.rapid.Thread;
/**
* Created by hackerchai on 15-2-5.
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.Key;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Date;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hackerchai.rapid.Crypto;
import com.hackerchai.rapid.TokenParse;
import com.hackerchai.rapid.udpService.MD5Util;
public class SocketServer {
Handler handler;
private int PORT;
private ServerSocket server = null;
private String PAIR_KEY;
private String Username;
private String Password;
private String Iccid;
private String token_url;
private String tokenContent;
private String getToken;
private String decryptMsg;
private String encryptMsg;
private String passwordHash;
private String oKey;
private int Status;
public static final int SHOW_RESPONSE = 0;
static final String key="CF166A138A5B6AD5";
public SocketServer(String pair,String username,String password,String iccid,int PORT,Handler handler,int status) {
try {
this.handler=handler;
this.PORT=PORT;
this.PAIR_KEY = pair;
this.Username =username;
this.Password = password;
this.Iccid= iccid;
this.Status =status;
server = new ServerSocket(PORT);
Socket client = null;
while (true) {
client = server.accept();
TcpThread tcpThread = new TcpThread(client);
new Thread(tcpThread).run();
}
} catch (Exception e) {
e.printStackTrace();
}
}
class TcpThread implements Runnable {
final Socket socket;
private BufferedReader in = null;
private String msg = "";
public TcpThread(Socket socket) {
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//Log.d("run", "receive");
// TODO Auto-generated method stub
while (!Thread.currentThread().isInterrupted()) {
try {
if ((msg = in.readLine()) != null) {
if(Status==1) {
oKey = rollKey(key);
// Log.d("pair","reveive pair message request");
}
else
{
String tempHash=getHash();
oKey = rollKey(tempHash);
Log.d("auth","reveive auth message request");
}
//Log.d("received message,and key is",oKey);
decryptMsg = Crypto.decrypt(msg,oKey);
Log.d("message",decryptMsg);
if (decryptMsg.substring(0, 4).equals("PAIR")) {
if (decryptMsg.substring(4, 8).equals(PAIR_KEY)) {
sendKey("PAIROK" + PAIR_KEY);
passwordHash=getHash();
sendKey(passwordHash);
Message message = Message.obtain();
String mes ="PAIR";
message.obj=mes;
message.what =SHOW_RESPONSE;
handler.sendMessage(message);
} else {
sendKey("PAIRFAIL" + msg.substring(4, 8));
}
}
if (decryptMsg.substring(0, 4).equals("AUTH")) {
if (decryptMsg.substring(4, 8).equals(PAIR_KEY)) {
HttpUtil token = new HttpUtil();
token_url ="https://rapid.cotr.me/api/login";
//token.setUrl(token_url);
Map<String, String> params = new HashMap<String, String>();
params.put("username", Username);
params.put("password", Password);
params.put("iccid",Iccid);
try {
tokenContent = token.post(token_url,null,params);
getToken = parseTokenWithJson(tokenContent);
if (!getToken.equals("BAD_TOKEN")) {
sendmsg("AUTHOK" + getToken);
Message message = Message.obtain();
String mes ="AUTH";
message.obj=mes;
message.what =SHOW_RESPONSE;
handler.sendMessage(message);
} else {
sendmsg("AUTHFAIL");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (token != null) {
}
}
} else {
sendmsg("AUTHFAIL");
}
}
else{
}
} else {
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void sendmsg(String sMesg) {
String sendMsg = sMesg;
try {
String getHashValue = getHash();
Log.d("sendmsg",getHashValue);
String sendKey = rollKey(getHashValue);
encryptMsg = Crypto.encrypt(sendMsg, sendKey);
} catch (Exception e) {
e.printStackTrace();
}
try {
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
br.write(encryptMsg+"\r\n");
br.flush();
/*
pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
pout.println(msg);
pout.flush();
*/
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendKey(String sMesg) {
String sendMsg = sMesg;
try {
String rolledKey = rollKey(key);
Log.d("sendkey",rolledKey);
encryptMsg = Crypto.encrypt(sendMsg, rolledKey);
} catch (Exception e) {
e.printStackTrace();
}
try {
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
br.write(encryptMsg+"\r\n");
br.flush();
/*
pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
pout.println(msg);
pout.flush();
*/
} catch (IOException e) {
e.printStackTrace();
}
}
private String getHash()
{
String original_hash=MD5Util.MD5(Username+Password);
return original_hash;
}
private String parseTokenWithJson (String jsonData) {
Gson gsonToken = new Gson();
TokenParse tokenParse = gsonToken.fromJson(jsonData, TokenParse.class);
String err_code = tokenParse.getError().getId();
String token = null;
if (err_code.equals("0")) {
token =tokenParse.getData();
} else {
token="BAD_TOKEN";
}
return token;
}
private String rollKey (String inputKey) throws UnsupportedEncodingException {
String original_seed=inputKey;
//Log.d("original key",inputKey);
int enc_seed_long=(int)Math.floor((System.currentTimeMillis() / 1000) / 60);
String enc_seed=String.valueOf(enc_seed_long);
//Log.d("epoch", enc_seed);
String original_seed_md5= MD5Util.MD5(original_seed);
String enc_seed_md5=MD5Util.MD5(MD5Util.MD5(enc_seed));
String outputKey=MD5Util.MD5(original_seed_md5+enc_seed_md5).substring(0,8);
return new String(outputKey.getBytes(),"UTF-8");
}
}
}