Browse Source

gradle build

gradle build
shimingxy 5 years ago
parent
commit
ba66c919f0
48 changed files with 1416 additions and 59 deletions
  1. 10 7
      build.gradle
  2. 0 1
      buildrelease.bat
  3. 1 0
      maxkey-client-sdk/.gitignore
  4. 1 0
      maxkey-core/.gitignore
  5. 3 3
      maxkey-core/src/test/java/com/connsec/util/PathUtilsTest.java
  6. 1 0
      maxkey-dao/.gitignore
  7. 1 1
      maxkey-dao/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java
  8. 1 0
      maxkey-jose-jwt/.gitignore
  9. 1 0
      maxkey-protocols/maxkey-protocol-authorize/.gitignore
  10. 0 0
      maxkey-protocols/maxkey-protocol-authorize/bin/main/.gitignore
  11. 2 2
      maxkey-protocols/maxkey-protocol-authorize/build.gradle
  12. 3 22
      maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/AuthorizeEndpoint.java
  13. 0 1
      maxkey-protocols/maxkey-protocol-cas/bin/test/.gitignore
  14. BIN
      maxkey-protocols/maxkey-protocol-cas/build/libs/maxkey-protocol-cas-1.0.0.RELEASE.jar
  15. 179 0
      maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/css/base-style.css
  16. 84 0
      maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/css/style.css
  17. 92 0
      maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/index.html
  18. 194 0
      maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/js/report.js
  19. 0 0
      maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/output.bin
  20. BIN
      maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/output.bin.idx
  21. 0 0
      maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/results.bin
  22. 7 0
      maxkey-protocols/maxkey-protocol-cas/build/tmp/jar/MANIFEST.MF
  23. BIN
      maxkey-protocols/maxkey-protocol-desktop/build/libs/maxkey-protocol-desktop-1.0.0.RELEASE.jar
  24. 7 0
      maxkey-protocols/maxkey-protocol-desktop/build/tmp/jar/MANIFEST.MF
  25. BIN
      maxkey-protocols/maxkey-protocol-extendapi/build/libs/maxkey-protocol-extendapi-1.0.0.RELEASE.jar
  26. 7 0
      maxkey-protocols/maxkey-protocol-extendapi/build/tmp/jar/MANIFEST.MF
  27. BIN
      maxkey-protocols/maxkey-protocol-formbased/build/libs/maxkey-protocol-formbased-1.0.0.RELEASE.jar
  28. 7 0
      maxkey-protocols/maxkey-protocol-formbased/build/tmp/jar/MANIFEST.MF
  29. 1 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build.gradle
  30. BIN
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/libs/maxkey-protocol-oauth-2.0-1.0.0.RELEASE.jar
  31. 3 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/MANIFEST.MF
  32. 2 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/spring.handlers
  33. 5 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/spring.schemas
  34. 728 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/org/springframework/security/oauth2/spring-security-oauth2-1.0.xsd
  35. 7 0
      maxkey-protocols/maxkey-protocol-oauth-2.0/build/tmp/jar/MANIFEST.MF
  36. 40 3
      maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java
  37. 0 1
      maxkey-protocols/maxkey-protocol-saml-2.0/bin/main/.gitignore
  38. BIN
      maxkey-protocols/maxkey-protocol-saml-2.0/build/libs/maxkey-protocol-saml-2.0-1.0.0.RELEASE.jar
  39. 7 0
      maxkey-protocols/maxkey-protocol-saml-2.0/build/tmp/jar/MANIFEST.MF
  40. BIN
      maxkey-protocols/maxkey-protocol-tokenbased/build/libs/maxkey-protocol-tokenbased-1.0.0.RELEASE.jar
  41. 7 0
      maxkey-protocols/maxkey-protocol-tokenbased/build/tmp/jar/MANIFEST.MF
  42. 1 1
      maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java
  43. 1 2
      maxkey-web-manage/.classpath
  44. 8 9
      maxkey-web-manage/.settings/org.eclipse.wst.common.component
  45. 1 2
      maxkey-web-manage/.settings/org.eclipse.wst.common.project.facet.core.xml
  46. 1 1
      maxkey-web-manage/build.gradle
  47. 1 1
      maxkey-web-maxkey/build.gradle
  48. 2 2
      setenv.bat

+ 10 - 7
build.gradle

@@ -124,6 +124,7 @@ subprojects {
         mavenCentral()
         jcenter()
         maven { url "https://maven.eveoh.nl/content/repositories/releases" }
+        maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases"}
         maven { url "https://plugins.gradle.org/m2/" }
         maven { url "http://repo.spring.io/plugins-release" }
         maven { url "https://repo.spring.io/milestone" }
@@ -319,7 +320,8 @@ subprojects {
 	    }
 	}
     
-  /*  task checkenv<<{
+    task checkenv{
+		println 'check env for project '
 	     //项目名
 	     println project.name
 	     //项目相对路径
@@ -329,16 +331,18 @@ subprojects {
 	     //项目的绝对路径
 	     println project.projectDir
 	     //项目的build文件绝对路径
-	     println project.buildDir
+	     println "buildDir " +project.buildDir
 	     //项目所在的group
 	     println project.group
 	     //项目的版本号
 	     println project.version
 	     //项目的ant对象
 	     println project.ant
-	}*/
+		 
+	}
 
     task copyjar2Release(type: Copy) {
+		println "$buildDir/libs/ to $rootDir/build/jars/"
 		into "$rootDir/build/jars/"
 	    from "$buildDir/libs/"
 	    include '*.jar'
@@ -361,10 +365,9 @@ subprojects {
 	    from "$buildDir/libs/"
 	}
 
-	//task buildRelease(dependsOn:['build','war','copyjar2Release','copyWar2Release','copyotherWar2Release','copydemoWar2Release']) << {
-	//task buildRelease(dependsOn:['copyjar2Release','copyWar2Release','copyotherWar2Release','copydemoWar2Release']) << {
-	//    println 'Build MaxKey '+project.name +' complete .'
-	//}
+	task buildRelease(dependsOn:['build','jar','copyjar2Release'])  {
+	   println 'Build MaxKey '+project.name +' complete .'
+	}
 }  
 
 

