22 Commits
2.0 ... test403

Author SHA1 Message Date
Sola
a121cd3f28 no message 2016-03-25 06:14:03 +08:00
Sola
d88eddc1c4 no message 2016-03-25 06:07:56 +08:00
Sola
0723dd6090 no message 2016-03-25 05:58:13 +08:00
Sola
8551dce821 no message 2016-03-25 05:54:58 +08:00
Sola
ec1336e86a no message 2016-03-25 05:50:07 +08:00
Sola
6a0e67a3d9 no message 2016-03-25 05:40:00 +08:00
Sola
391a353aee no message 2016-03-25 05:32:57 +08:00
Sola
b8bdca7b37 no message 2016-03-25 05:28:33 +08:00
Sola
1dcd07c137 no message 2016-03-25 05:13:32 +08:00
Sola
edba6c2b0e no message 2016-03-25 05:10:14 +08:00
Sola
bbbe15ff9b no message 2016-03-25 05:06:26 +08:00
Sola
ebf5c4f66a no message 2016-03-25 05:03:51 +08:00
Sola
2c1f589ab2 no message 2016-03-25 04:59:27 +08:00
Sola
cd5733e64a no message 2016-03-25 04:50:33 +08:00
Sola
3212a2fe04 no message 2016-03-25 04:41:42 +08:00
Sola
e20d550dfa no message 2016-03-25 04:29:00 +08:00
Sola
2eb5b1344f no message 2016-03-25 04:17:21 +08:00
Sola
1835510283 no message 2016-03-25 04:15:23 +08:00
Sola
e46257d152 no message 2016-03-25 04:12:04 +08:00
Sola
153997d684 no message 2016-03-25 04:06:58 +08:00
Sola
42c966394e no message 2016-03-25 04:01:52 +08:00
Sola
0e4efc55a1 no message 2016-03-25 03:55:36 +08:00
50 changed files with 450 additions and 824 deletions

1
.gitignore vendored
View File

@@ -9,4 +9,5 @@ out/
.DS_Store .DS_Store
.classpath .classpath
/target /target
/src/main/webapp/META-INF/context.xml
.project .project

316
pom.xml
View File

@@ -1,168 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<modelVersion>4.0.0</modelVersion> <name>WechatTicketSystem</name>
<name>WechatTicketSystem</name> <groupId>love.sola.netsupport</groupId>
<groupId>love.sola.netsupport</groupId> <artifactId>WechatTicketSystem</artifactId>
<artifactId>WechatTicketSystem</artifactId> <version>1.4-SNAPSHOT</version>
<version>2.0</version> <packaging>war</packaging>
<packaging>war</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<source>1.8</source> <source>1.8</source>
<target>1.8</target> <target>1.8</target>
</properties> </properties>
<scm> <scm>
<connection>scm:svn:http://127.0.0.1/dummy</connection> <connection>scm:svn:http://127.0.0.1/dummy</connection>
<developerConnection>scm:svn:https://127.0.0.1/dummy</developerConnection> <developerConnection>scm:svn:https://127.0.0.1/dummy</developerConnection>
<tag>HEAD</tag> <tag>HEAD</tag>
<url>http://127.0.0.1/dummy</url> <url>http://127.0.0.1/dummy</url>
</scm> </scm>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version> <version>3.3</version>
<configuration> <configuration>
<source>1.8</source> <source>1.8</source>
<target>1.8</target> <target>1.8</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId> <artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version> <version>1.4</version>
<configuration> <configuration>
<format>{0,number,0000}</format> <format>{0,number,0000}</format>
<items> <items>
<item>buildNumber0</item> <item>buildNumber0</item>
</items> </items>
<doCheck>false</doCheck> <doCheck>false</doCheck>
<doUpdate>false</doUpdate> <doUpdate>false</doUpdate>
<revisionOnScmFailure>unknown</revisionOnScmFailure> <revisionOnScmFailure>unknown</revisionOnScmFailure>
</configuration> </configuration>
<executions> <executions>
<execution> <execution>
<phase>validate</phase> <phase>validate</phase>
<goals> <goals>
<goal>create</goal> <goal>create</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>
<finalName>${project.artifactId}##${buildNumber}</finalName> <finalName>${project.artifactId}##${buildNumber}</finalName>
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version> <version>3.1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.16.6</version> <version>1.16.6</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.12</version> <version>4.12</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId> <artifactId>slf4j-simple</artifactId>
<version>1.7.12</version> <version>1.7.12</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>19.0-rc2</version> <version>19.0-rc2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.4</version> <version>2.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>1.3.2</version> <version>1.3.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.4</version> <version>3.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-net</groupId> <groupId>commons-net</groupId>
<artifactId>commons-net</artifactId> <artifactId>commons-net</artifactId>
<version>3.3</version> <version>3.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.chanjar</groupId> <groupId>me.chanjar</groupId>
<artifactId>weixin-java-mp</artifactId> <artifactId>weixin-java-mp</artifactId>
<version>1.3.3</version> <version>1.3.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.mchange</groupId> <groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId> <artifactId>c3p0</artifactId>
<version>0.9.5.1</version> <version>0.9.5.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version> <version>5.1.37</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId> <artifactId>hibernate-core</artifactId>
<version>5.0.3.Final</version> <version>5.0.3.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId> <artifactId>hibernate-entitymanager</artifactId>
<version>5.0.3.Final</version> <version>5.0.3.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId> <artifactId>hibernate-c3p0</artifactId>
<version>5.0.3.Final</version> <version>5.0.3.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate.javax.persistence</groupId> <groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId> <artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version> <version>1.0.0.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId> <artifactId>hibernate-envers</artifactId>
<version>5.0.3.Final</version> <version>5.0.3.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>de.svenkubiak</groupId> <groupId>de.svenkubiak</groupId>
<artifactId>jBCrypt</artifactId> <artifactId>jBCrypt</artifactId>
<version>0.4</version> <version>0.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.yaml</groupId> <groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId> <artifactId>snakeyaml</artifactId>
<version>1.16</version> <version>1.16</version>
</dependency> </dependency>
<dependency> </dependencies>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
</dependencies>
</project> </project>

View File

@@ -1,8 +1,21 @@
package love.sola.netsupport.api; package love.sola.netsupport.api;
import love.sola.netsupport.api.manager.GetUser;
import love.sola.netsupport.api.manager.TicketPush;
import love.sola.netsupport.api.root.DashBoard;
import love.sola.netsupport.api.root.FlushCache;
import love.sola.netsupport.api.root.SetPassword;
import love.sola.netsupport.api.stuff.TicketLog;
import love.sola.netsupport.api.stuff.TicketLookup;
import love.sola.netsupport.api.stuff.TicketTrack;
import love.sola.netsupport.api.stuff.TicketUpdate;
import love.sola.netsupport.api.user.ProfileModify;
import love.sola.netsupport.api.user.Register;
import love.sola.netsupport.api.user.TicketQuery;
import love.sola.netsupport.api.user.TicketSubmit;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -29,4 +42,21 @@ public abstract class API {
'}'; '}';
} }
public static final Class[] LIST = new Class[]{
GetUser.class,
TicketPush.class,
DashBoard.class,
FlushCache.class,
SetPassword.class,
TicketLog.class,
TicketLookup.class,
TicketTrack.class,
TicketUpdate.class,
ProfileModify.class,
Register.class,
TicketQuery.class,
TicketSubmit.class,
CheckSession.class
};
} }

