提交 ba70570e 编写于 作者: O o2null

更新令牌过期,通过center进行刷新

上级 4a2e9773
package com.x.organization.assemble.authentication;
import org.apache.commons.lang3.BooleanUtils;
import com.x.base.core.project.Context;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.message.MessageConnector;
import com.x.organization.assemble.authentication.jaxrs.authentication.QueueLoginRecord;
import com.x.organization.assemble.authentication.schedule.CleanupBind;
......@@ -29,9 +32,12 @@ public class ThisApplication {
context.startQueue(queueLoginRecord);
context.schedule(CleanupBind.class, "0 */15 * * * ?");
context.schedule(CleanupOauthCode.class, "0 */15 * * * ?");
context.schedule(CleanupTokenThreshold.class, "50 50 6,12,18 * * ?");
context.scheduleLocal(UpdateTokenThresholds.class, 300, 15);
MessageConnector.start(context());
// 如果启用了安全注销需要启动定时任务进行刷新
if (BooleanUtils.isTrue(Config.person().getEnableSafeLogout())) {
context.schedule(CleanupTokenThreshold.class, "50 50 6,12,18 * * ?");
context.scheduleLocal(UpdateTokenThresholds.class, 45, 60 * 30);
}
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -2,6 +2,7 @@ package com.x.organization.assemble.authentication.jaxrs.authentication;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
......@@ -14,7 +15,9 @@ import javax.servlet.http.HttpServletResponse;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.annotation.CheckPersistType;
import com.x.base.core.project.config.CenterServer;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.http.HttpToken;
......@@ -33,9 +36,10 @@ class ActionSafeLogout extends BaseAction {
TokenThreshold tokenThreshold = new TokenThreshold(effectivePerson.getDistinguishedName(), new Date());
Config.resource_node_tokenThresholds().put(tokenThreshold.getPerson(), tokenThreshold.getThreshold());
// Config.resource_node_tokenThresholds().put(tokenThreshold.getPerson(),
// tokenThreshold.getThreshold());
update(tokenThreshold);
broadcast(tokenThreshold);
ActionResult<Wo> result = new ActionResult<>();
HttpToken httpToken = new HttpToken();
......@@ -70,6 +74,13 @@ class ActionSafeLogout extends BaseAction {
}
}
private void broadcast(TokenThreshold tokenThreshold) throws Exception {
for (Entry<String, CenterServer> entry : Config.nodes().centerServers().orderedEntry()) {
CipherConnectionAction.post(false, 4000, 8000,
Config.url_x_program_center_jaxrs(entry, "tokenthreshold", "update"), tokenThreshold);
}
}
public static class Wo extends AbstractWoAuthentication {
private static final long serialVersionUID = 4883354487268278719L;
......
......@@ -33,6 +33,7 @@ import com.x.program.center.jaxrs.pms.PmsAction;
import com.x.program.center.jaxrs.prompterrorlog.PromptErrorLogAction;
import com.x.program.center.jaxrs.qiyeweixin.QiyeweixinAction;
import com.x.program.center.jaxrs.schedule.ScheduleAction;
import com.x.program.center.jaxrs.tokenthreshold.TokenThresholdAction;
import com.x.program.center.jaxrs.unexpectederrorlog.UnexpectedErrorLogAction;
import com.x.program.center.jaxrs.validation.ValidationAction;
import com.x.program.center.jaxrs.warnlog.WarnLogAction;
......@@ -76,6 +77,7 @@ public class ActionApplication extends AbstractActionApplication {
classes.add(DesignerAction.class);
classes.add(MPWeixinAction.class);
classes.add(AppPackAction.class);
classes.add(TokenThresholdAction.class);
return classes;
}
}
package com.x.program.center.jaxrs;
import javax.servlet.annotation.WebFilter;
import com.x.base.core.project.jaxrs.CipherManagerJaxrsFilter;
@WebFilter(urlPatterns = "/jaxrs/tokenthreshold/*", asyncSupported = true)
public class TokenThresholdDispatchJaxrsFilter extends CipherManagerJaxrsFilter {
}
package com.x.program.center.jaxrs.dingding.encrypt;
import java.security.SecureRandom;
import java.util.Random;
/**
* Created by fancyLou on 2020-10-26.
* Copyright © 2020 O2. All rights reserved.
* Created by fancyLou on 2020-10-26. Copyright © 2020 O2. All rights reserved.
*/
public class Utils {
public Utils() {
}
public static String getRandomStr(int count) {
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
private static final Random random = new SecureRandom();
for(int i = 0; i < count; ++i) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
private Utils() {
// nothing
}
return sb.toString();
}
public static String getRandomStr(int count) {
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
public static byte[] int2Bytes(int count) {
byte[] byteArr = new byte[]{(byte)(count >> 24 & 255), (byte)(count >> 16 & 255), (byte)(count >> 8 & 255), (byte)(count & 255)};
return byteArr;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; ++i) {
sb.append(base.charAt(random.nextInt(base.length())));
}
public static int bytes2int(byte[] byteArr) {
int count = 0;
return sb.toString();
}
for(int i = 0; i < 4; ++i) {
count <<= 8;
count |= byteArr[i] & 255;
}
public static byte[] int2Bytes(int count) {
return new byte[] { (byte) (count >> 24 & 255), (byte) (count >> 16 & 255), (byte) (count >> 8 & 255),
(byte) (count & 255) };
}
return count;
}
public static int bytes2int(byte[] byteArr) {
int count = 0;
for (int i = 0; i < 4; ++i) {
count <<= 8;
count |= byteArr[i] & 255;
}
return count;
}
}
......@@ -168,25 +168,20 @@ abstract class BaseAction extends StandardJaxrsAction {
}
@SuppressWarnings("unchecked")
private List<Class<?>> listAssemble() throws Exception {
private synchronized List<Class<?>> listAssemble() throws Exception {
if (null == assembles) {
synchronized (BaseAction.class) {
if (null == assembles) {
try (ScanResult scanResult = new ClassGraph()
.addClassLoader(ClassLoaderTools.urlClassLoader(true, false, false, false, false))
.enableAnnotationInfo().scan()) {
assembles = new CopyOnWriteArrayList<Class<?>>();
List<ClassInfo> list = new ArrayList<>();
list.addAll(scanResult.getClassesWithAnnotation(Module.class.getName()));
list = list.stream().sorted(Comparator.comparing(ClassInfo::getName))
.collect(Collectors.toList());
for (ClassInfo info : list) {
Class<?> cls = Class.forName(info.getName());
Module module = cls.getAnnotation(Module.class);
if (Objects.equal(module.type(), ModuleType.ASSEMBLE)) {
assembles.add(cls);
}
}
try (ScanResult scanResult = new ClassGraph()
.addClassLoader(ClassLoaderTools.urlClassLoader(true, false, false, false, false))
.enableAnnotationInfo().scan()) {
assembles = new CopyOnWriteArrayList<Class<?>>();
List<ClassInfo> list = new ArrayList<>();
list.addAll(scanResult.getClassesWithAnnotation(Module.class.getName()));
list = list.stream().sorted(Comparator.comparing(ClassInfo::getName)).collect(Collectors.toList());
for (ClassInfo info : list) {
Class<?> cls = Class.forName(info.getName());
Module module = cls.getAnnotation(Module.class);
if (Objects.equal(module.type(), ModuleType.ASSEMBLE)) {
assembles.add(cls);
}
}
}
......
......@@ -4,7 +4,6 @@ import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
......@@ -129,32 +128,35 @@ class ActionInstallOrUpdate extends BaseAction {
FileTools.forceMkdir(dist);
JarTools.unjar(zipFile, new ArrayList<>(), dist, true);
// 过滤必要的文件
File[] files = dist.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return true;
}
});
for (File file : files) {
if (!file.isDirectory()) {
if (file.getName().toLowerCase().endsWith(".xapp")) {
String json = FileUtils.readFileToString(file, DefaultCharset.charset);
Gson gson = new Gson();
JsonElement jsonElement = gson.fromJson(json, JsonElement.class);
WrapModule module = this.convertToWrapIn(jsonElement, WrapModule.class);
this.installModule(module);
installData.setWrapModule(module);
} else if (file.getName().toLowerCase().endsWith(".app.zip")) {
logger.print("开始安装自定义应用:{}", file.getName());
this.installCustomApp(file.getName(), FileUtils.readFileToByteArray(file));
installData.setCustomApp(file.getName());
logger.print("完成自定义应用安装:{}", file.getName());
} else if (file.getName().toLowerCase().endsWith(".zip")) {
logger.print("开始安装静态资源");
try {
Business.dispatch(false, file.getName(), "", FileUtils.readFileToByteArray(file));
installData.setStaticResource(file.getName());
} catch (Exception e) {
logger.print("模块安装成功但静态资源安装失败:{}", e.getMessage());
// File[] files = dist.listFiles(new FileFilter() {
// public boolean accept(File pathname) {
// return true;
// }
// });
File[] files = dist.listFiles(path -> true);
if (null != files) {
for (File file : files) {
if (!file.isDirectory()) {
if (file.getName().toLowerCase().endsWith(".xapp")) {
String json = FileUtils.readFileToString(file, DefaultCharset.charset);
Gson gson = new Gson();
JsonElement jsonElement = gson.fromJson(json, JsonElement.class);
WrapModule module = this.convertToWrapIn(jsonElement, WrapModule.class);
this.installModule(module);
installData.setWrapModule(module);
} else if (file.getName().toLowerCase().endsWith(".app.zip")) {
logger.print("开始安装自定义应用:{}", file.getName());
this.installCustomApp(file.getName(), FileUtils.readFileToByteArray(file));
installData.setCustomApp(file.getName());
logger.print("完成自定义应用安装:{}", file.getName());
} else if (file.getName().toLowerCase().endsWith(".zip")) {
logger.print("开始安装静态资源");
try {
Business.dispatch(false, file.getName(), "", FileUtils.readFileToByteArray(file));
installData.setStaticResource(file.getName());
} catch (Exception e) {
logger.print("模块安装成功但静态资源安装失败:{}", e.getMessage());
}
}
}
}
......
......@@ -3,10 +3,6 @@ package com.x.program.center.jaxrs.module;
import java.util.ArrayList;
import java.util.List;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
......@@ -18,8 +14,10 @@ import com.x.base.core.project.x_query_assemble_designer;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.cache.Cache.CacheCategory;
import com.x.base.core.project.cache.Cache.CacheKey;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.connection.ActionResponse;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.connection.ConnectionAction;
import com.x.base.core.project.gson.GsonPropertyObject;
import com.x.base.core.project.http.ActionResult;
......@@ -29,30 +27,17 @@ import com.x.base.core.project.tools.StringTools;
import com.x.cms.core.entity.element.wrap.WrapCms;
import com.x.portal.core.entity.wrap.WrapPortal;
import com.x.processplatform.core.entity.element.wrap.WrapProcessPlatform;
import com.x.program.center.Business;
import com.x.program.center.ThisApplication;
import com.x.program.center.WrapModule;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.x.query.core.entity.wrap.WrapQuery;
class ActionCompare extends BaseAction {
ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
Business business = new Business(emc);
ActionResult<Wo> result = new ActionResult<>();
Wo wo = new Wo();
// if (BooleanUtils.isNotTrue(Config.collect().getEnable())) {
// throw new ExceptionDisable();
// }
// if (!business.collectAccountNotEmpty()) {
// throw new ExceptionCollectAccountEmpty();
// }
// if (BooleanUtils.isNotTrue(business.connectCollect())) {
// throw new ExceptionConnectError();
// }
// if (BooleanUtils.isNotTrue(business.validateCollect())) {
// throw new ExceptionValidateError();
// }
Req req = new Req();
req.setName(Config.collect().getName());
req.setPassword(Config.collect().getPassword());
......
......@@ -3,25 +3,23 @@ package com.x.program.center.jaxrs.module;
import java.util.ArrayList;
import java.util.List;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.annotation.CheckPersistType;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.annotation.CheckPersistType;
import com.x.base.core.project.Applications;
import com.x.base.core.project.x_cms_assemble_control;
import com.x.base.core.project.x_portal_assemble_designer;
import com.x.base.core.project.x_processplatform_assemble_designer;
import com.x.base.core.project.x_query_assemble_designer;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.ActionResponse;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.gson.GsonPropertyObject;
import com.x.base.core.project.gson.XGsonBuilder;
import com.x.base.core.project.http.ActionResult;
......@@ -34,6 +32,8 @@ import com.x.portal.core.entity.wrap.WrapPortal;
import com.x.processplatform.core.entity.element.wrap.WrapProcessPlatform;
import com.x.program.center.ThisApplication;
import com.x.program.center.WrapModule;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.x.query.core.entity.wrap.WrapQuery;
class ActionCompareUpload extends BaseAction {
......
package com.x.program.center.jaxrs.module;
import java.io.File;
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
......@@ -7,10 +12,6 @@ import com.x.base.core.project.jaxrs.WrapStringList;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.program.center.Business;
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import java.io.File;
class ActionDispatchResource extends BaseAction {
......
......@@ -3,8 +3,6 @@ package com.x.program.center.jaxrs.module;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.BooleanUtils;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
......@@ -15,31 +13,17 @@ import com.x.base.core.project.connection.ConnectionAction;
import com.x.base.core.project.gson.GsonPropertyObject;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.program.center.Business;
import com.x.program.center.WrapModule;
class ActionList extends BaseAction {
ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
Business business = new Business(emc);
Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
if (null == wi) {
wi = new Wi();
}
ActionResult<List<Wo>> result = new ActionResult<>();
// if (BooleanUtils.isNotTrue(Config.collect().getEnable())) {
// throw new ExceptionDisable();
// }
// if (!business.collectAccountNotEmpty()) {
// throw new ExceptionCollectAccountEmpty();
// }
// if (BooleanUtils.isNotTrue(business.connectCollect())) {
// throw new ExceptionConnectError();
// }
// if (BooleanUtils.isNotTrue(business.validateCollect())) {
// throw new ExceptionValidateError();
// }
Req req = new Req();
req.setName(Config.collect().getName());
req.setPassword(Config.collect().getPassword());
......
......@@ -2,8 +2,6 @@ package com.x.program.center.jaxrs.module;
import java.util.List;
import org.apache.commons.lang3.BooleanUtils;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.project.annotation.FieldDescribe;
......@@ -13,26 +11,12 @@ import com.x.base.core.project.connection.ConnectionAction;
import com.x.base.core.project.gson.GsonPropertyObject;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.program.center.Business;
class ActionListCategory extends BaseAction {
ActionResult<List<Wo>> execute(EffectivePerson effectivePerson) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
Business business = new Business(emc);
ActionResult<List<Wo>> result = new ActionResult<>();
// if (BooleanUtils.isNotTrue(Config.collect().getEnable())) {
// throw new ExceptionDisable();
// }
// if (!business.collectAccountNotEmpty()) {
// throw new ExceptionCollectAccountEmpty();
// }
// if (BooleanUtils.isNotTrue(business.connectCollect())) {
// throw new ExceptionConnectError();
// }
// if (BooleanUtils.isNotTrue(business.validateCollect())) {
// throw new ExceptionValidateError();
// }
Req req = new Req();
req.setName(Config.collect().getName());
req.setPassword(Config.collect().getPassword());
......
......@@ -15,7 +15,6 @@ import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.Structure_;
public class ActionListStructure extends BaseAction {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
......@@ -18,14 +11,19 @@ import com.x.base.core.project.x_portal_assemble_designer;
import com.x.base.core.project.x_processplatform_assemble_designer;
import com.x.base.core.project.x_query_assemble_designer;
import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.cache.Cache.CacheCategory;
import com.x.base.core.project.cache.Cache.CacheKey;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.cache.Cache.CacheCategory;
import com.x.base.core.project.cache.Cache.CacheKey;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.base.core.project.tools.ListTools;
import com.x.cms.core.entity.element.wrap.WrapCms;
import com.x.portal.core.entity.wrap.WrapPortal;
......@@ -33,6 +31,7 @@ import com.x.processplatform.core.entity.element.wrap.WrapProcessPlatform;
import com.x.program.center.ThisApplication;
import com.x.program.center.WrapModule;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.x.query.core.entity.wrap.WrapQuery;
......
package com.x.program.center.jaxrs.module;
import java.io.ByteArrayOutputStream;
import java.util.Optional;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.project.cache.Cache.CacheCategory;
......@@ -14,12 +17,8 @@ import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.program.center.ThisApplication;
import com.x.program.center.WrapModule;
import com.x.program.center.core.entity.Structure;
import java.io.ByteArrayOutputStream;
import java.util.Optional;
public class ActionOutputFile extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionOutputFile.class);
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.*;
import com.x.base.core.project.Applications;
import com.x.base.core.project.x_cms_assemble_control;
import com.x.base.core.project.x_portal_assemble_designer;
import com.x.base.core.project.x_processplatform_assemble_designer;
import com.x.base.core.project.x_query_assemble_designer;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.http.ActionResult;
......
......@@ -4,13 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.gson.XGsonBuilder;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import org.apache.commons.lang3.StringUtils;
import com.google.gson.JsonElement;
......@@ -25,18 +18,25 @@ import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.cache.Cache.CacheCategory;
import com.x.base.core.project.cache.Cache.CacheKey;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMapping;
import com.x.base.core.project.connection.CipherConnectionAction;
import com.x.base.core.project.gson.GsonPropertyObject;
import com.x.base.core.project.gson.XGsonBuilder;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WoId;
import com.x.base.core.project.jaxrs.WrapPair;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.cms.core.entity.element.wrap.WrapCms;
import com.x.portal.core.entity.wrap.WrapPortal;
import com.x.processplatform.core.entity.element.wrap.WrapProcessPlatform;
import com.x.program.center.ThisApplication;
import com.x.program.center.WrapModule;
import com.x.program.center.core.entity.Structure;
import com.x.program.center.core.entity.wrap.WrapServiceModule;
import com.x.query.core.entity.wrap.WrapQuery;
public class ActionWrite extends BaseAction {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionAllocateStorageMaaping extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionCollectAccountEmpty extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionConnectError extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionDisable extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionFlagNotExist extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionStorageNotExist extends LanguagePromptException {
......
package com.x.program.center.jaxrs.module;
import com.x.base.core.project.exception.LanguagePromptException;
import com.x.base.core.project.exception.PromptException;
class ExceptionValidateError extends LanguagePromptException {
......
......@@ -3,7 +3,14 @@ package com.x.program.center.jaxrs.module;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
......
......@@ -14,6 +14,8 @@
package com.x.program.center.jaxrs.qiyeweixin;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Random;
......@@ -22,24 +24,28 @@ import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
/**
* 提供接收和推送给企业微信消息的加解密接口(UTF8编码的字符串).
* <ol>
* <li>第三方回复加密消息给企业微信</li>
* <li>第三方收到企业微信发送的消息,验证消息的安全性,并对消息进行解密。</li>
* <li>第三方回复加密消息给企业微信</li>
* <li>第三方收到企业微信发送的消息,验证消息的安全性,并对消息进行解密。</li>
* </ol>
* 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
* <ol>
* <li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
* http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
* <li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
* <li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
* <li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
* <li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
* http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
* <li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
* <li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
* <li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
* </ol>
*/
public class WXBizMsgCrypt {
static Charset CHARSET = Charset.forName("utf-8");
private static final Random random = new SecureRandom();
static final Charset CHARSET = StandardCharsets.UTF_8;
Base64 base64 = new Base64();
byte[] aesKey;
String token;
......@@ -47,9 +53,10 @@ public class WXBizMsgCrypt {
/**
* 构造函数
* @param token 企业微信后台,开发者设置的token
*
* @param token 企业微信后台,开发者设置的token
* @param encodingAesKey 企业微信后台,开发者设置的EncodingAESKey
* @param receiveid, 不同场景含义不同,详见文档
* @param receiveid, 不同场景含义不同,详见文档
*
* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
*/
......@@ -86,11 +93,9 @@ public class WXBizMsgCrypt {
// 随机生成16位字符串
String getRandomStr() {
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 16; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
sb.append(base.charAt(random.nextInt(base.length())));
}
return sb.toString();
}
......@@ -179,8 +184,7 @@ public class WXBizMsgCrypt {
int xmlLength = recoverNetworkBytesOrder(networkOrder);
xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
from_receiveid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
CHARSET);
from_receiveid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET);
} catch (Exception e) {
e.printStackTrace();
throw new AesException(AesException.IllegalBuffer);
......@@ -197,14 +201,14 @@ public class WXBizMsgCrypt {
/**
* 将企业微信回复用户的消息加密打包.
* <ol>
* <li>对要发送的消息进行AES-CBC加密</li>
* <li>生成安全签名</li>
* <li>将消息密文和安全签名打包成xml格式</li>
* <li>对要发送的消息进行AES-CBC加密</li>
* <li>生成安全签名</li>
* <li>将消息密文和安全签名打包成xml格式</li>
* </ol>
*
* @param replyMsg 企业微信待回复用户的消息,xml格式的字符串
* @param replyMsg 企业微信待回复用户的消息,xml格式的字符串
* @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp
* @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
* @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
*
* @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
......@@ -214,7 +218,7 @@ public class WXBizMsgCrypt {
String encrypt = encrypt(getRandomStr(), replyMsg);
// 生成安全签名
if (timeStamp == "") {
if (StringUtils.isEmpty(timeStamp)) {
timeStamp = Long.toString(System.currentTimeMillis());
}
......@@ -229,21 +233,20 @@ public class WXBizMsgCrypt {
/**
* 检验消息的真实性,并且获取解密后的明文.
* <ol>
* <li>利用收到的密文生成安全签名,进行签名验证</li>
* <li>若验证通过,则提取xml中的加密消息</li>
* <li>对消息进行解密</li>
* <li>利用收到的密文生成安全签名,进行签名验证</li>
* <li>若验证通过,则提取xml中的加密消息</li>
* <li>对消息进行解密</li>
* </ol>
*
* @param msgSignature 签名串,对应URL参数的msg_signature
* @param timeStamp 时间戳,对应URL参数的timestamp
* @param nonce 随机串,对应URL参数的nonce
* @param postData 密文,对应POST请求的数据
* @param timeStamp 时间戳,对应URL参数的timestamp
* @param nonce 随机串,对应URL参数的nonce
* @param postData 密文,对应POST请求的数据
*
* @return 解密后的原文
* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
*/
public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
throws AesException {
public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData) throws AesException {
// 密钥,公众账号的app secret
// 提取密文
......@@ -266,16 +269,16 @@ public class WXBizMsgCrypt {
/**
* 验证URL
*
* @param msgSignature 签名串,对应URL参数的msg_signature
* @param timeStamp 时间戳,对应URL参数的timestamp
* @param nonce 随机串,对应URL参数的nonce
* @param echoStr 随机串,对应URL参数的echostr
* @param timeStamp 时间戳,对应URL参数的timestamp
* @param nonce 随机串,对应URL参数的nonce
* @param echoStr 随机串,对应URL参数的echostr
*
* @return 解密之后的echostr
* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
*/
public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr)
throws AesException {
public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr) throws AesException {
String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
if (!signature.equals(msgSignature)) {
......
package com.x.program.center.jaxrs.tokenthreshold;
import com.google.gson.JsonElement;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WrapBoolean;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.organization.core.entity.log.TokenThreshold;
class ActionUpdate extends BaseAction {
private static final Logger logger = LoggerFactory.getLogger(ActionUpdate.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
ActionResult<Wo> result = new ActionResult<>();
Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
Config.resource_node_tokenThresholds().put(wi.getPerson(), wi.getThreshold());
Wo wo = new Wo();
wo.setValue(true);
result.setData(wo);
return result;
}
public static class Wi extends TokenThreshold {
private static final long serialVersionUID = -6020110344581428321L;
static WrapCopier<Wi, TokenThreshold> copier = WrapCopierFactory.wi(Wi.class, TokenThreshold.class, null,
ListTools.toList(TokenThreshold.person_FIELDNAME, TokenThreshold.threshold_FIELDNAME));
}
public static class Wo extends WrapBoolean {
private static final long serialVersionUID = -338678364674176846L;
}
}
package com.x.program.center.jaxrs.tokenthreshold;
import com.x.base.core.project.jaxrs.StandardJaxrsAction;
abstract class BaseAction extends StandardJaxrsAction {
}
\ No newline at end of file
package com.x.program.center.jaxrs.tokenthreshold;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import com.google.gson.JsonElement;
import com.x.base.core.project.annotation.JaxrsDescribe;
import com.x.base.core.project.annotation.JaxrsMethodDescribe;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.http.HttpMediaType;
import com.x.base.core.project.jaxrs.ResponseFactory;
import com.x.base.core.project.jaxrs.StandardJaxrsAction;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
@Path("tokenthreshold")
@JaxrsDescribe("令牌过期")
public class TokenThresholdAction extends StandardJaxrsAction {
private static Logger logger = LoggerFactory.getLogger(TokenThresholdAction.class);
@JaxrsMethodDescribe(value = "接收消息,更新node节点上的过期tokenThreshold消息.", action = ActionUpdate.class)
@POST
@Path("update")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void info(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@Context HttpServletResponse response, JsonElement jsonElement) {
ActionResult<ActionUpdate.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new ActionUpdate().execute(effectivePerson, jsonElement);
} catch (Exception e) {
logger.error(e, effectivePerson, request, jsonElement);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册