+ 0 - 1
buildrelease.bat

@@ -14,7 +14,6 @@ call %GRADLE_HOME%/bin/gradle war
 
 call %GRADLE_HOME%/bin/gradle buildRelease
 
-call %GRADLE_HOME%/bin/gradle buildReleaseGear
 
 cd build
 rd /q /s libs

+ 1 - 0
maxkey-client-sdk/.gitignore

@@ -0,0 +1 @@
+/build/

+ 1 - 0
maxkey-core/.gitignore

@@ -0,0 +1 @@
+/build/

+ 3 - 3
maxkey-core/src/test/java/com/connsec/util/PathUtilsTest.java

@@ -6,8 +6,8 @@ import org.maxkey.util.PathUtils;
 public class PathUtilsTest {
 	@Test
 	public void test()  {
-		System.out.println(PathUtils.getInstance().getAppPath());
-		System.out.println(PathUtils.getInstance().getWebInf());
-		System.out.println(PathUtils.getInstance().getClassPath());
+		//System.out.println(PathUtils.getInstance().getAppPath());
+		//System.out.println(PathUtils.getInstance().getWebInf());
+		//System.out.println(PathUtils.getInstance().getClassPath());
 	}
 }

+ 1 - 0
maxkey-dao/.gitignore

@@ -0,0 +1 @@
+/build/

+ 1 - 1
maxkey-dao/src/test/java/org/apache/mybatis/jpa/test/FormBasedDetailsServiceTest.java

@@ -25,7 +25,7 @@ public class FormBasedDetailsServiceTest {
 	public static AppsFormBasedDetailsService service;
 	
 	public AppsFormBasedDetailsService getservice() {
-		service=(AppsFormBasedDetailsService)WebContext.getBean("formBasedDetailsService");
+		service=(AppsFormBasedDetailsService)WebContext.getBean("appsFormBasedDetailsService");
 		return service;
 	}
 	

+ 1 - 0
maxkey-jose-jwt/.gitignore

@@ -0,0 +1 @@
+/build/

+ 1 - 0
maxkey-protocols/maxkey-protocol-authorize/.gitignore

@@ -0,0 +1 @@
+/build/

+ 0 - 0
maxkey-protocols/maxkey-protocol-cas/bin/main/.gitignore → maxkey-protocols/maxkey-protocol-authorize/bin/main/.gitignore


+ 2 - 2
maxkey-protocols/maxkey-protocol-authorize/build.gradle

@@ -10,7 +10,7 @@ dependencies {
 	compile project(":maxkey-dao")
    	compile project(":maxkey-jose-jwt")
    	compile project(":maxkey-client-sdk")
-   	compile project(":maxkey-protocols:maxkey-protocol-oauth-2.0")
-   	compile project(":maxkey-protocols:maxkey-protocol-saml-2.0")
+   	//compileOnly project(":maxkey-protocols:maxkey-protocol-oauth-2.0")
+   	//compileOnly project(":maxkey-protocols:maxkey-protocol-saml-2.0")
    
 }

+ 3 - 22
maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/AuthorizeEndpoint.java

@@ -5,16 +5,13 @@ package org.maxkey.authz.endpoint;
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.maxkey.authz.oauth2.provider.ClientDetailsService;
-import org.maxkey.client.utils.HttpEncoder;
+
 import org.maxkey.constants.PROTOCOLS;
 import org.maxkey.dao.service.AppsCasDetailsService;
 import org.maxkey.domain.apps.Apps;
-import org.maxkey.domain.apps.oauth2.provider.ClientDetails;
 import org.maxkey.web.WebConstants;
 import org.maxkey.web.WebContext;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,12 +23,6 @@ import org.springframework.web.servlet.ModelAndView;
  */
 @Controller
 public class AuthorizeEndpoint extends AuthorizeBaseEndpoint{
-	private static final String OAUTH_V20_AUTHORIZATION_URL = "%s/oauth/v20/authorize?client_id=%s&response_type=code&redirect_uri=%s&approval_prompt=auto";
-	
-	@Autowired
-	@Qualifier("oauth20JdbcClientDetailsService")
-	private ClientDetailsService clientDetailsService;
-	
 	@Autowired
 	AppsCasDetailsService casDetailsService;
 	
@@ -51,23 +42,13 @@ public class AuthorizeEndpoint extends AuthorizeBaseEndpoint{
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.FORMBASED)){
 			 modelAndView=WebContext.forward("/authz/formbased/"+id);
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OAUTH20)){
-			ClientDetails  clientDetails =clientDetailsService.loadClientByClientId(application.getId());
-			_logger.debug(""+clientDetails);
-			String authorizationUrl = String.format(OAUTH_V20_AUTHORIZATION_URL, 
-							applicationConfig.getServerPrefix(),
-							clientDetails.getClientId(), 
-							HttpEncoder.encode(clientDetails.getRegisteredRedirectUri().toArray()[0].toString())
-					);
-			
-			_logger.debug("authorizationUrl "+authorizationUrl);
-			
-			modelAndView=WebContext.redirect(authorizationUrl);
+			 modelAndView=WebContext.forward("/authz/oauthv20/"+application.getId());
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.OPEN_ID_CONNECT)){
 			// modelAndView=new ModelAndView("openid connect");
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.SAML20)){
 			 modelAndView=WebContext.forward("/authz/saml20/idpinit/"+application.getId());
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.TOKENBASED)){
-			modelAndView=WebContext.forward("/authorize/tokenbased/"+id);
+			modelAndView=WebContext.forward("/authz/tokenbased/"+id);
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.CAS)){
 			modelAndView=WebContext.forward("/authz/cas/"+id);
 		}else if (application.getProtocol().equalsIgnoreCase(PROTOCOLS.DESKTOP)){

+ 0 - 1
maxkey-protocols/maxkey-protocol-cas/bin/test/.gitignore

@@ -1 +0,0 @@
-/com/

BIN
maxkey-protocols/maxkey-protocol-cas/build/libs/maxkey-protocol-cas-1.0.0.RELEASE.jar


+ 179 - 0
maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/css/base-style.css

@@ -0,0 +1,179 @@
+
+body {
+    margin: 0;
+    padding: 0;
+    font-family: sans-serif;
+    font-size: 12pt;
+}
+
+body, a, a:visited {
+    color: #303030;
+}
+
+#content {
+    padding-left: 50px;
+    padding-right: 50px;
+    padding-top: 30px;
+    padding-bottom: 30px;
+}
+
+#content h1 {
+    font-size: 160%;
+    margin-bottom: 10px;
+}
+
+#footer {
+    margin-top: 100px;
+    font-size: 80%;
+    white-space: nowrap;
+}
+
+#footer, #footer a {
+    color: #a0a0a0;
+}
+
+#line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+#label-for-line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+ul {
+    margin-left: 0;
+}
+
+h1, h2, h3 {
+    white-space: nowrap;
+}
+
+h2 {
+    font-size: 120%;
+}
+
+ul.tabLinks {
+    padding-left: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    overflow: auto;
+    min-width: 800px;
+    width: auto !important;
+    width: 800px;
+}
+
+ul.tabLinks li {
+    float: left;
+    height: 100%;
+    list-style: none;
+    padding-left: 10px;
+    padding-right: 10px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-bottom: 0;
+    -moz-border-radius: 7px;
+    border-radius: 7px;
+    margin-right: 25px;
+    border: solid 1px #d4d4d4;
+    background-color: #f0f0f0;
+}
+
+ul.tabLinks li:hover {
+    background-color: #fafafa;
+}
+
+ul.tabLinks li.selected {
+    background-color: #c5f0f5;
+    border-color: #c5f0f5;
+}
+
+ul.tabLinks a {
+    font-size: 120%;
+    display: block;
+    outline: none;
+    text-decoration: none;
+    margin: 0;
+    padding: 0;
+}
+
+ul.tabLinks li h2 {
+    margin: 0;
+    padding: 0;
+}
+
+div.tab {
+}
+
+div.selected {
+    display: block;
+}
+
+div.deselected {
+    display: none;
+}
+
+div.tab table {
+    min-width: 350px;
+    width: auto !important;
+    width: 350px;
+    border-collapse: collapse;
+}
+
+div.tab th, div.tab table {
+    border-bottom: solid #d0d0d0 1px;
+}
+
+div.tab th {
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 6em;
+}
+
+div.tab th:first-child {
+    padding-left: 0;
+}
+
+div.tab td {
+    white-space: nowrap;
+    padding-left: 6em;
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+div.tab td:first-child {
+    padding-left: 0;
+}
+
+div.tab td.numeric, div.tab th.numeric {
+    text-align: right;
+}
+
+span.code {
+    display: inline-block;
+    margin-top: 0em;
+    margin-bottom: 1em;
+}
+
+span.code pre {
+    font-size: 11pt;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0;
+    background-color: #f7f7f7;
+    border: solid 1px #d0d0d0;
+    min-width: 700px;
+    width: auto !important;
+    width: 700px;
+}
+
+span.wrapped pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+    word-break: break-all;
+}
+
+label.hidden {
+    display: none;
+}