View File

@@ -5,11 +5,10 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.reflections.Reflections;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
@@ -21,7 +20,6 @@ import java.io.PrintWriter;
import java.text.ParseException; import java.text.ParseException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* *********************************************** * ***********************************************
@@ -35,20 +33,22 @@ public class APIRouter extends HttpServlet {
protected static Gson gson = SQLCore.gson; protected static Gson gson = SQLCore.gson;
private Map<String, API> nodes = new HashMap<>(); private Map<String, API> nodes = new HashMap<>();
@Override public APIRouter() {
public void init() throws ServletException {
super.init();
try { try {
Reflections reflections = new Reflections(getClass().getPackage().getName()); // ClassPath path = ClassPath.from(getServletContext().getClassLoader());
Set<Class<? extends API>> set = reflections.getSubTypesOf(API.class); // Set<ClassPath.ClassInfo> classes = path.getTopLevelClasses();
for (Class<? extends API> clz : set) { // for (ClassPath.ClassInfo info : classes) {
try { for (Class<?> clz : API.LIST) {
System.out.println("Loading API: " + clz.getName()); // Class<?> clz = info.load();
API obj = clz.newInstance(); if (!API.class.equals(clz) && API.class.isAssignableFrom(clz)) {
System.out.println("Registered API: " + obj); try {
nodes.put(obj.url, obj); System.out.print("Loading API: " + clz.getName());
} catch (InstantiationException | IllegalAccessException e) { API obj = (API) clz.newInstance();
e.printStackTrace(); System.out.println("Registered API: " + obj);
nodes.put(obj.url, obj);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
} }
} }
} catch (Exception e) { } catch (Exception e) {
@@ -68,6 +68,7 @@ public class APIRouter extends HttpServlet {
API api = nodes.get(req.getPathInfo()); API api = nodes.get(req.getPathInfo());
if (api == null) { if (api == null) {
resp.sendError(HttpServletResponse.SC_FORBIDDEN); resp.sendError(HttpServletResponse.SC_FORBIDDEN);
// obj = req.getPathInfo();
return; return;
} }
WxSession session = getSession(req); WxSession session = getSession(req);
@@ -81,14 +82,14 @@ public class APIRouter extends HttpServlet {
return; return;
} }
if (api.access == Access.USER) { if (api.access == Access.USER) {
User u = session.getAttribute(Attribute.USER); User u = (User) session.getAttribute(Attribute.USER);
if (u == null) { if (u == null) {
obj = Error.UNAUTHORIZED; obj = Error.UNAUTHORIZED;
return; return;
} }
} }
if (api.access < Access.USER) { if (api.access < Access.USER) {
Operator op = session.getAttribute(Attribute.OPERATOR); Operator op = (Operator) session.getAttribute(Attribute.OPERATOR);
if (op == null) { if (op == null) {
obj = Error.UNAUTHORIZED; obj = Error.UNAUTHORIZED;
return; return;
@@ -120,7 +121,7 @@ public class APIRouter extends HttpServlet {
private static WxSession getSession(HttpServletRequest req) { private static WxSession getSession(HttpServletRequest req) {
String t = req.getParameter("token"); String t = req.getParameter("token");
if (t == null || t.isEmpty()) return null; if (t == null || t.isEmpty()) return null;
return WechatSession.get(t); return WechatSession.get(t, false);
} }
} }

View File

@@ -2,7 +2,7 @@ package love.sola.netsupport.api;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.session.WxSession; import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;

View File

@@ -5,14 +5,15 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.sql.TableOperator; import love.sola.netsupport.sql.TableOperator;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.util.Crypto; import love.sola.netsupport.util.Crypto;
import love.sola.netsupport.util.ParseUtil;
import love.sola.netsupport.util.RSAUtil; import love.sola.netsupport.util.RSAUtil;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
@@ -44,7 +45,8 @@ public class Login extends HttpServlet {
response.addHeader("Content-type", "application/json;charset=utf-8"); response.addHeader("Content-type", "application/json;charset=utf-8");
response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Origin", "*");
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
out.println(gson.toJson(login(request))); String json = gson.toJson(login(request));
out.println(ParseUtil.parseJsonP(request, json));
out.close(); out.close();
} }
@@ -63,7 +65,8 @@ public class Login extends HttpServlet {
return Error.WRONG_PASSWORD; return Error.WRONG_PASSWORD;
} }
WxSession session = WechatSession.create(); String sid = WechatSession.genId();
WxSession session = WechatSession.get(sid, true);
if (bypass) { if (bypass) {
session.setAttribute(Attribute.AUTHORIZED, Command.fromId(Integer.parseInt(request.getParameter("bypass")))); session.setAttribute(Attribute.AUTHORIZED, Command.fromId(Integer.parseInt(request.getParameter("bypass"))));
} else { } else {
@@ -81,7 +84,7 @@ public class Login extends HttpServlet {
if (request.getParameter("bypasswechat") != null) { if (request.getParameter("bypasswechat") != null) {
session.setAttribute(Attribute.WECHAT, request.getParameter("bypasswechat")); session.setAttribute(Attribute.WECHAT, request.getParameter("bypasswechat"));
} }
return session.getId(); return sid;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Error.INTERNAL_ERROR; return Error.INTERNAL_ERROR;

View File

@@ -4,9 +4,9 @@ import love.sola.netsupport.api.API;
import love.sola.netsupport.api.Error; import love.sola.netsupport.api.Error;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;

View File

@@ -9,10 +9,10 @@ import love.sola.netsupport.enums.Status;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.Checker;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.Session; import org.hibernate.Session;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -41,7 +41,7 @@ public class TicketPush extends API {
if (desc.length() > Settings.MAX_DESC_LENGTH) { if (desc.length() > Settings.MAX_DESC_LENGTH) {
return Error.LENGTH_LIMIT_EXCEEDED; return Error.LENGTH_LIMIT_EXCEEDED;
} }
Operator op = session.getAttribute(Attribute.OPERATOR); Operator op = (Operator) session.getAttribute(Attribute.OPERATOR);
try (Session s = SQLCore.sf.openSession()) { try (Session s = SQLCore.sf.openSession()) {
s.beginTransaction(); s.beginTransaction();
User u = s.get(User.class, Long.parseLong(uid)); User u = s.get(User.class, Long.parseLong(uid));

View File

@@ -2,12 +2,13 @@ package love.sola.netsupport.api.root;
import love.sola.netsupport.api.API; import love.sola.netsupport.api.API;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.session.InternalSession;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Set; import java.util.Enumeration;
/** /**
* *********************************************** * ***********************************************
@@ -26,11 +27,13 @@ public class DashBoard extends API {
@Override @Override
protected Object process(HttpServletRequest req, WxSession session) throws Exception { protected Object process(HttpServletRequest req, WxSession session) throws Exception {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (love.sola.netsupport.session.WxSession ws : WechatSession.list()) { for (InternalSession s : WechatSession.list()) {
sb.append("=====").append(ws.getId()).append("=====\n"); sb.append("=====").append(s.getIdInternal()).append("=====\n");
Set<String> e = ws.getAttributeNames(); WxSession ws = s.getSession();
for (String key : e) { Enumeration<String> e = ws.getAttributeNames();
sb.append(key).append(": ").append(ws.getAttribute(key).toString()).append("\n"); while (e.hasMoreElements()) {
String key = e.nextElement();
sb.append(key).append(": ").append(ws.getAttribute(key)).append("\n");
} }
} }
return sb.toString(); return sb.toString();

View File

@@ -3,9 +3,9 @@ package love.sola.netsupport.api.root;
import love.sola.netsupport.api.API; import love.sola.netsupport.api.API;
import love.sola.netsupport.api.Error; import love.sola.netsupport.api.Error;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;

View File

@@ -4,10 +4,10 @@ import love.sola.netsupport.api.API;
import love.sola.netsupport.api.Error; import love.sola.netsupport.api.Error;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.util.Crypto; import love.sola.netsupport.util.Crypto;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.Session; import org.hibernate.Session;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;

View File

@@ -3,10 +3,10 @@ package love.sola.netsupport.api.stuff;
import love.sola.netsupport.api.API; import love.sola.netsupport.api.API;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReader;

View File

@@ -4,9 +4,9 @@ import love.sola.netsupport.api.API;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -26,7 +26,7 @@ public class TicketLookup extends API {
@Override @Override
protected Object process(HttpServletRequest req, WxSession session) throws Exception { protected Object process(HttpServletRequest req, WxSession session) throws Exception {
Operator op = session.getAttribute(Attribute.OPERATOR); Operator op = (Operator) session.getAttribute(Attribute.OPERATOR);
int block; int block;
if (req.getParameter("block") != null) { if (req.getParameter("block") != null) {
block = Integer.parseInt(req.getParameter("block")); block = Integer.parseInt(req.getParameter("block"));

View File

@@ -3,9 +3,9 @@ package love.sola.netsupport.api.stuff;
import love.sola.netsupport.api.API; import love.sola.netsupport.api.API;
import love.sola.netsupport.api.Error; import love.sola.netsupport.api.Error;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;

View File

@@ -6,10 +6,10 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.Checker;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.Session; import org.hibernate.Session;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -36,7 +36,7 @@ public class TicketUpdate extends API {
String status = req.getParameter("status"); String status = req.getParameter("status");
if (Checker.hasNull(ticket, remark, status)) return Error.PARAMETER_REQUIRED; if (Checker.hasNull(ticket, remark, status)) return Error.PARAMETER_REQUIRED;
try (Session s = SQLCore.sf.openSession()) { try (Session s = SQLCore.sf.openSession()) {
Operator op = session.getAttribute(Attribute.OPERATOR); Operator op = (Operator) session.getAttribute(Attribute.OPERATOR);
Ticket t = s.get(Ticket.class, Integer.parseInt(ticket)); Ticket t = s.get(Ticket.class, Integer.parseInt(ticket));
if (t == null) { if (t == null) {
return Error.TICKET_NOT_FOUND; return Error.TICKET_NOT_FOUND;

View File

@@ -6,9 +6,9 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.enums.ISP; import love.sola.netsupport.enums.ISP;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.ConstraintViolationException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -31,7 +31,7 @@ public class ProfileModify extends API {
@Override @Override
protected Object process(HttpServletRequest req, WxSession session) throws Exception { protected Object process(HttpServletRequest req, WxSession session) throws Exception {
User u = session.getAttribute(Attribute.USER); User u = (User) session.getAttribute(Attribute.USER);
ISP isp = checkISP(req.getParameter("isp")); ISP isp = checkISP(req.getParameter("isp"));
String netAccount = checkNetAccount(req.getParameter("username"), isp); String netAccount = checkNetAccount(req.getParameter("username"), isp);
int block = checkBlock(req.getParameter("block")); int block = checkBlock(req.getParameter("block"));

View File

@@ -6,12 +6,12 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.enums.ISP; import love.sola.netsupport.enums.ISP;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WxMpServlet; import love.sola.netsupport.wechat.WxMpServlet;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.ConstraintViolationException;
@@ -39,7 +39,7 @@ public class Register extends API {
@Override @Override
protected Object process(HttpServletRequest req, WxSession session) throws Exception { protected Object process(HttpServletRequest req, WxSession session) throws Exception {
String wechat = session.getAttribute(Attribute.WECHAT); String wechat = (String) session.getAttribute(Attribute.WECHAT);
if (wechat == null) { if (wechat == null) {
return Error.UNAUTHORIZED; return Error.UNAUTHORIZED;
} }

View File

@@ -5,9 +5,9 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.Criteria; import org.hibernate.Criteria;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.criterion.Order; import org.hibernate.criterion.Order;
@@ -32,7 +32,7 @@ public class TicketQuery extends API {
@Override @Override
protected Object process(HttpServletRequest req, WxSession session) throws Exception { protected Object process(HttpServletRequest req, WxSession session) throws Exception {
try (Session s = SQLCore.sf.openSession()) { try (Session s = SQLCore.sf.openSession()) {
User u = session.getAttribute(Attribute.USER); User u = (User) session.getAttribute(Attribute.USER);
Criteria c = s.createCriteria(Ticket.class); Criteria c = s.createCriteria(Ticket.class);
int first = req.getParameter("offset") == null ? 0 : Integer.parseInt(req.getParameter("offset")); int first = req.getParameter("offset") == null ? 0 : Integer.parseInt(req.getParameter("offset"));
int limit = req.getParameter("limit") == null ? 5 : Integer.parseInt(req.getParameter("limit")); int limit = req.getParameter("limit") == null ? 5 : Integer.parseInt(req.getParameter("limit"));

View File

@@ -7,10 +7,10 @@ import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.session.WxSession;
import org.hibernate.Session; import org.hibernate.Session;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -40,7 +40,7 @@ public class TicketSubmit extends API {
} }
try (Session s = SQLCore.sf.openSession()) { try (Session s = SQLCore.sf.openSession()) {
User u = session.getAttribute(Attribute.USER); User u = (User) session.getAttribute(Attribute.USER);
if (TableTicket.hasOpen(u)) { if (TableTicket.hasOpen(u)) {
session.invalidate(); session.invalidate();
return Error.ALREADY_SUBMITTED; return Error.ALREADY_SUBMITTED;

View File

@@ -1,11 +1,12 @@
package love.sola.netsupport.auth; package love.sola.netsupport.auth;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.Checker;
import love.sola.netsupport.wechat.WechatSession;
import love.sola.netsupport.wechat.WxMpServlet; import love.sola.netsupport.wechat.WxMpServlet;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@@ -14,8 +15,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/** /**
* *********************************************** * ***********************************************
@@ -23,42 +22,25 @@ import java.util.Map;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
@WebServlet(name = "OAuth2", urlPatterns = "/oauth2/callback", loadOnStartup = 21, asyncSupported = true) @WebServlet(name = "OAuth2", urlPatterns = "/oauth2/callback", loadOnStartup = 21)
public class OAuth2 extends HttpServlet { public class OAuth2 extends HttpServlet {
private static Map<String, OAuth2Handler> oAuth2HandlerMap = new HashMap<>();
/**
* for {@link love.sola.netsupport.wechat.WxMpServlet#registerCommands}
* @param state the state key from open platform callback.
* @param handler handler
*/
public static void registerOAuth2Handler(String state, OAuth2Handler handler) {
oAuth2HandlerMap.put(state, handler);
}
@Override @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
AsyncContext actx = req.startAsync(); AsyncContext acxt = req.startAsync();
String code = req.getParameter("code"); String code = req.getParameter("code");
String state = req.getParameter("state"); String state = req.getParameter("state");
if (Checker.hasNull(code, state)) { if (Checker.hasNull(code, state)) {
resp.sendError(HttpServletResponse.SC_FORBIDDEN); resp.sendError(HttpServletResponse.SC_FORBIDDEN);
return; return;
} }
OAuth2Handler handler = oAuth2HandlerMap.get(state); acxt.start(() -> {
if (handler == null) {
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
return;
}
actx.start(() -> {
try { try {
WxMpService wxMpService = WxMpServlet.instance.wxMpService; WxMpService wxMpService = WxMpServlet.instance.wxMpService;
WxMpOAuth2AccessToken token = wxMpService.oauth2getAccessToken(code); WxMpOAuth2AccessToken token = wxMpService.oauth2getAccessToken(code);
String wechat = token.getOpenId(); WxMpUser wxUser = wxMpService.oauth2getUserInfo(token, "zh_CN");
WxSession session = WechatSession.create(); String sid = WechatSession.genId();
handler.onOAuth2(actx, (HttpServletResponse) actx.getResponse(), wechat, session); WxSession session = WechatSession.get(sid, true);
actx.complete();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -1,18 +0,0 @@
package love.sola.netsupport.auth;
import love.sola.netsupport.session.WxSession;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletResponse;
/**
* ***********************************************
* Created by Sola on 2016/3/26.
* Don't modify this source without my agreement
* ***********************************************
*/
public interface OAuth2Handler {
void onOAuth2(AsyncContext actx, HttpServletResponse resp, String user, WxSession session);
}

View File

@@ -1,88 +0,0 @@
/*
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package love.sola.netsupport.session;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @author Sola
*/
@EqualsAndHashCode(of = "id")
public final class MapSession implements WxSession, Serializable {
@Getter
private final String id;
private Map<String, Object> sessionAttrs = new HashMap<String, Object>();
@Getter
private long creationTime = System.currentTimeMillis();
@Getter
@Setter
private long lastAccessedTime = creationTime;
@Getter
private boolean invalidated = false;
/**
* Creates a new instance with a secure randomly generated identifier.
*/
public MapSession() {
this(UUID.randomUUID().toString());
}
/**
* Creates a new instance with the specified id. This is preferred to the
* default constructor when the id is known to prevent unnecessary consumption on
* entropy which can be slow.
*
* @param id the identifier to use
*/
public MapSession(String id) {
this.id = id;
}
@SuppressWarnings("unchecked")
public <T> T getAttribute(String attributeName) {
return (T) sessionAttrs.get(attributeName);
}
public Set<String> getAttributeNames() {
return sessionAttrs.keySet();
}
public void setAttribute(String attributeName, Object attributeValue) {
if (attributeValue == null) {
removeAttribute(attributeName);
} else {
sessionAttrs.put(attributeName, attributeValue);
}
}
public void removeAttribute(String attributeName) {
sessionAttrs.remove(attributeName);
}
public void invalidate() {
invalidated = true;
}
}

View File

@@ -1,85 +0,0 @@
/*
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package love.sola.netsupport.session;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import love.sola.netsupport.config.Settings;
import org.apache.commons.lang3.Validate;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author Sola
*/
public class MapSessionRepository {
private final LoadingCache<String, MapSession> sessions;
public MapSessionRepository() {
this(CacheBuilder.newBuilder()
.concurrencyLevel(4)
.maximumSize(65535)
.expireAfterAccess(Settings.I.User_Session_Max_Inactive, TimeUnit.SECONDS)
.build(new CacheLoader<String, MapSession>() {
@Override
public MapSession load(@Nonnull String key) throws Exception {
return new MapSession(key);
}
}
)
);
}
public MapSessionRepository(LoadingCache<String, MapSession> sessions) {
Validate.notNull(sessions);
this.sessions = sessions;
}
public void save(MapSession session) {
sessions.put(session.getId(), session);
}
public MapSession getSession(String id) {
MapSession saved = sessions.getIfPresent(id);
if (saved == null) {
return null;
}
if (saved.isInvalidated()) {
delete(saved.getId());
return null;
}
return saved;
}
public void delete(String id) {
sessions.invalidate(id);
}
public MapSession createSession() {
MapSession session = new MapSession();
save(session);
return session;
}
public Map<String, MapSession> asMap() {
return sessions.asMap();
}
}

View File

@@ -1,32 +0,0 @@
package love.sola.netsupport.session;
import java.util.Collection;
/**
* ***********************************************
* Created by Sola on 2015/12/14.
* Don't modify this source without my agreement
* ***********************************************
*/
public class WechatSession {
private static MapSessionRepository repository;
static {
repository = new MapSessionRepository();
}
public static WxSession get(String id) {
return repository.getSession(id);
}
public static WxSession create() {
return repository.createSession();
}
public static Collection<? extends WxSession> list() {
return repository.asMap().values();
}
}

View File

@@ -1,22 +0,0 @@
package love.sola.netsupport.session;
import java.util.Set;
/**
* @author Sola
*/
public interface WxSession {
String getId();
<T> T getAttribute(String name);
Set<String> getAttributeNames();
void setAttribute(String name, Object value);
void removeAttribute(String name);
void invalidate();
}

View File

@@ -5,7 +5,6 @@ import com.google.gson.annotations.Expose;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; import com.google.gson.stream.JsonWriter;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import love.sola.netsupport.enums.ISP; import love.sola.netsupport.enums.ISP;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import org.hibernate.Hibernate; import org.hibernate.Hibernate;
@@ -19,7 +18,6 @@ import org.hibernate.proxy.HibernateProxy;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;
import javax.naming.InitialContext; import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
@@ -32,10 +30,7 @@ import java.util.Date;
*/ */
public class SQLCore { public class SQLCore {
public static InitialContext ic;
public static DataSource ds; public static DataSource ds;
public static SessionFactory sf;
public static ServiceRegistry sr;
public static Gson gson = new GsonBuilder() public static Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new ExclusionStrategy() { .addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override @Override
@@ -69,10 +64,12 @@ public class SQLCore {
.registerTypeAdapter(Command.class, (JsonSerializer<Command>) (src, typeOfSrc, context) -> new JsonPrimitive(src.id)) .registerTypeAdapter(Command.class, (JsonSerializer<Command>) (src, typeOfSrc, context) -> new JsonPrimitive(src.id))
.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY) .registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY)
.create(); .create();
public static SessionFactory sf;
public static ServiceRegistry sr;
static { static {
try { try {
ic = new InitialContext(); InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup("java:comp/env/jdbc/netsupport"); ds = (DataSource) ic.lookup("java:comp/env/jdbc/netsupport");
ds.setLoginTimeout(3); ds.setLoginTimeout(3);
@@ -86,16 +83,6 @@ public class SQLCore {
} }
} }
public static void destroy() {
try {
SQLCore.sf.close();
((ComboPooledDataSource) SQLCore.ds).close();
SQLCore.ic.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
public static AuditReader getAuditReader(Session session) { public static AuditReader getAuditReader(Session session) {
return AuditReaderFactory.get(session); return AuditReaderFactory.get(session);
} }

View File

@@ -72,7 +72,7 @@ public class TableUser extends SQLCore {
private static LoadingCache<String, User> cache = CacheBuilder.newBuilder() private static LoadingCache<String, User> cache = CacheBuilder.newBuilder()
.concurrencyLevel(4) .concurrencyLevel(4)
.maximumSize(4096) .maximumSize(4096)
.expireAfterAccess(Settings.I.User_Wechat_Cache_Expire_Time, TimeUnit.SECONDS) .expireAfterWrite(Settings.I.User_Wechat_Cache_Expire_Time, TimeUnit.SECONDS)
.build(new ValueLoader()); .build(new ValueLoader());
private static class ValueLoader extends CacheLoader<String, User> { private static class ValueLoader extends CacheLoader<String, User> {

View File

@@ -1,7 +1,13 @@
package love.sola.netsupport.util; package love.sola.netsupport.util;
import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.enums.Block; import love.sola.netsupport.enums.Block;
import love.sola.netsupport.enums.ISP; import love.sola.netsupport.enums.ISP;
import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.session.WxSession;
import javax.servlet.http.HttpServletRequest;
/** /**
* *********************************************** * ***********************************************
@@ -19,6 +25,13 @@ public class Checker {
return false; return false;
} }
public static WxSession isAuthorized(HttpServletRequest r, Command c) {
String t = r.getParameter("token");
if (t == null || t.isEmpty()) return null;
WxSession s = WechatSession.get(t, false);
return s == null ? null : s.getAttribute(Attribute.AUTHORIZED) == c ? s : null;
}
public static long checkStudentId(String studentId) { public static long checkStudentId(String studentId) {
if (studentId == null) return -1; if (studentId == null) return -1;
if (studentId.matches(STUDENT_ID_REGEX)) { if (studentId.matches(STUDENT_ID_REGEX)) {

View File

@@ -3,6 +3,7 @@ package love.sola.netsupport.util;
import love.sola.netsupport.enums.Status; import love.sola.netsupport.enums.Status;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import static love.sola.netsupport.config.Lang.lang; import static love.sola.netsupport.config.Lang.lang;
@@ -29,4 +30,11 @@ public class ParseUtil {
return sb.toString(); return sb.toString();
} }
public static String parseJsonP(HttpServletRequest request, String json) {
String jsonp = request.getParameter("jsonp");
if (jsonp == null || jsonp.isEmpty())
return json;
else
return jsonp.replace("{0}", json);
}
} }

View File

@@ -1,7 +1,5 @@
package love.sola.netsupport.util; package love.sola.netsupport.util;
import com.google.common.net.UrlEscapers;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@@ -15,106 +13,15 @@ import static love.sola.netsupport.config.Lang.lang;
*/ */
public class Redirect { public class Redirect {
private static final String REDIRECT_PAGE = lang("Result_Page"); public static final String REDIRECT_PAGE = lang("Result_Page");
private static final int SUCCESS = 1;
private static final int ERROR = 0;
private static final int WARNING = -1;
private static final int NON_WECHAT = 88;
public static RedirectBuilder success() {
return new RedirectBuilder(SUCCESS);
}
public static RedirectBuilder error() {
return new RedirectBuilder(ERROR);
}
public static class RedirectBuilder {
private StringBuilder sb;
RedirectBuilder(int type) {
sb = new StringBuilder(REDIRECT_PAGE).append("?");
type(type);
}
private RedirectBuilder type(int type) {
sb.append("type=").append(type).append("&");
return this;
}
public RedirectBuilder msg(String msg) {
sb.append("msg=").append(escape(msg)).append("&");
return this;
}
public RedirectBuilder title(String title) {
sb.append("title=").append(escape(title)).append("&");
return this;
}
public RedirectBuilder noButton() {
sb.append("btn=").append("hide").append("&");
return this;
}
public RedirectBuilder button(String text) {
sb.append("btn=").append(escape(text)).append("&");
return this;
}
public RedirectBuilder icon(WeUIIcon icon) {
sb.append("icon=").append(icon.toString()).append("&");
return this;
}
public RedirectBuilder to(String url) {
sb.append("redirect=").append(escape(url)).append("&");
return this;
}
public void go(HttpServletResponse resp) throws IOException {
resp.sendRedirect(sb.toString());
}
public String toString() {
return sb.toString();
}
private static String escape(String str) {
return UrlEscapers.urlFragmentEscaper().escape(str);
}
}
public enum WeUIIcon {
SUCCESS("weui_icon_success"),
SUCCESS_CIRCLE("weui_icon_success_circle"),
SUCCESS_NO_CIRCLE("weui_icon_success_no_circle"),
SUCCESS_SAFE("weui_icon_safe_success"),
INFO("weui_icon_info"),
INFO_CIRCLE("weui_icon_info_circle"),
WAITING("weui_icon_waiting"),
WAITING_CIRCLE("weui_icon_waiting_circle"),
CIRCLE("weui_icon_circle"),
WARN("weui_icon_warn"),
WARN_SAFE("weui_icon_safe_warn"),
DOWNLOAD("weui_icon_download"),
CANCEL("weui_icon_cancel"),
;
private String value;
WeUIIcon(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
public static void message(HttpServletResponse response, int type, String message) throws IOException {
response.sendRedirect(
response.encodeRedirectURL(REDIRECT_PAGE +
"?msg=" + message +
"&type=" + type
)
);
} }
} }

View File

@@ -0,0 +1,43 @@
package love.sola.netsupport.wechat;
import love.sola.netsupport.config.Settings;
import me.chanjar.weixin.common.session.*;
import java.util.UUID;
/**
* ***********************************************
* Created by Sola on 2015/12/14.
* Don't modify this source without my agreement
* ***********************************************
*/
public class WechatSession {
private static StandardSessionManager manager;
static{
manager = new StandardSessionManager();
manager.setMaxInactiveInterval(Settings.I.User_Session_Max_Inactive);
}
public static WxSession get(String id, boolean create) {
WxSession session = manager.getSession(id, create);
if (session != null) {
((StandardSessionFacade) session).getInternalSession().endAccess();
}
return session;
}
public static WxSession get(String id) {
return get(id, true);
}
public static String genId() {
return UUID.randomUUID().toString();
}
public static InternalSession[] list() {
return manager.findSessions();
}
}

View File

@@ -1,9 +1,6 @@
package love.sola.netsupport.wechat; package love.sola.netsupport.wechat;
import love.sola.netsupport.auth.OAuth2;
import love.sola.netsupport.auth.OAuth2Handler;
import love.sola.netsupport.config.Settings; import love.sola.netsupport.config.Settings;
import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.wechat.handler.RegisterHandler; import love.sola.netsupport.wechat.handler.RegisterHandler;
import love.sola.netsupport.wechat.handler.SubscribeHandler; import love.sola.netsupport.wechat.handler.SubscribeHandler;
import love.sola.netsupport.wechat.matcher.CheckSpamMatcher; import love.sola.netsupport.wechat.matcher.CheckSpamMatcher;
@@ -89,9 +86,6 @@ public class WxMpServlet extends HttpServlet {
WxMpMessageHandler handler = c.handler.newInstance(); WxMpMessageHandler handler = c.handler.newInstance();
router.rule().async(false).msgType(WxConsts.XML_MSG_TEXT).rContent(c.regex).handler(handler).end(); router.rule().async(false).msgType(WxConsts.XML_MSG_TEXT).rContent(c.regex).handler(handler).end();
router.rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_CLICK).eventKey(c.name()).handler(handler).end(); router.rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_CLICK).eventKey(c.name()).handler(handler).end();
if (handler instanceof OAuth2Handler) {
OAuth2.registerOAuth2Handler(c.name(), (OAuth2Handler) handler);
}
} }
} }
@@ -159,8 +153,4 @@ public class WxMpServlet extends HttpServlet {
doPost(req, resp); doPost(req, resp);
} }
@Override
public void destroy() {
SQLCore.destroy();
}
} }

View File

@@ -1,14 +1,12 @@
package love.sola.netsupport.wechat.handler; package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.auth.OAuth2Handler;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.util.Redirect;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -16,12 +14,9 @@ import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder; import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
import static love.sola.netsupport.config.Lang.format; import static love.sola.netsupport.config.Lang.format;
import static love.sola.netsupport.config.Lang.lang;
/** /**
* *********************************************** * ***********************************************
@@ -29,39 +24,19 @@ import static love.sola.netsupport.config.Lang.lang;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class ProfileHandler implements WxMpMessageHandler, OAuth2Handler { public class ProfileHandler implements WxMpMessageHandler {
@Override @Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
User u = TableUser.getByWechat(wxMessage.getFromUserName()); User u = TableUser.getByWechat(wxMessage.getFromUserName());
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.USER, u); session.setAttribute(Attribute.USER, u);
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
out.content(format("Profile_Modify", format("User_Profile_Link", session.getId(), u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()))); out.content(format("Profile_Modify", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())));
return out.build(); return out.build();
} }
@Override
public void onOAuth2(AsyncContext actx, HttpServletResponse resp, String user, WxSession session) {
try {
User u = TableUser.getByWechat(user);
if (u == null) {
session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER);
session.setAttribute(Attribute.WECHAT, user);
Redirect.error().icon(Redirect.WeUIIcon.INFO).noButton()
.title(lang("Need_Register_Title")).msg(lang("Need_Register"))
.to(format("User_Register_Link", session.getId())).go(resp);
return;
}
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, user);
session.setAttribute(Attribute.USER, u);
resp.sendRedirect(format("User_Profile_Link", session.getId(), u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()));
} catch (Exception e) {
e.printStackTrace();
}
}
} }

View File

@@ -3,13 +3,13 @@ package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.util.ParseUtil;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -40,7 +40,8 @@ public class QueryHandler implements WxMpMessageHandler {
return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
.content(lang("No_Ticket_Available")).build(); .content(lang("No_Ticket_Available")).build();
} }
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
session.setAttribute(Attribute.AUTHORIZED, Command.QUERY); session.setAttribute(Attribute.AUTHORIZED, Command.QUERY);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.USER, u); session.setAttribute(Attribute.USER, u);
@@ -49,7 +50,7 @@ public class QueryHandler implements WxMpMessageHandler {
WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
item.setTitle(lang("Query_Title")); item.setTitle(lang("Query_Title"));
item.setDescription(ParseUtil.parseTicket(t) + "\n" + lang("More_Details")); item.setDescription(ParseUtil.parseTicket(t) + "\n" + lang("More_Details"));
item.setUrl(format("User_Query_Link", session.getId())); item.setUrl(format("User_Query_Link", id));
out.addArticle(item); out.addArticle(item);
return out.build(); return out.build();
} }

View File

@@ -2,11 +2,11 @@ package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -32,16 +32,17 @@ public class RegisterHandler implements WxMpMessageHandler {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
String fromUser = wxMessage.getFromUserName(); String fromUser = wxMessage.getFromUserName();
User u = TableUser.getByWechat(fromUser); User u = TableUser.getByWechat(fromUser);
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
if (u != null) { if (u != null) {
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.WECHAT, fromUser);
session.setAttribute(Attribute.USER, u); session.setAttribute(Attribute.USER, u);
out.content(format("Already_Registered", format("User_Profile_Link", session.getId(), u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()))); out.content(format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())));
} else { } else {
session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER);
session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.WECHAT, fromUser);
out.content(format("User_Register", format("User_Register_Link", session.getId()))); out.content(format("User_Register", format("User_Register_Link", id)));
} }
return out.build(); return out.build();
} }

View File

@@ -2,12 +2,12 @@ package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -36,7 +36,8 @@ public class SubmitHandler implements WxMpMessageHandler {
return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
.content(lang("Already_Opening_Ticket")).build(); .content(lang("Already_Opening_Ticket")).build();
} }
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
session.setAttribute(Attribute.AUTHORIZED, Command.SUBMIT); session.setAttribute(Attribute.AUTHORIZED, Command.SUBMIT);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.USER, u); session.setAttribute(Attribute.USER, u);
@@ -45,7 +46,7 @@ public class SubmitHandler implements WxMpMessageHandler {
WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
item.setTitle(lang("Submit_Title")); item.setTitle(lang("Submit_Title"));
item.setDescription(lang("Submit_Desc")); item.setDescription(lang("Submit_Desc"));
item.setUrl(format("User_Submit_Link", session.getId(), u.getName(), u.getIsp().id, u.getRoom(), u.getBlock(), u.getPhone())); item.setUrl(format("User_Submit_Link", id, u.getName(), u.getIsp().id, u.getRoom(), u.getBlock(), u.getPhone()));
out.addArticle(item); out.addArticle(item);
return out.build(); return out.build();
} }

View File

@@ -4,12 +4,12 @@ import love.sola.netsupport.api.user.Register;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableOperator; import love.sola.netsupport.sql.TableOperator;
import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -34,12 +34,13 @@ public class SubscribeHandler implements WxMpMessageHandler {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
String fromUser = wxMessage.getFromUserName(); String fromUser = wxMessage.getFromUserName();
User u = TableUser.getByWechat(fromUser); User u = TableUser.getByWechat(fromUser);
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
if (u != null) { if (u != null) {
session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE);
session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.WECHAT, fromUser);
session.setAttribute(Attribute.USER, u); session.setAttribute(Attribute.USER, u);
out.content(format("Event_Subscribe", format("Already_Registered", format("User_Profile_Link", session.getId(), u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())))); out.content(format("Event_Subscribe", format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()))));
Operator op = TableOperator.get(fromUser); Operator op = TableOperator.get(fromUser);
if (op != null) { if (op != null) {
@@ -50,7 +51,7 @@ public class SubscribeHandler implements WxMpMessageHandler {
} else { } else {
session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER);
session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.WECHAT, fromUser);
out.content(format("Event_Subscribe", format("User_Register", format("User_Register_Link", session.getId())))); out.content(format("Event_Subscribe", format("User_Register", format("User_Register_Link", id))));
} }
return out.build(); return out.build();
} }

View File

@@ -1,15 +1,13 @@
package love.sola.netsupport.wechat.handler.admin; package love.sola.netsupport.wechat.handler.admin;
import love.sola.netsupport.auth.OAuth2Handler;
import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Access;
import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.enums.Attribute;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.session.WechatSession;
import love.sola.netsupport.session.WxSession;
import love.sola.netsupport.sql.TableOperator; import love.sola.netsupport.sql.TableOperator;
import love.sola.netsupport.util.Redirect;
import love.sola.netsupport.wechat.Command; import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.WechatSession;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
@@ -17,8 +15,6 @@ import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder; import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
import static love.sola.netsupport.config.Lang.format; import static love.sola.netsupport.config.Lang.format;
@@ -30,7 +26,7 @@ import static love.sola.netsupport.config.Lang.lang;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class LoginHandler implements WxMpMessageHandler, OAuth2Handler { public class LoginHandler implements WxMpMessageHandler {
@Override @Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
@@ -42,12 +38,14 @@ public class LoginHandler implements WxMpMessageHandler, OAuth2Handler {
else if (operator.getAccess() >= Access.NO_LOGIN) { else if (operator.getAccess() >= Access.NO_LOGIN) {
out.content(lang("No_Login")); out.content(lang("No_Login"));
} else { } else {
WxSession session = WechatSession.create(); String id = WechatSession.genId();
WxSession session = WechatSession.get(id, true);
session.setAttribute(Attribute.AUTHORIZED, Command.LOGIN); session.setAttribute(Attribute.AUTHORIZED, Command.LOGIN);
session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName());
session.setAttribute(Attribute.OPERATOR, operator); session.setAttribute(Attribute.OPERATOR, operator);
out.content(format("Home_Page_Msg", format("Operator_Home_Page", session.getId()))); out.content(format("Operator_Home_Page", id));
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
out.content(lang("Login_Error")); out.content(lang("Login_Error"));
@@ -55,28 +53,4 @@ public class LoginHandler implements WxMpMessageHandler, OAuth2Handler {
return out.build(); return out.build();
} }
@Override
public void onOAuth2(AsyncContext actx, HttpServletResponse resp, String user, WxSession session) {
try {
Operator operator = TableOperator.get(user);
if (operator == null) {
Redirect.error().icon(Redirect.WeUIIcon.WARN_SAFE).noButton()
.title(lang("Not_Operator")).msg(lang("Not_Operator_OAuth2")).go(resp);
return;
}
if (operator.getAccess() >= Access.NO_LOGIN) {
Redirect.error().icon(Redirect.WeUIIcon.WAITING).noButton()
.title(lang("Left_Operator_Title")).msg(lang("Left_Operator")).go(resp);
return;
}
session.setAttribute(Attribute.AUTHORIZED, Command.LOGIN);
session.setAttribute(Attribute.WECHAT, user);
session.setAttribute(Attribute.OPERATOR, operator);
resp.sendRedirect(format("Operator_Home_Page", session.getId()));
} catch (Exception e) {
e.printStackTrace();
}
}
} }

View File

@@ -1,5 +1,6 @@
package love.sola.netsupport.wechat.handler.admin; package love.sola.netsupport.wechat.handler.admin;
import love.sola.netsupport.enums.Access;
import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Operator;
import love.sola.netsupport.sql.TableOperator; import love.sola.netsupport.sql.TableOperator;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
@@ -28,10 +29,10 @@ public class OperatorInfoHandler implements WxMpMessageHandler {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
try { try {
Operator op = TableOperator.get(wxMessage.getFromUserName()); Operator op = TableOperator.get(wxMessage.getFromUserName());
if (op == null) { if (op == null)
out.content(lang("Not_Operator")); out.content(lang("Not_Operator"));
// } else if (op.getAccess() >= Access.NO_LOGIN) { else if (op.getAccess() >= Access.NO_LOGIN) {
// out.content(lang("No_Login")); out.content(lang("No_Login"));
} else { } else {
out.content(format("Operator_Info", op.getId(), op.getName(), op.getAccess(), op.getBlock(), op.getWeek())); out.content(format("Operator_Info", op.getId(), op.getName(), op.getAccess(), op.getBlock(), op.getWeek()));
} }

View File

@@ -42,33 +42,27 @@ User_Cancel_Remark: '用户手动取消报修。'
Cancel_Failed: '取消失败。' Cancel_Failed: '取消失败。'
#Modify #Modify
Profile_Modify: '<a href="{0}">> 点此修改资料 <</a>' Profile_Modify: '<a href="{0}">> 点此修改资料 <</a>'
Need_Register_Title: '尚未进行微信绑定'
Need_Register: '您尚未进行微信绑定3秒后将自动跳转至微信绑定页面。'
#Login #Login
Home_Page_Msg: '<a href="{0}">CLICK HERE</a>'
Not_Operator: '嘟嘟嘟……' Not_Operator: '嘟嘟嘟……'
Not_Operator_OAuth2: '看起来你并不是我们网维大家族的一员,但我们随时都欢迎你的加入哦!'
No_Login: 'Permission Denied.' No_Login: 'Permission Denied.'
Left_Operator_Title: '一路上有你'
Left_Operator: '网络维护科的茁壮成长离不开每一位成员的陪伴。一路上有你,感谢你对网络维护科的贡献!'
Internal_Error: '啊哦,登录失败了哦。' Internal_Error: '啊哦,登录失败了哦。'
#Operator_Info #Operator_Info
Operator_Info: | Operator_Info: |
网维成员资料: 网维成员资料:
网维ID: {0,number,#} 网维ID: {0,number,#}
姓名: {1} 姓名: {1}
岗位: {2,choice,0#'Administrator >ω<'|3#值班组长|6#正式成员|7#实习成员|9#'曾经的一员(TдT)'} 岗位: {2,choice,0#'Administrator >ω<'|3#值班组长|6#正式成员|7#实习成员|}
值班片区: {3,choice,0#'全图 >ω<'|1#岐头片区|2#北门片区|3#东门片区|4#香灰片区|5#凤翔片区} 值班片区: {3,choice,0#'全图 >ω<'|1#岐头片区|2#北门片区|3#东门片区|4#香灰片区|5#凤翔片区}
值班日: {4,choice,0#'2月30日 >ω<'|1#周一|2#周二|3#周三|4#周四|5#周五|6#周六|7#周日} 值班日: {4,choice,0#'2月30日 >ω<'|1#周一|2#周二|3#周三|4#周四|5#周五|6#周六|7#周日}
若以上信息有误,请及时联系@15-沙子森。 若以上信息有误,请及时联系@15-排污-沙子森。
#URL #URL
User_Register_Link: 'http://topaz.sinaapp.com/nm/v2/user/reg.html?token={0}' User_Register_Link: 'http://topaz.sinaapp.com/nm/v2/user/reg.html?token={0}'
User_Query_Link: 'http://topaz.sinaapp.com/nm/v2/user/list.html?token={0}' User_Query_Link: 'http://topaz.sinaapp.com/nm/v2/user/list.html?token={0}'
User_Submit_Link: 'http://topaz.sinaapp.com/nm/v2/user/rrepair.html?token={0}&name={1}&isp={2}&room={3}&block={4}&phone={5,number,#}' User_Submit_Link: 'http://topaz.sinaapp.com/nm/v2/user/rrepair.html?token={0}&name={1}&isp={2}&room={3}&block={4}&phone={5,number,#}'
User_Profile_Link: 'http://topaz.sinaapp.com/nm/v2/user/modi.html?token={0}&name={1}&isp={2}&username={3}&block={4}&room={5}&phone={6,number,#}' User_Profile_Link: 'http://topaz.sinaapp.com/nm/v2/user/modi.html?token={0}&name={1}&isp={2}&username={3}&block={4}&room={5}&phone={6,number,#}'
Result_Page: 'http://topaz.sinaapp.com/nm/v2/result.html' Result_Page: 'http://topaz.sinaapp.com/nm/v2/result.html'
Operator_Home_Page: 'http://topaz.sinaapp.com/nm/v2/man/home.html?token={0}' Operator_Home_Page: '<a href="http://topaz.sinaapp.com/nm/v2/man/home.html?token={0}">CLICK HERE</a>'
Operator_Login_Page: 'http://topaz.sinaapp.com/nm/v2/man/login.html?pkey={0}' Operator_Login_Page: 'http://topaz.sinaapp.com/nm/v2/man/login.html?pkey={0}'
#Localized #Localized

View File

@@ -19,9 +19,9 @@
"key": "CANCEL" "key": "CANCEL"
}, },
{ {
"type": "view", "type": "click",
"name": "修改资料", "name": "修改资料",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb7a8b799e494b053&redirect_uri=http%3a%2f%2fwcs.sola.love%2foauth2%2fcallback&response_type=code&scope=snsapi_base&state=PROFILE#wechat_redirect" "key": "PROFILE"
} }
] ]
}, },
@@ -34,9 +34,9 @@
"key": "OPERATOR_INFO" "key": "OPERATOR_INFO"
}, },
{ {
"type": "view", "type": "click",
"name": "后台登录", "name": "后台登录",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb7a8b799e494b053&redirect_uri=http%3a%2f%2fwcs.sola.love%2foauth2%2fcallback&response_type=code&scope=snsapi_base&state=LOGIN#wechat_redirect" "key": "LOGIN"
} }
] ]
} }

View File

@@ -19,9 +19,9 @@
"key": "CANCEL" "key": "CANCEL"
}, },
{ {
"type": "view", "type": "click",
"name": "修改资料", "name": "修改资料",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb7a8b799e494b053&redirect_uri=http%3a%2f%2fwcs.sola.love%2foauth2%2fcallback&response_type=code&scope=snsapi_base&state=PROFILE#wechat_redirect" "key": "PROFILE"
} }
] ]
} }

View File

@@ -1,48 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context swallowOutput="false" antiResourceLocking="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Resource auth="Container"
description="C3P0 database connection pool"
driverClass="com.mysql.jdbc.Driver"
maxPoolSize="10"
minPoolSize="2"
acquireIncrement="1"
maxIdleTime="3600"
idleConnectionTestPeriod="1800"
name="jdbc/netsupport"
user="root"
password=""
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
jdbcUrl="jdbc:mysql://localhost:3306/netsupport?autoReconnect=true&amp;characterEncoding=utf8" />
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
</Context>

View File

@@ -1,23 +1,34 @@
package love.sola.netsupport.api; package love.sola.netsupport.api;
import com.google.common.reflect.ClassPath;
import org.junit.Test; import org.junit.Test;
import org.reflections.Reflections;
import java.io.IOException;
import java.util.Set; import java.util.Set;
/** /**
* *********************************************** * ***********************************************
* Created by Sola on 2016/3/26. * Created by Sola on 2014/8/20.
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class ReflectionTest { public class ReflectionTest {
@Test @Test
public void test() { public void test() throws IOException, IllegalAccessException, InstantiationException {
Reflections reflections = new Reflections(getClass().getPackage().getName()); int count = 0;
Set<Class<? extends API>> set = reflections.getSubTypesOf(API.class); ClassPath path = ClassPath.from(getClass().getClassLoader());
assert set.size() == 14; Set<ClassPath.ClassInfo> classes = path.getTopLevelClassesRecursive(getClass().getPackage().getName());
for (ClassPath.ClassInfo info : classes) {
Class<?> clz = info.load();
if (!API.class.equals(clz) && API.class.isAssignableFrom(clz)) {
System.out.println("Loading API: " + clz.getName());
API obj = (API) clz.newInstance();
System.out.println("Registered API: " + obj);
count++;
}
}
System.out.println("Total " + count + " API(s) loaded.");
} }
} }

View File

@@ -1,34 +0,0 @@
package love.sola.netsupport.util;
import com.google.common.net.UrlEscapers;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* ***********************************************
* Created by Sola on 2016/3/26.
* Don't modify this source without my agreement
* ***********************************************
*/
public class URLEncodeTest {
@Test
public void testEncode() throws UnsupportedEncodingException {
assertThat(
UrlEscapers.urlFragmentEscaper().escape("Test Title"),
equalTo("Test%20Title")
);
assertThat(
Redirect.success()
.title("Test Title")
.msg("Test Message")
.toString(),
equalTo("http://topaz.sinaapp.com/nm/v2/result.html?type=1&title=Test%20Title&msg=Test%20Message&")
);
}
}

View File

@@ -1,18 +1,20 @@
package love.sola.netsupport.config; package love.sola.netsupport.wechat;
import org.junit.Test; import org.junit.Test;
import java.util.Date;
/** /**
* *********************************************** * ***********************************************
* Created by Sola on 2016/3/26. * Created by Sola on 2015/12/3.
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class ReflectionTest { public class TestDate {
@Test @Test
public void testLang() { public void test() {
assert Lang.messages != null; System.out.println(new Date());
} }
} }

View File

@@ -1,5 +1,6 @@
package love.sola.netsupport.util; package love.sola.netsupport.wechat;
import love.sola.netsupport.util.RSAUtil;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.junit.Test; import org.junit.Test;
import org.mindrot.jbcrypt.BCrypt; import org.mindrot.jbcrypt.BCrypt;
@@ -15,7 +16,7 @@ import java.security.spec.X509EncodedKeySpec;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class EncryptTest { public class TestEncrypt {
@Test @Test
public void testBCrypt() { public void testBCrypt() {

View File

@@ -1,9 +1,11 @@
package love.sola.netsupport.util; package love.sola.netsupport.wechat;
import com.google.gson.*; import com.google.gson.*;
import love.sola.netsupport.config.Lang;
import love.sola.netsupport.enums.ISP; import love.sola.netsupport.enums.ISP;
import org.junit.Test; import org.junit.Test;
import java.text.MessageFormat;
import java.util.Date; import java.util.Date;
/** /**
@@ -12,7 +14,12 @@ import java.util.Date;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class GsonTest { public class TestMessageFormat {
@Test
public void testLang() {
assert Lang.messages != null;
}
@Test @Test
public void testJsonDate() { public void testJsonDate() {
@@ -28,4 +35,14 @@ public class GsonTest {
assert gson.toJson(ISP.TELECOM).equals("1"); assert gson.toJson(ISP.TELECOM).equals("1");
} }
@Test
public void testLong() {
assert "15838838438".equals(MessageFormat.format("{0,number,#}", 15838838438L));
}
@Test
public void testOpInfo() {
assert !Lang.format("Operator_Info", 1541, "Sola", 0, 0, 4).isEmpty();
}
} }

View File

@@ -1,5 +1,6 @@
package love.sola.netsupport.enums; package love.sola.netsupport.wechat;
import love.sola.netsupport.enums.Block;
import org.junit.Test; import org.junit.Test;
/** /**
@@ -8,21 +9,11 @@ import org.junit.Test;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class ReflectionTest { public class TestReflection {
@Test @Test
public void testBlock() { public void testBlock() {
assert Block.inverseMap != null; assert Block.inverseMap != null;
} }
@Test
public void testAccess() {
assert Access.inverseMap != null;
}
@Test
public void testStatus() {
assert Status.inverseMap != null;
}
} }

View File

@@ -0,0 +1,21 @@
package love.sola.netsupport.wechat;
import org.junit.Test;
/**
* ***********************************************
* Created by Sola on 2015/11/26.
* Don't modify this source without my agreement
* ***********************************************
*/
public class TestRegex {
public static final String STUDENT_ID_REGEX = "^(2012|2013|2014|2015)[0-9]{9}";
@Test
public void testStudentId() {
assert !"2011130201233".matches(STUDENT_ID_REGEX);
assert "2015130201233".matches(STUDENT_ID_REGEX);
}
}