Implement session logging

This commit is contained in:
Trever Fischer 2012-04-02 20:58:42 -04:00
parent 86a44e9163
commit 3ae4e8349a
3 changed files with 84 additions and 13 deletions

View File

@ -24,6 +24,8 @@ import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import java.io.IOException; import java.io.IOException;
@ -38,28 +40,59 @@ public class JoinListener implements Listener {
m_plugin = p; m_plugin = p;
} }
@EventHandler private void closePlayerSession(Player p) throws IOException {
public void onPlayerLogin(PlayerLoginEvent event) { m_plugin.api().closeSession(p.getName());
Player p = event.getPlayer(); }
private ValidationResponse openPlayerSession(Player p) throws IOException {
ValidationResponse resp = null; ValidationResponse resp = null;
try { resp = m_plugin.api().openSession(p.getName(), p.getAddress());
resp = m_plugin.api().validatePlayer(p.getName()); if (!resp.valid) {
if (!resp.valid) { return resp;
event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "An active camin.us account is required.");
return;
}
} catch (IOException e) {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Camin.us auth server seems down.");
return;
} }
log.info("Session "+resp.sessionId+" opened for "+p.getName());
PermissionAttachment att = p.addAttachment(m_plugin); PermissionAttachment att = p.addAttachment(m_plugin);
for(String perm : resp.permissions) { for(String perm : resp.permissions) {
log.info("Granting "+perm); log.info("Granting "+perm);
att.setPermission(perm, true); att.setPermission(perm, true);
} }
p.recalculatePermissions(); p.recalculatePermissions();
return resp;
} }
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
try {
closePlayerSession(event.getPlayer());
} catch (IOException e) {
}
}
@EventHandler
public void onPlayerKicked(PlayerKickEvent event) {
try {
closePlayerSession(event.getPlayer());
} catch (IOException e) {
}
}
@EventHandler
public void onPlayerLogin(PlayerLoginEvent event) {
ValidationResponse resp;
try {
resp = openPlayerSession(event.getPlayer());
} catch (IOException e) {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Camin.us auth server seems down.");
return;
}
if (!resp.valid) {
event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, resp.errorMessage);
return;
}
}
static public final String SESSION_METADATA_KEY = "caminus-session-id";
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
m_plugin.sendMOTD(event.getPlayer()); m_plugin.sendMOTD(event.getPlayer());

View File

@ -25,6 +25,7 @@ import java.io.InputStreamReader;
import java.io.IOException; import java.io.IOException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.InetSocketAddress;
import java.net.ProtocolException; import java.net.ProtocolException;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
@ -74,7 +75,6 @@ public class Server {
conn.setRequestMethod(method); conn.setRequestMethod(method);
if (params.size() > 0) { if (params.size() > 0) {
conn.setDoOutput(true); conn.setDoOutput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
Set<Map.Entry<String, String>> values = params.entrySet(); Set<Map.Entry<String, String>> values = params.entrySet();
Iterator<Map.Entry<String, String>> it = values.iterator(); Iterator<Map.Entry<String, String>> it = values.iterator();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -88,6 +88,7 @@ public class Server {
String postData = sb.substring(0, sb.length()-1); String postData = sb.substring(0, sb.length()-1);
conn.setFixedLengthStreamingMode(postData.length()); conn.setFixedLengthStreamingMode(postData.length());
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(postData); out.writeBytes(postData);
} }
return readJSON(conn); return readJSON(conn);
@ -126,6 +127,14 @@ public class Server {
return exec(path, "GET"); return exec(path, "GET");
} }
public JSONObject post(String path, HashMap<String, String> params) throws MalformedURLException, IOException {
try {
return exec(path, "POST", params);
} catch (ProtocolException e) {
return null;
}
}
public JSONObject put(String path, HashMap<String, String> params) throws MalformedURLException, IOException { public JSONObject put(String path, HashMap<String, String> params) throws MalformedURLException, IOException {
try { try {
return exec(path, "PUT", params); return exec(path, "PUT", params);
@ -215,4 +224,31 @@ public class Server {
} }
return true; return true;
} }
public void closeSession(String player) throws IOException {
log.info("Closing session for "+player);
get("server/session/"+player+"/close");
}
public ValidationResponse openSession(String player, InetSocketAddress sourceAddr) throws IOException {
log.info("Opening session for "+player);
ValidationResponse resp = new ValidationResponse();
HashMap<String, String> params = new HashMap<String, String>();
//params.put("ip", sourceAddr.toString());
params.put("ip", "");
JSONObject jsonObj = post("server/session/"+player+"/new", params);
resp.valid = jsonObj.optBoolean("success");
resp.errorMessage = jsonObj.optString("error");
resp.sessionId = jsonObj.optInt("sessionId");
try {
JSONArray perms = jsonObj.getJSONArray("permissions");
resp.permissions = new String[perms.length()];
for (int i = 0;i<perms.length();i++) {
resp.permissions[i] = perms.optString(i);
}
} catch (JSONException e) {
throw new IOException("JSON parse error", e);
}
return resp;
}
} }

View File

@ -21,5 +21,7 @@ package us.camin.api;
public class ValidationResponse { public class ValidationResponse {
public boolean valid = false; public boolean valid = false;
public String[] permissions = new String[0]; public String[] permissions = new String[0];
public String errorMessage;
public int sessionId;
} }