+ 84 - 0
maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/css/style.css

@@ -0,0 +1,84 @@
+
+#summary {
+    margin-top: 30px;
+    margin-bottom: 40px;
+}
+
+#summary table {
+    border-collapse: collapse;
+}
+
+#summary td {
+    vertical-align: top;
+}
+
+.breadcrumbs, .breadcrumbs a {
+    color: #606060;
+}
+
+.infoBox {
+    width: 110px;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    text-align: center;
+}
+
+.infoBox p {
+    margin: 0;
+}
+
+.counter, .percent {
+    font-size: 120%;
+    font-weight: bold;
+    margin-bottom: 8px;
+}
+
+#duration {
+    width: 125px;
+}
+
+#successRate, .summaryGroup {
+    border: solid 2px #d0d0d0;
+    -moz-border-radius: 10px;
+    border-radius: 10px;
+}
+
+#successRate {
+    width: 140px;
+    margin-left: 35px;
+}
+
+#successRate .percent {
+    font-size: 180%;
+}
+
+.success, .success a {
+    color: #008000;
+}
+
+div.success, #successRate.success {
+    background-color: #bbd9bb;
+    border-color: #008000;
+}
+
+.failures, .failures a {
+    color: #b60808;
+}
+
+.skipped, .skipped a {
+    color: #c09853;
+}
+
+div.failures, #successRate.failures {
+    background-color: #ecdada;
+    border-color: #b60808;
+}
+
+ul.linkList {
+    padding-left: 0;
+}
+
+ul.linkList li {
+    list-style: none;
+    margin-bottom: 5px;
+}

