package org.dynmap.servlet;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.ListIterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.dynmap.DynmapCore;
import org.dynmap.DynmapWorld;
import org.dynmap.InternalClientUpdateComponent;
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import static org.dynmap.JSONUtils.s;
import static org.dynmap.JSONUtils.g;
public class ClientConfigurationServlet extends HttpServlet {
private static final long serialVersionUID = 9106801553080522469L;
private DynmapCore core;
private Charset cs_utf8 = Charset.forName("UTF-8");
public ClientConfigurationServlet(DynmapCore plugin) {
this.core = plugin;
}
@SuppressWarnings("unchecked")
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
byte[] outputBytes;
HttpSession sess = req.getSession(true);
String user = (String) sess.getAttribute(LoginServlet.USERID_ATTRIB);
if(user == null) user = LoginServlet.USERID_GUEST;
boolean guest = user.equals(LoginServlet.USERID_GUEST);
JSONObject json = new JSONObject();
if(core.getLoginRequired() && guest) {
s(json, "error", "login-required");
}
else if(core.isLoginSupportEnabled()) {
if(guest) {
s(json, "loggedin", false);
}
else {
s(json, "loggedin", true);
s(json, "player", user);
}
JSONObject obj = InternalClientUpdateComponent.getClientConfig();
if(obj != null) {
json.putAll(obj);
}
/* Prune based on security */
JSONArray wlist = (JSONArray)g(json, "worlds");
JSONArray newwlist = new JSONArray();
json.put("worlds", newwlist);
for(ListIterator<JSONObject> iter = wlist.listIterator(); iter.hasNext();) {
JSONObject w = iter.next();
String n = (String)g(w, "name");
DynmapWorld dw = core.getWorld(n);
/* If protected, and we're guest or don't have permission, drop it */
if(dw.isProtected() && (guest || (!core.getServer().checkPlayerPermission(user, "world." + n)))) {
/* Don't add to new list */
}
else {
JSONObject neww = new JSONObject();
neww.putAll(w);
newwlist.add(neww);
JSONArray mlist = (JSONArray)g(w, "maps");
JSONArray newmlist = new JSONArray();
neww.put("maps", newmlist);
for(ListIterator<JSONObject> iter2 = mlist.listIterator(); iter2.hasNext();) {
JSONObject m = iter2.next();
Boolean prot = (Boolean) g(m, "protected");
/* If not protected, leave it in */
if((prot == null) || (prot.booleanValue() == false)) {
newmlist.add(m);
continue;
}
/* If not guest and we have permission, keep it */
String mn = (String)g(m, "name");
if ((!guest) && core.getServer().checkPlayerPermission(user, "map." + n + "." + mn)) {
newmlist.add(m);
}
}
}
}
}
else {
s(json, "loggedin", !guest);
JSONObject obj = InternalClientUpdateComponent.getClientConfig();
if(obj != null) {
json.putAll(obj);
}
}
outputBytes = json.toJSONString().getBytes(cs_utf8);
String dateStr = new Date().toString();
res.addHeader("Date", dateStr);
res.setContentType("text/plain; charset=utf-8");
res.addHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
res.addHeader("Last-modified", dateStr);
res.setContentLength(outputBytes.length);
res.getOutputStream().write(outputBytes);
}
}