aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Ugnich Anton2013-08-30 13:10:14 +0700
committerGravatar Ugnich Anton2013-08-30 13:10:14 +0700
commit91bf74631157d8e559686ca25e4980f155d88438 (patch)
treed04790f407eba507aa3e9a6e17d9bc109b7fd982
parent4b1ef499dbd28c1639b9723ee2e9c5ff80002dde (diff)
PM
-rw-r--r--lib/xpp3_min-1.1.4.jarbin0 -> 24955 bytes
-rw-r--r--nbproject/build-impl.xml11
-rw-r--r--nbproject/genfiles.properties6
-rw-r--r--nbproject/project.properties8
-rw-r--r--nbproject/project.xml16
-rw-r--r--src/java/com/juick/api/Main.java75
-rw-r--r--src/java/com/juick/api/Others.java45
-rw-r--r--src/java/com/juick/api/PM.java102
-rw-r--r--src/java/com/juick/api/Utils.java12
9 files changed, 266 insertions, 9 deletions
diff --git a/lib/xpp3_min-1.1.4.jar b/lib/xpp3_min-1.1.4.jar
new file mode 100644
index 00000000..e02ea412
--- /dev/null
+++ b/lib/xpp3_min-1.1.4.jar
Binary files differ
diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml
index 965b7552..7fcc9e67 100644
--- a/nbproject/build-impl.xml
+++ b/nbproject/build-impl.xml
@@ -538,6 +538,9 @@ exists or setup the property manually. For example like this:
<ant antfile="${project.com_juick_server}/build.xml" inheritall="false" target="jar">
<property name="deploy.on.save" value="false"/>
</ant>
+ <ant antfile="${project.com_juick_xmpp}/build.xml" inheritall="false" target="jar">
+ <property name="deploy.on.save" value="false"/>
+ </ant>
</target>
<target depends="init" if="dist.ear.dir" name="deps-ear-jar" unless="no.deps">
<ant antfile="${project.com_juick}/build.xml" inheritall="false" target="jar">
@@ -549,6 +552,9 @@ exists or setup the property manually. For example like this:
<ant antfile="${project.com_juick_server}/build.xml" inheritall="false" target="jar">
<property name="deploy.on.save" value="false"/>
</ant>
+ <ant antfile="${project.com_juick_xmpp}/build.xml" inheritall="false" target="jar">
+ <property name="deploy.on.save" value="false"/>
+ </ant>
</target>
<target depends="init, deps-module-jar, deps-ear-jar" name="deps-jar" unless="no.deps"/>
<target depends="init,deps-jar" name="-pre-pre-compile">
@@ -696,7 +702,9 @@ exists or setup the property manually. For example like this:
<copyfiles files="${reference.com_juick.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
<copyfiles files="${reference.com_juick_server.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
<copyfiles files="${reference.com_juick_json.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+ <copyfiles files="${reference.com_juick_xmpp.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
<copyfiles files="${libs.JSON.classpath}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+ <copyfiles files="${file.reference.xpp3_min-1.1.4.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
<mkdir dir="${build.web.dir}/META-INF"/>
<manifest file="${build.web.dir}/META-INF/MANIFEST.MF" mode="update"/>
</target>
@@ -704,7 +712,9 @@ exists or setup the property manually. For example like this:
<copyfiles files="${reference.com_juick.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
<copyfiles files="${reference.com_juick_server.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
<copyfiles files="${reference.com_juick_json.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+ <copyfiles files="${reference.com_juick_xmpp.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
<copyfiles files="${libs.JSON.classpath}" todir="${build.web.dir}/WEB-INF/lib"/>
+ <copyfiles files="${file.reference.xpp3_min-1.1.4.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
</target>
<target depends="init" if="dist.ear.dir" name="-clean-webinf-lib">
<delete dir="${build.web.dir}/WEB-INF/lib"/>
@@ -1072,6 +1082,7 @@ exists or setup the property manually. For example like this:
<ant antfile="${project.com_juick}/build.xml" inheritall="false" target="clean"/>
<ant antfile="${project.com_juick_json}/build.xml" inheritall="false" target="clean"/>
<ant antfile="${project.com_juick_server}/build.xml" inheritall="false" target="clean"/>
+ <ant antfile="${project.com_juick_xmpp}/build.xml" inheritall="false" target="clean"/>
</target>
<target depends="init" name="do-clean">
<condition property="build.dir.to.clean" value="${build.web.dir}">
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
index 13678348..9fa27ff1 100644
--- a/nbproject/genfiles.properties
+++ b/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=8cb2a940
+build.xml.data.CRC32=0e286cb1
build.xml.script.CRC32=2226508e
build.xml.stylesheet.CRC32=651128d4@1.33.1.1
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=8cb2a940
-nbproject/build-impl.xml.script.CRC32=9918d740
+nbproject/build-impl.xml.data.CRC32=0e286cb1
+nbproject/build-impl.xml.script.CRC32=4228b93d
nbproject/build-impl.xml.stylesheet.CRC32=0cbf5bb7@1.33.1.1
diff --git a/nbproject/project.properties b/nbproject/project.properties
index e57401a6..92f560c4 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -1,6 +1,5 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=true
-annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
build.classes.dir=${build.web.dir}/WEB-INF/classes
@@ -26,6 +25,7 @@ dist.war=${dist.dir}/${war.name}
endorsed.classpath=\
${libs.javaee-endorsed-api-6.0.classpath}
excludes=
+file.reference.xpp3_min-1.1.4.jar=lib/xpp3_min-1.1.4.jar
includes=**
j2ee.compile.on.save=true
j2ee.deploy.on.save=true
@@ -37,7 +37,9 @@ javac.classpath=\
${reference.com_juick.jar}:\
${reference.com_juick_server.jar}:\
${reference.com_juick_json.jar}:\
- ${libs.JSON.classpath}
+ ${reference.com_juick_xmpp.jar}:\
+ ${libs.JSON.classpath}:\
+ ${file.reference.xpp3_min-1.1.4.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.debug=true
@@ -69,9 +71,11 @@ platform.active=default_platform
project.com_juick=../com.juick
project.com_juick_json=../com.juick.json
project.com_juick_server=../com.juick.server
+project.com_juick_xmpp=../com.juick.xmpp
reference.com_juick.jar=${project.com_juick}/dist/com.juick.jar
reference.com_juick_json.jar=${project.com_juick_json}/dist/com.juick.json.jar
reference.com_juick_server.jar=${project.com_juick_server}/dist/com.juick.server.jar
+reference.com_juick_xmpp.jar=${project.com_juick_xmpp}/dist/com.juick.xmpp.jar
resource.dir=setup
run.test.classpath=\
${javac.test.classpath}:\
diff --git a/nbproject/project.xml b/nbproject/project.xml
index 15c691a1..01e2f8c9 100644
--- a/nbproject/project.xml
+++ b/nbproject/project.xml
@@ -19,9 +19,17 @@
<path-in-war>WEB-INF/lib</path-in-war>
</library>
<library dirs="200">
+ <file>${reference.com_juick_xmpp.jar}</file>
+ <path-in-war>WEB-INF/lib</path-in-war>
+ </library>
+ <library dirs="200">
<file>${libs.JSON.classpath}</file>
<path-in-war>WEB-INF/lib</path-in-war>
</library>
+ <library dirs="200">
+ <file>${file.reference.xpp3_min-1.1.4.jar}</file>
+ <path-in-war>WEB-INF/lib</path-in-war>
+ </library>
</web-module-libraries>
<web-module-additional-libraries/>
<source-roots>
@@ -56,6 +64,14 @@
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
+ <reference>
+ <foreign-project>com_juick_xmpp</foreign-project>
+ <artifact-type>jar</artifact-type>
+ <script>build.xml</script>
+ <target>jar</target>
+ <clean-target>clean</clean-target>
+ <id>jar</id>
+ </reference>
</references>
</configuration>
</project>
diff --git a/src/java/com/juick/api/Main.java b/src/java/com/juick/api/Main.java
index 449c2a86..718ca249 100644
--- a/src/java/com/juick/api/Main.java
+++ b/src/java/com/juick/api/Main.java
@@ -17,9 +17,13 @@
*/
package com.juick.api;
+import com.juick.xmpp.JID;
+import com.juick.xmpp.Stream;
+import com.juick.xmpp.StreamComponent;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
+import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
@@ -35,11 +39,14 @@ import javax.servlet.http.HttpServletResponse;
* @author Ugnich Anton
*/
@WebServlet(name = "Main", urlPatterns = {"/"})
-public class Main extends HttpServlet {
+public class Main extends HttpServlet implements Stream.StreamListener {
Connection sql;
Connection sqlSearch;
+ Stream xmpp;
Users users;
+ PM pm;
+ Others others;
@Override
public void init() throws ServletException {
@@ -53,11 +60,44 @@ public class Main extends HttpServlet {
sqlSearch = DriverManager.getConnection("jdbc:mysql://127.0.0.1:9306/juick?autoReconnect=true&characterEncoding=utf8&maxAllowedPacket=512000&relaxAutoCommit=true&user=root&password=");
users = new Users(sql);
+ pm = new PM(sql);
+ others = new Others(sql);
+
+ setupXmppComponent(conf.getProperty("xmpp_password"));
+
} catch (Exception e) {
log(null, e);
}
}
+ public void setupXmppComponent(final String password) {
+ Thread thr = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ Socket socket = new Socket("localhost", 5347);
+ xmpp = new StreamComponent(new JID("", "api.juick.com", ""), socket.getInputStream(), socket.getOutputStream(), password);
+ xmpp.addListener(Main.this);
+ xmpp.startParsing();
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+ });
+ thr.start();
+ }
+
+ @Override
+ public void onStreamFail(String msg) {
+ System.err.println("XMPP STREAM FAIL: " + msg);
+ }
+
+ @Override
+ public void onStreamReady() {
+ System.err.println("XMPP STREAM READY");
+ }
+
@Override
public void destroy() {
super.destroy();
@@ -93,6 +133,9 @@ public class Main extends HttpServlet {
}
int vuid = Utils.getHttpAuthUID(sql, request);
+ if (vuid == 0) {
+ vuid = Utils.getVisitorQueryStringUID(sql, request);
+ }
String uri = request.getRequestURI();
if (uri.equals("/users")) {
@@ -101,6 +144,18 @@ public class Main extends HttpServlet {
users.doGetUserRead(request, response, vuid);
} else if (uri.equals("/users/readers")) {
users.doGetUserReaders(request, response, vuid);
+ } else if (uri.equals("/pm")) {
+ if (vuid > 0) {
+ pm.doGetPM(request, response, vuid);
+ } else {
+ response.sendError(401);
+ }
+ } else if (uri.equals("/groups_pms")) {
+ if (vuid > 0) {
+ others.doGetGroupsPMs(request, response, vuid);
+ } else {
+ response.sendError(401);
+ }
} else {
response.sendError(404);
}
@@ -115,8 +170,24 @@ public class Main extends HttpServlet {
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ if (request.getCharacterEncoding() == null) {
+ request.setCharacterEncoding("UTF-8");
+ }
+
+ int vuid = Utils.getHttpAuthUID(sql, request);
+ if (vuid == 0) {
+ vuid = Utils.getVisitorQueryStringUID(sql, request);
+ }
+
+
String uri = request.getRequestURI();
if (uri.equals("/post")) {
+ } else if (uri.equals("/pm")) {
+ if (vuid > 0) {
+ pm.doPostPM(request, response, xmpp, vuid);
+ } else {
+ response.sendError(401);
+ }
} else {
response.sendError(405);
}
@@ -127,7 +198,7 @@ public class Main extends HttpServlet {
response.setHeader("Access-Control-Allow-Origin", "*");
String callback = request.getParameter("callback");
- if (callback != null && (callback.length() > 64 || !callback.matches("[a-zA-Z0-9\\-]+"))) {
+ if (callback != null && (callback.length() > 64 || !callback.matches("[a-zA-Z0-9\\-\\_]+"))) {
callback = null;
}
diff --git a/src/java/com/juick/api/Others.java b/src/java/com/juick/api/Others.java
new file mode 100644
index 00000000..25df5bf4
--- /dev/null
+++ b/src/java/com/juick/api/Others.java
@@ -0,0 +1,45 @@
+package com.juick.api;
+
+import com.juick.server.PMQueries;
+import java.io.IOException;
+import java.sql.Connection;
+import java.util.ArrayList;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ *
+ * @author ugnich
+ */
+public class Others {
+
+ Connection sql;
+
+ public Others(Connection sql) {
+ this.sql = sql;
+ }
+
+ public void doGetGroupsPMs(HttpServletRequest request, HttpServletResponse response, int vuid) throws ServletException, IOException {
+ int cnt = 5;
+ try {
+ String cntStr = request.getParameter("cnt");
+ cnt = Integer.parseInt(cntStr);
+ if (cnt < 3) {
+ cnt = 3;
+ }
+ if (cnt > 10) {
+ cnt = 10;
+ }
+ } catch (Exception e) {
+ }
+
+ ArrayList<com.juick.User> lastconv = PMQueries.getPMLastConversationsUsers(sql, vuid, cnt);
+ if (lastconv != null && !lastconv.isEmpty()) {
+ String json = "{\"pms\":" + com.juick.json.Users.arrayToString(lastconv) + "}";
+ Main.replyJSON(request, response, json);
+ } else {
+ response.sendError(404);
+ }
+ }
+}
diff --git a/src/java/com/juick/api/PM.java b/src/java/com/juick/api/PM.java
new file mode 100644
index 00000000..285f9ff6
--- /dev/null
+++ b/src/java/com/juick/api/PM.java
@@ -0,0 +1,102 @@
+package com.juick.api;
+
+import com.juick.server.PMQueries;
+import com.juick.server.UserQueries;
+import com.juick.xmpp.JID;
+import com.juick.xmpp.Message;
+import com.juick.xmpp.Stream;
+import com.juick.xmpp.extensions.JuickMessage;
+import java.io.IOException;
+import java.sql.Connection;
+import java.util.ArrayList;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ *
+ * @author ugnich
+ */
+public class PM {
+
+ Connection sql;
+
+ public PM(Connection sql) {
+ this.sql = sql;
+ }
+
+ public void doGetPM(HttpServletRequest request, HttpServletResponse response, int vuid) throws ServletException, IOException {
+ String uname = request.getParameter("uname");
+ int uid = 0;
+ if (uname != null && uname.matches("^[a-zA-Z0-9\\-]{2,16}$")) {
+ uid = UserQueries.getUIDbyName(sql, uname);
+ }
+
+ if (uid == 0) {
+ response.sendError(400);
+ return;
+ }
+
+ ArrayList<com.juick.Message> msgs = PMQueries.getPMMessages(sql, vuid, uid);
+ if (msgs != null && !msgs.isEmpty()) {
+ String json = com.juick.json.Messages.arrayToString(msgs);
+ Main.replyJSON(request, response, json);
+ } else {
+ response.sendError(404);
+ }
+ }
+
+ public void doPostPM(HttpServletRequest request, HttpServletResponse response, Stream xmpp, int vuid) throws ServletException, IOException {
+ String uname = request.getParameter("uname");
+ int uid = 0;
+ if (UserQueries.checkUserNameValid(uname)) {
+ uid = UserQueries.getUIDbyName(sql, uname);
+ }
+
+ String body = request.getParameter("body");
+ if (uid == 0 || body == null || body.length() < 1 || body.length() > 10240) {
+ response.sendError(400);
+ return;
+ }
+
+ if (UserQueries.isInBL(sql, uid, vuid)) {
+ response.sendError(403);
+ return;
+ }
+
+ if (PMQueries.createPM(sql, vuid, uid, body)) {
+ Main.replyJSON(request, response, "");
+
+ Message msg = new Message();
+ msg.from = new JID("juick", "juick.com", null);
+ msg.to = new JID(Integer.toString(uid), "push.juick.com", null);
+ JuickMessage jmsg = new JuickMessage();
+ jmsg.User = UserQueries.getUserByUID(sql, vuid);
+ jmsg.Text = body;
+ msg.childs.add(jmsg);
+ System.out.println("MESSAGE: " + msg);
+ xmpp.send(msg);
+
+ msg.to.Host = "ws.juick.com";
+ xmpp.send(msg);
+
+ String jid = UserQueries.getJIDbyUID(sql, uid);
+ if (jid != null) {
+ Message mm = new Message();
+ mm.to = new JID(jid);
+ mm.type = Message.Type.chat;
+ if (PMQueries.havePMinRoster(sql, vuid, jid)) {
+ mm.from = new JID(jmsg.User.UName, "juick.com", "Juick");
+ mm.body = body;
+ } else {
+ mm.from = new JID("juick", "juick.com", "Juick");
+ mm.body = "Private message from @" + jmsg.User.UName + ":\n" + body;
+ }
+ xmpp.send(mm);
+ }
+
+ } else {
+ response.sendError(500);
+ }
+ }
+}
diff --git a/src/java/com/juick/api/Utils.java b/src/java/com/juick/api/Utils.java
index cac5612d..b406c362 100644
--- a/src/java/com/juick/api/Utils.java
+++ b/src/java/com/juick/api/Utils.java
@@ -70,8 +70,8 @@ public class Utils {
}
public static int getHttpAuthUID(Connection sql, HttpServletRequest request) {
- String auth = request.getHeader("HTTP_AUTHORIZATION");
- if (auth != null && auth.length() > 8) {
+ String auth = request.getHeader("Authorization");
+ if (auth != null && auth.length() > 8 && auth.startsWith("Basic ")) {
try {
BASE64Decoder dec = new BASE64Decoder();
String loginpassw[] = new String(dec.decodeBuffer(auth.substring(6))).split(":", 2);
@@ -84,6 +84,14 @@ public class Utils {
return 0;
}
+ public static int getVisitorQueryStringUID(Connection sql, HttpServletRequest request) {
+ String hash = request.getParameter("hash");
+ if (hash != null && hash.length() == 16) {
+ return com.juick.server.UserQueries.getUIDbyHash(sql, hash);
+ }
+ return 0;
+ }
+
public static void sendPermanentRedirect(HttpServletResponse response, String location) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", location);