+ 92 - 0
maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/index.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta http-equiv="x-ua-compatible" content="IE=edge"/>
+<title>Test results - Test Summary</title>
+<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
+<link href="css/style.css" rel="stylesheet" type="text/css"/>
+<script src="js/report.js" type="text/javascript"></script>
+</head>
+<body>
+<div id="content">
+<h1>Test Summary</h1>
+<div id="summary">
+<table>
+<tr>
+<td>
+<div class="summaryGroup">
+<table>
+<tr>
+<td>
+<div class="infoBox" id="tests">
+<div class="counter">0</div>
+<p>tests</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="failures">
+<div class="counter">0</div>
+<p>failures</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="ignored">
+<div class="counter">0</div>
+<p>ignored</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="duration">
+<div class="counter">-</div>
+<p>duration</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</td>
+<td>
+<div class="infoBox success" id="successRate">
+<div class="percent">-</div>
+<p>successful</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div id="tabs">
+<ul class="tabLinks">
+<li>
+<a href="#tab0">Classes</a>
+</li>
+</ul>
+<div id="tab0" class="tab">
+<h2>Classes</h2>
+<table>
+<thead>
+<tr>
+<th>Class</th>
+<th>Tests</th>
+<th>Failures</th>
+<th>Ignored</th>
+<th>Duration</th>
+<th>Success rate</th>
+</tr>
+</thead>
+<tbody/>
+</table>
+</div>
+</div>
+<div id="footer">
+<p>
+<div>
+<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
+<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
+</label>
+</div>Generated by 
+<a href="http://www.gradle.org">Gradle 5.4.1</a> at 2019-11-10 12:36:07</p>
+</div>
+</div>
+</body>
+</html>

+ 194 - 0
maxkey-protocols/maxkey-protocol-cas/build/reports/tests/test/js/report.js

@@ -0,0 +1,194 @@
+(function (window, document) {
+    "use strict";
+
+    var tabs = {};
+
+    function changeElementClass(element, classValue) {
+        if (element.getAttribute("className")) {
+            element.setAttribute("className", classValue);
+        } else {
+            element.setAttribute("class", classValue);
+        }
+    }
+
+    function getClassAttribute(element) {
+        if (element.getAttribute("className")) {
+            return element.getAttribute("className");
+        } else {
+            return element.getAttribute("class");
+        }
+    }
+
+    function addClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element) + " " + classValue);
+    }
+
+    function removeClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
+    }
+
+    function initTabs() {
+        var container = document.getElementById("tabs");
+
+        tabs.tabs = findTabs(container);
+        tabs.titles = findTitles(tabs.tabs);
+        tabs.headers = findHeaders(container);
+        tabs.select = select;
+        tabs.deselectAll = deselectAll;
+        tabs.select(0);
+
+        return true;
+    }
+
+    function getCheckBox() {
+        return document.getElementById("line-wrapping-toggle");
+    }
+
+    function getLabelForCheckBox() {
+        return document.getElementById("label-for-line-wrapping-toggle");
+    }
+
+    function findCodeBlocks() {
+        var spans = document.getElementById("tabs").getElementsByTagName("span");
+        var codeBlocks = [];
+        for (var i = 0; i < spans.length; ++i) {
+            if (spans[i].className.indexOf("code") >= 0) {
+                codeBlocks.push(spans[i]);
+            }
+        }
+        return codeBlocks;
+    }
+
+    function forAllCodeBlocks(operation) {
+        var codeBlocks = findCodeBlocks();
+
+        for (var i = 0; i < codeBlocks.length; ++i) {
+            operation(codeBlocks[i], "wrapped");
+        }
+    }
+
+    function toggleLineWrapping() {
+        var checkBox = getCheckBox();
+
+        if (checkBox.checked) {
+            forAllCodeBlocks(addClass);
+        } else {
+            forAllCodeBlocks(removeClass);
+        }
+    }
+
+    function initControls() {
+        if (findCodeBlocks().length > 0) {
+            var checkBox = getCheckBox();
+            var label = getLabelForCheckBox();
+
+            checkBox.onclick = toggleLineWrapping;
+            checkBox.checked = false;
+
+            removeClass(label, "hidden");
+         }
+    }
+
+    function switchTab() {
+        var id = this.id.substr(1);
+
+        for (var i = 0; i < tabs.tabs.length; i++) {
+            if (tabs.tabs[i].id === id) {
+                tabs.select(i);
+                break;
+            }
+        }
+
+        return false;
+    }
+
+    function select(i) {
+        this.deselectAll();
+
+        changeElementClass(this.tabs[i], "tab selected");
+        changeElementClass(this.headers[i], "selected");
+
+        while (this.headers[i].firstChild) {
+            this.headers[i].removeChild(this.headers[i].firstChild);
+        }
+
+        var h2 = document.createElement("H2");
+
+        h2.appendChild(document.createTextNode(this.titles[i]));
+        this.headers[i].appendChild(h2);
+    }
+
+    function deselectAll() {
+        for (var i = 0; i < this.tabs.length; i++) {
+            changeElementClass(this.tabs[i], "tab deselected");
+            changeElementClass(this.headers[i], "deselected");
+
+            while (this.headers[i].firstChild) {
+                this.headers[i].removeChild(this.headers[i].firstChild);
+            }
+
+            var a = document.createElement("A");
+
+            a.setAttribute("id", "ltab" + i);
+            a.setAttribute("href", "#tab" + i);
+            a.onclick = switchTab;
+            a.appendChild(document.createTextNode(this.titles[i]));
+
+            this.headers[i].appendChild(a);
+        }
+    }
+
+    function findTabs(container) {
+        return findChildElements(container, "DIV", "tab");
+    }
+
+    function findHeaders(container) {
+        var owner = findChildElements(container, "UL", "tabLinks");
+        return findChildElements(owner[0], "LI", null);
+    }
+
+    function findTitles(tabs) {
+        var titles = [];
+
+        for (var i = 0; i < tabs.length; i++) {
+            var tab = tabs[i];
+            var header = findChildElements(tab, "H2", null)[0];
+
+            header.parentNode.removeChild(header);
+
+            if (header.innerText) {
+                titles.push(header.innerText);
+            } else {
+                titles.push(header.textContent);
+            }
+        }
+
+        return titles;
+    }
+
+    function findChildElements(container, name, targetClass) {
+        var elements = [];
+        var children = container.childNodes;
+
+        for (var i = 0; i < children.length; i++) {
+            var child = children.item(i);
+
+            if (child.nodeType === 1 && child.nodeName === name) {
+                if (targetClass && child.className.indexOf(targetClass) < 0) {
+                    continue;
+                }
+
+                elements.push(child);
+            }
+        }
+
+        return elements;
+    }
+
+    // Entry point.
+
+    window.onload = function() {
+        initTabs();
+        initControls();
+    };
+} (window, window.document));

