From 8b6f94daf7161869c37b8fb5d92f25f9d8b37ea7 Mon Sep 17 00:00:00 2001 From: pioneer Date: Fri, 17 Mar 2023 15:05:42 +0800 Subject: [PATCH] open --- .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .gradle/7.1.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/7.1.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/7.1.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/vcs-1/gc.properties | 0 README.md | 6 + build.gradle | 122 ++++++ encrypt.xml | 13 + plugin.xml | 25 ++ .../config/InitializeMonitor.java | 21 + .../config/WinkSimpleConfig.java | 50 +++ .../xdfileencrypt/filter/DecryptRequest.java | 114 ++++++ .../filter/DelegatingServletInputStream.java | 46 +++ .../filter/EncryptOutputStream.java | 126 ++++++ .../xdfileencrypt/filter/EncryptResponse.java | 23 ++ .../wink/xdfileencrypt/filter/SSOFilter.java | 180 +++++++++ .../xdfileencrypt/localeFinder/locale.java | 10 + .../wink/xdfileencrypt/utils/FRUtils.java | 363 +++++++++++++++++ .../wink/xdfileencrypt/utils/FileUtils.java | 102 +++++ .../wink/xdfileencrypt/utils/HttpUtils.java | 348 +++++++++++++++++ .../xdfileencrypt/utils/ResponseUtils.java | 108 +++++ .../wink/xdfileencrypt/utils/TypeDict.java | 49 +++ .../wink/xdfileencrypt/utils/Utils.java | 369 ++++++++++++++++++ .../config/InitializeMonitor.java | 21 + .../config/WinkSimpleConfig.java | 50 +++ .../xdfileencrypt/filter/DecryptRequest.java | 114 ++++++ .../filter/DelegatingServletInputStream.java | 46 +++ .../filter/EncryptOutputStream.java | 126 ++++++ .../xdfileencrypt/filter/EncryptResponse.java | 23 ++ .../xx/xdfileencrypt/filter/SSOFilter.java | 180 +++++++++ .../xx/xdfileencrypt/localeFinder/locale.java | 10 + .../xx/xdfileencrypt/utils/FRUtils.java | 363 +++++++++++++++++ .../xx/xdfileencrypt/utils/FileUtils.java | 102 +++++ .../xx/xdfileencrypt/utils/HttpUtils.java | 348 +++++++++++++++++ .../xx/xdfileencrypt/utils/ResponseUtils.java | 108 +++++ .../plugin/xx/xdfileencrypt/utils/Test.java | 0 .../xx/xdfileencrypt/utils/TypeDict.java | 49 +++ .../plugin/xx/xdfileencrypt/utils/Utils.java | 369 ++++++++++++++++++ .../xx/xdfileencrypt/locale/locale.properties | 10 + .../locale/locale_zh_CN.properties | 10 + 44 files changed, 4006 insertions(+) create mode 100644 .gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/7.1.1/dependencies-accessors/gc.properties create mode 100644 .gradle/7.1.1/fileChanges/last-build.bin create mode 100644 .gradle/7.1.1/fileHashes/fileHashes.lock create mode 100644 .gradle/7.1.1/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 README.md create mode 100644 build.gradle create mode 100644 encrypt.xml create mode 100644 plugin.xml create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/config/InitializeMonitor.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/config/WinkSimpleConfig.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DecryptRequest.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DelegatingServletInputStream.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptOutputStream.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptResponse.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/SSOFilter.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/localeFinder/locale.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FRUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FileUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/HttpUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/ResponseUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/TypeDict.java create mode 100644 src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/Utils.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/config/InitializeMonitor.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/config/WinkSimpleConfig.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DecryptRequest.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DelegatingServletInputStream.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptOutputStream.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptResponse.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/SSOFilter.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/localeFinder/locale.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FRUtils.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FileUtils.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/HttpUtils.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/ResponseUtils.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Test.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/TypeDict.java create mode 100644 src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Utils.java create mode 100644 src/main/resources/com/eco/plugin/xx/xdfileencrypt/locale/locale.properties create mode 100644 src/main/resources/com/eco/plugin/xx/xdfileencrypt/locale/locale_zh_CN.properties diff --git a/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..92b58d9ecde0e46d6e5d0505addb45c547d92aec GIT binary patch literal 17 ScmZR6WiFMnsE{*~0SW*pivt({ literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/dependencies-accessors/gc.properties b/.gradle/7.1.1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/7.1.1/fileChanges/last-build.bin b/.gradle/7.1.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/fileHashes/fileHashes.lock b/.gradle/7.1.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..c64d2bdeb952d034d807ef64ad2149548e9af821 GIT binary patch literal 17 ScmZRUbm6Fp6#Nyy00jUZ2LhP@ literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/gc.properties b/.gradle/7.1.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..901c6213e69d16437c12eb76dea31daeb9db067c GIT binary patch literal 17 UcmZQpO)6c^@oni@1_)pT058o17ytkO literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..976a907 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Fri Mar 17 15:02:20 CST 2023 +gradle.version=7.1.1 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..b8a694257f2dcad713f69b97c6946526dfbf5169 GIT binary patch literal 17 TcmZQR!t>+m4lP$N1}FdkHB$r< literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..adc1f59 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# open-JSD-10438 + +JSD-10438 excel导出加密\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c56b872 --- /dev/null +++ b/build.gradle @@ -0,0 +1,122 @@ + +apply plugin: 'java' + + +ext { + /** + * 项目中依赖的jar的路径 + * 1.如果依赖的jar需要打包到zip中,放置在lib根目录下 + * 2.如果依赖的jar仅仅是编译时需要,防止在lib下子目录下即可 + */ + libPath = "$projectDir/../webroot/WEB-INF/lib" + + /** + * 是否对插件的class进行加密保护,防止反编译 + */ + guard = false + + def pluginInfo = getPluginInfo() + pluginPre = "fine-plugin" + pluginName = pluginInfo.id + pluginVersion = pluginInfo.version + + outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes" +} + +group = 'com.fr.plugin' +version = '10.0' +sourceCompatibility = '8' + +sourceSets { + main { + java.outputDir = file(outputPath) + output.resourcesDir = file(outputPath) + } +} + +ant.importBuild("encrypt.xml") +//定义ant变量 +ant.projectDir = projectDir +ant.references["compile.classpath"] = ant.path { + fileset(dir: libPath, includes: '**/*.jar') + fileset(dir: ".",includes:"**/*.jar" ) +} + +classes.dependsOn('clean') + +task copyFiles(type: Copy,dependsOn: 'classes'){ + from outputPath + into "$projectDir/classes" +} + +task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){ + from "$projectDir/classes" + into "$projectDir/transform-classes" + include "**/*.*" +} +jar.dependsOn("preJar") + +task makeJar(type: Jar,dependsOn: preJar){ + from fileTree(dir: "$projectDir/transform-classes") + baseName pluginPre + appendix pluginName + version pluginVersion + destinationDir = file("$buildDir/libs") + + doLast(){ + delete file("$projectDir/classes") + delete file("$projectDir/transform-classes") + } +} + +task copyFile(type: Copy,dependsOn: ["makeJar"]){ + from "$buildDir/libs" + from("$projectDir/lib") { + include "*.jar" + } + from "$projectDir/plugin.xml" + into file("$buildDir/temp/plugin") +} + +task zip(type:Zip,dependsOn:["copyFile"]){ + from "$buildDir/temp/plugin" + destinationDir file("$buildDir/install") + baseName pluginPre + appendix pluginName + version pluginVersion +} + +//控制build时包含哪些文件,排除哪些文件 +processResources { +// exclude everything +// 用*.css没效果 +// exclude '**/*.css' +// except this file +// include 'xx.xml' +} + +/*读取plugin.xml中的version*/ +def getPluginInfo(){ + def xmlFile = file("plugin.xml") + if (!xmlFile.exists()) { + return ["id":"none", "version":"1.0.0"] + } + def plugin = new XmlParser().parse(xmlFile) + def version = plugin.version[0].text() + def id = plugin.id[0].text() + return ["id":id,"version":version] +} + +repositories { + mavenLocal() + maven { + url = uri('http://mvn.finedevelop.com/repository/maven-public/') + } +} + +dependencies { + //使用本地jar + implementation fileTree(dir: 'lib', include: ['**/*.jar']) + implementation fileTree(dir: libPath, include: ['**/*.jar']) +} + diff --git a/encrypt.xml b/encrypt.xml new file mode 100644 index 0000000..1401cd1 --- /dev/null +++ b/encrypt.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..c2df4e9 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,25 @@ + + com.eco.plugin.xx.xdfileencrypt + + yes + 1.1.1 + 10.0 + 2018-07-31 + fr.open + + + com.eco.plugin.xx.xdfileencrypt + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/InitializeMonitor.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/InitializeMonitor.java new file mode 100644 index 0000000..7ac4d35 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/InitializeMonitor.java @@ -0,0 +1,21 @@ +package com.eco.plugin.xx.xdfileencrypt.config; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; + +/** + * @author xx + * @version 10.0 + * Created by xx on 2021-12-03 + */ +public class InitializeMonitor extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + xxSimpleConfig.getInstance(); + } + + @Override + public void beforeStop(PluginContext pluginContext) { + + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/WinkSimpleConfig.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/WinkSimpleConfig.java new file mode 100644 index 0000000..ea4732b --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/config/WinkSimpleConfig.java @@ -0,0 +1,50 @@ +package com.eco.plugin.xx.xdfileencrypt.config; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.record.analyzer.EnableMetrics; + +@Visualization(category = "Plugin-Config-Title") +@EnableMetrics +public class xxSimpleConfig extends DefaultConfiguration { + + private static volatile xxSimpleConfig config = null; + + @Focus(id="com.eco.plugin.xx.xdfileencrypt.config", text = "Plugin-Config-Title", source = Original.PLUGIN) + public static xxSimpleConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(xxSimpleConfig.class); + } + return config; + } + + @Identifier(value = "size", name = "Plugin-Config-Size", description = "Plugin-Config-Size", status = Status.SHOW) + private Conf size = Holders.simple(""); + + + + public String getSize() { + return size.get(); + } + + public void setSize(String url) { + this.size.set(url); + } + + + + @Override + public Object clone() throws CloneNotSupportedException { + xxSimpleConfig cloned = (xxSimpleConfig) super.clone(); +// cloned.text = (Conf) text.clone(); +// cloned.count = (Conf) count.clone(); +// cloned.price = (Conf) price.clone(); +// cloned.time = (Conf) time.clone(); +// cloned.student = (Conf) student.clone(); + return cloned; + } + +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DecryptRequest.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DecryptRequest.java new file mode 100644 index 0000000..dab6dc2 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DecryptRequest.java @@ -0,0 +1,114 @@ +package com.eco.plugin.xx.xdfileencrypt.filter; + +import com.eco.plugin.xx.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.xx.xdfileencrypt.utils.HttpUtils; +import com.fr.base.core.IgnoreBytesInputStream; +import com.fr.base.core.ParseResult; +import com.fr.base.core.PostParseUtils; +import com.fr.cache.Attachment; +import com.fr.cache.type.AttachmentScope; +import com.fr.general.IOUtils; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.fileupload.FileItem; +import com.fr.third.org.apache.commons.fileupload.FileItemFactory; +import com.fr.third.org.apache.commons.fileupload.disk.DiskFileItemFactory; +import com.fr.third.org.apache.commons.fileupload.servlet.ServletFileUpload; +import com.fr.web.AttachmentHelper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.*; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class DecryptRequest extends HttpServletRequestWrapper { +// private static final String directory = "E:\\temp\\"; +// private static final String directory2 = "E:\\temp\\temp2\\"; + + private byte[] data; + public DecryptRequest(HttpServletRequest request,String filename) { + super(request); + init(filename); + } + + private void init(String filename) { + try { + getFileData((HttpServletRequest) getRequest()); + data = IOUtils.inputStream2Bytes(getRequest().getInputStream()); +// FileUtils.writeBytesToFile(data,directory2+"a.txt"); + } catch (IOException e) { + data = new byte[0]; + } + } + + private static void getFileData(HttpServletRequest req){ + if(ServletFileUpload.isMultipartContent(req)){ + FileItemFactory fileItemFactory =new DiskFileItemFactory(); + ServletFileUpload servletFileUpload =new ServletFileUpload(fileItemFactory); + servletFileUpload.setHeaderEncoding("utf-8"); + servletFileUpload.setFileSizeMax(1024*1024*100); + try { + List list = servletFileUpload.parseRequest(req); + for (FileItem fileItem : list) { + if(fileItem.isFormField()){ + String id = fileItem.getString("UTF-8"); + }else { + String fileItemName = fileItem.getName(); + String subname = fileItemName.substring(fileItemName.lastIndexOf("."), fileItemName.length()); + String filename2 = java.util.UUID.randomUUID() + subname; + String realPath = req.getServletContext().getRealPath("work"); + File file = new File(realPath + "/" + filename2); + fileItem.write(file); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() { + + final ByteArrayInputStream bais = new ByteArrayInputStream(data); + + return new ServletInputStream() { + + @Override + public int read() { + return bais.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DelegatingServletInputStream.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DelegatingServletInputStream.java new file mode 100644 index 0000000..b605b55 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/DelegatingServletInputStream.java @@ -0,0 +1,46 @@ +package com.eco.plugin.xx.xdfileencrypt.filter; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class DelegatingServletInputStream extends ServletInputStream { + private final InputStream sourceStream; + + public DelegatingServletInputStream(InputStream stream) { + this.sourceStream = stream; + } + + public final InputStream getSourceStream() { + return this.sourceStream; + } + @Override + public int read() throws IOException { + return this.sourceStream.read(); + } + + @Override + public void close() throws IOException { + super.close(); + this.sourceStream.close(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener listener) { } +} \ No newline at end of file diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptOutputStream.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptOutputStream.java new file mode 100644 index 0000000..c018400 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptOutputStream.java @@ -0,0 +1,126 @@ +package com.eco.plugin.xx.xdfileencrypt.filter; + +import com.eco.plugin.xx.xdfileencrypt.config.xxSimpleConfig; +import com.eco.plugin.xx.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.xx.xdfileencrypt.utils.HttpUtils; +import com.eco.plugin.xx.xdfileencrypt.utils.Utils; +import com.fr.json.JSONObject; +import com.fr.record.analyzer.EnableMetrics; + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.UUID; + + +@EnableMetrics +public class EncryptOutputStream extends ServletOutputStream { +// private static final String directory = "E:\\temp\\"; +// private static final String directory = "/opt/tomcat/temp/"; + private static final String directory = "/usr/fine/temp"; + private OutputStream original = null; + private boolean closed = false; + private ByteArrayOutputStream crypt = new ByteArrayOutputStream(); + + public EncryptOutputStream(OutputStream original){ + this.original = original; + } + + /** + * 实际加密的代码就在这里实现了 + * @param bytes + * @return + */ + private byte[] encrypt(byte[] bytes) throws IOException { + String filename = UUID.randomUUID().toString()+Utils.getFileSuffix(bytes); + String originFilePath =directory+filename; + FileUtils.writeBytesToFile(bytes,originFilePath); + File originFile = new File(originFilePath); + String fileSize = xxSimpleConfig.getInstance().getSize(); + if(Utils.isNotNullStr(fileSize)){ + long size = Long.parseLong(fileSize); + long fileSizeReal = originFile.length()/1024/1024; + + if(fileSizeReal > size){ + throw new IOException("导出文件超出文件大小设置!"); + } + } + String result = HttpUtils.HttpPostJson("http://localhost:8090/encrypt?fileName="+filename,"",null); + JSONObject jsonObject = new JSONObject(result); + String filePath = jsonObject.getString("filePath"); + byte[] encryptFile = FileUtils.readBytesFromFile(filePath); + + while (validateFile(bytes,encryptFile)){ + encryptFile = FileUtils.readBytesFromFile(filePath); + } + + + byte[] resultByte = encryptFile.clone(); + + if(originFile.exists() && originFile.isFile()){ + originFile.delete(); + } + File targetFile = new File(filePath); + if(targetFile.exists() && targetFile.isFile()){ + targetFile.delete(); + } + + return resultByte; + } + + private boolean validateFile(byte[] bytes, byte[] encryptFile) { + return bytes[0] == encryptFile[0] && bytes[bytes.length-1] == encryptFile[encryptFile.length-1]; + } + + @Override + public void write(int b) throws IOException { + if (closed) { + throw new IOException("Cannot write to a closed output stream"); + } + crypt.write(b); + } + + @Override + public void close() throws IOException { + if( !closed ){ + byte[] bytes = crypt.toByteArray(); + bytes = encrypt(bytes); + original.write(bytes); + original.flush(); + original.close(); + closed = true; + } + } + + @Override + public void flush() throws IOException { + crypt.flush(); + } + + @Override + public void write(byte[] data) throws IOException { + write(data, 0, data.length); + } + + @Override + public void write(byte[] data, int off, int len) throws IOException { + if (closed) { + throw new IOException("Cannot write to a closed output stream"); + } + crypt.write(data, off, len); + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener listener) { + + } + +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptResponse.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptResponse.java new file mode 100644 index 0000000..b40a1d5 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/EncryptResponse.java @@ -0,0 +1,23 @@ +package com.eco.plugin.xx.xdfileencrypt.filter; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.IOException; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class EncryptResponse extends HttpServletResponseWrapper { + public EncryptResponse(HttpServletResponse response) { + super(response); + } + + public ServletOutputStream getOutputStream()throws IOException { + ServletOutputStream original = super.getOutputStream(); + return new EncryptOutputStream(original); + } + +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/SSOFilter.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/SSOFilter.java new file mode 100644 index 0000000..5c869f8 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/filter/SSOFilter.java @@ -0,0 +1,180 @@ +package com.eco.plugin.xx.xdfileencrypt.filter; + + +import com.eco.plugin.xx.xdfileencrypt.utils.FRUtils; +import com.eco.plugin.xx.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.xx.xdfileencrypt.utils.HttpUtils; +import com.fr.base.core.IgnoreBytesInputStream; +import com.fr.base.core.ParseResult; +import com.fr.base.core.PostParseUtils; +import com.fr.cache.Attachment; +import com.fr.cache.AttachmentFileBase; +import com.fr.cache.AttachmentSource; +import com.fr.cache.factory.AttachmentFileManager; +import com.fr.cache.type.AttachmentScope; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.record.OperateMessage; +import com.fr.decision.webservice.utils.CharLimitType; +import com.fr.decision.webservice.utils.WebServiceUtils; +import com.fr.decision.webservice.v10.security.SecurityService; +import com.fr.general.CommonIOUtils; +import com.fr.general.ComparatorUtils; +import com.fr.intelli.record.MetricRegistry; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.security.WebSecurityConfig; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.io.FilenameUtils; +import com.fr.third.org.apache.http.entity.ContentType; +import com.fr.web.AttachmentHelper; +import com.fr.web.utils.WebUtils; + +import javax.servlet.FilterChain; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.UUID; + + +@EnableMetrics +@FunctionRecorder +public class SSOFilter extends AbstractGlobalRequestFilterProvider { + private static final byte[] NEW_LINE_BYTES = new byte[]{13, 10}; + private static final byte[] BOUNDARY_END = new byte[]{45, 45}; +// private static final String directory = "/opt/tomcat/temp/"; +// private static final String directory = "E:\\temp\\"; + private static final String directory = "/usr/fine/temp"; + + @Override + public String filterName() { + return "xdfileencryptFilter"; + } + + @Override + public String[] urlPatterns() { + return new String[]{"/*"}; + } + + @Override + public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain ){ + String url = FRUtils.getAllUrl(req); + + if(url.contains("global/export")){ + res = new EncryptResponse( res ); + } + + if(url.contains("attach/upload")){ + String filename = req.getParameter("filename"); + if(filename.contains(".xls") || filename.contains(".xlsx") || filename.contains(".csv")){ + try { + int width = Integer.valueOf(req.getParameter("width")); + int height = Integer.valueOf(req.getParameter("height")); + + uploadAttach(req,res,width,height,filename,false); + } catch (Exception e) { + FRUtils.FRLogInfo("上传文件失败:"+filename); + } + + return ; + } + } + + release(req,res,chain); + } + + private static void uploadAttach(HttpServletRequest req, HttpServletResponse res, int width, int height, String filename, boolean isHolder) throws Exception { + SecurityService.checkXss(filename); + if (!filename.startsWith(" ") && !WebServiceUtils.containIllegalChars(CharLimitType.UPLOAD_FILE_NAME_LIMIT, filename)) { + ServletInputStream is = req.getInputStream(); + ParseResult fileheader = PostParseUtils.parse(is, req.getCharacterEncoding()); + + /** + * 文件落盘 + */ + String filenameNew = directory+"jm"+ UUID.randomUUID().toString()+ filename; + IgnoreBytesInputStream ignoreBytesInputStream = new IgnoreBytesInputStream(is, concat(concat(NEW_LINE_BYTES, fileheader.getBoundary().getBytes()), BOUNDARY_END)); + FileUtils.inputstreamToFile(ignoreBytesInputStream,filenameNew); + + + /** + * 获取新文件inputStream + */ + byte[] decryptFileByte = HttpUtils.getFileByte("http://localhost:8090/decrypt?fileName="+URLEncoder.encode(filenameNew)); + InputStream inputStream = new ByteArrayInputStream(decryptFileByte); + IgnoreBytesInputStream ignoreBytesInputStream2 = new IgnoreBytesInputStream(inputStream, concat(concat(NEW_LINE_BYTES, fileheader.getBoundary().getBytes()), BOUNDARY_END)); + + String fileType = fileheader.getContentType().indexOf("image") > 0 ? "image" : "other"; + Attachment attachment = addAttachment(fileType, CodeUtils.cjkDecode(filename), ignoreBytesInputStream2, width, height, isHolder ? AttachmentScope.HOLDER : AttachmentScope.DEFAULT); + if (WebSecurityConfig.getInstance().isFileVerificationEnabled()) { + checkFile(fileType, attachment, filename); + } + + MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-Attachment", "Dec-Attachment_Upload", filename, "Dec-Log_Add")); + res.setContentType(ContentType.APPLICATION_JSON.getMimeType()); + PrintWriter var12 = WebUtils.createPrintWriter(res); + var12.print(attachment.toConfig()); + var12.flush(); + var12.close(); + } else { + throw new Exception("Dec-Data_Set_File_Name_Error"); + } + } + + /** + * 添加附件 + * @param fileType 附件类型 image or other + * @param filename + * @param is + * @param width + * @param height + * @param scope + * @return + */ + public static Attachment addAttachment(String fileType, String filename, InputStream is, int width, int height, AttachmentScope scope) { + AttachmentFileBase fileBase = AttachmentFileManager.getManager().createFile((String)null, is, scope); + Attachment attachment = new Attachment(fileBase.getFileName(), fileType, filename, fileBase, width, height, scope); + AttachmentSource.putAttachment(fileBase.getFileName(), attachment); + return attachment; + } + + private static byte[] concat(byte[] var1, byte[] var2) { + byte[] var3 = new byte[var1.length + var2.length]; + System.arraycopy(var1, 0, var3, 0, var1.length); + System.arraycopy(var2, 0, var3, var1.length, var2.length); + return var3; + } + + private static void checkFile(String var1, Attachment var2, String var3) throws Exception { + InputStream var4 = var2.getInputStream(); + if (ComparatorUtils.equals(var1, "image") && var4.available() > 20971520) { + AttachmentHelper.removeAttachment(var2.getID()); + throw new Exception("Dec-File_Too_Large_Error"); + } else { + try { + boolean var5 = WebSecurityConfig.getInstance().getFileInspector().checkFileType(var4, FilenameUtils.getExtension(var3)); + if (!var5) { + AttachmentHelper.removeAttachment(var2.getID()); + throw new Exception("Dec-Invalid_file_Error"); + } + } finally { + CommonIOUtils.close(var4); + } + + } + } + //放行拦截器 + private void release(HttpServletRequest req, HttpServletResponse res, FilterChain chain) { + try{ + chain.doFilter(req,res); + }catch (Exception e){ + + } + } + +} + diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/localeFinder/locale.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/localeFinder/locale.java new file mode 100644 index 0000000..72a600e --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/localeFinder/locale.java @@ -0,0 +1,10 @@ +package com.eco.plugin.xx.xdfileencrypt.localeFinder; + +import com.fr.stable.fun.impl.AbstractLocaleFinder; + +public class locale extends AbstractLocaleFinder{ + @Override + public String find() { + return "com/eco/plugin/xx/xdfileencrypt/locale/locale"; + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FRUtils.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FRUtils.java new file mode 100644 index 0000000..fb53496 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FRUtils.java @@ -0,0 +1,363 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +import com.fr.base.ServerConfig; +import com.fr.base.TableData; +import com.fr.base.TemplateUtils; +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; +import com.fr.decision.authority.data.User; +import com.fr.decision.base.util.UUIDUtil; +import com.fr.decision.privilege.TransmissionTool; +import com.fr.decision.privilege.encrpt.PasswordValidator; +import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; +import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.utils.DecisionStatusService; +import com.fr.decision.webservice.utils.UserSourceFactory; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.event.LogInOutEvent; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.event.EventDispatcher; +import com.fr.file.TableDataConfig; +import com.fr.general.data.DataModel; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.third.springframework.web.method.HandlerMethod; +import com.fr.web.controller.ReportRequestService; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +public class FRUtils { + /** + * 判断用户是否存在 + * @param userName + * @return + */ + public static boolean isUserExist(String userName){ + if (StringUtils.isEmpty(userName)) { + return false; + } else { + try { + List userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); + return userList != null && !userList.isEmpty(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + return false; + } + } + } + + /** + * 判断是否登录FR + * @param req + * @return + */ + public static boolean isLogin(HttpServletRequest req){ + return LoginService.getInstance().isLogged(req); + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param userName + * @param url + */ + public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ + FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName+";跳转链接:"+url); + + //判断用户名是否为空 + if(!Utils.isNullStr(userName)){ + if(isUserExist(userName)){ + try { + LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); + + EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); + FineLoggerFactory.getLogger().info("FRLOG:登陆成功!"); + + if(!Utils.isNullStr(url)){ + httpServletResponse.sendRedirect(url); + } + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!"); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); + } + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param token + * @param url + */ + public static void loginByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token,String url){ + + FineLoggerFactory.getLogger().info("FRLOG:token:"+token+";跳转链接:"+url); + + //判断用户名是否为空 + if(!Utils.isNullStr(token)){ + writeToken2Cookie(httpServletResponse,token,-1); + + HttpSession session = httpServletRequest.getSession(true); + + httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,token); + + session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + + if(!Utils.isNullStr(url)){ + try { + httpServletResponse.sendRedirect(url); + } catch (IOException e) { + ResponseUtils.failedResponse(httpServletResponse,"跳转异常!"); + } + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"token不能为空!"); + } + } + + /** + * 产品原始登录方法 + * @param req + * @param res + * @param username + * @return + */ + public static JSONObject originLogin(HttpServletRequest req,HttpServletResponse res,String username){ +// String password = param.getString("password"); +// password = decryptFRPsd(password); + + FRUtils.FRLogInfo("originLogin:"+username); + + if(isUserExist(username)){ + try { + String token = LoginService.getInstance().login(req, res, username); + JSONObject result = new JSONObject(); + result.put("username",username); + result.put("validity",-1); + result.put("accessToken",token); + result.put("username",username); + result.put("url","/webroot/decision"); + JSONObject originUrlResponse = new JSONObject(); + originUrlResponse.put("originUrl","/webroot/decision"); + originUrlResponse.put("method","GET"); + originUrlResponse.put("parameters",new JSONObject()); + result.put("originUrlResponse",originUrlResponse); + return new JSONObject().put("data",result); + } catch (Exception e) { + ResponseUtils.failedResponse(res,"登录异常,请联系管理员!"); + } + }else{ + ResponseUtils.failedResponse(res,"用户在报表系统中不存在!"); + } + + return new JSONObject(); + } + + /** + * 获取token + * @param httpServletRequest + * @param httpServletResponse + * @param username + * @return + */ + public static String getToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String username){ + String token = ""; + try { + token = LoginService.getInstance().login(httpServletRequest, httpServletResponse, username); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:获取token失败"+e.getMessage()); + } + + return token; + } + + private static void writeToken2Cookie(HttpServletResponse req, String token, int num) { + try { + if (StringUtils.isNotEmpty(token)) { + Cookie cookie = new Cookie("fine_auth_token", token); + long maxAge = num == -2 ? 1209600000L : (long)num; + cookie.setMaxAge((int)maxAge); + cookie.setPath(ServerConfig.getInstance().getCookiePath()); + req.addCookie(cookie); + Cookie rememberCookie = new Cookie("fine_remember_login", String.valueOf(num == -2 ? -2 : -1)); + rememberCookie.setMaxAge((int)maxAge); + rememberCookie.setPath(ServerConfig.getInstance().getCookiePath()); + req.addCookie(rememberCookie); + } else { + FineLoggerFactory.getLogger().error("empty token cannot save."); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + + /** + * 后台登出 + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logoutByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token) + { + httpServletRequest.setAttribute("fine_auth_token",token); + logout(httpServletRequest,httpServletResponse); + } + + /** + * + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) + { + if(!isLogin(httpServletRequest)){ + return ; + } + + try { + LoginService.getInstance().logout(httpServletRequest,httpServletResponse); + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + } + + /** + * 打印FR日志 + * @param message + */ + public static void FRLogInfo(String message){ + FineLoggerFactory.getLogger().info("FRLOG:"+message); + } + + /** + * 打印FR日志-error + * @param message + */ + public static void FRLogError(String message){ + FineLoggerFactory.getLogger().error("FRLOG:"+message); + } + + + /** + * 根据用户名获取用户信息 + * @param userName + * @return + */ + public static User getFRUserByUserName(String userName){ + try { + return UserService.getInstance().getUserByUserName(userName); + } catch (Exception e) { + FRLogInfo("获取用户信息异常:"+e.getMessage()); + } + + return null; + } + + /** + * 解密FR密码 + * @param password + * @return + */ + public static String decryptFRPsd(String password){ + FRLogInfo("解密密码:"+password); + return TransmissionTool.decrypt(password); + } + + /** + * 根据明文密码生成数据库中的密码,用户密码校验用 + * @return + */ + public static String getDBPsd(String username,String password){ + PasswordValidator pv = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); + String uuid = UUIDUtil.generate(); + + return pv.encode(username, password, uuid); + } + + /** + * 获取带参数的访问链接 + * @return + */ + public static String getAllUrl(HttpServletRequest httpServletRequest){ + return WebUtils.getOriginalURL(httpServletRequest); + } + + /** + * 根据originKey获取源链接 + * @param req + * @return + * @throws Exception + */ + public static String getOriginUrl(HttpServletRequest req) throws Exception { + String origin = req.getParameter("origin"); + if (StringUtils.isNotEmpty(origin)) { + OriginUrlResponseBean originUrlResponseBean = (OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(origin); + DecisionStatusService.originUrlStatusService().delete(origin); + if (originUrlResponseBean != null) { + return originUrlResponseBean.getOriginUrl(); + } + } + + return new OriginUrlResponseBean(TemplateUtils.render("${fineServletURL}")).getOriginUrl(); + } + + /** + * 判断是否开启模板认证 + * @param + * @return + * @throws Exception + */ + public static boolean isTempAuth(HttpServletRequest req,HttpServletResponse res) throws Exception { + ReportTemplateRequestChecker checker = new ReportTemplateRequestChecker(); + HandlerMethod hm = new HandlerMethod(new ReportRequestService(),ReportRequestService.class.getMethod("preview", HttpServletRequest.class, HttpServletResponse.class, String.class)); + return checker.checkRequest(req,res,hm); + } + + /** + * 获取数据集数据 + * @param serverDataSetName + * @return + */ + public static DataModel getTableData(String serverDataSetName){ + TableData userInfo = TableDataConfig.getInstance().getTableData(serverDataSetName); + DataModel userInfoDM = userInfo.createDataModel(Calculator.createCalculator()); +// userInfoDM.getRowCount(); +// userInfoDM.getColumnIndex(); +// userInfoDM.getValueAt() + return userInfoDM; + } + + public static String getIndex(HttpServletRequest req){ + String url = req.getScheme()+"://"+req.getServerName()+":"+String.valueOf(req.getServerPort())+req.getRequestURI(); + return url; + } + + /** + * 获取帆软域名 + * @param req + * @return + */ + public static String getFRDomain(HttpServletRequest req){ + return getAllUrl(req).split("/webroot")[0]; + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FileUtils.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FileUtils.java new file mode 100644 index 0000000..8d12941 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/FileUtils.java @@ -0,0 +1,102 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +import com.finebi.web.action.v5.api.BiApiAction; +import com.fr.base.core.IgnoreBytesInputStream; + +import java.io.*; + +public class FileUtils { + public static void writeBytesToFile(byte[] bFile, String fileDest) { + FileOutputStream fileOuputStream = null; + try { + fileOuputStream = new FileOutputStream(fileDest); + fileOuputStream.write(bFile); + + } catch (IOException e) { + }finally { + if(fileOuputStream != null){ + try { + fileOuputStream.flush(); + fileOuputStream.close(); + } catch (IOException e) { + } + + } + } + + } + + public static void inputstreamToFile(IgnoreBytesInputStream inputStream, String filePath){ + BufferedOutputStream bos = null; + BufferedInputStream bis = new BufferedInputStream(inputStream); + try { + bos = new BufferedOutputStream(new FileOutputStream(new File(filePath))); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) { + bos.write(buffer, 0, bytesRead); + } + } catch (Exception e) { + + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + } + inputStream = null; + } + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + } + bos = null; + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + } + bis = null; + } + } + } + + public static byte[] readBytesFromFile(String filePath) { + + FileInputStream fileInputStream = null; + + byte[] bytesArray = null; + + try { + File file = new File(filePath); + + bytesArray = new byte[(int) file.length()]; + fileInputStream = new FileInputStream(file); + + fileInputStream.read(bytesArray); + + } catch (IOException e) { + + e.printStackTrace(); + + } finally { + + if (fileInputStream != null) { + + try { + fileInputStream.close(); + + } catch (IOException e) { + } + + } + + } + + return bytesArray; + + } + +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/HttpUtils.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/HttpUtils.java new file mode 100644 index 0000000..81c756f --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/HttpUtils.java @@ -0,0 +1,348 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpEntity; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.NameValuePair; +import com.fr.third.org.apache.http.client.CookieStore; +import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; +import com.fr.third.org.apache.http.client.methods.HttpGet; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.BasicCookieStore; +import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.cookie.BasicClientCookie; +import com.fr.third.org.apache.http.message.BasicNameValuePair; +import com.fr.third.org.apache.http.ssl.SSLContexts; +import com.fr.third.org.apache.http.ssl.TrustStrategy; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.servlet.http.Cookie; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class HttpUtils { + + /** + * httpGet请求 + * @param url + * @return + */ + public static String httpGet(String url,Cookie[] cookies,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--url:"+url); + + //创建httpClient + CloseableHttpClient httpclient = createHttpClient(cookies); + + HttpGet getMethod = new HttpGet(url); + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + getMethod.setHeader(key,header.get(key)); + } + } + + try { + HttpResponse response = httpclient.execute(getMethod); + int status =response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--status:"+status +";returnResult:"+returnResult); + + httpclient.close(); + + if (status == HttpStatus.SC_OK) { + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return ""; + } + + public static byte[] httpPostByte(String url,byte[] param){ + OutputStream out = null; + BufferedReader in = null; + String result = ""; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("Content-Type", "text/plain"); + conn.setRequestProperty("user-agent", + "PostmanRuntime/7.29.0"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + /*-----------------------------------------*/ + /*注意这里使用字节流*/ + out = new BufferedOutputStream(conn.getOutputStream()); + // 发送请求参数 + out.write(param); + // flush输出流的缓冲 + out.flush(); + /*-----------------------------------------*/ + // 定义BufferedReader输入流来读取URL的响应 + byte[] file = toByteArray(conn.getInputStream()); + + return file; + + } catch (Exception e) { + } + //使用finally块来关闭输出流、输入流 + finally{ + try{ + if(out!=null){ + out.close(); + } + if(in!=null){ + in.close(); + } + } + catch(IOException ex){ + + } + } + + return new byte[0]; + } + + /** + * HttpPost请求 + * @param postMethod + * @return + */ + private static String HttpPost(HttpPost postMethod){ + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + int status = response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:status:"+status+"returnResult:"+returnResult); + httpclient.close(); + + if (status == HttpStatus.SC_OK) { + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return ""; + } + + public static String HttpPostXML(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/html"); + HttpEntity entity = null; + try { + entity = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + + return HttpPost(postMethod); + } + + public static String HttpPostText(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/plain"); + HttpEntity entity = null; + try { + entity = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + + return HttpPost(postMethod); + } + + public static byte[] toByteArray(InputStream input) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024*4]; + int n = 0; + while (-1 != (n = input.read(buffer))) { + output.write(buffer, 0, n); + } + return output.toByteArray(); + } + + public static byte[] getFileByte(String url){ + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + HttpEntity entity = response.getEntity(); + byte[] file = toByteArray(entity.getContent()); + return file; + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return new byte[1]; + } + + public static String HttpPostJson(String url, String param,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(!Utils.isNullStr(param)){ + HttpEntity entity = null; + try { + entity = new StringEntity(param); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + } + + return HttpPost(postMethod); + } + + public static String HttpPostForm(String url, Map header,Map param){ + FineLoggerFactory.getLogger().info("FRLOG:HttpForm:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(param != null && param.size() > 0){ + List params = new ArrayList(param.size()); + + for(Map.Entry map : param.entrySet()){ + params.add(new BasicNameValuePair(map.getKey(), map.getValue())); + } + + try { + postMethod.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpForm:异常:"+e.getMessage()); + return ""; + } + } + + return HttpPost(postMethod); + } + + private static CloseableHttpClient createHttpClient(Cookie[] cookies){ + + SSLContext sslContext = null; + try { + sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(); + } catch (Exception e) { + FRUtils.FRLogInfo("exception:"+e.getMessage()); + } + + CloseableHttpClient httpclient = null; + + if(cookies != null && cookies.length > 0){ + CookieStore cookieStore = cookieToCookieStore(cookies); + + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).setDefaultCookieStore(cookieStore).build(); + } + else{ + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + } + + return httpclient; + } + + /** + * cookies转cookieStore + * @param cookies + * @return + */ + public static CookieStore cookieToCookieStore(Cookie[] cookies){ + CookieStore cookieStore = new BasicCookieStore(); + + if(cookies != null && cookies.length>0){ + for(Cookie cookie : cookies){ + BasicClientCookie cookie1 = new BasicClientCookie(cookie.getName(), cookie.getValue()); + cookieStore.addCookie(cookie1); + } + } + + return cookieStore; + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/ResponseUtils.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/ResponseUtils.java new file mode 100644 index 0000000..f3d2479 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/ResponseUtils.java @@ -0,0 +1,108 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class ResponseUtils { + private static final int SUCCESS = 200; + private static final int FAILED = -1; + + public static void successResponse(HttpServletResponse res, String body) { + response(res, body, SUCCESS); + } + + public static void failedResponse(HttpServletResponse res, String body) { + response(res, body, FAILED); + } + + private static void response(HttpServletResponse res, String body, int code) { + JSONObject object = new JSONObject(); + PrintWriter pw; + try { + object.put("code", code); + object.put("data", body); + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = object.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void response(HttpServletResponse res,JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = json.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void responseText(HttpServletResponse res,String text){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/html;charset=utf-8"); + pw.println(text); + pw.flush(); + pw.close(); + } + + public static void responseXml(HttpServletResponse res,String xml){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/xml;charset=utf-8"); + pw.println(xml); + pw.flush(); + pw.close(); + } + + public static void setCSRFHeader(HttpServletResponse httpServletResponse){ + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH"); + httpServletResponse.setHeader("Access-Control-Max-Age", "36000"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization"); + } + + public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/javascript;charset=utf-8;charset=utf-8"); + String result = json.toString(); + + String jsonp=req.getParameter("callback"); + + pw.println(jsonp+"("+result+")"); + pw.flush(); + pw.close(); + } +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/TypeDict.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/TypeDict.java new file mode 100644 index 0000000..6a03329 --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/TypeDict.java @@ -0,0 +1,49 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +public class TypeDict { + /** + 常用文件的文件头如下:(以前六位为准) + JPEG (jpg),文件头:FFD8FF + PNG (png),文件头:89504E47 + GIF (gif),文件头:47494638 + TIFF (tif),文件头:49492A00 + Windows Bitmap (bmp),文件头:424D + CAD (dwg),文件头:41433130 + Adobe Photoshop (psd),文件头:38425053 + Rich Text Format (rtf),文件头:7B5C727466 + XML (xml),文件头:3C3F786D6C + HTML (html),文件头:68746D6C3E + Email [thorough only] (eml),文件头:44656C69766572792D646174653A + Outlook Express (dbx),文件头:CFAD12FEC5FD746F + Outlook (pst),文件头:2142444E + MS Word/Excel (xls.or.doc),文件头:D0CF11E0 + MS Access (mdb),文件头:5374616E64617264204A + WordPerfect (wpd),文件头:FF575043 + Postscript (eps.or.ps),文件头:252150532D41646F6265 + Adobe Acrobat (pdf),文件头:255044462D312E + Quicken (qdf),文件头:AC9EBD8F + Windows Password (pwl),文件头:E3828596 + ZIP Archive (zip),文件头:504B0304 + RAR Archive (rar),文件头:52617221 + Wave (wav),文件头:57415645 + AVI (avi),文件头:41564920 + Real Audio (ram),文件头:2E7261FD + Real Media (rm),文件头:2E524D46 + MPEG (mpg),文件头:000001BA + MPEG (mpg),文件头:000001B3 + Quicktime (mov),文件头:6D6F6F76 + Windows Media (asf),文件头:3026B2758E66CF11 + MIDI (mid),文件头:4D546864 + */ + public static String checkType(String fileheader) { + + switch (fileheader) { + case "D0CF11": return ".xls"; + case "255044": return ".pdf"; + case "504B03": return ".xlsx"; + case "EFBBBF": return ".csv"; + default: return "0000"; + } + } + +} diff --git a/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/Utils.java b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/Utils.java new file mode 100644 index 0000000..351a0df --- /dev/null +++ b/src/main/java/com/eco/plugin/wink/xdfileencrypt/utils/Utils.java @@ -0,0 +1,369 @@ +package com.eco.plugin.xx.xdfileencrypt.utils; + +import com.fr.base.TemplateUtils; +import com.fr.data.NetworkHelper; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.io.utils.ResourceIOUtils; +import com.fr.json.JSONObject; +import com.fr.stable.CodeUtils; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Utils { + + public static byte[] getByteHeader(byte[] bytes){ + byte[] newByte = new byte[3]; + for(int i=0;i parameterMap){ + if(parameterMap == null){ + parameterMap = new HashMap(); + } + + try { + String macPage = TemplateUtils.renderTemplate(path, parameterMap); + WebUtils.printAsString(res, macPage); + }catch (Exception e){ + FRUtils.FRLogError("跳转页面异常"); + } + + } + + /** + * 判断是否是管理员 + * @param username + * @return + */ + public static boolean isAdmin(String username) throws Exception{ + return UserService.getInstance().isAdmin(UserService.getInstance().getUserByUserName(username).getId()); + } + + /** + * 去掉浏览器中的参数 + * @param url + * @param param + * @return + */ + public static String removeParam(String url,String param){ + if(!url.contains("?"+param) && !url.contains("&"+param)){ + return url; + } + + return url.substring(0,url.indexOf(url.contains("?"+param) ? "?"+param : "&"+param)); + } + + /** + * 获取跳转链接 + * @param req + * @param param + * @return + */ + public static String getRedirectUrl(HttpServletRequest req,String param){ + String url = FRUtils.getAllUrl(req); + + if(isNotNullStr(param)){ + url = removeParam(url,param); + } + + url = encodeCH(url); + + return url; + } + + /** + * 去除空格换行 + * @param str + * @return + */ + public static String trim(String str){ + return str.trim().replaceAll("\n","").replaceAll("\r",""); + } + + /** + * list 转化为指定字符分割的字符串 + * @param list + * @param list + * @return + */ + public static String listToStr(List list, String split){ + String result = ""; + + if(list == null || list.size() <= 0){ + return result; + } + + for(String str : list){ + result+=","+str; + } + + result = result.substring(1); + + return result; + } + + /** + * array 转化为指定字符分割的字符串 + * @param list + * @param list + * @return + */ + public static String arrayToStr(String[] list, String split){ + String result = ""; + + if(list == null ||list.length <= 0){ + return result; + } + + for(int i=0;i size = Holders.simple(""); + + + + public String getSize() { + return size.get(); + } + + public void setSize(String url) { + this.size.set(url); + } + + + + @Override + public Object clone() throws CloneNotSupportedException { + WinkSimpleConfig cloned = (WinkSimpleConfig) super.clone(); +// cloned.text = (Conf) text.clone(); +// cloned.count = (Conf) count.clone(); +// cloned.price = (Conf) price.clone(); +// cloned.time = (Conf) time.clone(); +// cloned.student = (Conf) student.clone(); + return cloned; + } + +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DecryptRequest.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DecryptRequest.java new file mode 100644 index 0000000..f119e77 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DecryptRequest.java @@ -0,0 +1,114 @@ +package com.eco.plugin.wink.xdfileencrypt.filter; + +import com.eco.plugin.wink.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.wink.xdfileencrypt.utils.HttpUtils; +import com.fr.base.core.IgnoreBytesInputStream; +import com.fr.base.core.ParseResult; +import com.fr.base.core.PostParseUtils; +import com.fr.cache.Attachment; +import com.fr.cache.type.AttachmentScope; +import com.fr.general.IOUtils; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.fileupload.FileItem; +import com.fr.third.org.apache.commons.fileupload.FileItemFactory; +import com.fr.third.org.apache.commons.fileupload.disk.DiskFileItemFactory; +import com.fr.third.org.apache.commons.fileupload.servlet.ServletFileUpload; +import com.fr.web.AttachmentHelper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.*; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class DecryptRequest extends HttpServletRequestWrapper { +// private static final String directory = "E:\\temp\\"; +// private static final String directory2 = "E:\\temp\\temp2\\"; + + private byte[] data; + public DecryptRequest(HttpServletRequest request,String filename) { + super(request); + init(filename); + } + + private void init(String filename) { + try { + getFileData((HttpServletRequest) getRequest()); + data = IOUtils.inputStream2Bytes(getRequest().getInputStream()); +// FileUtils.writeBytesToFile(data,directory2+"a.txt"); + } catch (IOException e) { + data = new byte[0]; + } + } + + private static void getFileData(HttpServletRequest req){ + if(ServletFileUpload.isMultipartContent(req)){ + FileItemFactory fileItemFactory =new DiskFileItemFactory(); + ServletFileUpload servletFileUpload =new ServletFileUpload(fileItemFactory); + servletFileUpload.setHeaderEncoding("utf-8"); + servletFileUpload.setFileSizeMax(1024*1024*100); + try { + List list = servletFileUpload.parseRequest(req); + for (FileItem fileItem : list) { + if(fileItem.isFormField()){ + String id = fileItem.getString("UTF-8"); + }else { + String fileItemName = fileItem.getName(); + String subname = fileItemName.substring(fileItemName.lastIndexOf("."), fileItemName.length()); + String filename2 = java.util.UUID.randomUUID() + subname; + String realPath = req.getServletContext().getRealPath("work"); + File file = new File(realPath + "/" + filename2); + fileItem.write(file); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() { + + final ByteArrayInputStream bais = new ByteArrayInputStream(data); + + return new ServletInputStream() { + + @Override + public int read() { + return bais.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DelegatingServletInputStream.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DelegatingServletInputStream.java new file mode 100644 index 0000000..bc84402 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/DelegatingServletInputStream.java @@ -0,0 +1,46 @@ +package com.eco.plugin.wink.xdfileencrypt.filter; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class DelegatingServletInputStream extends ServletInputStream { + private final InputStream sourceStream; + + public DelegatingServletInputStream(InputStream stream) { + this.sourceStream = stream; + } + + public final InputStream getSourceStream() { + return this.sourceStream; + } + @Override + public int read() throws IOException { + return this.sourceStream.read(); + } + + @Override + public void close() throws IOException { + super.close(); + this.sourceStream.close(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener listener) { } +} \ No newline at end of file diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptOutputStream.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptOutputStream.java new file mode 100644 index 0000000..e0fdb47 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptOutputStream.java @@ -0,0 +1,126 @@ +package com.eco.plugin.wink.xdfileencrypt.filter; + +import com.eco.plugin.wink.xdfileencrypt.config.WinkSimpleConfig; +import com.eco.plugin.wink.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.wink.xdfileencrypt.utils.HttpUtils; +import com.eco.plugin.wink.xdfileencrypt.utils.Utils; +import com.fr.json.JSONObject; +import com.fr.record.analyzer.EnableMetrics; + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.UUID; + + +@EnableMetrics +public class EncryptOutputStream extends ServletOutputStream { +// private static final String directory = "E:\\temp\\"; +// private static final String directory = "/opt/tomcat/temp/"; + private static final String directory = "/usr/fine/temp"; + private OutputStream original = null; + private boolean closed = false; + private ByteArrayOutputStream crypt = new ByteArrayOutputStream(); + + public EncryptOutputStream(OutputStream original){ + this.original = original; + } + + /** + * 实际加密的代码就在这里实现了 + * @param bytes + * @return + */ + private byte[] encrypt(byte[] bytes) throws IOException { + String filename = UUID.randomUUID().toString()+Utils.getFileSuffix(bytes); + String originFilePath =directory+filename; + FileUtils.writeBytesToFile(bytes,originFilePath); + File originFile = new File(originFilePath); + String fileSize = WinkSimpleConfig.getInstance().getSize(); + if(Utils.isNotNullStr(fileSize)){ + long size = Long.parseLong(fileSize); + long fileSizeReal = originFile.length()/1024/1024; + + if(fileSizeReal > size){ + throw new IOException("导出文件超出文件大小设置!"); + } + } + String result = HttpUtils.HttpPostJson("http://localhost:8090/encrypt?fileName="+filename,"",null); + JSONObject jsonObject = new JSONObject(result); + String filePath = jsonObject.getString("filePath"); + byte[] encryptFile = FileUtils.readBytesFromFile(filePath); + + while (validateFile(bytes,encryptFile)){ + encryptFile = FileUtils.readBytesFromFile(filePath); + } + + + byte[] resultByte = encryptFile.clone(); + + if(originFile.exists() && originFile.isFile()){ + originFile.delete(); + } + File targetFile = new File(filePath); + if(targetFile.exists() && targetFile.isFile()){ + targetFile.delete(); + } + + return resultByte; + } + + private boolean validateFile(byte[] bytes, byte[] encryptFile) { + return bytes[0] == encryptFile[0] && bytes[bytes.length-1] == encryptFile[encryptFile.length-1]; + } + + @Override + public void write(int b) throws IOException { + if (closed) { + throw new IOException("Cannot write to a closed output stream"); + } + crypt.write(b); + } + + @Override + public void close() throws IOException { + if( !closed ){ + byte[] bytes = crypt.toByteArray(); + bytes = encrypt(bytes); + original.write(bytes); + original.flush(); + original.close(); + closed = true; + } + } + + @Override + public void flush() throws IOException { + crypt.flush(); + } + + @Override + public void write(byte[] data) throws IOException { + write(data, 0, data.length); + } + + @Override + public void write(byte[] data, int off, int len) throws IOException { + if (closed) { + throw new IOException("Cannot write to a closed output stream"); + } + crypt.write(data, off, len); + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener listener) { + + } + +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptResponse.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptResponse.java new file mode 100644 index 0000000..4417607 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/EncryptResponse.java @@ -0,0 +1,23 @@ +package com.eco.plugin.wink.xdfileencrypt.filter; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.IOException; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021/7/15 + **/ +public class EncryptResponse extends HttpServletResponseWrapper { + public EncryptResponse(HttpServletResponse response) { + super(response); + } + + public ServletOutputStream getOutputStream()throws IOException { + ServletOutputStream original = super.getOutputStream(); + return new EncryptOutputStream(original); + } + +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/SSOFilter.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/SSOFilter.java new file mode 100644 index 0000000..466f18d --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/filter/SSOFilter.java @@ -0,0 +1,180 @@ +package com.eco.plugin.wink.xdfileencrypt.filter; + + +import com.eco.plugin.wink.xdfileencrypt.utils.FRUtils; +import com.eco.plugin.wink.xdfileencrypt.utils.FileUtils; +import com.eco.plugin.wink.xdfileencrypt.utils.HttpUtils; +import com.fr.base.core.IgnoreBytesInputStream; +import com.fr.base.core.ParseResult; +import com.fr.base.core.PostParseUtils; +import com.fr.cache.Attachment; +import com.fr.cache.AttachmentFileBase; +import com.fr.cache.AttachmentSource; +import com.fr.cache.factory.AttachmentFileManager; +import com.fr.cache.type.AttachmentScope; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.record.OperateMessage; +import com.fr.decision.webservice.utils.CharLimitType; +import com.fr.decision.webservice.utils.WebServiceUtils; +import com.fr.decision.webservice.v10.security.SecurityService; +import com.fr.general.CommonIOUtils; +import com.fr.general.ComparatorUtils; +import com.fr.intelli.record.MetricRegistry; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.security.WebSecurityConfig; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.io.FilenameUtils; +import com.fr.third.org.apache.http.entity.ContentType; +import com.fr.web.AttachmentHelper; +import com.fr.web.utils.WebUtils; + +import javax.servlet.FilterChain; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.UUID; + + +@EnableMetrics +@FunctionRecorder +public class SSOFilter extends AbstractGlobalRequestFilterProvider { + private static final byte[] NEW_LINE_BYTES = new byte[]{13, 10}; + private static final byte[] BOUNDARY_END = new byte[]{45, 45}; +// private static final String directory = "/opt/tomcat/temp/"; +// private static final String directory = "E:\\temp\\"; + private static final String directory = "/usr/fine/temp"; + + @Override + public String filterName() { + return "xdfileencryptFilter"; + } + + @Override + public String[] urlPatterns() { + return new String[]{"/*"}; + } + + @Override + public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain ){ + String url = FRUtils.getAllUrl(req); + + if(url.contains("global/export")){ + res = new EncryptResponse( res ); + } + + if(url.contains("attach/upload")){ + String filename = req.getParameter("filename"); + if(filename.contains(".xls") || filename.contains(".xlsx") || filename.contains(".csv")){ + try { + int width = Integer.valueOf(req.getParameter("width")); + int height = Integer.valueOf(req.getParameter("height")); + + uploadAttach(req,res,width,height,filename,false); + } catch (Exception e) { + FRUtils.FRLogInfo("上传文件失败:"+filename); + } + + return ; + } + } + + release(req,res,chain); + } + + private static void uploadAttach(HttpServletRequest req, HttpServletResponse res, int width, int height, String filename, boolean isHolder) throws Exception { + SecurityService.checkXss(filename); + if (!filename.startsWith(" ") && !WebServiceUtils.containIllegalChars(CharLimitType.UPLOAD_FILE_NAME_LIMIT, filename)) { + ServletInputStream is = req.getInputStream(); + ParseResult fileheader = PostParseUtils.parse(is, req.getCharacterEncoding()); + + /** + * 文件落盘 + */ + String filenameNew = directory+"jm"+ UUID.randomUUID().toString()+ filename; + IgnoreBytesInputStream ignoreBytesInputStream = new IgnoreBytesInputStream(is, concat(concat(NEW_LINE_BYTES, fileheader.getBoundary().getBytes()), BOUNDARY_END)); + FileUtils.inputstreamToFile(ignoreBytesInputStream,filenameNew); + + + /** + * 获取新文件inputStream + */ + byte[] decryptFileByte = HttpUtils.getFileByte("http://localhost:8090/decrypt?fileName="+URLEncoder.encode(filenameNew)); + InputStream inputStream = new ByteArrayInputStream(decryptFileByte); + IgnoreBytesInputStream ignoreBytesInputStream2 = new IgnoreBytesInputStream(inputStream, concat(concat(NEW_LINE_BYTES, fileheader.getBoundary().getBytes()), BOUNDARY_END)); + + String fileType = fileheader.getContentType().indexOf("image") > 0 ? "image" : "other"; + Attachment attachment = addAttachment(fileType, CodeUtils.cjkDecode(filename), ignoreBytesInputStream2, width, height, isHolder ? AttachmentScope.HOLDER : AttachmentScope.DEFAULT); + if (WebSecurityConfig.getInstance().isFileVerificationEnabled()) { + checkFile(fileType, attachment, filename); + } + + MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-Attachment", "Dec-Attachment_Upload", filename, "Dec-Log_Add")); + res.setContentType(ContentType.APPLICATION_JSON.getMimeType()); + PrintWriter var12 = WebUtils.createPrintWriter(res); + var12.print(attachment.toConfig()); + var12.flush(); + var12.close(); + } else { + throw new Exception("Dec-Data_Set_File_Name_Error"); + } + } + + /** + * 添加附件 + * @param fileType 附件类型 image or other + * @param filename + * @param is + * @param width + * @param height + * @param scope + * @return + */ + public static Attachment addAttachment(String fileType, String filename, InputStream is, int width, int height, AttachmentScope scope) { + AttachmentFileBase fileBase = AttachmentFileManager.getManager().createFile((String)null, is, scope); + Attachment attachment = new Attachment(fileBase.getFileName(), fileType, filename, fileBase, width, height, scope); + AttachmentSource.putAttachment(fileBase.getFileName(), attachment); + return attachment; + } + + private static byte[] concat(byte[] var1, byte[] var2) { + byte[] var3 = new byte[var1.length + var2.length]; + System.arraycopy(var1, 0, var3, 0, var1.length); + System.arraycopy(var2, 0, var3, var1.length, var2.length); + return var3; + } + + private static void checkFile(String var1, Attachment var2, String var3) throws Exception { + InputStream var4 = var2.getInputStream(); + if (ComparatorUtils.equals(var1, "image") && var4.available() > 20971520) { + AttachmentHelper.removeAttachment(var2.getID()); + throw new Exception("Dec-File_Too_Large_Error"); + } else { + try { + boolean var5 = WebSecurityConfig.getInstance().getFileInspector().checkFileType(var4, FilenameUtils.getExtension(var3)); + if (!var5) { + AttachmentHelper.removeAttachment(var2.getID()); + throw new Exception("Dec-Invalid_file_Error"); + } + } finally { + CommonIOUtils.close(var4); + } + + } + } + //放行拦截器 + private void release(HttpServletRequest req, HttpServletResponse res, FilterChain chain) { + try{ + chain.doFilter(req,res); + }catch (Exception e){ + + } + } + +} + diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/localeFinder/locale.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/localeFinder/locale.java new file mode 100644 index 0000000..b97f561 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/localeFinder/locale.java @@ -0,0 +1,10 @@ +package com.eco.plugin.wink.xdfileencrypt.localeFinder; + +import com.fr.stable.fun.impl.AbstractLocaleFinder; + +public class locale extends AbstractLocaleFinder{ + @Override + public String find() { + return "com/eco/plugin/wink/xdfileencrypt/locale/locale"; + } +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FRUtils.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FRUtils.java new file mode 100644 index 0000000..25728c7 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FRUtils.java @@ -0,0 +1,363 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +import com.fr.base.ServerConfig; +import com.fr.base.TableData; +import com.fr.base.TemplateUtils; +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; +import com.fr.decision.authority.data.User; +import com.fr.decision.base.util.UUIDUtil; +import com.fr.decision.privilege.TransmissionTool; +import com.fr.decision.privilege.encrpt.PasswordValidator; +import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; +import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.utils.DecisionStatusService; +import com.fr.decision.webservice.utils.UserSourceFactory; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.event.LogInOutEvent; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.event.EventDispatcher; +import com.fr.file.TableDataConfig; +import com.fr.general.data.DataModel; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.third.springframework.web.method.HandlerMethod; +import com.fr.web.controller.ReportRequestService; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +public class FRUtils { + /** + * 判断用户是否存在 + * @param userName + * @return + */ + public static boolean isUserExist(String userName){ + if (StringUtils.isEmpty(userName)) { + return false; + } else { + try { + List userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); + return userList != null && !userList.isEmpty(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + return false; + } + } + } + + /** + * 判断是否登录FR + * @param req + * @return + */ + public static boolean isLogin(HttpServletRequest req){ + return LoginService.getInstance().isLogged(req); + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param userName + * @param url + */ + public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ + FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName+";跳转链接:"+url); + + //判断用户名是否为空 + if(!Utils.isNullStr(userName)){ + if(isUserExist(userName)){ + try { + LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); + + EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); + FineLoggerFactory.getLogger().info("FRLOG:登陆成功!"); + + if(!Utils.isNullStr(url)){ + httpServletResponse.sendRedirect(url); + } + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!"); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); + } + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param token + * @param url + */ + public static void loginByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token,String url){ + + FineLoggerFactory.getLogger().info("FRLOG:token:"+token+";跳转链接:"+url); + + //判断用户名是否为空 + if(!Utils.isNullStr(token)){ + writeToken2Cookie(httpServletResponse,token,-1); + + HttpSession session = httpServletRequest.getSession(true); + + httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,token); + + session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + + if(!Utils.isNullStr(url)){ + try { + httpServletResponse.sendRedirect(url); + } catch (IOException e) { + ResponseUtils.failedResponse(httpServletResponse,"跳转异常!"); + } + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"token不能为空!"); + } + } + + /** + * 产品原始登录方法 + * @param req + * @param res + * @param username + * @return + */ + public static JSONObject originLogin(HttpServletRequest req,HttpServletResponse res,String username){ +// String password = param.getString("password"); +// password = decryptFRPsd(password); + + FRUtils.FRLogInfo("originLogin:"+username); + + if(isUserExist(username)){ + try { + String token = LoginService.getInstance().login(req, res, username); + JSONObject result = new JSONObject(); + result.put("username",username); + result.put("validity",-1); + result.put("accessToken",token); + result.put("username",username); + result.put("url","/webroot/decision"); + JSONObject originUrlResponse = new JSONObject(); + originUrlResponse.put("originUrl","/webroot/decision"); + originUrlResponse.put("method","GET"); + originUrlResponse.put("parameters",new JSONObject()); + result.put("originUrlResponse",originUrlResponse); + return new JSONObject().put("data",result); + } catch (Exception e) { + ResponseUtils.failedResponse(res,"登录异常,请联系管理员!"); + } + }else{ + ResponseUtils.failedResponse(res,"用户在报表系统中不存在!"); + } + + return new JSONObject(); + } + + /** + * 获取token + * @param httpServletRequest + * @param httpServletResponse + * @param username + * @return + */ + public static String getToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String username){ + String token = ""; + try { + token = LoginService.getInstance().login(httpServletRequest, httpServletResponse, username); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:获取token失败"+e.getMessage()); + } + + return token; + } + + private static void writeToken2Cookie(HttpServletResponse req, String token, int num) { + try { + if (StringUtils.isNotEmpty(token)) { + Cookie cookie = new Cookie("fine_auth_token", token); + long maxAge = num == -2 ? 1209600000L : (long)num; + cookie.setMaxAge((int)maxAge); + cookie.setPath(ServerConfig.getInstance().getCookiePath()); + req.addCookie(cookie); + Cookie rememberCookie = new Cookie("fine_remember_login", String.valueOf(num == -2 ? -2 : -1)); + rememberCookie.setMaxAge((int)maxAge); + rememberCookie.setPath(ServerConfig.getInstance().getCookiePath()); + req.addCookie(rememberCookie); + } else { + FineLoggerFactory.getLogger().error("empty token cannot save."); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + + /** + * 后台登出 + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logoutByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token) + { + httpServletRequest.setAttribute("fine_auth_token",token); + logout(httpServletRequest,httpServletResponse); + } + + /** + * + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) + { + if(!isLogin(httpServletRequest)){ + return ; + } + + try { + LoginService.getInstance().logout(httpServletRequest,httpServletResponse); + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + } + + /** + * 打印FR日志 + * @param message + */ + public static void FRLogInfo(String message){ + FineLoggerFactory.getLogger().info("FRLOG:"+message); + } + + /** + * 打印FR日志-error + * @param message + */ + public static void FRLogError(String message){ + FineLoggerFactory.getLogger().error("FRLOG:"+message); + } + + + /** + * 根据用户名获取用户信息 + * @param userName + * @return + */ + public static User getFRUserByUserName(String userName){ + try { + return UserService.getInstance().getUserByUserName(userName); + } catch (Exception e) { + FRLogInfo("获取用户信息异常:"+e.getMessage()); + } + + return null; + } + + /** + * 解密FR密码 + * @param password + * @return + */ + public static String decryptFRPsd(String password){ + FRLogInfo("解密密码:"+password); + return TransmissionTool.decrypt(password); + } + + /** + * 根据明文密码生成数据库中的密码,用户密码校验用 + * @return + */ + public static String getDBPsd(String username,String password){ + PasswordValidator pv = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); + String uuid = UUIDUtil.generate(); + + return pv.encode(username, password, uuid); + } + + /** + * 获取带参数的访问链接 + * @return + */ + public static String getAllUrl(HttpServletRequest httpServletRequest){ + return WebUtils.getOriginalURL(httpServletRequest); + } + + /** + * 根据originKey获取源链接 + * @param req + * @return + * @throws Exception + */ + public static String getOriginUrl(HttpServletRequest req) throws Exception { + String origin = req.getParameter("origin"); + if (StringUtils.isNotEmpty(origin)) { + OriginUrlResponseBean originUrlResponseBean = (OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(origin); + DecisionStatusService.originUrlStatusService().delete(origin); + if (originUrlResponseBean != null) { + return originUrlResponseBean.getOriginUrl(); + } + } + + return new OriginUrlResponseBean(TemplateUtils.render("${fineServletURL}")).getOriginUrl(); + } + + /** + * 判断是否开启模板认证 + * @param + * @return + * @throws Exception + */ + public static boolean isTempAuth(HttpServletRequest req,HttpServletResponse res) throws Exception { + ReportTemplateRequestChecker checker = new ReportTemplateRequestChecker(); + HandlerMethod hm = new HandlerMethod(new ReportRequestService(),ReportRequestService.class.getMethod("preview", HttpServletRequest.class, HttpServletResponse.class, String.class)); + return checker.checkRequest(req,res,hm); + } + + /** + * 获取数据集数据 + * @param serverDataSetName + * @return + */ + public static DataModel getTableData(String serverDataSetName){ + TableData userInfo = TableDataConfig.getInstance().getTableData(serverDataSetName); + DataModel userInfoDM = userInfo.createDataModel(Calculator.createCalculator()); +// userInfoDM.getRowCount(); +// userInfoDM.getColumnIndex(); +// userInfoDM.getValueAt() + return userInfoDM; + } + + public static String getIndex(HttpServletRequest req){ + String url = req.getScheme()+"://"+req.getServerName()+":"+String.valueOf(req.getServerPort())+req.getRequestURI(); + return url; + } + + /** + * 获取帆软域名 + * @param req + * @return + */ + public static String getFRDomain(HttpServletRequest req){ + return getAllUrl(req).split("/webroot")[0]; + } +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FileUtils.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FileUtils.java new file mode 100644 index 0000000..18abd04 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/FileUtils.java @@ -0,0 +1,102 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +import com.finebi.web.action.v5.api.BiApiAction; +import com.fr.base.core.IgnoreBytesInputStream; + +import java.io.*; + +public class FileUtils { + public static void writeBytesToFile(byte[] bFile, String fileDest) { + FileOutputStream fileOuputStream = null; + try { + fileOuputStream = new FileOutputStream(fileDest); + fileOuputStream.write(bFile); + + } catch (IOException e) { + }finally { + if(fileOuputStream != null){ + try { + fileOuputStream.flush(); + fileOuputStream.close(); + } catch (IOException e) { + } + + } + } + + } + + public static void inputstreamToFile(IgnoreBytesInputStream inputStream, String filePath){ + BufferedOutputStream bos = null; + BufferedInputStream bis = new BufferedInputStream(inputStream); + try { + bos = new BufferedOutputStream(new FileOutputStream(new File(filePath))); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) { + bos.write(buffer, 0, bytesRead); + } + } catch (Exception e) { + + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + } + inputStream = null; + } + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + } + bos = null; + } + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + } + bis = null; + } + } + } + + public static byte[] readBytesFromFile(String filePath) { + + FileInputStream fileInputStream = null; + + byte[] bytesArray = null; + + try { + File file = new File(filePath); + + bytesArray = new byte[(int) file.length()]; + fileInputStream = new FileInputStream(file); + + fileInputStream.read(bytesArray); + + } catch (IOException e) { + + e.printStackTrace(); + + } finally { + + if (fileInputStream != null) { + + try { + fileInputStream.close(); + + } catch (IOException e) { + } + + } + + } + + return bytesArray; + + } + +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/HttpUtils.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/HttpUtils.java new file mode 100644 index 0000000..c6d78fc --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/HttpUtils.java @@ -0,0 +1,348 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpEntity; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.NameValuePair; +import com.fr.third.org.apache.http.client.CookieStore; +import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; +import com.fr.third.org.apache.http.client.methods.HttpGet; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.BasicCookieStore; +import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.cookie.BasicClientCookie; +import com.fr.third.org.apache.http.message.BasicNameValuePair; +import com.fr.third.org.apache.http.ssl.SSLContexts; +import com.fr.third.org.apache.http.ssl.TrustStrategy; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.servlet.http.Cookie; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class HttpUtils { + + /** + * httpGet请求 + * @param url + * @return + */ + public static String httpGet(String url,Cookie[] cookies,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--url:"+url); + + //创建httpClient + CloseableHttpClient httpclient = createHttpClient(cookies); + + HttpGet getMethod = new HttpGet(url); + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + getMethod.setHeader(key,header.get(key)); + } + } + + try { + HttpResponse response = httpclient.execute(getMethod); + int status =response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--status:"+status +";returnResult:"+returnResult); + + httpclient.close(); + + if (status == HttpStatus.SC_OK) { + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return ""; + } + + public static byte[] httpPostByte(String url,byte[] param){ + OutputStream out = null; + BufferedReader in = null; + String result = ""; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("Content-Type", "text/plain"); + conn.setRequestProperty("user-agent", + "PostmanRuntime/7.29.0"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + /*-----------------------------------------*/ + /*注意这里使用字节流*/ + out = new BufferedOutputStream(conn.getOutputStream()); + // 发送请求参数 + out.write(param); + // flush输出流的缓冲 + out.flush(); + /*-----------------------------------------*/ + // 定义BufferedReader输入流来读取URL的响应 + byte[] file = toByteArray(conn.getInputStream()); + + return file; + + } catch (Exception e) { + } + //使用finally块来关闭输出流、输入流 + finally{ + try{ + if(out!=null){ + out.close(); + } + if(in!=null){ + in.close(); + } + } + catch(IOException ex){ + + } + } + + return new byte[0]; + } + + /** + * HttpPost请求 + * @param postMethod + * @return + */ + private static String HttpPost(HttpPost postMethod){ + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + int status = response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:status:"+status+"returnResult:"+returnResult); + httpclient.close(); + + if (status == HttpStatus.SC_OK) { + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return ""; + } + + public static String HttpPostXML(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/html"); + HttpEntity entity = null; + try { + entity = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + + return HttpPost(postMethod); + } + + public static String HttpPostText(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/plain"); + HttpEntity entity = null; + try { + entity = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + + return HttpPost(postMethod); + } + + public static byte[] toByteArray(InputStream input) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024*4]; + int n = 0; + while (-1 != (n = input.read(buffer))) { + output.write(buffer, 0, n); + } + return output.toByteArray(); + } + + public static byte[] getFileByte(String url){ + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + HttpEntity entity = response.getEntity(); + byte[] file = toByteArray(entity.getContent()); + return file; + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:exception:"+e.getMessage()); + } + + try { + httpclient.close(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); + } + + return new byte[1]; + } + + public static String HttpPostJson(String url, String param,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:getFileByte:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(!Utils.isNullStr(param)){ + HttpEntity entity = null; + try { + entity = new StringEntity(param); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity); + } + + return HttpPost(postMethod); + } + + public static String HttpPostForm(String url, Map header,Map param){ + FineLoggerFactory.getLogger().info("FRLOG:HttpForm:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(param != null && param.size() > 0){ + List params = new ArrayList(param.size()); + + for(Map.Entry map : param.entrySet()){ + params.add(new BasicNameValuePair(map.getKey(), map.getValue())); + } + + try { + postMethod.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpForm:异常:"+e.getMessage()); + return ""; + } + } + + return HttpPost(postMethod); + } + + private static CloseableHttpClient createHttpClient(Cookie[] cookies){ + + SSLContext sslContext = null; + try { + sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(); + } catch (Exception e) { + FRUtils.FRLogInfo("exception:"+e.getMessage()); + } + + CloseableHttpClient httpclient = null; + + if(cookies != null && cookies.length > 0){ + CookieStore cookieStore = cookieToCookieStore(cookies); + + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).setDefaultCookieStore(cookieStore).build(); + } + else{ + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + } + + return httpclient; + } + + /** + * cookies转cookieStore + * @param cookies + * @return + */ + public static CookieStore cookieToCookieStore(Cookie[] cookies){ + CookieStore cookieStore = new BasicCookieStore(); + + if(cookies != null && cookies.length>0){ + for(Cookie cookie : cookies){ + BasicClientCookie cookie1 = new BasicClientCookie(cookie.getName(), cookie.getValue()); + cookieStore.addCookie(cookie1); + } + } + + return cookieStore; + } +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/ResponseUtils.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/ResponseUtils.java new file mode 100644 index 0000000..7c374ca --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/ResponseUtils.java @@ -0,0 +1,108 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class ResponseUtils { + private static final int SUCCESS = 200; + private static final int FAILED = -1; + + public static void successResponse(HttpServletResponse res, String body) { + response(res, body, SUCCESS); + } + + public static void failedResponse(HttpServletResponse res, String body) { + response(res, body, FAILED); + } + + private static void response(HttpServletResponse res, String body, int code) { + JSONObject object = new JSONObject(); + PrintWriter pw; + try { + object.put("code", code); + object.put("data", body); + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = object.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void response(HttpServletResponse res,JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = json.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void responseText(HttpServletResponse res,String text){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/html;charset=utf-8"); + pw.println(text); + pw.flush(); + pw.close(); + } + + public static void responseXml(HttpServletResponse res,String xml){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/xml;charset=utf-8"); + pw.println(xml); + pw.flush(); + pw.close(); + } + + public static void setCSRFHeader(HttpServletResponse httpServletResponse){ + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH"); + httpServletResponse.setHeader("Access-Control-Max-Age", "36000"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization"); + } + + public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/javascript;charset=utf-8;charset=utf-8"); + String result = json.toString(); + + String jsonp=req.getParameter("callback"); + + pw.println(jsonp+"("+result+")"); + pw.flush(); + pw.close(); + } +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Test.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Test.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/TypeDict.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/TypeDict.java new file mode 100644 index 0000000..84f22d1 --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/TypeDict.java @@ -0,0 +1,49 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +public class TypeDict { + /** + 常用文件的文件头如下:(以前六位为准) + JPEG (jpg),文件头:FFD8FF + PNG (png),文件头:89504E47 + GIF (gif),文件头:47494638 + TIFF (tif),文件头:49492A00 + Windows Bitmap (bmp),文件头:424D + CAD (dwg),文件头:41433130 + Adobe Photoshop (psd),文件头:38425053 + Rich Text Format (rtf),文件头:7B5C727466 + XML (xml),文件头:3C3F786D6C + HTML (html),文件头:68746D6C3E + Email [thorough only] (eml),文件头:44656C69766572792D646174653A + Outlook Express (dbx),文件头:CFAD12FEC5FD746F + Outlook (pst),文件头:2142444E + MS Word/Excel (xls.or.doc),文件头:D0CF11E0 + MS Access (mdb),文件头:5374616E64617264204A + WordPerfect (wpd),文件头:FF575043 + Postscript (eps.or.ps),文件头:252150532D41646F6265 + Adobe Acrobat (pdf),文件头:255044462D312E + Quicken (qdf),文件头:AC9EBD8F + Windows Password (pwl),文件头:E3828596 + ZIP Archive (zip),文件头:504B0304 + RAR Archive (rar),文件头:52617221 + Wave (wav),文件头:57415645 + AVI (avi),文件头:41564920 + Real Audio (ram),文件头:2E7261FD + Real Media (rm),文件头:2E524D46 + MPEG (mpg),文件头:000001BA + MPEG (mpg),文件头:000001B3 + Quicktime (mov),文件头:6D6F6F76 + Windows Media (asf),文件头:3026B2758E66CF11 + MIDI (mid),文件头:4D546864 + */ + public static String checkType(String fileheader) { + + switch (fileheader) { + case "D0CF11": return ".xls"; + case "255044": return ".pdf"; + case "504B03": return ".xlsx"; + case "EFBBBF": return ".csv"; + default: return "0000"; + } + } + +} diff --git a/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Utils.java b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Utils.java new file mode 100644 index 0000000..11316ac --- /dev/null +++ b/src/main/java/com/eco/plugin/xx/xdfileencrypt/utils/Utils.java @@ -0,0 +1,369 @@ +package com.eco.plugin.wink.xdfileencrypt.utils; + +import com.fr.base.TemplateUtils; +import com.fr.data.NetworkHelper; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.io.utils.ResourceIOUtils; +import com.fr.json.JSONObject; +import com.fr.stable.CodeUtils; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Utils { + + public static byte[] getByteHeader(byte[] bytes){ + byte[] newByte = new byte[3]; + for(int i=0;i parameterMap){ + if(parameterMap == null){ + parameterMap = new HashMap(); + } + + try { + String macPage = TemplateUtils.renderTemplate(path, parameterMap); + WebUtils.printAsString(res, macPage); + }catch (Exception e){ + FRUtils.FRLogError("跳转页面异常"); + } + + } + + /** + * 判断是否是管理员 + * @param username + * @return + */ + public static boolean isAdmin(String username) throws Exception{ + return UserService.getInstance().isAdmin(UserService.getInstance().getUserByUserName(username).getId()); + } + + /** + * 去掉浏览器中的参数 + * @param url + * @param param + * @return + */ + public static String removeParam(String url,String param){ + if(!url.contains("?"+param) && !url.contains("&"+param)){ + return url; + } + + return url.substring(0,url.indexOf(url.contains("?"+param) ? "?"+param : "&"+param)); + } + + /** + * 获取跳转链接 + * @param req + * @param param + * @return + */ + public static String getRedirectUrl(HttpServletRequest req,String param){ + String url = FRUtils.getAllUrl(req); + + if(isNotNullStr(param)){ + url = removeParam(url,param); + } + + url = encodeCH(url); + + return url; + } + + /** + * 去除空格换行 + * @param str + * @return + */ + public static String trim(String str){ + return str.trim().replaceAll("\n","").replaceAll("\r",""); + } + + /** + * list 转化为指定字符分割的字符串 + * @param list + * @param list + * @return + */ + public static String listToStr(List list, String split){ + String result = ""; + + if(list == null || list.size() <= 0){ + return result; + } + + for(String str : list){ + result+=","+str; + } + + result = result.substring(1); + + return result; + } + + /** + * array 转化为指定字符分割的字符串 + * @param list + * @param list + * @return + */ + public static String arrayToStr(String[] list, String split){ + String result = ""; + + if(list == null ||list.length <= 0){ + return result; + } + + for(int i=0;i