From 78df8db495c85eb36bbeaac81f069737c69e05b9 Mon Sep 17 00:00:00 2001 From: pioneer Date: Fri, 5 Aug 2022 16:03:14 +0800 Subject: [PATCH] open --- README.md | 6 + conf/bg.xml | 7 + lib/cas-client-core-3.2.1.jar | Bin 0 -> 87318 bytes lib/casclient.jar | Bin 0 -> 23806 bytes plugin.xml | 30 ++ .../Jsd9683PluginLifecycleMonitor.java | 60 +++ .../plugin/jsd9683/beans/DeleteUserBean.java | 25 ++ .../plugin/jsd9683/beans/ReportFileBean.java | 53 +++ .../conf/Jsd9683ConfigXmlConfigReader.java | 45 +++ .../jsd9683/controller/Jsd9683Controller.java | 229 +++++++++++ .../controller/Jsd9683ControllerProvider.java | 12 + .../fr/plugin/jsd9683/filter/CasFilter.java | 47 +++ .../plugin/jsd9683/filter/Jsd9683Filter.java | 373 ++++++++++++++++++ .../fr/plugin/jsd9683/filter/NoFilter.java | 26 ++ .../jsd9683/filter/RequestGlobalFilter.java | 60 +++ .../Jsd9683WebResourceComponent.java | 20 + .../Jsd9683WebResourceProvider.java | 17 + .../MyTemplateRequestChecker.java | 51 +++ .../com/fr/plugin/jsd9683/jscss/Jsd9683.js | 30 ++ .../fr/plugin/jsd9683/jscss/unavaliable.html | 81 ++++ 交付/conf/bg.xml | 7 + 21 files changed, 1179 insertions(+) create mode 100644 README.md create mode 100644 conf/bg.xml create mode 100644 lib/cas-client-core-3.2.1.jar create mode 100644 lib/casclient.jar create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/jsd9683/Jsd9683PluginLifecycleMonitor.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/beans/DeleteUserBean.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/beans/ReportFileBean.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/conf/Jsd9683ConfigXmlConfigReader.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683Controller.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683ControllerProvider.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/filter/CasFilter.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/filter/Jsd9683Filter.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/filter/NoFilter.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/filter/RequestGlobalFilter.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceComponent.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceProvider.java create mode 100644 src/main/java/com/fr/plugin/jsd9683/webResourceProvider/MyTemplateRequestChecker.java create mode 100644 src/main/resources/com/fr/plugin/jsd9683/jscss/Jsd9683.js create mode 100644 src/main/resources/com/fr/plugin/jsd9683/jscss/unavaliable.html create mode 100644 交付/conf/bg.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..4d5f92c --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# open-JSD-9412 + +JSD-9412 cas单点集成\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/conf/bg.xml b/conf/bg.xml new file mode 100644 index 0000000..8dbe357 --- /dev/null +++ b/conf/bg.xml @@ -0,0 +1,7 @@ + + http://xxx/login + http://xxxx/proxyValidate + x.x.x.x:8080 + http://xx/fine_report/report_access_validation + true + diff --git a/lib/cas-client-core-3.2.1.jar b/lib/cas-client-core-3.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c97b6b135ed5c74aa95d42bd9877780b586b0d07 GIT binary patch literal 87318 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 LT=6E*KZE%{%h!$C literal 0 HcmV?d00001 diff --git a/lib/casclient.jar b/lib/casclient.jar new file mode 100644 index 0000000000000000000000000000000000000000..02737cd6da2b779e3c3f171274a49a274b56285b GIT binary patch literal 23806 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 UZgEmk@eyAk#Ocf>2 + com.fr.plugin.jsd9683 + + yes + 1.0 + 10.0 + 2018-07-31 + fr.open + + + [2018-07-31]初始化插件。
+ ]]>
+ + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/main/java/com/fr/plugin/jsd9683/Jsd9683PluginLifecycleMonitor.java b/src/main/java/com/fr/plugin/jsd9683/Jsd9683PluginLifecycleMonitor.java new file mode 100644 index 0000000..29722b9 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/Jsd9683PluginLifecycleMonitor.java @@ -0,0 +1,60 @@ +package com.fr.plugin.jsd9683; + + +import com.fr.base.PropertiesUtils; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.jsd9683.conf.Jsd9683ConfigXmlConfigReader; + +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.stable.xml.XMLTools; +import com.fr.workspace.WorkContext; + +import java.io.*; + + +@EnableMetrics +@FunctionRecorder +public class Jsd9683PluginLifecycleMonitor extends AbstractPluginLifecycleMonitor { + @Override + @Focus(id = "com.fr.plugin.jsd9683", text = "jsd9683", source = Original.PLUGIN) + public void afterRun(PluginContext pluginContext) { + + // PreHandlerFactory.getInstance().registerRequestCheckers(new MyTemplateRequestChecker()); + + + + FineLoggerFactory.getLogger().info("插件启动:"); + //读取webroot下的配置文件 + String envPath = WorkContext.getCurrent().getPath(); + FineLoggerFactory.getLogger().info("envPath:"+envPath); + String webReport = (new File(envPath)).getParent(); + FineLoggerFactory.getLogger().info("webReport:"+webReport); + File envFile = new File(webReport+File.separator+"conf"+File.separator+"bg.xml"); + try { + XMLTools.readFileXML(Jsd9683ConfigXmlConfigReader.getInstance(), envFile); + } catch (Exception e) { + e.printStackTrace(); + } + + FineLoggerFactory.getLogger().info(pluginContext.getID()+" startup....."); + FineLoggerFactory.getLogger().info("插件启动"); + FineLoggerFactory.getLogger().info("jsd9683 plugin start .........................."); + + + // ddd(); + } + + + + + + @Override + public void beforeStop(PluginContext pluginContext) { + FineLoggerFactory.getLogger().info("插件停止"); + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/beans/DeleteUserBean.java b/src/main/java/com/fr/plugin/jsd9683/beans/DeleteUserBean.java new file mode 100644 index 0000000..d28df76 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/beans/DeleteUserBean.java @@ -0,0 +1,25 @@ +package com.fr.plugin.jsd9683.beans; + +public class DeleteUserBean { + private String orgCode; + private String userName; + + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getOrgCode() { + return orgCode; + } + + public String getUserName() { + return userName; + } + + +} diff --git a/src/main/java/com/fr/plugin/jsd9683/beans/ReportFileBean.java b/src/main/java/com/fr/plugin/jsd9683/beans/ReportFileBean.java new file mode 100644 index 0000000..d92eb96 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/beans/ReportFileBean.java @@ -0,0 +1,53 @@ +package com.fr.plugin.jsd9683.beans; + +import java.util.ArrayList; + +public class ReportFileBean { + + private String name; + private String path; + private String previewUrl; + private boolean isDir; + + private ArrayList children; + + public void setName(String name) { + this.name = name; + } + + public void setPath(String path) { + this.path = path; + } + + public void setChildren(ArrayList children) { + this.children = children; + } + + public String getName() { + return name; + } + + public String getPath() { + return path; + } + + public String getPreviewUrl() { + return previewUrl; + } + + public boolean isDir() { + return isDir; + } + + public void setDir(boolean dir) { + isDir = dir; + } + + public void setPreviewUrl(String previewUrl) { + this.previewUrl = previewUrl; + } + + public ArrayList getChildren() { + return children; + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/conf/Jsd9683ConfigXmlConfigReader.java b/src/main/java/com/fr/plugin/jsd9683/conf/Jsd9683ConfigXmlConfigReader.java new file mode 100644 index 0000000..6f1e358 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/conf/Jsd9683ConfigXmlConfigReader.java @@ -0,0 +1,45 @@ +package com.fr.plugin.jsd9683.conf; + +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLableReader; + +public class Jsd9683ConfigXmlConfigReader implements XMLReadable { + private static Jsd9683ConfigXmlConfigReader instance; + + public static Jsd9683ConfigXmlConfigReader getInstance(){ + if(instance == null){ + instance = new Jsd9683ConfigXmlConfigReader(); + } + return instance; + } + + public static String CAS_LOGIN_URL = ""; + public static String CAS_VALIDATE_URL = ""; + public static String CAS_SERVER_NAME = ""; + public static String ROLE_VALIDATE_URL = ""; + public static String isAuthority = "true"; + + public void readXML(XMLableReader reader) { + if (reader.isChildNode()) { + String nodeName = reader.getTagName(); + if ("casLoginUrl".equals(nodeName)) { + CAS_LOGIN_URL = StringUtils.trim(reader.getElementValue()); + } + if ("casValidateUrl".equals(nodeName)) { + CAS_VALIDATE_URL = StringUtils.trim(reader.getElementValue()); + } + if ("casClientServerName".equals(nodeName)) { + CAS_SERVER_NAME = StringUtils.trim(reader.getElementValue()); + } + if ("roleValidateUrl".equals(nodeName)) { + ROLE_VALIDATE_URL = StringUtils.trim(reader.getElementValue()); + } + if ("isAuthority".equals(nodeName)) { + isAuthority = StringUtils.trim(reader.getElementValue()); + + } + + } + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683Controller.java b/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683Controller.java new file mode 100644 index 0000000..f8752cc --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683Controller.java @@ -0,0 +1,229 @@ +package com.fr.plugin.jsd9683.controller; + + +import com.fr.decision.authority.data.User; +import com.fr.decision.webservice.CrossDomainResponse; +import com.fr.decision.webservice.Response; +import com.fr.decision.webservice.annotation.LoginStatusChecker; +import com.fr.decision.webservice.bean.user.UserUpdateBean; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.jsd9683.beans.DeleteUserBean; +import com.fr.plugin.jsd9683.beans.ReportFileBean; +import com.fr.stable.StringUtils; +import com.fr.third.springframework.stereotype.Controller; +import com.fr.third.springframework.web.bind.annotation.*; +import com.fr.web.JSONReportUtils; + +import com.fr.web.controller.decision.api.auth.LoginResource; +import com.fr.workspace.WorkContext; + +import org.apache.catalina.filters.CorsFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; + +@Controller +@LoginStatusChecker( + required = false +) +public class Jsd9683Controller { + + @RequestMapping( + value = {"/bg/deleteUserByOrgCodeAndName"}, + method = {RequestMethod.POST} + ) + @ResponseBody + public Response deleteUserByName(HttpServletRequest req, HttpServletResponse res, @RequestBody DeleteUserBean deleteUserBean ) throws Exception { + FineLoggerFactory.getLogger().info("delete user by post................"); + String X_Access_Token = req.getHeader("X-Access-Token"); + FineLoggerFactory.getLogger().info("X-Access-Token:"+X_Access_Token); + Response response = deleteUserByUserNameAndOrgCode(deleteUserBean.getUserName(),deleteUserBean.getOrgCode()); + return response; + } + + @RequestMapping( + value = {"/bg/deleteUserByOrgCodeAndName1"}, + method = {RequestMethod.GET} + ) + @ResponseBody + public Response deleteUserByNameByGet(HttpServletRequest req, HttpServletResponse res, @RequestParam("userName") String userName,@RequestParam("orgCode") String orgCode) throws Exception { + FineLoggerFactory.getLogger().info("delete user by get................"); + res.setHeader("Access-Control-Allow-Origin", "*"); + String X_Access_Token = req.getHeader("X-Access-Token"); + FineLoggerFactory.getLogger().info("X-Access-Token:"+X_Access_Token); + Response response = deleteUserByUserNameAndOrgCode(userName,orgCode); + // return CrossDomainResponse.create().callbackFuncName(callback).parameter("result", "ok").parameter("status", "success").createCrossDomainResponse(); + return response; + } + + @RequestMapping( + value = {"/bg/deleteUserByOrgCodeAndName2"}, + method = {RequestMethod.GET} + ) + @ResponseBody + public String deleteUserByNameByJSONP(HttpServletRequest req, HttpServletResponse res, @RequestParam("userName") String userName,@RequestParam("orgCode") String orgCode,@RequestParam(value = "callback",required = false,defaultValue = "callback") String callback) throws Exception { + FineLoggerFactory.getLogger().info("delete user by jsonp................"); + String X_Access_Token = req.getHeader("X-Access-Token"); + //获取不到,JSONP不支持在header中加入自定义属性 + FineLoggerFactory.getLogger().info("X-Access-Token:"+X_Access_Token); + FineLoggerFactory.getLogger().info("==== deleteUserByName userName:"+userName); + FineLoggerFactory.getLogger().info("==== deleteUserByName orgCode:"+orgCode); + String fineUserName = orgCode + "_" +userName; + User user = UserService.getInstance().getUserByUserName(fineUserName); + if(user == null){ + return (new CrossDomainResponse()).callbackFuncName(callback).parameter("status", "fail").parameter("errorCode", "0001").parameter("errorMsg", "user is not exist").createCrossDomainResponse(); + } + UserUpdateBean deleteBean = new UserUpdateBean(); + String[] removeIds = new String[1]; + removeIds[0] = user.getId(); + deleteBean.setRemoveUserIds(removeIds);//删除登录用户 + UserService.getInstance().deleteUsers(deleteBean); + return CrossDomainResponse.create().callbackFuncName(callback).parameter("message", "ok").parameter("status", "success").createCrossDomainResponse(); + } + + private Response deleteUserByUserNameAndOrgCode(String userName,String orgCode) throws Exception { + FineLoggerFactory.getLogger().info("==== deleteUserByName userName:"+userName); + FineLoggerFactory.getLogger().info("==== deleteUserByName orgCode:"+orgCode); + String fineUserName = orgCode + "_" +userName; + User user = UserService.getInstance().getUserByUserName(fineUserName); + if(user == null){ + return Response.error("0001","user is not exist"); + // return (new CrossDomainResponse()).callbackFuncName(callback).parameter("status", "fail").parameter("errorCode", "0001").parameter("errorMsg", "user is not exist").createCrossDomainResponse(); + } + UserUpdateBean deleteBean = new UserUpdateBean(); + String[] removeIds = new String[1]; + removeIds[0] = user.getId(); + deleteBean.setRemoveUserIds(removeIds);//删除登录用户 + UserService.getInstance().deleteUsers(deleteBean); + return Response.ok("ok"); + } + + //@RequestParam(value = "callback",required = false,defaultValue = "callback") String callback + @RequestMapping( + value = {"/bg/getReportDirList"}, + method = {RequestMethod.GET} + ) + @ResponseBody + public Response getReportDirList(HttpServletRequest req, HttpServletResponse res, @RequestParam("name") String name) throws Exception { + + String envPath = WorkContext.getCurrent().getPath(); + FineLoggerFactory.getLogger().info("envPath:" + envPath); + String webReport = (new File(envPath)).getParent(); + FineLoggerFactory.getLogger().info("webReport:" + webReport); + String basePath = webReport + File.separator + "WEB-INF" + File.separator + "reportlets" + File.separator; + File reportDir = new File(basePath); + ArrayList allFiles = new ArrayList<>(); + ArrayList allReportFile = new ArrayList<>(); + if (reportDir.exists()) { + try { + iterateDir(reportDir, allReportFile, basePath, name); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + ReportFileBean root = new ReportFileBean(); + root.setDir(true); + root.setPreviewUrl(""); + root.setChildren(new ArrayList<>()); + root.setPath(""); + root.setName("root"); + + if (allReportFile.size() > 0) { + for (ReportFileBean node : allReportFile) { + String path = node.getPath(); + FineLoggerFactory.getLogger().info("==== path:" + path); + if (path.indexOf(File.separator) == -1 ) { //根目录的文件 + root.getChildren().add(node); + } else { + String[] pathStrings = path.split("\\"+File.separator); + ReportFileBean childNode = new ReportFileBean(); + ReportFileBean parent = null; + String currentPath = ""; + for (int i = 0; i < pathStrings.length; i++) { + String fileName = pathStrings[i]; + currentPath+= (File.separator+fileName); + + if (fileName.indexOf(".cpt") != -1 || fileName.indexOf(".frm") != -1) { + parent = getChildNode(parent.getChildren(), fileName); + parent.setDir(false); + parent.setPath(path); + parent.setPreviewUrl(node.getPreviewUrl()); + } else { + if (i == 0) { + parent = getChildNode(root.getChildren(), fileName); + parent.setDir(true); + parent.setPath(currentPath); + parent.setPreviewUrl(""); + } else { + parent = getChildNode(parent.getChildren(), fileName); + parent.setDir(true); + parent.setPath(currentPath); + parent.setPreviewUrl(""); + } + } + } + + } + + } + } + + //String result = JSONReportUtils.objToJSONString(root); + // FineLoggerFactory.getLogger().info("==== result:" + result); + // return CrossDomainResponse.create().callbackFuncName(callback).parameter("result",result).createCrossDomainResponse(); + return Response.ok(root); + } + + private ReportFileBean getChildNode(ArrayList clildren,String name){ + for(ReportFileBean node : clildren){ + if(node.getName().equals(name)){ + return node; + } + } + + ReportFileBean child = new ReportFileBean(); + clildren.add(child); + child.setName(name); + child.setChildren(new ArrayList<>()); + + return child; + } + + private void iterateDir(File parent,ArrayList allReportFile,String basePath,String paramName) throws UnsupportedEncodingException { + File[] childrens = parent.listFiles(); + if(childrens != null && childrens.length > 0){ + for(File f:childrens){ + String reportName = f.getName(); + ReportFileBean bean = new ReportFileBean(); + bean.setChildren(new ArrayList<>()); + boolean isAdd = true; + if(StringUtils.isNotEmpty(paramName)){ + if(reportName.indexOf(paramName) == -1){ + isAdd = false; + } + } + + if(isAdd){ + + bean.setName(reportName); + String abPath = f.getAbsolutePath(); + String rePath = abPath.replace(basePath,""); + bean.setPath(rePath); + bean.setDir(f.isDirectory()); + if(bean.isDir() == false){ + allReportFile.add(bean); + bean.setPreviewUrl("webroot/decision//view/report?viewlet="+ java.net.URLEncoder.encode(rePath, "UTF-8")); + } + + } + iterateDir(f,allReportFile,basePath,paramName); + } + } + + } + +} diff --git a/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683ControllerProvider.java b/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683ControllerProvider.java new file mode 100644 index 0000000..6ca39fb --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/controller/Jsd9683ControllerProvider.java @@ -0,0 +1,12 @@ +package com.fr.plugin.jsd9683.controller; + +import com.fr.decision.fun.impl.AbstractControllerRegisterProvider; + +public class Jsd9683ControllerProvider extends AbstractControllerRegisterProvider { + @Override + public Class[] getControllers() { + return new Class[]{ + Jsd9683Controller.class + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/jsd9683/filter/CasFilter.java b/src/main/java/com/fr/plugin/jsd9683/filter/CasFilter.java new file mode 100644 index 0000000..487f0b6 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/filter/CasFilter.java @@ -0,0 +1,47 @@ +package com.fr.plugin.jsd9683.filter; + +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.jsd9683.conf.Jsd9683ConfigXmlConfigReader; +import edu.yale.its.tp.cas.client.filter.CASFilter; + +import java.util.HashMap; +import java.util.Map; + +public class CasFilter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "casFilter11"; + } + + @Override + public String[] urlPatterns() { + return new String[]{ + "/decision/view/*", + }; + } + + + public String externalFilterClassName() { + + FineLoggerFactory.getLogger().info("isAuthority:"+Jsd9683ConfigXmlConfigReader.isAuthority); + if(Jsd9683ConfigXmlConfigReader.isAuthority.equals("true")){ + FineLoggerFactory.getLogger().info("registe com.fr.plugin.jsd9683.servletfilter.CasServeltFilter................."); + return "edu.yale.its.tp.cas.client.filter.CASFilter"; + } + else{ + FineLoggerFactory.getLogger().info("registe com.fr.plugin.jsd9683.filter.NoFilter................."); + return "com.fr.plugin.jsd9683.filter.NoFilter"; + } + // return "com.fr.plugin.jsd9683.servletfilter.CasServeltFilter"; + } + + public Map initializationParameters() { + HashMap paramMap = new HashMap<>(); + paramMap.put("edu.yale.its.tp.cas.client.filter.validateUrl", Jsd9683ConfigXmlConfigReader.CAS_VALIDATE_URL); + paramMap.put("edu.yale.its.tp.cas.client.filter.loginUrl",Jsd9683ConfigXmlConfigReader.CAS_LOGIN_URL); + paramMap.put("edu.yale.its.tp.cas.client.filter.serverName",Jsd9683ConfigXmlConfigReader.CAS_SERVER_NAME); + FineLoggerFactory.getLogger().info("init casFilter参数................."); + return paramMap; + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/filter/Jsd9683Filter.java b/src/main/java/com/fr/plugin/jsd9683/filter/Jsd9683Filter.java new file mode 100644 index 0000000..02b8e80 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/filter/Jsd9683Filter.java @@ -0,0 +1,373 @@ +package com.fr.plugin.jsd9683.filter; + +import com.fr.data.NetworkHelper; +import com.fr.decision.authority.data.User; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.mobile.terminal.TerminalHandler; +import com.fr.decision.webservice.bean.user.UserBean; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.utils.WebServiceUtils; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.general.ComparatorUtils; +import com.fr.json.JSONObject; +import com.fr.json.JSONParser; +import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.jsd9683.conf.Jsd9683ConfigXmlConfigReader; +import com.fr.security.JwtUtils; +import com.fr.security.encryption.transmission.impl.AESTransmissionEncryption; +import com.fr.stable.StringUtils; +import com.fr.stable.web.Device; +import com.fr.stable.web.SessionProvider; +import com.fr.third.alibaba.druid.support.json.JSONUtils; +import com.fr.util.TemplateParser; +import com.fr.web.core.SessionPoolManager; +import com.fr.web.core.WidgetSessionIDInfor; + +import javax.net.ssl.HttpsURLConnection; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; + +import java.security.cert.CertificateException; +import java.util.Map; + +import javax.net.ssl.*; + +import com.fr.web.utils.WebUtils; +import org.jasig.cas.client.validation.Assertion; + +public class Jsd9683Filter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "Jsd9683Filter"; + } + + @Override + public String[] urlPatterns() { + return new String[]{ + "/decision/view/report/*", + }; + } + + + @Override + public void doFilter(HttpServletRequest request, HttpServletResponse res, FilterChain filterChain) { + String uri = request.getRequestURI(); + String reqUrl = request.getRequestURL().toString(); + String ticket = WebUtils.getHTTPRequestParameter(request, "ticket"); + FineLoggerFactory.getLogger().info("Jsd9683Filter ===============================req coming:" + uri); + FineLoggerFactory.getLogger().info("===============================req coming:" + reqUrl); + FineLoggerFactory.getLogger().info("===============================[ticket]:" + ticket); + if (StringUtils.isNotEmpty(ticket)) { + FineLoggerFactory.getLogger().info("===============================只有ticket有值才处理" ); + String queryString = request.getQueryString(); + String http = "http"; + if (reqUrl.indexOf("https") != -1) { + http = "https"; + } + reqUrl = reqUrl.replace(uri, ""); + if (reqUrl.indexOf(":") == -1) { + reqUrl = reqUrl + ":" + request.getLocalPort() + uri + "?" + queryString; + } else { + reqUrl = reqUrl + uri + "?" + queryString; + } + + // if(reqUrl.indexOf("?ticket") != -1){ + // reqUrl = reqUrl.replace("?ticket","&ticket"); + // } + + String proxyValidate = Jsd9683ConfigXmlConfigReader.CAS_VALIDATE_URL + "?service=" + reqUrl; + FineLoggerFactory.getLogger().info("================ sendRedirect url:" + proxyValidate); + + String result = doHttpReq(proxyValidate, "GET"); + FineLoggerFactory.getLogger().info("sendRedirect url result is :" + result); + if (result.indexOf("authenticationSuccess") != -1) { + String beginTag = ""; + String endTag = ""; + int beginIndex = result.indexOf(beginTag) + beginTag.length(); + int endIndex = result.indexOf(endTag); + String userName = result.substring(beginIndex, endIndex); + + beginTag = ""; + endTag = ""; + beginIndex = result.indexOf(beginTag) + beginTag.length(); + endIndex = result.indexOf(endTag); + String sid = result.substring(beginIndex, endIndex); + + beginTag = ""; + endTag = ""; + beginIndex = result.indexOf(beginTag) + beginTag.length(); + endIndex = result.indexOf(endTag); + String orgCode = result.substring(beginIndex, endIndex); + + FineLoggerFactory.getLogger().info("================ userName:" + userName + ",sid:" + sid + ",orgCode:" + orgCode); + String fineUserName = orgCode + "_" + userName; + + String templateId = getTemplateId(request); + FineLoggerFactory.getLogger().info("templateId:" + templateId); + if (StringUtils.isNotEmpty(templateId)) { + + String parentSessionId = getParentSeeesionFromSession(request); + FineLoggerFactory.getLogger().info("parentSessionId:" + parentSessionId); + if (StringUtils.isNotEmpty(parentSessionId)) { + FineLoggerFactory.getLogger().info("child link template...."); + //ReportSessionIDInfor,FormSessionIDInfor + templateId = ""; + WidgetSessionIDInfor objSession = SessionPoolManager.getSessionIDInfor(parentSessionId, WidgetSessionIDInfor.class); + if (objSession != null) { + String parentPath = objSession.getRelativePath(); + FineLoggerFactory.getLogger().info("child link template is ok....:" + parentPath); + templateId = parentPath; + } + } + FineLoggerFactory.getLogger().info("templateId:" + templateId); + if (StringUtils.isNotEmpty(templateId)) { + //去远程看有权限没,y有就继续走, + + FineLoggerFactory.getLogger().info("===========role validatee url:" + Jsd9683ConfigXmlConfigReader.ROLE_VALIDATE_URL); + + JSONObject jsonObj = new JSONObject(); + + jsonObj.put("org_code", orgCode); + jsonObj.put("account", userName); + jsonObj.put("report_code", templateId); + jsonObj.put("root_report_code", templateId); + jsonObj.put("params", new JSONObject()); + String jsonData = jsonObj.toString(); + FineLoggerFactory.getLogger().info("===========role validatee param:" + jsonData); + String roleResult = doPostHttpReq(Jsd9683ConfigXmlConfigReader.ROLE_VALIDATE_URL, jsonData); + FineLoggerFactory.getLogger().info("===========role validatee roleResult:" + roleResult); + if (roleResult.indexOf("true") != -1) { + + try { + User user = UserService.getInstance().getUserByUserName(fineUserName); + if (user == null) { + UserBean userBean = new UserBean(); + userBean.setRealName(fineUserName); + userBean.setUsername(fineUserName); + userBean.setPassword(AESTransmissionEncryption.getInstance().encrypt("123456")); + userBean.setEmail(""); + userBean.setMobile(""); + userBean.setRoleIds(new String[]{}); + userBean.setCreationType(0); + userBean.setEnable(true); + userBean.setDepartmentPostIds(new ArrayList<>()); + userBean.setExtraAttribute(new HashMap<>()); + UserService.getInstance().addUser(userBean); + FineLoggerFactory.getLogger().info("add user:" + fineUserName); + } + + + } catch (Exception e) { + e.printStackTrace(); + } + + HttpSession session = request.getSession(true); + try { + FineLoggerFactory.getLogger().info("begin login..."); + login(request, res, session, fineUserName); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + filterChain.doFilter(request, res); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServletException e) { + e.printStackTrace(); + } + } else { + FineLoggerFactory.getLogger().info("无权限访问"); + try { + FineLoggerFactory.getLogger().info("到无权限界面去了"); + PrintWriter printWriter = null; + + printWriter = WebUtils.createPrintWriter(res); + + Map map = new HashMap<>(); + map.put("result", InterProviderFactory.getProvider().getLocText("Fine-Engine_Error_Page_Result")); + map.put("reason", "您没有权限访问该报表页面"); + map.put("solution", InterProviderFactory.getProvider().getLocText("Fine-Engine_Please_Contact_Platform_Admin")); + String page = WebServiceUtils.parseWebPageResourceSafe("com/fr/plugin/jsd9683/jscss/unavaliable.html", map); + printWriter.write(page); + printWriter.flush(); + printWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + } else { + try { + FineLoggerFactory.getLogger().info("===================== error:go on"); + filterChain.doFilter(request, res); + } catch (IOException e) { + FineLoggerFactory.getLogger().info("===================== error:" + e.toString()); + e.printStackTrace(); + } catch (ServletException e) { + e.printStackTrace(); + FineLoggerFactory.getLogger().info("===================== error:" + e.toString()); + } + } + + } + + } else { + try { + FineLoggerFactory.getLogger().info("===================== normal:go on"); + filterChain.doFilter(request, res); + } catch (IOException e) { + FineLoggerFactory.getLogger().info("===================== error:" + e.toString()); + e.printStackTrace(); + } catch (ServletException e) { + e.printStackTrace(); + FineLoggerFactory.getLogger().info("===================== error:" + e.toString()); + } + + } + } + + + private String doHttpReq(String reqUrl, String methord) { + HttpURLConnection con = null; + BufferedReader buffer = null; + StringBuffer resultBuffer = null; + String result = ""; + try { + URL url = new URL(reqUrl); + + con = (HttpURLConnection) url.openConnection(); + + con.setRequestMethod(methord); + + //con.setRequestProperty("Content-Type", "application/json;charset=GBK"); + + con.setDoOutput(true); + + con.setDoInput(true); + + con.setUseCaches(false); + + int responseCode = con.getResponseCode(); + FineLoggerFactory.getLogger().info("sendRedirect responseCode:" + responseCode); + if (responseCode == HttpURLConnection.HTTP_OK) { + + InputStream inputStream = con.getInputStream(); + + resultBuffer = new StringBuffer(); + String line; + buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK")); + while ((line = buffer.readLine()) != null) { + resultBuffer.append(line); + } + result = resultBuffer.toString(); + + } + } catch (Exception e) { + e.printStackTrace(); + } + + return result; + } + + private String doPostHttpReq(String reqUrl, String jsonData) { + HttpURLConnection con = null; + BufferedReader buffer = null; + StringBuffer resultBuffer = null; + String result = ""; + try { + URL url = new URL(reqUrl); + // 得到连接对象 + con = (HttpURLConnection) url.openConnection(); + // 设置请求类型 + con.setRequestMethod("POST"); + + con.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + + + con.setDoOutput(true); + + con.setDoInput(true); + + con.setUseCaches(false); + con.connect(); + + String body = jsonData; + + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), "UTF-8")); + writer.write(body); + writer.close(); + + + int responseCode = con.getResponseCode(); + FineLoggerFactory.getLogger().info("sendRedirect responseCode:" + responseCode); + if (responseCode == HttpURLConnection.HTTP_OK) { + + InputStream inputStream = con.getInputStream(); + + resultBuffer = new StringBuffer(); + String line; + buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK")); + while ((line = buffer.readLine()) != null) { + resultBuffer.append(line); + } + result = resultBuffer.toString(); + + } + } catch (Exception e) { + e.printStackTrace(); + } + + return result; + } + + + private void login(HttpServletRequest req, HttpServletResponse res, HttpSession session, String username) throws Exception { + // String token = LoginService.getInstance().login(req, res, username); + // req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + // FineLoggerFactory.getLogger().info("fr FrFilter is over with username is ###" + username); + } + + + private static String getParentSeeesionFromSession(HttpServletRequest request) { + return NetworkHelper.getHTTPRequestParameter(request, "parentSeeesion"); + } + + public String getTemplateId(HttpServletRequest request) { + return TemplateParser.analyzeTemplateID(request); + } + + private static String getHyperLinkTemplateIdFromSession(HttpServletRequest request) { + SessionProvider session = getSessionFromRequest(request); + return session != null ? session.getRelativePath() : ""; + } + + + private static SessionProvider getSessionFromRequest(HttpServletRequest request) { + try { + String sessionId = NetworkHelper.getHTTPRequestParameter(request, "sessionID"); + if (StringUtils.isNotEmpty(sessionId)) { + return SessionPoolManager.getSessionIDInfor(sessionId, SessionProvider.class); + } + } catch (Exception var2) { + FineLoggerFactory.getLogger().error(var2.getMessage(), var2); + } + + return null; + } + +} diff --git a/src/main/java/com/fr/plugin/jsd9683/filter/NoFilter.java b/src/main/java/com/fr/plugin/jsd9683/filter/NoFilter.java new file mode 100644 index 0000000..ac6ed5b --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/filter/NoFilter.java @@ -0,0 +1,26 @@ +package com.fr.plugin.jsd9683.filter; + +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.jsd9683.conf.Jsd9683ConfigXmlConfigReader; + +import javax.servlet.*; +import java.io.IOException; + +public class NoFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + FineLoggerFactory.getLogger().info("============= NoFilter init.。。。。。。。。。。。。。。 "); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + FineLoggerFactory.getLogger().info("============= NoFilter go go go "); + + filterChain.doFilter(servletRequest,servletResponse); + } + + @Override + public void destroy() { + + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/filter/RequestGlobalFilter.java b/src/main/java/com/fr/plugin/jsd9683/filter/RequestGlobalFilter.java new file mode 100644 index 0000000..3be5ef1 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/filter/RequestGlobalFilter.java @@ -0,0 +1,60 @@ +package com.fr.plugin.jsd9683.filter; + +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class RequestGlobalFilter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "RequestGlobalFilter"; + } + + @Override + public String[] urlPatterns() { + return new String[]{ + "/decision/*", + }; + } + + @Override + public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { + + FineLoggerFactory.getLogger().info("===============================RequestGlobalFilter:" ); + String origin = req.getHeader("Origin"); + FineLoggerFactory.getLogger().info("===============================origin:" +origin); + if (StringUtils.isNotEmpty(origin)) { + res.addHeader("Access-Control-Allow-Origin", origin); + String headers = req.getHeader("Access-Control-Request-Headers"); + FineLoggerFactory.getLogger().info("===============================headers:" +headers); + if (StringUtils.isNotEmpty(headers)) + res.addHeader("Access-Control-Allow-Headers", headers); + + res.addHeader("Access-Control-Allow-Methods", "*"); + res.addHeader("Access-Control-Max-Age", "3600"); + } + + String methodName = req.getMethod(); + FineLoggerFactory.getLogger().info("===============================methodName:" +methodName); + if (methodName.equals("OPTIONS")) { + res.setStatus(HttpServletResponse.SC_OK); + FineLoggerFactory.getLogger().info("options set status ok"); + } + else{ + try { + FineLoggerFactory.getLogger().info(" ok go on"); + filterChain.doFilter(req,res); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServletException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceComponent.java b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceComponent.java new file mode 100644 index 0000000..f512e9c --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceComponent.java @@ -0,0 +1,20 @@ +package com.fr.plugin.jsd9683.webResourceProvider; + +import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.web.struct.Component; +import com.fr.web.struct.browser.RequestClient; +import com.fr.web.struct.category.ScriptPath; + +public class Jsd9683WebResourceComponent extends Component { + + public static Jsd9683WebResourceComponent KEY = new Jsd9683WebResourceComponent(); + + + @Override + public ScriptPath script(RequestClient req) { + + return ScriptPath.build("/com/fr/plugin/jsd9683/jscss/Jsd9683.js"); + } + +} diff --git a/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceProvider.java b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceProvider.java new file mode 100644 index 0000000..3726782 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/Jsd9683WebResourceProvider.java @@ -0,0 +1,17 @@ +package com.fr.plugin.jsd9683.webResourceProvider; + +import com.fr.decision.fun.impl.AbstractWebResourceProvider; +import com.fr.report.web.ReportMainComponent; +import com.fr.web.struct.Atom; + +public class Jsd9683WebResourceProvider extends AbstractWebResourceProvider { + @Override + public Atom attach() { + return ReportMainComponent.KEY; + } + + public Atom client() { + + return Jsd9683WebResourceComponent.KEY; + } +} diff --git a/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/MyTemplateRequestChecker.java b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/MyTemplateRequestChecker.java new file mode 100644 index 0000000..5e099c9 --- /dev/null +++ b/src/main/java/com/fr/plugin/jsd9683/webResourceProvider/MyTemplateRequestChecker.java @@ -0,0 +1,51 @@ +package com.fr.plugin.jsd9683.webResourceProvider; + +import com.fr.data.NetworkHelper; +import com.fr.decision.webservice.interceptor.DecisionInterceptor; +import com.fr.decision.webservice.interceptor.handler.TemplateRequestChecker; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.log.FineLoggerFactory; +import com.fr.third.springframework.web.method.HandlerMethod; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class MyTemplateRequestChecker extends TemplateRequestChecker { + @Override + public String getTemplateId(HttpServletRequest httpServletRequest, HandlerMethod handlerMethod) { + return null; + } + + @Override + public boolean detectTemplateNeedAuthenticate(HttpServletRequest httpServletRequest, String s) { + return false; + } + + @Override + public boolean detectTemplateRoleAuthority(HttpServletRequest httpServletRequest, String s, String s1) { + return false; + } + + @Override + public boolean doesUserHaveAnyHyperlinkTempAuth(String s, String s1) throws Exception { + return false; + } + + @Override + public boolean acceptRequest(HttpServletRequest httpServletRequest, HandlerMethod handlerMethod) { + return true; + } + + @Override + public boolean checkRequest(HttpServletRequest request, HttpServletResponse httpServletResponse, HandlerMethod handlerMethod) throws Exception { + String hyperlinkUUIDKey = NetworkHelper.getHTTPRequestParameter(request, DecisionServiceConstants.FINE_AUTH_TOKEN_NAME_HYPERLINK); + FineLoggerFactory.getLogger().info("hyperlinkUUIDKey:" + hyperlinkUUIDKey); + + return true; + } + + @Override + public int toInteger() { + return 0; + } +} diff --git a/src/main/resources/com/fr/plugin/jsd9683/jscss/Jsd9683.js b/src/main/resources/com/fr/plugin/jsd9683/jscss/Jsd9683.js new file mode 100644 index 0000000..dac038f --- /dev/null +++ b/src/main/resources/com/fr/plugin/jsd9683/jscss/Jsd9683.js @@ -0,0 +1,30 @@ +; (function () { + console.log("加载插件jsd9683...") + + function getReportSessionID() { + if (FR && FR.SessionMgr && $.isFunction(FR.SessionMgr.getSessionID)) { + return FR.SessionMgr.getSessionID(); + } + return ""; + } + + var doHyperlinkByGet4Reportlet = FR.doHyperlinkByGet4Reportlet + + var newDoHyperlinkByGet4Reportlet = function(url, para, target, feature, title) { + console.log("hack newDoHyperlinkByGet4Reportlet") + var url = url.url+'&parentSeeesion='+getReportSessionID(); + console.log("跳转url:"+url) + doHyperlinkByGet4Reportlet.apply(FR,[url,para,target,feature,title]); + } + + FR.doHyperlinkByGet4Reportlet = newDoHyperlinkByGet4Reportlet; + + var doHyperlinkByPost = FR.doHyperlinkByPost + var newDoHyperlinkByPost = function(url, para, target, feature, title) { + console.log("hack newDoHyperlinkByGet4Reportlet") + var url = url.url+'&parentSeeesion='+getReportSessionID(); + console.log("跳转url:"+url) + doHyperlinkByPost.apply(FR,[url,para,target,feature,title]); + } + FR.doHyperlinkByPost = newDoHyperlinkByPost; + })(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/jsd9683/jscss/unavaliable.html b/src/main/resources/com/fr/plugin/jsd9683/jscss/unavaliable.html new file mode 100644 index 0000000..de6a562 --- /dev/null +++ b/src/main/resources/com/fr/plugin/jsd9683/jscss/unavaliable.html @@ -0,0 +1,81 @@ + + + + + + + + + + +

+
+ +
+
非常抱歉,无法查看该页面
+
您没有权限访问该报表页面
+
如果您确实需要访问该页面,请联系平台管理员
+
+ + + + \ No newline at end of file diff --git a/交付/conf/bg.xml b/交付/conf/bg.xml new file mode 100644 index 0000000..8dbe357 --- /dev/null +++ b/交付/conf/bg.xml @@ -0,0 +1,7 @@ + + http://xxx/login + http://xxxx/proxyValidate + x.x.x.x:8080 + http://xx/fine_report/report_access_validation + true +