+ 0 - 0
maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/output.bin


BIN
maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/output.bin.idx


+ 0 - 0
maxkey-protocols/maxkey-protocol-cas/build/test-results/test/binary/results.bin


+ 7 - 0
maxkey-protocols/maxkey-protocol-cas/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-cas
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.160+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

BIN
maxkey-protocols/maxkey-protocol-desktop/build/libs/maxkey-protocol-desktop-1.0.0.RELEASE.jar


+ 7 - 0
maxkey-protocols/maxkey-protocol-desktop/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-desktop
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.172+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

BIN
maxkey-protocols/maxkey-protocol-extendapi/build/libs/maxkey-protocol-extendapi-1.0.0.RELEASE.jar


+ 7 - 0
maxkey-protocols/maxkey-protocol-extendapi/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-extendapi
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.185+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

BIN
maxkey-protocols/maxkey-protocol-formbased/build/libs/maxkey-protocol-formbased-1.0.0.RELEASE.jar


+ 7 - 0
maxkey-protocols/maxkey-protocol-formbased/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-formbased
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.194+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

+ 1 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build.gradle

@@ -7,6 +7,7 @@ dependencies {
     compile project(":maxkey-core")
     compile project(":maxkey-dao")
     compile project(":maxkey-jose-jwt")
+    compile project(":maxkey-client-sdk")
     compile project(":maxkey-protocols:maxkey-protocol-authorize")
    
 }

BIN
maxkey-protocols/maxkey-protocol-oauth-2.0/build/libs/maxkey-protocol-oauth-2.0-1.0.0.RELEASE.jar


+ 3 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/MANIFEST.MF

@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: 
+

+ 2 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/spring.handlers

@@ -0,0 +1,2 @@
+http\://www.springframework.org/schema/security/oauth2=org.springframework.security.oauth2.config.xml.OAuth2SecurityNamespaceHandler
+http\://www.springframework.org/schema/security/oauth=org.springframework.security.oauth.config.OAuthSecurityNamespaceHandler

+ 5 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/META-INF/spring.schemas

@@ -0,0 +1,5 @@
+http\://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd=org/springframework/security/oauth2/spring-security-oauth2-1.0.xsd
+http\://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd=org/springframework/security/oauth2/spring-security-oauth2-2.0.xsd
+http\://www.springframework.org/schema/security/spring-security-oauth2.xsd=org/springframework/security/oauth2/spring-security-oauth2-2.0.xsd
+http\://www.springframework.org/schema/security/spring-security-oauth-1.0.xsd=org/springframework/security/oauth/spring-security-oauth-1.0.xsd
+http\://www.springframework.org/schema/security/spring-security-oauth.xsd=org/springframework/security/oauth/spring-security-oauth-1.0.xsd

+ 728 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build/resources/main/org/springframework/security/oauth2/spring-security-oauth2-1.0.xsd

