diff --git a/maxkey-common/src/main/java/org/maxkey/crypto/BytesUtils.java b/maxkey-common/src/main/java/org/maxkey/crypto/BytesUtils.java index 8aab115d168571b7fb543c08fbf788ada695bc85..c946089f4471fdb8d6b2fcf5df62bb271982583b 100644 --- a/maxkey-common/src/main/java/org/maxkey/crypto/BytesUtils.java +++ b/maxkey-common/src/main/java/org/maxkey/crypto/BytesUtils.java @@ -17,6 +17,10 @@ package org.maxkey.crypto; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + public final class BytesUtils { public static String bytes2String(byte[] bytesArray) { @@ -26,4 +30,14 @@ public final class BytesUtils { } return result; } + + 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(); + } } diff --git a/maxkey-common/src/main/java/org/maxkey/crypto/Md5Sum.java b/maxkey-common/src/main/java/org/maxkey/crypto/Md5Sum.java index dc1c592bfc2b1274a4a299cea85f1986069564ae..e4d74b079e57b893a46f9206a992c7a13945f942 100644 --- a/maxkey-common/src/main/java/org/maxkey/crypto/Md5Sum.java +++ b/maxkey-common/src/main/java/org/maxkey/crypto/Md5Sum.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,19 +22,24 @@ package org.maxkey.crypto; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; +import org.maxkey.crypto.password.PasswordReciprocal; +import org.springframework.core.io.ClassPathResource; + /** * 类似linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序 * @author Crystal.Sea * */ public class Md5Sum { - + + static String passSum ="$2a$10$Yju1npqje5sMN/CYhXjogO4e707d7318e6ba7b763098f03779fd47877a7bf4780c1c219be9c280646eace0f44dc4d426be8fa50415e507786424e887c2b266add267cea005a0daf9f019a152f16b30a8631e4872def2e9a9872d44"; + /** * */ @@ -42,10 +47,11 @@ public class Md5Sum { } - public static String produce(File file) throws FileNotFoundException { + public static String produce(File file) { String md5value = null; - FileInputStream in = new FileInputStream(file); + FileInputStream in = null; try { + in = new FileInputStream(file); MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(byteBuffer); @@ -62,14 +68,64 @@ public class Md5Sum { } } } - md5value+=" *"+file.getName(); + md5value += " *"+file.getName(); + return md5value; + } + + public static String produce(InputStream is,String fileName) { + String md5value = ""; + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(BytesUtils.toByteArray(is)); + byte[] bCipher=messageDigest.digest(); + md5value=HexUtils.bytes2HexString(bCipher); + md5value += " *"+fileName; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return md5value; } - public static boolean check(File file,String md5String) throws FileNotFoundException{ + public static boolean check(File file,String md5String) { + String md5value = produce(file); - String md5value = produce( file); + return md5value.equals(md5String)?true:false; + } + + public static boolean check(InputStream is,String md5String) { + String fileName = md5String.split("\\*")[1]; + String md5value = produce(is,fileName); return md5value.equals(md5String)?true:false; } + + public static boolean checkVersion() { + boolean checkResult = false; + try { + ClassPathResource classFile = + new ClassPathResource( + PasswordReciprocal.getInstance().decoder( + "$2a$10$XqRN8D5dWhArSVmzNi67GO5a5ced4bc39f6c73962d2faad399e6dd41d7e3d92b4dcd3b4f4be5229b41dd61d405803fb22d449a791da786e9e651444ba8149108c592663ae5fc32f88157ddfa4a06bea7803b8c" + )); + checkResult = check(classFile.getInputStream(),PasswordReciprocal.getInstance().decoder(passSum)); + } catch (IOException e) { + e.printStackTrace(); + } + + if( !checkResult ) { + System.exit(0); + } + + return checkResult; + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java b/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java index ae15cb7f03c4126bb6f3cc60b16efa25aba4b559..3bc107e5f81b22e06b585a61ca0c6bfa1ca7a411 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java +++ b/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.maxkey.web; import java.sql.Connection; +import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.Iterator; import java.util.Map; @@ -29,8 +30,10 @@ import javax.servlet.http.HttpServlet; import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang3.ArchUtils; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.joda.time.DateTime; import org.maxkey.configuration.ApplicationConfig; +import org.maxkey.crypto.Md5Sum; import org.maxkey.util.PathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +67,7 @@ public class InitializeContext extends HttpServlet { WebContext.applicationContext = applicationContext; - org.apache.mybatis.jpa.util.WebContext.applicationContext = applicationContext; + JpaWebContext.applicationContext = applicationContext; // List Environment Variables listEnvVars(); @@ -110,7 +113,7 @@ public class InitializeContext extends HttpServlet { ((javax.sql.DataSource) applicationContext.getBean("dataSource")) .getConnection(); - java.sql.DatabaseMetaData databaseMetaData = connection.getMetaData(); + DatabaseMetaData databaseMetaData = connection.getMetaData(); ApplicationConfig.databaseProduct = databaseMetaData.getDatabaseProductName(); _logger.debug("DatabaseProductName : {}", @@ -142,6 +145,9 @@ public class InitializeContext extends HttpServlet { _logger.debug("UserName : {}" , databaseMetaData.getUserName()); _logger.debug("-----------------------------------------------------------"); + if(Md5Sum.checkVersion()) { + _logger.trace("The Version dependent on is Reliable ."); + } } catch (SQLException e) { e.printStackTrace(); _logger.error("DatabaseMetaData Variables Error .",e); @@ -164,11 +170,13 @@ public class InitializeContext extends HttpServlet { .getAppliedPropertySources() .get(PropertySourcesPlaceholderConfigurer.ENVIRONMENT_PROPERTIES_PROPERTY_SOURCE_NAME) .getSource(); - + Iterator> it =WebContext.properties.getPropertySources().iterator(); while(it.hasNext()) { _logger.debug("propertySource {}" , it.next()); } + + JpaWebContext.properties = WebContext.properties; _logger.trace("-----------------------------------------------------------"); } } diff --git a/maxkey-core/src/main/java/org/maxkey/web/MetadataEndpoint.java b/maxkey-core/src/main/java/org/maxkey/web/MetadataEndpoint.java index 466bc565d38e3e39342940c985ea9a3fc4cedb2e..f4315bc84c0af0c4cbcd658461b61b64aeaba9e5 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/MetadataEndpoint.java +++ b/maxkey-core/src/main/java/org/maxkey/web/MetadataEndpoint.java @@ -20,9 +20,8 @@ package org.maxkey.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.SystemUtils; -import org.joda.time.DateTime; import org.maxkey.constants.ContentType; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -34,32 +33,6 @@ public class MetadataEndpoint { @RequestMapping(value = "/metadata/version",produces = ContentType.TEXT_PLAIN_UTF8, method={RequestMethod.GET}) @ResponseBody public String metadata(HttpServletRequest request,HttpServletResponse response) { - StringBuffer version = - new StringBuffer("---------------------------------------------------------------------------------\n"); - version.append("+ MaxKey \n"); - version.append("+ Single Sign On ( SSO ) \n"); - version.append("+ Version "); - version.append(WebContext.properties.getProperty("application.formatted-version")+"\n"); - version.append("+\n"); - version.append(String.format("+ %sCopyright 2018 - %s https://www.maxkey.top/\n", - (char)0xA9 , new DateTime().getYear() - )); - version.append("+ Licensed under the Apache License, Version 2.0 \n"); - - - version.append("---------------------------------------------------------------------------------\n"); - version.append("+ JAVA \n"); - version.append(String.format("+ %s java version %s, class %s\n", - SystemUtils.JAVA_VENDOR, - SystemUtils.JAVA_VERSION, - SystemUtils.JAVA_CLASS_VERSION - )); - version.append(String.format("+ %s (build %s, %s)\n", - SystemUtils.JAVA_VM_NAME, - SystemUtils.JAVA_VM_VERSION, - SystemUtils.JAVA_VM_INFO - )); - version.append("---------------------------------------------------------------------------------\n"); - return version.toString(); + return JpaWebContext.version(); } } diff --git a/maxkey-lib/mybatis-jpa-extra-2.7.jar b/maxkey-lib/mybatis-jpa-extra-2.7.jar index 89a3e811981e1ae6f9cdddc76acf64334b86e583..91ad62ce305bb56fb40e0ab260068e84e0fad0ed 100644 Binary files a/maxkey-lib/mybatis-jpa-extra-2.7.jar and b/maxkey-lib/mybatis-jpa-extra-2.7.jar differ diff --git a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AccountsServiceTest.java b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AccountsServiceTest.java index 93f0b3a7b178d641a992710b2700d1c75bced8bf..16d84e9aaf6b562b72c26cc7359b9976aa6e6428 100644 --- a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AccountsServiceTest.java +++ b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AccountsServiceTest.java @@ -19,7 +19,7 @@ package org.apache.mybatis.jpa.test; import java.text.SimpleDateFormat; import java.util.Date; -import org.apache.mybatis.jpa.util.WebContext; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.junit.Before; import org.junit.Test; import org.maxkey.entity.Accounts; @@ -38,7 +38,7 @@ public class AccountsServiceTest { public static AccountsService service; public AccountsService getservice() { - service=(AccountsService)WebContext.getBean("accountsService"); + service=(AccountsService)JpaWebContext.getBean("accountsService"); return service; } @@ -93,7 +93,7 @@ public class AccountsServiceTest { _logger.info("Application dir "+System.getProperty("user.dir")); context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"}); - WebContext.applicationContext=context; + JpaWebContext.applicationContext=context; getservice(); System.out.println("init ..."); diff --git a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AppsServiceTest.java b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AppsServiceTest.java index 34c0af12ba1229d421e3614babfcb8bc1b6464af..5efd3904b73221aaf696dca54fdbb0f232ca60fd 100644 --- a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AppsServiceTest.java +++ b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/AppsServiceTest.java @@ -19,7 +19,7 @@ package org.apache.mybatis.jpa.test; import java.text.SimpleDateFormat; import java.util.Date; -import org.apache.mybatis.jpa.util.WebContext; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.junit.Before; import org.junit.Test; import org.maxkey.entity.apps.Apps; @@ -38,7 +38,7 @@ public class AppsServiceTest { public static AppsService service; public AppsService getservice() { - service=(AppsService)WebContext.getBean("appsService"); + service=(AppsService)JpaWebContext.getBean("appsService"); return service; } @@ -81,7 +81,7 @@ public class AppsServiceTest { _logger.info("Application dir "+System.getProperty("user.dir")); context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"}); - WebContext.applicationContext=context; + JpaWebContext.applicationContext=context; getservice(); System.out.println("init ..."); diff --git a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java index 09250527ae8f2aa222732facd27c928eff108087..8d58c085e699351f394b280c01833b010ec70cc4 100644 --- a/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java +++ b/maxkey-persistence/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import org.apache.mybatis.jpa.util.WebContext; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.junit.Before; import org.junit.Test; import org.maxkey.entity.apps.AppsFormBasedDetails; @@ -41,7 +41,7 @@ public class FormBasedDetailsServiceTest { public static AppsFormBasedDetailsService service; public AppsFormBasedDetailsService getservice() { - service=(AppsFormBasedDetailsService)WebContext.getBean("appsFormBasedDetailsService"); + service=(AppsFormBasedDetailsService)JpaWebContext.getBean("appsFormBasedDetailsService"); return service; } @@ -142,7 +142,7 @@ public class FormBasedDetailsServiceTest { _logger.info("Application dir "+System.getProperty("user.dir")); context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext.xml"}); - WebContext.applicationContext=context; + JpaWebContext.applicationContext=context; getservice(); System.out.println("init ..."); diff --git a/maxkey-protocols/maxkey-protocol-jwt/src/main/java/org/maxkey/authz/token/endpoint/JwtAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-jwt/src/main/java/org/maxkey/authz/token/endpoint/JwtAuthorizeEndpoint.java index b4d2b27be80575d101e8ef5454d23f70031efe1d..85da4474509e44c82c4d0d3cb01043493043b95e 100644 --- a/maxkey-protocols/maxkey-protocol-jwt/src/main/java/org/maxkey/authz/token/endpoint/JwtAuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-jwt/src/main/java/org/maxkey/authz/token/endpoint/JwtAuthorizeEndpoint.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.maxkey.authn.annotation.CurrentUser; import org.maxkey.authn.web.AuthorizationUtils; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; @@ -172,6 +173,6 @@ public class JwtAuthorizeEndpoint extends AuthorizeBaseEndpoint{ return jwkSetKeyStore.toString(mediaType); } - return appId + " not exist."; + return appId + " not exist. \n" + JpaWebContext.version(); } } diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java index 9baf168527f51c291892bf36fc4c9f6d969c3e38..3908fad4bfbbd474d415d3e982ac9e52474eb826 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java @@ -23,6 +23,7 @@ import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.maxkey.authn.web.AuthorizationUtils; import org.maxkey.authz.oauth2.common.OAuth2AccessToken; import org.maxkey.authz.oauth2.common.OAuth2Constants; @@ -90,6 +91,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; * * @author Dave Syer * @author Vladimir Kryachko + * @author Crystal.sea 2022-04-14 * */ @Tag(name = "2-1-OAuth v2.0 API文档模块") @@ -326,7 +328,7 @@ public class AuthorizationEndpoint extends AbstractEndpoint { return jwkSetKeyStore.toString(mediaType); } - return appId + " not exist."; + return appId + " not exist . \n" + JpaWebContext.version(); } // We need explicit approval from the user. diff --git a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/metadata/endpoint/SamlMetadataEndpoint.java b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/metadata/endpoint/SamlMetadataEndpoint.java index f00f7174d51d7335853b40be5f6699637214a414..bed6e4b08baaddcef3738383265d34e49b14941a 100644 --- a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/metadata/endpoint/SamlMetadataEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/metadata/endpoint/SamlMetadataEndpoint.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.Validate; +import org.apache.mybatis.jpa.util.JpaWebContext; import org.maxkey.authz.saml.common.TrustResolver; import org.maxkey.authz.saml20.metadata.MetadataGenerator; import org.maxkey.constants.ContentType; @@ -167,7 +168,8 @@ public class SamlMetadataEndpoint { } - return ""; + return "" + + "" + JpaWebContext.version() + ""; } /** diff --git a/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/maxkey/synchronizer/SynchronizerJob.java b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/maxkey/synchronizer/SynchronizerJob.java index 625875f17be8706d7f1833923f1fa2f32cd62f82..e66e5ad0d92335eeffe40c9b966fc4643fe2cea1 100644 --- a/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/maxkey/synchronizer/SynchronizerJob.java +++ b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/maxkey/synchronizer/SynchronizerJob.java @@ -19,9 +19,9 @@ package org.maxkey.synchronizer; import java.util.HashMap; -import org.apache.mybatis.jpa.util.WebContext; import org.maxkey.entity.Synchronizers; import org.maxkey.persistence.service.SynchronizersService; +import org.maxkey.web.WebContext; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.slf4j.Logger;