diff --git a/pages/index.html b/pages/index.html
index a03ab85..64460ec 100644
--- a/pages/index.html
+++ b/pages/index.html
@@ -10,8 +10,10 @@
diff --git a/pages/js/message.js b/pages/js/message.js
index 5b26814..eee0559 100644
--- a/pages/js/message.js
+++ b/pages/js/message.js
@@ -16,12 +16,12 @@ var respfunc = function respfunc(result) {
else {
var errormsg = document.getElementById("errormsg");
errormsg.innerHTML = result.responseText;
- errormsg.style = "display: block";
+ errormsg.style = "display: block"; //TODO: Hide errormsg after a while (index.js)
msginput.disabled = false;
}
}
else
- location.reload(true);
+ location.reload(true); //TODO: Don't referesh on message send
};
var sendmsgonenter = function sendmsgonenter(e) {
diff --git a/src/io/github/norbipeti/chat/server/Main.java b/src/io/github/norbipeti/chat/server/Main.java
index dd0c6a5..1c2fde9 100644
--- a/src/io/github/norbipeti/chat/server/Main.java
+++ b/src/io/github/norbipeti/chat/server/Main.java
@@ -3,7 +3,6 @@ package io.github.norbipeti.chat.server;
import java.lang.reflect.Modifier;
import java.net.InetAddress;
import java.net.InetSocketAddress;
-import java.util.Date;
import java.util.Set;
import org.apache.logging.log4j.Level;
diff --git a/src/io/github/norbipeti/chat/server/data/DataManager.java b/src/io/github/norbipeti/chat/server/data/DataManager.java
index 83e5448..6be0cdb 100644
--- a/src/io/github/norbipeti/chat/server/data/DataManager.java
+++ b/src/io/github/norbipeti/chat/server/data/DataManager.java
@@ -18,8 +18,10 @@ public final class DataManager {
public static void save(T object) {
try {
- Files.write(Main.gson.toJson(object), new File(object.getClass().getName() + "-" + object.getId()),
- StandardCharsets.UTF_8);
+ File file = new File(object.getClass().getName() + "-" + object.getId());
+ while (file.exists())
+ object.setId(object.getId() + 1);
+ Files.write(Main.gson.toJson(object), file, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java b/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java
index d11353c..8a3e0c1 100644
--- a/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java
+++ b/src/io/github/norbipeti/chat/server/data/LoaderRefSerializer.java
@@ -1,11 +1,7 @@
package io.github.norbipeti.chat.server.data;
import java.io.IOException;
-import java.util.List;
-
-import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
-import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
diff --git a/src/io/github/norbipeti/chat/server/db/domain/Conversation.java b/src/io/github/norbipeti/chat/server/db/domain/Conversation.java
index a01d60a..38d73b5 100644
--- a/src/io/github/norbipeti/chat/server/db/domain/Conversation.java
+++ b/src/io/github/norbipeti/chat/server/db/domain/Conversation.java
@@ -8,10 +8,11 @@ import io.github.norbipeti.chat.server.data.LoaderCollection;
@Table(name = "CONVERSATION")
public class Conversation extends SavedData {
private static final long serialVersionUID = 5058682475353799722L;
+ private static Long nextid = 0L;
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// @Column(name = "ID", unique = true, nullable = false)
- // private Long id;
+ private Long id = nextid++;
@ElementCollection(fetch = FetchType.EAGER)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "conversation")
private LoaderCollection messsagechunks = new LoaderCollection<>(MessageChunk.class);
@@ -40,9 +41,13 @@ public class Conversation extends SavedData {
return users;
}
- /*
- * public Long getId() { return id; }
- *
- * public void setId(Long id) { this.id = id; }
- */
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(long id) {
+ this.id = id;
+ }
}
diff --git a/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java b/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java
index 4457577..cf4d4bc 100644
--- a/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java
+++ b/src/io/github/norbipeti/chat/server/db/domain/MessageChunk.java
@@ -7,6 +7,8 @@ import io.github.norbipeti.chat.server.data.LoaderRef;
public class MessageChunk extends SavedData {
private static final long serialVersionUID = -1665300779209348467L;
+ private static Long nextid = 0L;
+ private Long id = nextid++;
private List messages = new ArrayList<>();
private LoaderRef conversation;
@@ -30,4 +32,14 @@ public class MessageChunk extends SavedData {
public void setConversation(Conversation conversation) {
this.conversation = new LoaderRef(conversation);
}
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(long id) {
+ this.id = id;
+ }
}
diff --git a/src/io/github/norbipeti/chat/server/db/domain/SavedData.java b/src/io/github/norbipeti/chat/server/db/domain/SavedData.java
index b90ecc5..e6344e4 100644
--- a/src/io/github/norbipeti/chat/server/db/domain/SavedData.java
+++ b/src/io/github/norbipeti/chat/server/db/domain/SavedData.java
@@ -4,15 +4,7 @@ import java.io.Serializable;
@SuppressWarnings("serial")
public abstract class SavedData implements Serializable {
- private static long nextID = 0;
+ public abstract long getId();
- private long id;
-
- public long getId() {
- return id;
- }
-
- protected SavedData() {
- id = nextID++;
- }
+ public abstract void setId(long id);
}
diff --git a/src/io/github/norbipeti/chat/server/db/domain/User.java b/src/io/github/norbipeti/chat/server/db/domain/User.java
index 5221b71..8cfdff0 100644
--- a/src/io/github/norbipeti/chat/server/db/domain/User.java
+++ b/src/io/github/norbipeti/chat/server/db/domain/User.java
@@ -11,10 +11,8 @@ import io.github.norbipeti.chat.server.data.LoaderCollection;
@Table(name = "\"USER\"")
public class User extends SavedData {
private static final long serialVersionUID = 2862762084164225666L;
- // @Id
- // @GeneratedValue(strategy = GenerationType.IDENTITY)
- // @Column(name = "ID", unique = true, nullable = false)
- // private Long id;
+ private static Long nextid = 0L;
+ private Long id = nextid++;
private String name;
private String email;
private String password;
@@ -101,4 +99,14 @@ public class User extends SavedData {
public static LoaderCollection getUsers() {
return DataManager.load(User.class);
}
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(long id) {
+ this.id = id;
+ }
}
diff --git a/src/io/github/norbipeti/chat/server/io/Cookie.java b/src/io/github/norbipeti/chat/server/io/Cookie.java
new file mode 100644
index 0000000..7de81d6
--- /dev/null
+++ b/src/io/github/norbipeti/chat/server/io/Cookie.java
@@ -0,0 +1,32 @@
+package io.github.norbipeti.chat.server.io;
+
+public class Cookie {
+ private String name;
+ private String value;
+
+ public Cookie(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return "Cookie [name=" + name + ", value=" + value + "]";
+ }
+}
diff --git a/src/io/github/norbipeti/chat/server/io/Cookies.java b/src/io/github/norbipeti/chat/server/io/Cookies.java
new file mode 100644
index 0000000..a7fdefe
--- /dev/null
+++ b/src/io/github/norbipeti/chat/server/io/Cookies.java
@@ -0,0 +1,61 @@
+package io.github.norbipeti.chat.server.io;
+
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+import com.sun.net.httpserver.HttpExchange;
+
+public class Cookies extends HashMap {
+ private static final long serialVersionUID = -328053564170765287L;
+
+ private String expiretime;
+
+ public Cookies(int addyears) {
+ super();
+ this.expiretime = ZonedDateTime.now(ZoneId.of("GMT")).plus(Period.of(addyears, 0, 0))
+ .format(DateTimeFormatter.RFC_1123_DATE_TIME);
+ }
+
+ public Cookies(String expiretime) {
+ super();
+ this.expiretime = expiretime;
+ }
+
+ public Cookies() {
+ super();
+ this.expiretime = ZonedDateTime.now(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
+ }
+
+ public void SendHeaders(HttpExchange exchange) {
+ for (Entry item : entrySet())
+ exchange.getResponseHeaders().add("Set-Cookie",
+ item.getKey() + "=" + item.getValue().getValue() + "; expires=" + expiretime);
+ exchange.getResponseHeaders().add("Set-Cookie", "expiretime=" + expiretime + "; expires=" + expiretime);
+ }
+
+ public Cookies add(Cookie cookie) {
+ this.put(cookie.getName(), cookie);
+ return this;
+ }
+
+ public String getExpireTime() {
+ return expiretime;
+ }
+
+ public ZonedDateTime getExpireTimeParsed() {
+ return ZonedDateTime.parse(expiretime, DateTimeFormatter.RFC_1123_DATE_TIME);
+ }
+
+ public void setExpireTime(LocalDateTime expiretime) {
+ this.expiretime = expiretime.format(DateTimeFormatter.RFC_1123_DATE_TIME);
+ }
+
+ @Override
+ public String toString() {
+ return "Cookies [expiretime=" + expiretime + ", " + super.toString() + "]";
+ }
+}
diff --git a/src/io/github/norbipeti/chat/server/io/IOHelper.java b/src/io/github/norbipeti/chat/server/io/IOHelper.java
index 12f45c3..b6ffa5e 100644
--- a/src/io/github/norbipeti/chat/server/io/IOHelper.java
+++ b/src/io/github/norbipeti/chat/server/io/IOHelper.java
@@ -7,11 +7,14 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.UUID;
import java.util.function.Function;
@@ -67,11 +70,22 @@ public class IOHelper {
return content;
}
- public static HashMap GetPOST(HttpExchange exchange) throws IOException {
- if (exchange.getRequestBody().available() == 0)
- return new HashMap<>();
+ public static String GetPOST(HttpExchange exchange) {
try {
- String[] content = IOUtils.toString(exchange.getRequestBody(), StandardCharsets.ISO_8859_1).split("\\&");
+ if (exchange.getRequestBody().available() == 0)
+ return "";
+ String content = IOUtils.toString(exchange.getRequestBody(), StandardCharsets.ISO_8859_1);
+ return content;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ @Deprecated
+ public static HashMap GetPOSTKeyValues(HttpExchange exchange) {
+ try {
+ String[] content = GetPOST(exchange).split("\\&");
HashMap vars = new HashMap<>();
for (String var : content) {
String[] spl = var.split("\\=");
@@ -87,11 +101,9 @@ public class IOHelper {
}
}
- public static JsonObject GetPOSTJSON(HttpExchange exchange) throws IOException {
- if (exchange.getRequestBody().available() == 0)
- return null;
+ public static JsonObject GetPOSTJSON(HttpExchange exchange) {
try {
- String content = IOUtils.toString(exchange.getRequestBody(), StandardCharsets.ISO_8859_1);
+ String content = GetPOST(exchange);
JsonObject obj = new JsonParser().parse(content).getAsJsonObject();
return obj;
} catch (Exception e) {
@@ -122,11 +134,8 @@ public class IOHelper {
// provider.SetValues(() ->
// user.setSessionid(UUID.randomUUID().toString()));
user.setSessionid(UUID.randomUUID().toString());
- ZonedDateTime expiretime = ZonedDateTime.now(ZoneId.of("GMT")).plus(Period.of(2, 0, 0));
- exchange.getResponseHeaders().add("Set-Cookie",
- "user_id=" + user.getId() + "; expires=" + expiretime.format(DateTimeFormatter.RFC_1123_DATE_TIME));
- exchange.getResponseHeaders().add("Set-Cookie", "session_id=" + user.getSessionid() + "; expires="
- + expiretime.format(DateTimeFormatter.RFC_1123_DATE_TIME));
+ new Cookies(2).add(new Cookie("user_id", user.getId() + "")).add(new Cookie("session_id", user.getSessionid()))
+ .SendHeaders(exchange);
}
public static void LogoutUser(HttpExchange exchange, User user) {
@@ -136,8 +145,8 @@ public class IOHelper {
private static void SendLogoutHeaders(HttpExchange exchange) {
String expiretime = "Sat, 19 Mar 2016 23:33:00 GMT";
- exchange.getResponseHeaders().add("Set-Cookie", "user_id=del; expires=" + expiretime);
- exchange.getResponseHeaders().add("Set-Cookie", "session_id=del; expires=" + expiretime);
+ new Cookies(expiretime).add(new Cookie("user_id", "del")).add(new Cookie("session_id", "del"))
+ .SendHeaders(exchange);
}
public static void Redirect(String url, HttpExchange exchange) throws IOException {
@@ -145,10 +154,10 @@ public class IOHelper {
IOHelper.SendResponse(303, "If you can see this, click here to continue", exchange);
}
- public static HashMap GetCookies(HttpExchange exchange) {
+ public static Cookies GetCookies(HttpExchange exchange) {
if (!exchange.getRequestHeaders().containsKey("Cookie"))
- return new HashMap<>();
- HashMap map = new HashMap<>();
+ return new Cookies();
+ Map map = new HashMap<>();
for (String cheader : exchange.getRequestHeaders().get("Cookie")) {
String[] spl = cheader.split("\\;\\s*");
for (String s : spl) {
@@ -158,25 +167,39 @@ public class IOHelper {
map.put(kv[0], kv[1]);
}
}
- return map;
+ if (!map.containsKey("expiretime"))
+ return new Cookies();
+ Cookies cookies = null;
+ try {
+ cookies = new Cookies(map.get("expiretime"));
+ for (Entry item : map.entrySet())
+ if (!item.getKey().equalsIgnoreCase("expiretime"))
+ cookies.put(item.getKey(), new Cookie(item.getKey(), item.getValue()));
+ } catch (Exception e) {
+ return new Cookies();
+ }
+ return cookies;
}
/**
* Get logged in user. It may also send logout headers if the cookies are
- * invalid.
+ * invalid, or login headers to keep the user logged in.
*
* @param exchange
* @return The logged in user or null if not logged in.
* @throws IOException
*/
public static User GetLoggedInUser(HttpExchange exchange) throws IOException {
- HashMap cookies = GetCookies(exchange);
+ Cookies cookies = GetCookies(exchange);
if (!cookies.containsKey("user_id") || !cookies.containsKey("session_id"))
return null;
- User user = DataManager.load(User.class, Long.parseLong(cookies.get("user_id")));
- if (user != null && cookies.get("session_id") != null && cookies.get("session_id").equals(user.getSessionid()))
+ User user = DataManager.load(User.class, Long.parseLong(cookies.get("user_id").getValue()));
+ if (user != null && cookies.get("session_id") != null
+ && cookies.get("session_id").getValue().equals(user.getSessionid())) {
+ if (cookies.getExpireTimeParsed().minusYears(1).isBefore(ZonedDateTime.now(ZoneId.of("GMT"))))
+ LoginUser(exchange, user);
return user;
- else
+ } else
SendLogoutHeaders(exchange);
return null;
}
diff --git a/src/io/github/norbipeti/chat/server/page/LoginAjaxPage.java b/src/io/github/norbipeti/chat/server/page/LoginAjaxPage.java
index 3f656cc..7418a08 100644
--- a/src/io/github/norbipeti/chat/server/page/LoginAjaxPage.java
+++ b/src/io/github/norbipeti/chat/server/page/LoginAjaxPage.java
@@ -21,7 +21,7 @@ public class LoginAjaxPage extends Page {
}
User loginuser = null;
for (User user : DataManager.load(User.class)) {
- if (user.getEmail().equals(post.get("email"))) {
+ if (user.getEmail().equals(post.get("email").getAsString())) {
loginuser = user;
break;
}
diff --git a/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java b/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java
index ac82126..afbb3c4 100644
--- a/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java
+++ b/src/io/github/norbipeti/chat/server/page/SendMessageAjaxPage.java
@@ -76,7 +76,7 @@ public class SendMessageAjaxPage extends Page {
msg.setMessageChunk(chunk); // TODO: Store relations at one side or
// both);
chunk.getMessages().add(msg);
- //DataManager.save(chunk); - TODO
+ // DataManager.save(chunk); - TODO
conv.getMesssageChunks().add(chunk);
DataManager.save(conv);
LogManager.getLogger().log(Level.DEBUG,