@@ -0,0 +1,728 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns="http://www.springframework.org/schema/security/oauth2" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://www.springframework.org/schema/security/oauth2"
+	elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+	<xs:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" />
+
+	<xs:element name="rest-template">
+		<xs:annotation>
+			<xs:documentation>
+				Creates an OAuth2RestTemplate with all the pieces needed to connect to a remote resource from
+				a web
+				application. Injects request and session-scoped beans into the template, so can only be
+				used in the context of a web
+				request.
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType">
+					<xs:sequence>
+						<xs:element ref="beans:description" minOccurs="0" />
+						<xs:choice minOccurs="0" maxOccurs="unbounded">
+							<xs:element ref="beans:property" />
+						</xs:choice>
+					</xs:sequence>
+					<xs:attribute name="resource">
+						<xs:annotation>
+							<xs:documentation>
+								The OAuth2ProtectedResourceDetails governing the configuration of this client. Mandatory.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="access-token-provider" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The reference to the bean that manages access token acquisition. Optional (defaults to a chain
+								including common grant types from the spec).
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="authorization-server">
+		<xs:annotation>
+			<xs:documentation>
+				Specifies that the oauth 2 authorization and token
+				endpoints should be created in the application
+				context. These are
+				implemented as regular Spring @Controller beans, so as long as the
+				default Spring MVC set up in
+				present in the application
+				the endpoints should work (at /oauth/authorization and /oauth/token by
+				default).
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+
+			<xs:sequence>
+				<xs:element name="authorization-code" minOccurs="0" maxOccurs="1">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of the authorization code
+							mechanism. This
+							mechanism enables a way for clients to
+							obtain an
+							access token by obtaining an authorization code.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable the authorization code
+									mechanism.
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+						<xs:attribute name="authorization-code-services-ref" type="xs:string">
+							<xs:annotation>
+								<xs:documentation>
+									The reference to the bean that defines the
+									authorization code
+									services. Default value is an
+									instance of
+									"org.springframework.security.oauth2.provider.authorization_code.InMemoryAuthorizationCodeServices".
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="implicit" minOccurs="0" maxOccurs="1">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of the client credentials
+							grant type.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable the implicit grant type
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="refresh-token" minOccurs="0" maxOccurs="1">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of the refresh token grant
+							type.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable the refresh token grant
+									type
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="client-credentials" minOccurs="0" maxOccurs="1">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of the client credentials
+							grant type.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable the refresh token grant
+									type
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="password" minOccurs="0" maxOccurs="1">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of the resource owner password
+							grant type.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable the refresh token grant
+									type
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+						<xs:attribute name="authentication-manager-ref" type="xs:string">
+							<xs:annotation>
+								<xs:documentation>
+									A reference to an authentication manager that
+									can be used to
+									authenticate the resource owner
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="custom-grant" minOccurs="0" maxOccurs="unbounded">
+					<xs:annotation>
+						<xs:documentation>
+							The configuration of your custom grant type.
+						</xs:documentation>
+					</xs:annotation>
+					<xs:complexType>
+						<xs:attribute name="disabled" type="xs:boolean">
+							<xs:annotation>
+								<xs:documentation>
+									Whether to disable this grant
+									type
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+						<xs:attribute name="token-granter-ref" type="xs:string" use="required">
+							<xs:annotation>
+								<xs:documentation>
+									A reference to your token granter
+								</xs:documentation>
+							</xs:annotation>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="client-details-service-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the client
+						details service.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+			<xs:attribute name="token-endpoint-url" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The URL at which a request for an access token
+						will be serviced.
+						Default value: "/oauth/token"
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+			<xs:attribute name="authorization-endpoint-url" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The URL at which a user is redirected for
+						authorization. Default
+						value: "/oauth/authorize"
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<!--the following attributes are less used -->
+			<xs:attribute name="token-granter-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the
+						granter of different oauth
+						token types.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="implicit-grant-service-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the
+						implicit grant service.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+			
+			<xs:attribute name="token-services-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the token
+						services. Default
+						value is an instance of
+						"org.springframework.security.oauth2.provider.token.DefaultTokenServices".
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="authorization-request-manager-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the manager for
+						authorization requests from the input
+						parameters (e.g. request parameters).
+						Default
+						value is an
+						instance of
+						"org.springframework.security.oauth2.provider.token.DefaultAuthorizationRequestManager".
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="user-approval-handler-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						Reference to a bean that handles user approval decisions. Using this strategy servers can
+						selectively skip the approval process depending on decisions in the past or on the type of client.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="user-approval-page" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The URL of the page that handles the user
+						approval form (if needed, depending on the grant type).
+						The default is "forward:/oauth/confirm_access" which is not handled
+						by the authorization endpoint, so normally you
+						will have to supply a handler
+						for this path.
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="error-page" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The URL of the page that handles errors (default forward:/oauth/error).
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="approval-parameter-name" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The name of the form parameter that is used to
+						indicate user
+						approval of the client
+						authentication
+						request.
+						Default value: "user_oauth_approval".
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+			<xs:attribute name="redirect-resolver-ref" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>
+						The reference to the bean that defines the
+						redirect resolver, used
+						during the user
+						authorization.
+						Default
+						value is an instance of
+						"org.springframework.security.oauth2.provider.authorization_code.DefaultRedirectResolver".
+					</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="resource-server">
+		<xs:annotation>
+			<xs:documentation>
+				Specifies that there are oauth 2 protected resources in
+				the application context. This element
+				has an
+				id which is the bean id of the filter created. The filter
+				should be added to the Spring Security filter chain at
+				position before="PRE_AUTH_FILTER"
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType">
+
+					<xs:attribute name="resource-id" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The resource id that is protected by this filter
+								if any. If empty or
+								absent then all resource ids
+								are allowed,
+								otherwise
+								only tokens which are granted to a client that contains
+								this reosurce
+								id will be legal.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+
+					<xs:attribute name="token-services-ref" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The reference to the bean that defines the token
+								services. Default
+								value is an instance of
+								"org.springframework.security.oauth2.provider.token.DefaultTokenServices".
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+
+					<xs:attribute name="entry-point-ref" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The reference to the bean that defines the entry point for failed authentications. Defaults to
+								a vanilla
+								org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+
+					<xs:attribute name="auth-details-source-ref" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The reference to the bean that defines the AuthenticationDetailsSource.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="client-details-service">
+		<xs:annotation>
+			<xs:documentation>
+				Default element that contains the definition of the
+				OAuth clients that are
+				allowed to access this
+				service.
+			</xs:documentation>
+		</xs:annotation>
+
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType">
+					<xs:choice minOccurs="0" maxOccurs="unbounded">
+						<xs:element name="client">
+							<xs:annotation>
+								<xs:documentation>
+									Definition of a client that can act on behalf
+									of a user.
+								</xs:documentation>
+							</xs:annotation>
+
+							<xs:complexType>
+								<xs:attribute name="client-id" type="xs:string" use="required">
+									<xs:annotation>
+										<xs:documentation>
+											The client id.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="secret" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The client secret. If the secret is
+											undefined or empty (the
+											default) the client does
+											not
+											require a
+											secret.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="redirect-uri" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The re-direct URI(s) established during
+											registration (optional, comma separated).
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="resource-ids" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The resource ids to which this client can be
+											granted access
+											(comma-separated). If missing or
+											empty all
+											resources are
+											accessible (not recommended by the spec).
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="scope" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The scopes to which the client is limited
+											(comma-separated). If
+											scope is undefined or empty
+											(the
+											default) the client
+											is not limited by scope, but in that case
+											the authorization
+											service must explicitly
+											accept unlimited
+											access by not
+											specifying any scopes itself.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="authorized-grant-types" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											Grant types that are authorized for the
+											client to use
+											(comma-separated). Currently defined
+											grant types
+											include
+											"authorization_code", "password", "assertion", and
+											"refresh_token". Default value is
+											"authorization_code,refresh_token".
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="authorities" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											Authorities that are granted to the client
+											(comma-separated). Distinct
+											from the authorities
+											granted to
+											the user on behalf
+											of whom the client is acting.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="access-token-validity" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The access token validity period in seconds (optional). If unspecified a global default will
+											be applied by the token services.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="refresh-token-validity" type="xs:string">
+									<xs:annotation>
+										<xs:documentation>
+											The refresh token validity period in seconds (optional). If unspecified a global default
+											will
+											be applied by the token services.
+										</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+							</xs:complexType>
+						</xs:element>
+					</xs:choice>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="expression-handler">
+		<xs:annotation>
+			<xs:documentation>
+				Element for declaring and configuring an expression
+				handler for oauth
+				security expressions. See
+				http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType" />
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="web-expression-handler">
+		<xs:annotation>
+			<xs:documentation>
+				Element for declaring and configuring an expression
+				handler for oauth
+				security expressions in http
+				intercept urls. See
+				http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType" />
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="client">
+		<xs:annotation>
+			<xs:documentation>
+				Creates the oauth 2 client filter be be added to the
+				application security policy.
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType">
+					<xs:attribute name="redirect-strategy-ref" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The reference to the bean that defines the
+								redirect strategy, used when redirecting the user for
+								access authorization. Default value is an instance of
+								"org.springframework.security.web.DefaultRedirectStrategy".
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="resource">
+		<xs:annotation>
+			<xs:documentation>
+				Definition of a remote resource that is protected via
+				OAuth2 to which this client application wants
+				access.
+			</xs:documentation>
+		</xs:annotation>
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="beans:identifiedType">
+					<xs:attribute name="type" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The grant type. Currently defined grant types
+								include
+								"authorization_code", "password", and
+								"assertion".
+								Default value
+								is "authorization_code".
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="client-id" type="xs:string" use="required">
+						<xs:annotation>
+							<xs:documentation>
+								The client id. This is the id by which the
+								resource server will
+								identify this application.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="access-token-uri" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The uri to where the access token may be
+								obtained.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="scope" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								Comma-separted list of string specifying the
+								scope of the access to the
+								resource. By default,
+								no
+								scope will be
+								specified.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="client-secret" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The secret asssociated with the resource. By
+								default, no secret
+								will be supplied for access to
+								the resource.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="client-authentication-scheme" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The scheme that is used to pass the client
+								secret. Suggested
+								values: "header" and "form".
+								Default:
+								"header".
+								See section 2.1 of the OAuth 2 spec.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="user-authorization-uri" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The uri to which the user will be redirected if
+								the user is ever
+								needed to grant an authorization
+								code.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="authentication-scheme" default="header" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The method for bearing the token when accessing
+								the resource.
+								Default value is "header". See
+								AuthenticationScheme enum for possible values.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="token-name" type="xs:string" default="access_token">
+						<xs:annotation>
+							<xs:documentation>
+								The name of the bearer token. The default is
+								"access_token", which
+								is according to the spec,
+								but
+								some providers
+								(e.g. Facebook) don't conform to the spec.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="pre-established-redirect-uri" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								Some resource servers may require a
+								pre-established URI to which
+								they will redirect users after
+								users
+								authorize an access token.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="use-current-uri" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								Boolean flag indicating that the current URI should be used as a redirect (if available) rather
+								than the
+								registered redirect URI. Default is true.
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="username" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The username for authentication, required only when type is "password".
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+					<xs:attribute name="password" type="xs:string">
+						<xs:annotation>
+							<xs:documentation>
+								The password for authentication, required only when type is "password".
+							</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
+
+</xs:schema>

+ 7 - 0
maxkey-protocols/maxkey-protocol-oauth-2.0/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-oauth-2.0
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.204+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

+ 40 - 3
maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java

@@ -21,6 +21,10 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint;
 import org.maxkey.authz.oauth2.common.OAuth2AccessToken;
 import org.maxkey.authz.oauth2.common.exceptions.InvalidClientException;
 import org.maxkey.authz.oauth2.common.exceptions.InvalidRequestException;
@@ -41,13 +45,20 @@ import org.maxkey.authz.oauth2.provider.code.AuthorizationCodeServices;
 import org.maxkey.authz.oauth2.provider.code.InMemoryAuthorizationCodeServices;
 import org.maxkey.authz.oauth2.provider.implicit.ImplicitTokenRequest;
 import org.maxkey.authz.oauth2.provider.request.DefaultOAuth2RequestValidator;
+import org.maxkey.client.utils.HttpEncoder;
+import org.maxkey.config.ApplicationConfig;
 import org.maxkey.domain.apps.oauth2.provider.ClientDetails;
 import org.maxkey.web.WebContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.authentication.InsufficientAuthenticationException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -61,6 +72,7 @@ import org.springframework.web.servlet.view.RedirectView;
 import org.springframework.web.util.UriComponents;
 import org.springframework.web.util.UriComponentsBuilder;
 import org.springframework.web.util.UriTemplate;
+import org.maxkey.authz.oauth2.provider.ClientDetailsService;
 
 /**
  * <p>
@@ -82,9 +94,18 @@ import org.springframework.web.util.UriTemplate;
 @Controller
 @SessionAttributes("authorizationRequest")
 public class AuthorizationEndpoint extends AbstractEndpoint {
-
+	final static Logger _logger = LoggerFactory.getLogger(AuthorizationEndpoint.class);
+	
+	private static final String OAUTH_V20_AUTHORIZATION_URL = "%s/oauth/v20/authorize?client_id=%s&response_type=code&redirect_uri=%s&approval_prompt=auto";
+	
+	@Autowired
+	@Qualifier("oauth20JdbcClientDetailsService")
+	private ClientDetailsService clientDetailsService;
+	
+	@Autowired 
+  	@Qualifier("applicationConfig")
+  	protected ApplicationConfig applicationConfig;
 	
-
 	private RedirectResolver redirectResolver = new DefaultRedirectResolver();
 
 	private UserApprovalHandler userApprovalHandler = new DefaultUserApprovalHandler();
@@ -488,5 +509,21 @@ public class AuthorizationEndpoint extends AbstractEndpoint {
 		this.oauth2RequestValidator = oauth2RequestValidator;
 	}
 
-	
+	@RequestMapping("/authz/oauthv20/{id}")
+	public ModelAndView authorize(
+			HttpServletRequest request,
+			HttpServletResponse response,
+			@PathVariable("id") String id){
+		ClientDetails  clientDetails =clientDetailsService.loadClientByClientId(id);
+		_logger.debug(""+clientDetails);
+		String authorizationUrl = String.format(OAUTH_V20_AUTHORIZATION_URL, 
+						applicationConfig.getServerPrefix(),
+						clientDetails.getClientId(), 
+						HttpEncoder.encode(clientDetails.getRegisteredRedirectUri().toArray()[0].toString())
+				);
+		
+		_logger.debug("authorizationUrl "+authorizationUrl);
+		
+		return WebContext.redirect(authorizationUrl);
+	}
 }

+ 0 - 1
maxkey-protocols/maxkey-protocol-saml-2.0/bin/main/.gitignore

@@ -1 +0,0 @@
-/org/

BIN
maxkey-protocols/maxkey-protocol-saml-2.0/build/libs/maxkey-protocol-saml-2.0-1.0.0.RELEASE.jar


+ 7 - 0
maxkey-protocols/maxkey-protocol-saml-2.0/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-saml-2.0
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.214+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

BIN
maxkey-protocols/maxkey-protocol-tokenbased/build/libs/maxkey-protocol-tokenbased-1.0.0.RELEASE.jar


+ 7 - 0
maxkey-protocols/maxkey-protocol-tokenbased/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Implementation-Title: maxkey-protocol-tokenbased
+Implementation-Version: 1.0.0.RELEASE
+Implementation-Date: 2019-11-10T12:35:40.220+08:00[Asia/Shanghai]
+Created-By: org.maxkey
+Implementation-Vendor: https://github.com/shimingxy/MaxKey
+

+ 1 - 1
maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java

@@ -41,7 +41,7 @@ public class TokenBasedAuthorizeEndpoint  extends AuthorizeBaseEndpoint{
 	@Autowired
 	ApplicationConfig applicationConfig;
 	
-	@RequestMapping("/authorize/tokenbased/{id}")
+	@RequestMapping("/authz/tokenbased/{id}")
 	public ModelAndView authorize(
 			HttpServletRequest request,
 			HttpServletResponse response,

+ 1 - 2
maxkey-web-manage/.classpath

@@ -13,10 +13,9 @@
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
-	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
 	<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer">
 		<attributes>
-			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="bin/default"/>

+ 8 - 9
maxkey-web-manage/.settings/org.eclipse.wst.common.component

@@ -2,25 +2,24 @@
 <project-modules id="moduleCoreId" project-version="1.5.0">
 	<wb-module deploy-name="maxkey-web-manage">
 		<property name="context-root" value="maxkey-mgt"/>
-		<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
-		<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
-		<wb-resource deploy-path="/" source-path="src/main/webapp"/>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-core/maxkey-core">
+		<wb-resource deploy-path="/" source-path="src/main/resources"/>
+		<wb-resource deploy-path="/" source-path="src/main/java"/>
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-core/maxkey-core">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-jose-jwt/maxkey-jose-jwt">
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-jose-jwt/maxkey-jose-jwt">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-dao/maxkey-dao">
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-dao/maxkey-dao">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-client-sdk/maxkey-client-sdk">
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-client-sdk/maxkey-client-sdk">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-protocol-oauth-2.0/maxkey-protocol-oauth-2.0">
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-protocol-oauth-2.0/maxkey-protocol-oauth-2.0">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
-		<dependent-module deploy-path="/WEB-INF/lib" handle="module:/resource/maxkey-protocol-saml-2.0/maxkey-protocol-saml-2.0">
+		<dependent-module deploy-path="../" handle="module:/resource/maxkey-protocol-saml-2.0/maxkey-protocol-saml-2.0">
 			<dependency-type>uses</dependency-type>
 		</dependent-module>
 	</wb-module>

+ 1 - 2
maxkey-web-manage/.settings/org.eclipse.wst.common.project.facet.core.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <faceted-project>
 	<fixed facet="jst.java"/>
-	<fixed facet="jst.web"/>
-	<installed facet="jst.web" version="2.4"/>
+	<installed facet="jst.utility" version="1.0"/>
 	<installed facet="jst.java" version="1.8"/>
 </faceted-project>

+ 1 - 1
maxkey-web-manage/build.gradle

@@ -1,6 +1,6 @@
 description = "maxkey-web-manage"
 
-apply plugin: 'war'
+//apply plugin: 'war'
 apply plugin: 'eclipse-wtp'
 
 dependencies {

+ 1 - 1
maxkey-web-maxkey/build.gradle

@@ -3,7 +3,7 @@ description = "maxkey-web-maxkey"
 
 // Apply the java plugin to add support for Java
 apply plugin: 'java'
-apply plugin: 'war'
+//apply plugin: 'war'
 apply plugin: 'eclipse-wtp'
 apply plugin: 'com.bmuschko.tomcat-base'
 apply plugin: 'com.bmuschko.tomcat'

+ 2 - 2
setenv.bat

@@ -1,4 +1,4 @@
 echo off
 echo set env
-set JAVA_HOME=D:\javaIDE\jdk1.8.0_31
-set GRADLE_HOME=D:\javaIDE\gradle-4.8
+set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91
+set GRADLE_HOME=D:\JavaIDE\gradle-5.4.1