From 7b5a38c4d6f3b57b68f5cd9e2440e07f27a8ee32 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 19 May 2019 14:29:14 +0800 Subject: [PATCH 001/123] =?UTF-8?q?style=EF=BC=9A=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=AF=86=E7=A0=81=E5=8A=A0=E5=AF=86=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/webapp/WEB-INF/deployerConfigContext.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml index 07af7e3..bfca812 100644 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml @@ -15,6 +15,12 @@ http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> + + + From 16de250fc453e18618880f79b6db478e089be214 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 19 May 2019 14:42:57 +0800 Subject: [PATCH 002/123] =?UTF-8?q?feat=EF=BC=9A=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E5=85=88=E6=9A=82=E6=97=B6=E6=8E=A5=E5=85=A5CAS?= =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 7 + .../jeeplatform/web/filter/CASFilter.java | 20 ++ .../src/main/resources/application-dev.yml | 2 +- .../src/main/webapp/WEB-INF/web.xml | 265 +++++++++++------- 4 files changed, 191 insertions(+), 103 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/CASFilter.java diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index dbf353c..c098fc6 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -16,6 +16,7 @@ 1.2.3 4.7.2 3.7 + 3.2.0 @@ -81,6 +82,12 @@ 2.5 + + org.jasig.cas.client + cas-client-core + ${cas.version} + + diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/CASFilter.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/CASFilter.java new file mode 100644 index 0000000..95565d1 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/CASFilter.java @@ -0,0 +1,20 @@ +package org.muses.jeeplatform.web.filter; + + +import org.jasig.cas.client.authentication.AuthenticationFilter; + +/** + *
+ *  CAS认证Filter
+ * 
+ * + * @author nicky + *
+ * 修改记录
+ *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
+ * 
+ */ +public class CASFilter extends AuthenticationFilter { + + +} diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index 2223642..d6dd45b 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8081 spring: diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml index a6f9b49..253b7ec 100644 --- a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml @@ -1,112 +1,173 @@ - - - + + + Archetype Created Web Application - - - + + index.jsp + - - - - - - - - + - - - - - - - - - - - - - - - + + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + utf-8 + + + forceEncoding + true <!– 配置forceEncoding为true,请求和响应的数据的字符集均使用当前配置的字符集–> + + + + encodingFilter + /* + - - - - - - - - - - - + <!– 添加SSI(服务端页面包含技术)配置 start –> + + ssi + org.apache.catalina.ssi.SSIServlet + + + ssi + *.shtml + + <!– 添加SSI(服务端页面包含技术)配置 end –> - - - - - - - - - - - - - - - - - - - - - - + <!– 连接池 启用Web监控统计功能 start–> + + DruidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + + DruidWebStatFilter + /* + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + DruidStatView + /druid/* + + <!– 连接池 启用Web监控统计功能 end–> - - - - - - + + org.springframework.web.util.Log4jConfigListener + + + org.springframework.web.context.ContextLoaderListener + - - - - - - - - - - - - - + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:spring/spring-mvc.xml + + 1 + + + springMvc + / + - - - - - - - - - - - - - - - - + <!– Shiro过滤器配置 start –> + + shiroFilter + + org.springframework.web.filter.DelegatingFilterProxy + + + targetFilterLifecycle + true + + + + shiroFilter + /* + + <!– Shiro过滤器配置 end –> - - - + + 600 + --> - + + + org.jasig.cas.client.session.SingleSignOutHttpSessionListener + + + + + CAS Single Sign Out Filter + org.jasig.cas.client.session.SingleSignOutFilter + + + CAS Single Sign Out Filter + /* + + + + + CASFilter + org.jasig.cas.client.authentication.AuthenticationFilter + + + casServerLoginUrl + http://localhost:8080/jeeplatform-sso/login + + + serverName + http://localhost:8080 + + + + CASFilter + /* + + + + + CAS Validation Filter + org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter + + casServerUrlPrefix + http://localhost:8080/jeeplatform-sso + + + serverName + http://localhost:8080 + + + + CAS Validation Filter + /* + + + + + CAS Assertion Thread Local Filter + org.jasig.cas.client.util.AssertionThreadLocalFilter + + + CAS Assertion Thread Local Filter + /* + + + From 93820a3a0edf2c17d3f9328b047cd5ba1ecdba99 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 19 May 2019 14:53:39 +0800 Subject: [PATCH 003/123] =?UTF-8?q?rebuild=EF=BC=9A=E5=8E=BB=E6=8E=89CAS?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E7=9A=84=E4=B8=80=E4=BA=9B=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=EF=BC=8C=E4=B9=8B=E5=90=8E=E6=9C=89=E9=9C=80=E8=A6=81=E5=86=8D?= =?UTF-8?q?import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/casAcceptableUsagePolicyView.jsp | 26 ------------------- .../jsp/default/ui/casAccountDisabledView.jsp | 6 ----- .../jsp/default/ui/casAccountLockedView.jsp | 6 ----- .../view/jsp/default/ui/casBadHoursView.jsp | 6 ----- .../jsp/default/ui/casBadWorkstationView.jsp | 6 ----- .../view/jsp/default/ui/casConfirmView.jsp | 5 ---- .../jsp/default/ui/casExpiredPassView.jsp | 6 ----- .../jsp/default/ui/casGenericSuccessView.jsp | 8 ------ .../jsp/default/ui/casMustChangePassView.jsp | 6 ----- .../jsp/default/ui/serviceErrorSsoView.jsp | 11 -------- .../view/jsp/default/ui/serviceErrorView.jsp | 6 ----- 11 files changed, 92 deletions(-) delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp deleted file mode 100644 index 4ee34fd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp +++ /dev/null @@ -1,26 +0,0 @@ - -
- - -

Acceptable Usage Policy

-
- The purpose of this policy is to establish acceptable and unacceptable use of electronic devices and network resources in conjunction with the established culture of ethical and lawful behavior, openness, trust, and integrity. - -

- By using these resources, you agree to abide by the Acceptable Usage Policy. -

- -

Click '' to continue. Otherwise, click ''.

-
- -
- - - " type="submit" /> - " type="button" - onclick="location.href = location.href;" /> -
-
-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp deleted file mode 100644 index 0deddbf..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp deleted file mode 100644 index c41bccd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp deleted file mode 100644 index ace5f80..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp deleted file mode 100644 index 6f5ead2..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp deleted file mode 100644 index 5d8cc96..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casConfirmView.jsp +++ /dev/null @@ -1,5 +0,0 @@ - -
-

-
- \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp deleted file mode 100644 index 8ae8775..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp deleted file mode 100644 index 956ed44..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp +++ /dev/null @@ -1,8 +0,0 @@ - -
-

-

-

-
- - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp deleted file mode 100644 index 47772dd..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp deleted file mode 100644 index a9fcb96..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
-

-

-
- diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp deleted file mode 100644 index 2624d1d..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
-

-

-
- From 7764519c512a482d7690ccd7f070edd11f329fea Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 19 May 2019 17:53:17 +0800 Subject: [PATCH 004/123] =?UTF-8?q?rebuild:=E6=9A=82=E6=97=B6=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E9=A1=B5=E9=9D=A2=E9=87=8D=E6=9E=84=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=92=8C=E8=B5=84=E6=BA=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/jsp/default/ui/casLoginView.bat.jsp | 36 ++++++ .../src/main/webapp/images/favicon.ico | Bin 0 -> 1150 bytes .../webapp/themes/jeeplatform/css/login.css | 31 +++++ .../jeeplatform/images/air-balloon-1.png | Bin 0 -> 8981 bytes .../jeeplatform/images/air-balloon-2.png | Bin 0 -> 4602 bytes .../themes/jeeplatform/images/login-bg.jpg | Bin 0 -> 71775 bytes .../themes/jeeplatform/images/login-foot.jpg | Bin 0 -> 31434 bytes .../themes/jeeplatform/images/login.png | Bin 0 -> 38326 bytes .../webapp/themes/jeeplatform/js/fun.base.js | 13 ++ .../themes/jeeplatform/js/jquery-1.8.3.js | 1 + .../themes/jeeplatform/js/jquery.cookie.js | 117 ++++++++++++++++++ .../themes/jeeplatform/js/jquery.tips.js | 104 ++++++++++++++++ .../webapp/themes/jeeplatform/js/login.js | 45 +++++++ 13 files changed, 347 insertions(+) create mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp create mode 100644 code/jeeplatform-sso/src/main/webapp/images/favicon.ico create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/css/login.css create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-1.png create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-bg.jpg create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login.png create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js create mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp new file mode 100644 index 0000000..441516f --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp @@ -0,0 +1,36 @@ + + + +<%-- +
+

+

+
+
--%> + + + + + diff --git a/code/jeeplatform-sso/src/main/webapp/images/favicon.ico b/code/jeeplatform-sso/src/main/webapp/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..064a144383e0d49a9bf989c8bfc1ea17e7c7ae49 GIT binary patch literal 1150 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 literal 0 HcmV?d00001 diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7b7e8b782f6df9bcde36384461271679664f82 GIT binary patch literal 4602 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
    q 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 literal 0 HcmV?d00001 diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..390ce34cf03d8f001a875aa25810878ac09880df GIT binary patch literal 31434 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%0DR+@C}j?{+ejVf zchGtC;5+1JN_pkI29sXbzbe1?V@FBOr~)6K9~`3c8TxY{Z4W9GIZ;BFU1r=DCxv8$ z)xwgjLQM+_3@F#E^o1pak7y+`?=Z_05Gbr(K;(cmRWveiKDFuau$x)-WfYtjG$TSxF`Ye&^T4IQ!{{XKlnvP&RM=QuLUxZ7}Jroezh# z=j$5#A#Cls*moG%Aro{3wxymX6GBtJ=CmIVo^lLY=W#FFgK{N*A69*ED}gnG3kQtW z2WR-}Ewku+Si{h*^OE7aUuP1`HFreYacgY;62+I=_Ky-{9qlaYUT3d9YQut+!J$ms zf&EuBuGyDJHhzClHdJ{Fk5kkePvEiY$9(%3;{KK-D(94I8s*5?mI3-Jo0O z4-l%!pA>G&Q-|yv8Q7rSx#frYIET~Zc%=B-_)v-T$ct%K`OLsgnMQxwq1oxj;YH8o zPio78gNhw!R;oWqVJy9EL(Nxu&VK8#>℞vfDbR0jHa|SN^i)f3!{J95z-o+BPyy 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 A4FCWD literal 0 HcmV?d00001 diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js new file mode 100644 index 0000000..36e7f60 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js @@ -0,0 +1,13 @@ +;function rand(mi,ma){ + var range = ma - mi; + var out = mi + Math.round( Math.random() * range) ; + return parseInt(out); +}; + +function getViewSize(){ + var de=document.documentElement; + var db=document.body; + var viewW=de.clientWidth==0 ? db.clientWidth : de.clientWidth; + var viewH=de.clientHeight==0 ? db.clientHeight : de.clientHeight; + return Array(viewW,viewH); +} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js new file mode 100644 index 0000000..c3b7a15 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js @@ -0,0 +1 @@ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
    a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
    t
    ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
    ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
    ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

    ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
    ","
    "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
    ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js new file mode 100644 index 0000000..feb62e9 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js @@ -0,0 +1,117 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2006, 2014 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (arguments.length > 1 && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setTime(+t + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}; + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + var cookies = document.cookie ? document.cookie.split('; ') : []; + + for (var i = 0, l = cookies.length; i < l; i++) { + var parts = cookies[i].split('='); + var name = decode(parts.shift()); + var cookie = parts.join('='); + + if (key && key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) === undefined) { + return false; + } + + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js new file mode 100644 index 0000000..a4d7983 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js @@ -0,0 +1,104 @@ +/** +* jquery tips 提示插件 jquery.tips.js v0.1beta +* +* 使用方法 +* $(selector).tips({ //selector 为jquery选择器 +* msg:'your messages!', //你的提示消息 必填 +* side:1, //提示窗显示位置 1,2,3,4 分别代表 上右下左 默认为1(上) 可选 +* color:'#FFF', //提示文字色 默认为白色 可选 +* bg:'#F00',//提示窗背景色 默认为红色 可选 +* time:2,//自动关闭时间 默认2秒 设置0则不自动关闭 可选 +* x:0,//横向偏移 正数向右偏移 负数向左偏移 默认为0 可选 +* y:0,//纵向偏移 正数向下偏移 负数向上偏移 默认为0 可选 +* }) +* +* +*/ +(function ($) { + $.fn.tips = function(options){ + var defaults = { + side:1, + msg:'', + color:'#FFF', + bg:'#F00', + time:2, + x:0, + y:0 + } + var options = $.extend(defaults, options); + if (!options.msg||isNaN(options.side)) { + throw new Error('params error'); + } + if(!$('#jquery_tips_style').length){ + var style=''; + $(document.body).append(style); + } + this.each(function(){ + var element=$(this); + var element_top=element.offset().top,element_left=element.offset().left,element_height=element.outerHeight(),element_width=element.outerWidth(); + options.side=options.side<1?1:options.side>4?4:Math.round(options.side); + var sideName=options.side==1?'top':options.side==2?'right':options.side==3?'bottom':options.side==4?'left':'top'; + var tips=$('
    '+options.msg+'
    ').appendTo(document.body); + tips.find('.jq_tips_arrow').css('border-'+sideName,'10px solid '+options.bg); + tips.find('.jq_tips_info').css({ + color:options.color, + backgroundColor:options.bg + }); + switch(options.side){ + case 1: + tips.css({ + top:element_top-tips.outerHeight()+options.x, + left:element_left-10+options.y + }); + break; + case 2: + tips.css({ + top:element_top-20+options.x, + left:element_left+element_width+options.y + }); + break; + case 3: + tips.css({ + top:element_top+element_height+options.x, + left:element_left-10+options.y + }); + break; + case 4: + tips.css({ + top:element_top-20+options.x, + left:element_left-tips.outerWidth()+options.y + }); + break; + default: + } + var closeTime; + tips.fadeIn('fast').click(function(){ + clearTimeout(closeTime); + tips.fadeOut('fast',function(){ + tips.remove(); + }) + }) + if(options.time){ + closeTime=setTimeout(function(){ + tips.click(); + },options.time*1000); + tips.hover(function(){ + clearTimeout(closeTime); + },function(){ + closeTime=setTimeout(function(){ + tips.click(); + },options.time*1000); + }) + } + }); + return this; + }; +})(jQuery); \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js new file mode 100644 index 0000000..e1482ff --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js @@ -0,0 +1,45 @@ +$(function(){ + airBalloon('div.air-balloon'); +}); + +/* +@function 热气球移动 +@update by julying , 2012/7/25 +*/ +function airBalloon(balloon){ + var viewSize = [] , viewWidth = 0 , viewHeight = 0 ; + resize(); + $(balloon).each(function(){ + $(this).css({top: rand(40, viewHeight * 0.5 ) , left : rand( 10 , viewWidth - $(this).width() ) }); + fly(this); + }); + $(window).resize(function(){ + resize() + $(balloon).each(function(){ + $(this).stop().animate({top: rand(40, viewHeight * 0.5 ) , left : rand( 10 , viewWidth - $(this).width() ) } ,1000 , function(){ + fly(this); + }); + }); + }); + function resize(){ + viewSize = getViewSize(); + viewWidth = $(document).width() ; + viewHeight = viewSize[1] ; + } + function fly(obj){ + var $obj = $(obj); + var currentTop = parseInt($obj.css('top')); + var currentLeft = parseInt($obj.css('left') ); + var targetLeft = rand( 10 , viewWidth - $obj.width() ); + var targetTop = rand(40, viewHeight /2 ); + /*求两点之间的距离*/ + var removing = Math.sqrt( Math.pow( targetLeft - currentLeft , 2 ) + Math.pow( targetTop - currentTop , 2 ) ); + /*每秒移动24px ,计算所需要的时间,从而保持 气球的速度恒定*/ + var moveTime = removing / 24; + $obj.animate({ top : targetTop , left : targetLeft} , moveTime * 1000 , function(){ + setTimeout(function(){ + fly(obj); + }, rand(1000, 3000) ); + }); + } +}; \ No newline at end of file From 5e5ddc74cb2e7dc62e734a131230abf28047aff8 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 May 2019 11:58:28 +0800 Subject: [PATCH 005/123] =?UTF-8?q?=E4=BF=AE=E6=94=B9Constant=E7=B1=BB?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/{Constants.java => CommonConsts.java} | 2 +- .../java/org/muses/jeeplatform/util/DateUtils.java | 4 ++-- .../jeeplatform/web/controller/CodeController.java | 4 ++-- .../web/controller/LoginController.java | 14 +++++++------- .../jeeplatform/web/controller/MenuController.java | 6 +++--- .../web/controller/PermissionController.java | 4 ++-- .../jeeplatform/web/controller/RoleController.java | 4 ++-- .../jeeplatform/web/controller/UserController.java | 6 +++--- .../web/interceptor/LoginInterceptor.java | 8 ++++---- 9 files changed, 26 insertions(+), 26 deletions(-) rename code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/{Constants.java => CommonConsts.java} (97%) diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java similarity index 97% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java index 31127d7..7c75fe8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/Constants.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CommonConsts.java @@ -7,7 +7,7 @@ * @author Nicky * @date 2017年3月6日 */ -public class Constants { +public class CommonConsts { //定义统一Locale.CHINA,程序中所有和Locale相关操作均默认使用此Locale public static final Locale LOCALE_CHINA = Locale.CHINA; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java index d945df3..fad42c8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/util/DateUtils.java @@ -2,7 +2,7 @@ -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -40,7 +40,7 @@ public static String formatDate(Date date,String format){ * @return */ public static Date parse(String pattern, String date){ - return parse(pattern, date, Constants.LOCALE_CHINA); + return parse(pattern, date, CommonConsts.LOCALE_CHINA); } /** diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java index ffbf2bb..71e299f 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/CodeController.java @@ -3,7 +3,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,7 +30,7 @@ public void generate(HttpServletResponse response){ Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); - session.setAttribute(Constants.SESSION_SECURITY_CODE, code); + session.setAttribute(CommonConsts.SESSION_SECURITY_CODE, code); try { ServletOutputStream out = response.getOutputStream(); diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java index a6022d6..99a77f5 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java @@ -8,7 +8,7 @@ import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.ResultVO; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; @@ -95,7 +95,7 @@ public ResultVO loginCheck(HttpServletRequest request)throws AuthenticationExcep //获取Shiro管理的Session Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - String codeSession = (String)session.getAttribute(Constants.SESSION_SECURITY_CODE); + String codeSession = (String)session.getAttribute(CommonConsts.SESSION_SECURITY_CODE); String code = logindata[2]; /**检测页面验证码是否为空,调用工具类检测**/ if(Tools.isEmpty(code)){ @@ -116,9 +116,9 @@ public ResultVO loginCheck(HttpServletRequest request)throws AuthenticationExcep }else{ //Shiro添加会话 session.setAttribute("username", username); - session.setAttribute(Constants.SESSION_USER, user); + session.setAttribute(CommonConsts.SESSION_USER, user); //删除验证码Session - session.removeAttribute(Constants.SESSION_SECURITY_CODE); + session.removeAttribute(CommonConsts.SESSION_SECURITY_CODE); //保存登录IP this.getRemortIP(username); /**Shiro加入身份验证**/ @@ -153,7 +153,7 @@ public ModelAndView toMain() throws AuthenticationException{ /**获取Shiro管理的Session**/ Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - User user = (User)session.getAttribute(Constants.SESSION_USER); + User user = (User)session.getAttribute(CommonConsts.SESSION_USER); if(user != null){ Set roles = user.getRoles(); @@ -218,8 +218,8 @@ public ModelAndView logout(){ /**Shiro管理Session**/ Subject sub = SecurityUtils.getSubject(); Session session = sub.getSession(); - session.removeAttribute(Constants.SESSION_USER); - session.removeAttribute(Constants.SESSION_SECURITY_CODE); + session.removeAttribute(CommonConsts.SESSION_USER); + session.removeAttribute(CommonConsts.SESSION_SECURITY_CODE); /**Shiro销毁登录**/ Subject subject = SecurityUtils.getSubject(); subject.logout(); diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java index 291c42c..cc39189 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/MenuController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.muses.jeeplatform.annotation.LogController; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.service.MenuService; @@ -39,7 +39,7 @@ public class MenuController extends BaseController { public ModelAndView toMenuList(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException { String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page menuPage; @@ -72,7 +72,7 @@ public String doLoadData(HttpServletRequest request, Model model) throws IOExcep pageIndex = 1; } - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; Page menuPage = menuService.findAll(pageIndex, pageSize, Sort.Direction.ASC,"menuId"); String json = JSON.toJSONString(menuPage.getContent()); return json; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java index 8add10b..2dbb3eb 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/PermissionController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.muses.jeeplatform.annotation.LogController; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.service.PermissionPageService; import org.muses.jeeplatform.service.PermissionService; @@ -43,7 +43,7 @@ public class PermissionController extends BaseController { public ModelAndView queryAll(HttpServletRequest request, HttpServletResponse response, Model model){ String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page permissionPage; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java index 18476d3..7248921 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.apache.commons.lang.StringUtils; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; import org.muses.jeeplatform.core.entity.admin.Role; @@ -51,7 +51,7 @@ public class RoleController extends BaseController { public ModelAndView queryAll(HttpServletRequest request, HttpServletResponse response, Model model){ String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page rolePage; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java index b3c9ecc..254d0aa 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java @@ -2,7 +2,7 @@ import com.alibaba.fastjson.JSON; import org.apache.shiro.crypto.hash.SimpleHash; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.email.JavaEmailSender; import org.muses.jeeplatform.core.entity.admin.Role; import org.muses.jeeplatform.core.entity.admin.User; @@ -52,7 +52,7 @@ public class UserController extends BaseController { public ModelAndView findAll(HttpServletRequest request, HttpServletResponse response, Model model) { String pageIndexStr = request.getParameter("pageIndex"); - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page userPage; @@ -90,7 +90,7 @@ public ModelAndView findAll(HttpServletRequest request, HttpServletResponse resp @RequestMapping(value = "/searchU", produces = "application/json;charset=UTf-8") public ModelAndView doSearch(@RequestParam(value = "pageIndex",required = false) String pageIndexStr, @RequestParam(value = "keyword",required = false) String keyword, @RequestParam(value = "startDate",required = false) String startDateStr, @RequestParam(value = "endDate",required = false) String endDateStr) { - int pageSize = Constants.PAGE_SIZE; + int pageSize = CommonConsts.PAGE_SIZE; ModelAndView mv = this.getModelAndView(); Page userPage; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java index 6b378e8..1985374 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/interceptor/LoginInterceptor.java @@ -3,7 +3,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; -import org.muses.jeeplatform.core.Constants; +import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.User; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; @@ -22,19 +22,19 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String urlpath = request.getServletPath(); /**正则表达式过滤,不匹配该值的就拦截处理**/ - if(urlpath.matches(Constants.REGEXP_PATH)){ + if(urlpath.matches(CommonConsts.REGEXP_PATH)){ return true; }else { //shiro框架的会话管理,获取Session,校验用户是否通过登录验证 Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); - User user = (User)session.getAttribute(Constants.SESSION_USER); + User user = (User)session.getAttribute(CommonConsts.SESSION_USER); if(user != null){ /**加入权限校验,待开发...**/ return true; }else{ //重定向到登录页面 - response.sendRedirect(request.getContextPath() + Constants.URL_LOGIN); + response.sendRedirect(request.getContextPath() + CommonConsts.URL_LOGIN); return false; } } From 15c070cb76db0246cc72590090dba46b08a83cac Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 May 2019 12:39:57 +0800 Subject: [PATCH 006/123] =?UTF-8?q?feat=EF=BC=9A=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=85=A5CAS=E5=8D=95=E7=82=B9=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 18 ++- .../muses/jeeplatform/config/ShiroConfig.java | 116 +++++++++++++++--- .../org/muses/jeeplatform/core/CASConsts.java | 34 +++++ .../jeeplatform/core/shiro/ShiroRealm.java | 71 +++++++---- .../src/main/resources/application-dev.yml | 3 + .../src/main/webapp/WEB-INF/web.xml | 18 +-- 6 files changed, 203 insertions(+), 57 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index c098fc6..ba50c70 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -14,9 +14,12 @@ 1.2.3 + 1.2.4 + 1.2.4 4.7.2 3.7 3.2.0 + 1.2.4 @@ -57,8 +60,18 @@ org.apache.shiro - shiro-all - ${shiro.version} + shiro-spring + ${shiro.spring.version} + + + org.apache.shiro + shiro-ehcache + ${shiro.encache.version} + + + org.apache.shiro + shiro-cas + ${shiro.cas.version} @@ -82,6 +95,7 @@ 2.5 + org.jasig.cas.client cas-client-core diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java index c081a97..d8be0f5 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java @@ -1,58 +1,136 @@ package org.muses.jeeplatform.config; +import org.apache.shiro.cas.CasFilter; +import org.apache.shiro.cas.CasSubjectFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.jasig.cas.client.session.SingleSignOutFilter; +import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.muses.jeeplatform.core.shiro.ShiroRealm; import org.muses.jeeplatform.web.filter.SysAccessControllerFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import javax.servlet.Filter; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import static org.muses.jeeplatform.core.CASConsts.*; + /** * @author caiyuyu */ @Configuration public class ShiroConfig { + + private static final Logger LOG = LoggerFactory.getLogger(ShiroConfig.class); + + /** + * 单点登出监听器 + * @return + */ @Bean - public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { - ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); - shiroFilterFactoryBean.setSecurityManager(securityManager); + public ServletListenerRegistrationBean singleSignOutHttpSeessionListener(){ + ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(); + bean.setListener(new SingleSignOutHttpSessionListener()); + bean.setEnabled(true); + return bean; + } - //拦截器. - Map filterChainDefinitionMap = new LinkedHashMap<>(); - // 配置不会被拦截的链接 顺序判断 - filterChainDefinitionMap.put("/static/**", "anon"); - filterChainDefinitionMap.put("/upload/**", "anon"); - filterChainDefinitionMap.put("/plugins/**", "anon"); - filterChainDefinitionMap.put("/code", "anon"); - filterChainDefinitionMap.put("/login", "anon"); - filterChainDefinitionMap.put("/logincheck", "anon"); - filterChainDefinitionMap.put("/**", "authc"); + /** + * 注册单点登出的过滤器 + * @return + */ + @Bean + public FilterRegistrationBean singleSignOutFilter(){ + FilterRegistrationBean bean = new FilterRegistrationBean(); + bean.setName("singleSignOutFilter"); + bean.setFilter(new SingleSignOutFilter()); + bean.addUrlPatterns("/*"); + bean.setEnabled(true); + return bean; + } + - shiroFilterFactoryBean.setLoginUrl("/login"); - shiroFilterFactoryBean.setSuccessUrl("/index"); - shiroFilterFactoryBean.setUnauthorizedUrl("/login"); - shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); - return shiroFilterFactoryBean; + /** + * CAS过滤器 + * @return + */ + @Bean + public CasFilter getCasFilter(){ + CasFilter casFilter = new CasFilter(); + casFilter.setName("casFilter"); + casFilter.setEnabled(true); + casFilter.setFailureUrl(CAS_CLIENT_LOGIN_URL); + return casFilter; } + /** + * 定义ShrioRealm + * @return + */ @Bean public ShiroRealm myShiroRealm(){ ShiroRealm myShiroRealm = new ShiroRealm(); return myShiroRealm; } - + /** + * Shiro Security Manager + * @return + */ @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); + securityManager.setSubjectFactory(new CasSubjectFactory()); return securityManager; } + /** + * ShiroFilterFactoryBean + * @param securityManager + * @return + */ + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager,CasFilter casFilter) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + //注册Shrio Security Manager + shiroFilterFactoryBean.setSecurityManager(securityManager); + + shiroFilterFactoryBean.setLoginUrl(CAS_CLIENT_LOGIN_URL); + shiroFilterFactoryBean.setSuccessUrl(LOGIN_SUCCESS_URL); + shiroFilterFactoryBean.setUnauthorizedUrl(CAS_CLIENT_LOGIN_URL); + + //添加CasFilter到ShiroFilter + Map filters = new HashMap(); + filters.put("casFilter",casFilter); + shiroFilterFactoryBean.setFilters(filters); + + //拦截器. + Map filterChainDefinitionMap = new LinkedHashMap<>(); + //Shiro集成CAS后需要添加该规则 + filterChainDefinitionMap.put(CAS_FILTER_URL_PATTERN,"casFilter"); + // 配置不会被拦截的链接 顺序判断 + filterChainDefinitionMap.put("/static/**", "anon"); + filterChainDefinitionMap.put("/upload/**", "anon"); + filterChainDefinitionMap.put("/plugins/**", "anon"); + filterChainDefinitionMap.put("/code", "anon"); + filterChainDefinitionMap.put("/login", "anon"); + filterChainDefinitionMap.put("/logincheck", "anon"); + filterChainDefinitionMap.put("/logout","anon"); + filterChainDefinitionMap.put("/**", "authc"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + + return shiroFilterFactoryBean; + } + /** * 限制同一账号登录同时登录人数控制 * @return diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java new file mode 100644 index 0000000..66586f7 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java @@ -0,0 +1,34 @@ +package org.muses.jeeplatform.core; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年05月25日  修改内容:
    + * 
    + */ +public class CASConsts { + + /* CAS单点登录配置 */ + //客户端URL PREFIX + public static final String CLIENT_URL_PREFIX = "http://localhost:8081/jeeplatform"; + //客户端登录地址 + public static final String CLIENT_LOGIN_URL = CLIENT_URL_PREFIX +"/login"; + //客户端登出地址 + public static final String CLIENT_LOGOUT_URL = CLIENT_URL_PREFIX + "/logout"; + //CAS服务端URL PREFIX + public static final String CAS_SERVER_URL_PREFIX = "http://localhost:8080"; + //Cas过滤器UrlPattern + public static final String CAS_FILTER_URL_PATTERN = "/cas"; + //CAS客户端单点登录 + public static final String CAS_CLIENT_LOGIN_URL = CLIENT_LOGIN_URL + "?service="+CAS_SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; + //CAS客户端单点登出 + public static final String CAS_CLIENT_LOGOUT_URL = CLIENT_LOGOUT_URL + "?service="+CAS_SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; + //登录成功地址 + public static final String LOGIN_SUCCESS_URL = "/index"; + +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java index 6dfda18..49e456b 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java @@ -1,30 +1,41 @@ package org.muses.jeeplatform.core.shiro; -import javax.annotation.Resource; - -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.AuthenticationInfo; -import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.authc.LockedAccountException; -import org.apache.shiro.authc.SimpleAuthenticationInfo; -import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.cas.CasRealm; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.muses.jeeplatform.core.entity.admin.User; import org.muses.jeeplatform.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import static org.muses.jeeplatform.core.CASConsts.CAS_FILTER_URL_PATTERN; +import static org.muses.jeeplatform.core.CASConsts.CAS_SERVER_URL_PREFIX; /** * @description 基于Shiro框架的权限安全认证和授权 * @author Nicky * @date 2017年3月12日 */ -public class ShiroRealm extends AuthorizingRealm { +public class ShiroRealm extends CasRealm { + + Logger LOG = LoggerFactory.getLogger(ShiroRealm.class); /**注解引入业务类**/ @Resource UserService userService; + + @PostConstruct + public void initProperty(){ + setCasServerUrlPrefix(CAS_SERVER_URL_PREFIX); + //客户端回调地址 + setCasService(CAS_SERVER_URL_PREFIX + CAS_FILTER_URL_PATTERN); + } /** * 登录信息和用户验证信息验证(non-Javadoc) @@ -33,26 +44,30 @@ public class ShiroRealm extends AuthorizingRealm { @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { - String username = (String)token.getPrincipal(); //得到用户名 - String password = new String((char[])token.getCredentials()); //得到密码 + if(LOG.isInfoEnabled()) { + LOG.info("=>执行Shiro权限认证"); + } + + String username = (String)token.getPrincipal(); //得到用户名 + String password = new String((char[])token.getCredentials()); //得到密码 - User user = userService.findByUsername(username); + User user = userService.findByUsername(username); - /**检测是否有此用户 **/ - if(user == null){ - throw new UnknownAccountException();//没有找到账号异常 - } - /**检验账号是否被锁定 **/ - if(Boolean.TRUE.equals(user.getLocked())){ - throw new LockedAccountException();//抛出账号锁定异常 - } - /**AuthenticatingRealm使用CredentialsMatcher进行密码匹配**/ - if(null != username && null != password){ - return new SimpleAuthenticationInfo(username, password, getName()); - }else{ + /* 检测是否有此用户 */ + if(user == null){ + throw new UnknownAccountException();//没有找到账号异常 + } + /* 检验账号是否被锁定 */ + if(Boolean.TRUE.equals(user.getLocked())){ + throw new LockedAccountException();//抛出账号锁定异常 + } + /* AuthenticatingRealm使用CredentialsMatcher进行密码匹配*/ + if(null != username && null != password){ + return new SimpleAuthenticationInfo(username, password, getName()); + }else{ return null; - } - + } + } /** @@ -61,11 +76,13 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { + if(LOG.isInfoEnabled()) { + LOG.info("=>执行Shiro授权"); + } String username = (String)pc.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(userService.getRoles(username)); authorizationInfo.setStringPermissions(userService.getPermissions(username)); - System.out.println("Shiro授权"); return authorizationInfo; } diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index d6dd45b..61270f4 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -72,3 +72,6 @@ spring: + + + diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml index 253b7ec..90b7b82 100644 --- a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml @@ -2,9 +2,9 @@ Archetype Created Web Application - + - + + <!– 单点退出Filter –> CAS Single Sign Out Filter org.jasig.cas.client.session.SingleSignOutFilter @@ -123,12 +123,12 @@ /* - + <!– CAS认证Filter –> CASFilter org.jasig.cas.client.authentication.AuthenticationFilter - + <!– CAS登录页面,当SessionId无法匹配Session时,跳转到CAS登录页面 –> casServerLoginUrl http://localhost:8080/jeeplatform-sso/login @@ -142,7 +142,7 @@ /* - + <!– CAS Ticket校验Filter –> CAS Validation Filter org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter @@ -160,7 +160,7 @@ /* - + <!– 使客户端支持通过AssertionHolder来获取用户的登录名 –> CAS Assertion Thread Local Filter org.jasig.cas.client.util.AssertionThreadLocalFilter @@ -168,6 +168,6 @@ CAS Assertion Thread Local Filter /* - + --> From 1930ad306b32a26d87e5991a0255873076432243 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 May 2019 15:46:44 +0800 Subject: [PATCH 007/123] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=97=A0=E6=9D=83=E8=AE=BF=E9=97=AE403=E9=A1=B5=E9=9D=A2=20fix?= =?UTF-8?q?=EF=BC=9A=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95=E6=B2=A1=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E5=88=B0CAS=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../muses/jeeplatform/config/ShiroConfig.java | 11 +++--- .../org/muses/jeeplatform/core/CASConsts.java | 28 ++++++++------- .../web/controller/LoginController.java | 6 ++++ .../webapp/WEB-INF/jsp/admin/frame/403.jsp | 36 +++++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 4 +-- 5 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java index d8be0f5..b195ab2 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java @@ -56,7 +56,7 @@ public FilterRegistrationBean singleSignOutFilter(){ bean.setEnabled(true); return bean; } - + /** * CAS过滤器 @@ -68,6 +68,7 @@ public CasFilter getCasFilter(){ casFilter.setName("casFilter"); casFilter.setEnabled(true); casFilter.setFailureUrl(CAS_CLIENT_LOGIN_URL); + casFilter.setSuccessUrl(LOGIN_SUCCESS_URL); return casFilter; } @@ -106,7 +107,7 @@ public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager,CasFilt shiroFilterFactoryBean.setLoginUrl(CAS_CLIENT_LOGIN_URL); shiroFilterFactoryBean.setSuccessUrl(LOGIN_SUCCESS_URL); - shiroFilterFactoryBean.setUnauthorizedUrl(CAS_CLIENT_LOGIN_URL); + shiroFilterFactoryBean.setUnauthorizedUrl(LOGIN_UNAUTHORIZED_URL); //添加CasFilter到ShiroFilter Map filters = new HashMap(); @@ -122,9 +123,9 @@ public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager,CasFilt filterChainDefinitionMap.put("/upload/**", "anon"); filterChainDefinitionMap.put("/plugins/**", "anon"); filterChainDefinitionMap.put("/code", "anon"); - filterChainDefinitionMap.put("/login", "anon"); - filterChainDefinitionMap.put("/logincheck", "anon"); - filterChainDefinitionMap.put("/logout","anon"); + //filterChainDefinitionMap.put("/login", "anon"); + //filterChainDefinitionMap.put("/logincheck", "anon"); + //filterChainDefinitionMap.put("/logout","anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java index 66586f7..8842294 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java @@ -14,21 +14,23 @@ public class CASConsts { /* CAS单点登录配置 */ - //客户端URL PREFIX - public static final String CLIENT_URL_PREFIX = "http://localhost:8081/jeeplatform"; - //客户端登录地址 - public static final String CLIENT_LOGIN_URL = CLIENT_URL_PREFIX +"/login"; - //客户端登出地址 - public static final String CLIENT_LOGOUT_URL = CLIENT_URL_PREFIX + "/logout"; - //CAS服务端URL PREFIX - public static final String CAS_SERVER_URL_PREFIX = "http://localhost:8080"; - //Cas过滤器UrlPattern - public static final String CAS_FILTER_URL_PATTERN = "/cas"; - //CAS客户端单点登录 - public static final String CAS_CLIENT_LOGIN_URL = CLIENT_LOGIN_URL + "?service="+CAS_SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; + //Cas server地址 + public static final String CAS_SERVER_URL_PREFIX = "http://localhost:8080/cas"; + //Cas单点登录地址 + public static final String CAS_LOGIN_URL = CAS_SERVER_URL_PREFIX +"/login"; + //CAS单点登出地址 + public static final String CAS_LOGOUT_URL = CAS_SERVER_URL_PREFIX + "/logout"; + //对外提供的服务地址 + public static final String SERVER_URL_PREFIX = "http://localhost:8081"; + //Cas过滤器的urlPattern + public static final String CAS_FILTER_URL_PATTERN = "/jeeplatform"; + //CAS客户端单点登录跳转地址 + public static final String CAS_CLIENT_LOGIN_URL = CAS_LOGIN_URL + "?service="+SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; //CAS客户端单点登出 - public static final String CAS_CLIENT_LOGOUT_URL = CLIENT_LOGOUT_URL + "?service="+CAS_SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; + public static final String CAS_CLIENT_LOGOUT_URL = CAS_LOGOUT_URL + "?service="+SERVER_URL_PREFIX+CAS_FILTER_URL_PATTERN; //登录成功地址 public static final String LOGIN_SUCCESS_URL = "/index"; + //无权访问页面403 + public static final String LOGIN_UNAUTHORIZED_URL = "/403"; } diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java index 99a77f5..1079f37 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/LoginController.java @@ -228,5 +228,11 @@ public ModelAndView logout(){ return mv; } + @RequestMapping("/403") + public ModelAndView to403PAge(){ + ModelAndView mv = this.getModelAndView(); + mv.setViewName("admin/frame/403"); + return mv; + } } diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp b/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp new file mode 100644 index 0000000..5016486 --- /dev/null +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/jsp/admin/frame/403.jsp @@ -0,0 +1,36 @@ +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<% + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; +%> + + + + + + + + 403无权访问 + + + + +
    +

    403 why

    +

    非常抱歉...

    +

    您访问的页面无权访问

    +

    您可以 返回登录页

    +
    + + \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml index 90b7b82..4a450b6 100644 --- a/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml +++ b/code/jeeplatform-admin/src/main/webapp/WEB-INF/web.xml @@ -130,7 +130,7 @@ <!– CAS登录页面,当SessionId无法匹配Session时,跳转到CAS登录页面 –> casServerLoginUrl - http://localhost:8080/jeeplatform-sso/login + http://localhost:8080/cas/login serverName @@ -148,7 +148,7 @@ org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter casServerUrlPrefix - http://localhost:8080/jeeplatform-sso + http://localhost:8080/cas serverName From 5e118a87cafdc97c601be0de5db43dbb81533671 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 May 2019 16:34:53 +0800 Subject: [PATCH 008/123] =?UTF-8?q?fix=20#CAS=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8F=90=E7=A4=BA=E6=9C=AA=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=9A=84=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/muses/jeeplatform/config/ShiroConfig.java | 3 ++- code/jeeplatform-sso/src/main/webapp/cas.properties | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java index b195ab2..5cb2cef 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java @@ -124,8 +124,9 @@ public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager,CasFilt filterChainDefinitionMap.put("/plugins/**", "anon"); filterChainDefinitionMap.put("/code", "anon"); //filterChainDefinitionMap.put("/login", "anon"); + filterChainDefinitionMap.put("/403", "anon"); //filterChainDefinitionMap.put("/logincheck", "anon"); - //filterChainDefinitionMap.put("/logout","anon"); + filterChainDefinitionMap.put("/logout","anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties index 515c342..d6cf620 100644 --- a/code/jeeplatform-sso/src/main/webapp/cas.properties +++ b/code/jeeplatform-sso/src/main/webapp/cas.properties @@ -355,7 +355,7 @@ accept.authn.users=casuser::Mellon # JSON Service Registry # # Directory location where JSON service files may be found. -# service.registry.config.location=classpath:services + service.registry.config.location=WEB-INF/services ## # Service Registry Periodic Reloading Scheduler @@ -718,3 +718,4 @@ accept.authn.users=casuser::Mellon # cas.aup.ldap.startTLS=false # cas.aup.ldap.basedn=dc=example,dc=org # cas.aup.attribute= + From 654f1ba3dc48b2959c841592e2fd904e4e67465c Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 May 2019 17:46:48 +0800 Subject: [PATCH 009/123] =?UTF-8?q?style=20=EF=BC=9A=E4=BF=AE=E6=94=B9CAS?= =?UTF-8?q?=20TGC=E7=AD=89=E7=AD=89=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-sso/src/main/webapp/cas.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties index d6cf620..f560568 100644 --- a/code/jeeplatform-sso/src/main/webapp/cas.properties +++ b/code/jeeplatform-sso/src/main/webapp/cas.properties @@ -81,10 +81,10 @@ platform.jdbc.maxActive=50 # tgc.maxAge=-1 # The name of the SSO cookie -# tgc.name=TGC + tgc.name=TGC # The path to which the SSO cookie will be scoped -# tgc.path=/cas + tgc.path=/cas # The expiration value of the SSO cookie for long-term authentications # tgc.remember.me.maxAge=1209600 @@ -96,13 +96,13 @@ platform.jdbc.maxActive=50 # warn.cookie.maxAge=-1 # The name of the SSO Warning cookie -# warn.cookie.name=CASPRIVACY + warn.cookie.name=CASPRIVACY # The path to which the SSO Warning cookie will be scoped -# warn.cookie.path=/cas + warn.cookie.path=/cas # Whether we should track the most recent session by keeping the latest service ticket -# tgt.onlyTrackMostRecentSession = true + tgt.onlyTrackMostRecentSession = true ## # CAS UI Theme Resolution @@ -131,7 +131,7 @@ platform.jdbc.maxActive=50 # Single Sign-On Session # # Indicates whether an SSO session should be created for renewed authentication requests. -# create.sso.renewed.authn=true + create.sso.renewed.authn=true # # Indicates whether an SSO session can be created if no service is present. # create.sso.missing.service=true From f116ef3fb0e621f1b29d1443f51ff8af22306a60 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 26 May 2019 15:23:32 +0800 Subject: [PATCH 010/123] =?UTF-8?q?=E4=BF=AE=E6=94=B9CAS=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/webapp/cas.properties | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties index f560568..be3719a 100644 --- a/code/jeeplatform-sso/src/main/webapp/cas.properties +++ b/code/jeeplatform-sso/src/main/webapp/cas.properties @@ -69,16 +69,16 @@ platform.jdbc.maxActive=50 # Do note that the following settings MUST be generated per deployment. # # The encryption secret key. By default, must be a octet string of size 256. -# tgc.encryption.key= +#tgc.encryption.key=DSi19FXiMznOlZvZRHsThtl-3FZzNKjQzbHt8QASI7Q # The signing secret key. By default, must be a octet string of size 512. -# tgc.signing.key= +#tgc.signing.key=fOs-_ZjGNfcLsg8LWqkuHM6KccWlTsozxZZrwptqFMQAIvzqCD5lL9s4hvqDp5f-w1bpQM8IUAKEotw7jzhlvw # Decides whether SSO cookie should be created only under secure connections. tgc.secure=false # The expiration value of the SSO cookie -# tgc.maxAge=-1 + tgc.maxAge=-1 # The name of the SSO cookie tgc.name=TGC @@ -93,7 +93,7 @@ platform.jdbc.maxActive=50 warn.cookie.secure=false # The expiration value of the SSO Warning cookie -# warn.cookie.maxAge=-1 + warn.cookie.maxAge=-1 # The name of the SSO Warning cookie warn.cookie.name=CASPRIVACY @@ -194,10 +194,11 @@ message.bundle.basenames=WEB-INF/locale/messages # See the cas-servlet.xml file to understand how these properties are used. # # The encryption secret key. By default, must be a octet string of size 256. -# webflow.encryption.key= +# webflow.encryption.key=DsCqdpcudQPzsdHz # The signing secret key. By default, must be a octet string of size 512. -# webflow.signing.key= +# webflow.signing.key=U2ImXkZHYsZkORpSbjAqcvW3_gzz9oOUg6q2SWMz3Sr4Sf6NIVoNfQ97rqdhmtSZH6elMl8YgaoZrdiRWiybGw + ## # Remote User Authentication @@ -296,7 +297,7 @@ accept.authn.users=casuser::Mellon # Single Sign-On Session TGT Timeouts # # Inactivity Timeout Policy -# tgt.timeout.maxTimeToLiveInSeconds=28800 + tgt.timeout.maxTimeToLiveInSeconds=28800 # Hard Timeout Policy # tgt.timeout.hard.maxTimeToLiveInSeconds @@ -306,13 +307,14 @@ accept.authn.users=casuser::Mellon # tgt.throttled.timeInBetweenUsesInSeconds=5 # Default Expiration Policy -# tgt.maxTimeToLiveInSeconds=28800 -# tgt.timeToKillInSeconds=7200 + tgt.maxTimeToLiveInSeconds=28800 + tgt.timeToKillInSeconds=7200 ## # Service Ticket Timeout # -# st.timeToKillInSeconds=10 +#Ĭ10룬ij1800s + st.timeToKillInSeconds=1800 # st.numberOfUses=1 ## From 6e7c811aa618f2c3930b9e7ecde03cd3bd003941 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 26 May 2019 15:24:18 +0800 Subject: [PATCH 011/123] =?UTF-8?q?=E4=BF=AE=E6=94=B9CAS=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E7=B1=BB=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/muses/jeeplatform/core/CASConsts.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java index 8842294..632e75e 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java @@ -2,10 +2,10 @@ /** *
    - *
    + *  CAS配置环境类
      * 
    * - * @author nicky + * @author nicky.ma *
      * 修改记录
      *    修改后版本:     修改人:  修改日期: 2019年05月25日  修改内容:
    
    From b57b42dc237604cc286a47c06e5d5934a2a21f3e Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sun, 26 May 2019 22:16:32 +0800
    Subject: [PATCH 012/123] =?UTF-8?q?fix=20=E8=BF=94=E5=9B=9EST=E5=88=B0?=
     =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=B2=A1=E9=87=8D=E5=AE=9A=E5=90=91?=
     =?UTF-8?q?=E9=97=AE=E9=A2=98=20TODO=20TGT=E9=AA=8C=E8=AF=81=E5=A4=B1?=
     =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98=E5=BE=85=E6=8E=92=E6=9F=A5?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../muses/jeeplatform/config/ShiroConfig.java | 44 ++++++++++++++++++-
     1 file changed, 43 insertions(+), 1 deletion(-)
    
    diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java
    index 5cb2cef..7ce4a71 100644
    --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java
    +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/ShiroConfig.java
    @@ -5,8 +5,11 @@
     import org.apache.shiro.mgt.SecurityManager;
     import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
     import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    +import org.jasig.cas.client.authentication.AuthenticationFilter;
     import org.jasig.cas.client.session.SingleSignOutFilter;
     import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
    +import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
    +import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
     import org.muses.jeeplatform.core.shiro.ShiroRealm;
     import org.muses.jeeplatform.web.filter.SysAccessControllerFilter;
     import org.slf4j.Logger;
    @@ -57,6 +60,45 @@ public FilterRegistrationBean singleSignOutFilter(){
             return bean;
         }
     
    +    /**
    +     * 单点登录校验
    +     * @return
    +     */
    +    @Bean
    +    public FilterRegistrationBean validationFilter(){
    +        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    +        registrationBean.setFilter(new Cas20ProxyReceivingTicketValidationFilter());
    +        registrationBean.addUrlPatterns("/*");
    +        registrationBean.setName("CAS Validation Filter");
    +        registrationBean.addInitParameter("casServerUrlPrefix", CAS_SERVER_URL_PREFIX );
    +        registrationBean.addInitParameter("serverName", SERVER_URL_PREFIX );
    +        registrationBean.addInitParameter("useSession", "true");
    +        return registrationBean;
    +    }
    +
    +    @Bean
    +    public FilterRegistrationBean authenticationFilter(){
    +        FilterRegistrationBean bean = new FilterRegistrationBean();
    +        bean.setFilter(new AuthenticationFilter());
    +        bean.addUrlPatterns("/*");
    +        bean.setName("CAS AuthenticationFilter");
    +        bean.addInitParameter("casServerLoginUrl",CAS_SERVER_URL_PREFIX+"/login");
    +        bean.addInitParameter("serverName",SERVER_URL_PREFIX);
    +        return bean;
    +    }
    +
    +    /**
    +     * 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名
    +     *
    +     */
    +    @Bean
    +    public FilterRegistrationBean httpServletRequestWrapperFilter() {
    +        FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    +        filterRegistration.setFilter(new HttpServletRequestWrapperFilter());
    +        filterRegistration.setEnabled(true);
    +        filterRegistration.addUrlPatterns("/*");
    +        return filterRegistration;
    +    }
     
         /**
          * CAS过滤器
    @@ -89,7 +131,7 @@ public ShiroRealm myShiroRealm(){
         @Bean
         public SecurityManager securityManager(){
             DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
    -        securityManager.setRealm(myShiroRealm());
    +        //securityManager.setRealm(myShiroRealm());
             securityManager.setSubjectFactory(new CasSubjectFactory());
             return securityManager;
         }
    
    From 8da6d11c1d5bc40ac233b88565dd78c307fc6932 Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sat, 1 Jun 2019 10:38:20 +0800
    Subject: [PATCH 013/123] =?UTF-8?q?=E5=8A=A0=E4=B8=8Amaven=E7=A7=81?=
     =?UTF-8?q?=E6=9C=8D?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     code/pom.xml | 61 +++++++++++++++++++++++++++++++++++++++++++++++++---
     1 file changed, 58 insertions(+), 3 deletions(-)
    
    diff --git a/code/pom.xml b/code/pom.xml
    index 6ebc992..609afa0 100755
    --- a/code/pom.xml
    +++ b/code/pom.xml
    @@ -226,22 +226,77 @@
     
     	
     
    -	
    +	
     	
    +
     		
     			repos
     			Repository
     			http://maven.aliyun.com/nexus/content/groups/public
     		
    +
    +		
    +			oschina-repos
    +			Oschina Releases
    +			http://maven.oschina.net/content/groups/public
    +		
    +
    +		
    +			java-repos
    +			Java Repository
    +			https://maven.java.net/content/repositories/public/
    +		
    +
    +		
    +			JBoss-repos
    +			JBoss Repository
    +			http://repository.jboss.org/nexus/content/groups/public/
    +		
    +
    +		
    +			springsource-repos
    +			SpringSource Repository
    +			http://repo.spring.io/release/
    +		
    +
    +		
    +			central-repos
    +			Central Repository
    +			http://repo.maven.apache.org/maven2
    +		
    +
    +		
    +			central-repos2
    +			Central Repository 2
    +			http://repo1.maven.org/maven2/
    +		
    +
    +		
    +			activiti-repos
    +			Activiti Repository
    +			https://maven.alfresco.com/nexus/content/groups/public
    +		
    +
    +		
    +			activiti-repos2
    +			Activiti Repository 2
    +			https://app.camunda.com/nexus/content/groups/public
    +		
    +
    +		
    +			easonjim-repos
    +			EasonJim Repository
    +			https://raw.github.com/easonjim/repository/master
    +		
     	
     
     	
    -	
    +	
     
     
    
    From 140c6e65783bd7b6a2c5aec03360ad4a6286090f Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sat, 1 Jun 2019 10:39:04 +0800
    Subject: [PATCH 014/123] =?UTF-8?q?Ticket=E5=AD=98=E5=9C=A8Redis=E6=9C=8D?=
     =?UTF-8?q?=E5=8A=A1=E5=99=A8?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     code/jeeplatform-sso/pom.xml                  |  9 +++---
     .../webapp/WEB-INF/deployerConfigContext.xml  | 20 +++++++++++-
     .../src/main/webapp/cas.properties            | 32 ++++++++++++-------
     3 files changed, 45 insertions(+), 16 deletions(-)
    
    diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml
    index 233e088..c6ed8d7 100644
    --- a/code/jeeplatform-sso/pom.xml
    +++ b/code/jeeplatform-sso/pom.xml
    @@ -61,7 +61,7 @@
                 ${cas.version}
             
     
    -        
    +        
     
             
                 com.lmax
    @@ -89,11 +89,12 @@
                 ${fastjson.version}
             
     
    -        
    +        
                 ren.boot
                 cas-server-integration-redis
                 ${cas.integration.redis.version}
    -        -->
    +        
     
             
                 com.github.penggle
    diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml
    index bfca812..478c25b 100644
    --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml
    +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml
    @@ -92,7 +92,25 @@
     
         
     
    -    
    +    
    +    
    +
    +    
    +    
    +    
    +    
    +    
    +    
     
         
         
    diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties
    index be3719a..937df46 100644
    --- a/code/jeeplatform-sso/src/main/webapp/cas.properties
    +++ b/code/jeeplatform-sso/src/main/webapp/cas.properties
    @@ -1,18 +1,18 @@
    -server.name=http://localhost:8080
    -server.prefix=${server.name}/cas
    + server.name=http://localhost:8080
    + server.prefix=${server.name}/cas
     
     ##
     # Datasource config
    -platform.jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
    -platform.jdbc.username=root
    -platform.jdbc.password=root
    + platform.jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
    + platform.jdbc.username=root
    + platform.jdbc.password=root
     #platform.jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZijIzzXp1dyksL1ZSejBmuVz1Y0vgiQVbcQ/13p4pwHRo8gU3pd6YaWutOlBTEWvHBbnGxIdnrhxnQZGwU1O0CAwEAAQ==
    -platform.jdbc.initialSize=10
    -platform.jdbc.minIdle=10
    -platform.jdbc.maxActive=50
    + platform.jdbc.initialSize=10
    + platform.jdbc.minIdle=10
    + platform.jdbc.maxActive=50
             
     # security configuration based on IP address to access the /status and /statistics pages
    -# cas.securityContext.adminpages.ip=127\.0\.0\.1
    + cas.securityContext.adminpages.ip=127\.0\.0\.1
     
     ##
     # Unique CAS node name
    @@ -20,6 +20,13 @@ platform.jdbc.maxActive=50
     # hostname of the machine running the CAS node, but it could be any label so long as it is unique in the cluster.
     # host.name=
     
    +##
    +# Redis registry config
    + redis.hostName=127.0.0.1
    + redis.database=0
    + redis.password=2ImXkZHYsZkORpSbjAqcv
    + redis.port=6379
    +
     ##
     # JPA Ticket Registry Database Configuration
     #
    @@ -460,8 +467,11 @@ accept.authn.users=casuser::Mellon
     # Ticket Registry Cleaner
     #
     # Indicates how frequently the Ticket Registry cleaner should run. Configured in seconds.
    -# ticket.registry.cleaner.startdelay=20
    -# ticket.registry.cleaner.repeatinterval=5000
    +#ticket.registry.cleaner.startdelay=20
    +#ticket.registry.cleaner.repeatinterval=5000
    +# startdelayΪ0ͲcleanerΪҪʹredisĬϵijʱҪcascalendar
    + ticket.registry.cleaner.startdelay=0
    + ticket.registry.cleaner.repeatinterval=0
     
     ##
     # Ticket ID Generation
    
    From 882cc5a9f327767149aa72c170767142282b6c49 Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sat, 1 Jun 2019 12:02:54 +0800
    Subject: [PATCH 015/123] =?UTF-8?q?=E5=8A=A0=E4=B8=8ASwagger2=E4=B8=BB?=
     =?UTF-8?q?=E9=94=AE?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../web/controller/UserController.java         | 18 +++++++++++++++++-
     1 file changed, 17 insertions(+), 1 deletion(-)
    
    diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java
    index b3c9ecc..b9c8c51 100644
    --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java
    +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/UserController.java
    @@ -1,6 +1,10 @@
     package org.muses.jeeplatform.web.controller;
     
     import com.alibaba.fastjson.JSON;
    +import io.swagger.annotations.Api;
    +import io.swagger.annotations.ApiImplicitParam;
    +import io.swagger.annotations.ApiImplicitParams;
    +import io.swagger.annotations.ApiOperation;
     import org.apache.shiro.crypto.hash.SimpleHash;
     import org.muses.jeeplatform.core.Constants;
     import org.muses.jeeplatform.core.email.JavaEmailSender;
    @@ -28,6 +32,7 @@
     /**
      * Created by Nicky on 2017/7/29.
      */
    +@Api(value="用户操作接口",tags={"用户操作接口"})
     @RequestMapping("/user")
     @Controller
     public class UserController extends BaseController {
    @@ -48,6 +53,7 @@ public class UserController extends BaseController {
          * @param model
          * @return
          */
    +    @ApiOperation(value="用户信息列表", notes="用户信息列表")
         @RequestMapping(value = "/queryAll", produces = "application/json;charset=UTF-8")
         public ModelAndView findAll(HttpServletRequest request, HttpServletResponse response, Model model) {
             String pageIndexStr = request.getParameter("pageIndex");
    @@ -87,8 +93,9 @@ public ModelAndView findAll(HttpServletRequest request, HttpServletResponse resp
          * @param endDateStr
          * @return
          */
    +    @ApiOperation(value = "查询用户信息", notes = "查询用户信息")
         @RequestMapping(value = "/searchU", produces = "application/json;charset=UTf-8")
    -    public ModelAndView doSearch(@RequestParam(value = "pageIndex",required = false) String pageIndexStr, @RequestParam(value = "keyword",required = false) String keyword,
    +    public ModelAndView doSearch(@RequestParam(value = "pageIndex",required = true) String pageIndexStr, @RequestParam(value = "keyword",required = false) String keyword,
                                      @RequestParam(value = "startDate",required = false) String startDateStr, @RequestParam(value = "endDate",required = false) String endDateStr) {
             int pageSize = Constants.PAGE_SIZE;
             ModelAndView mv = this.getModelAndView();
    @@ -140,6 +147,10 @@ public String goAddU() {
          *
          * @param params
          */
    +    @ApiOperation(value = "新增用户",notes = "新增用户")
    +    @ApiImplicitParams({
    +            @ApiImplicitParam(name="params",value = "json参数",paramType = "query",dataType = "String")
    +    })
         @PostMapping(value = "/addU")
         @ResponseBody
         public Map addU(@RequestParam("params") String params) {
    @@ -183,6 +194,10 @@ public Map addU(@RequestParam("params") String params) {
             return result;
         }
     
    +    @ApiOperation(value = "跳转到编辑用户信息页面",notes = "编辑用户信息页面")
    +    @ApiImplicitParams({
    +            @ApiImplicitParam(name = "userId",paramType = "query",dataType = "String")
    +    })
         @GetMapping(value = "/goEditU")
         public String goEditU(@RequestParam("userId")String userId, Model model) {
             User user = userService.findByUId(Integer.parseInt(userId));
    @@ -278,6 +293,7 @@ public String goAuthorise(@RequestParam("userId")String userId, Model model){
             return "admin/user/sys_user_auth";
         }
     
    +    @ApiOperation(value="修改用户", notes="修改用户")
         @PostMapping(value = "/auth",produces = "application/json;charset=utf-8")
         @ResponseBody
         public Map doAuth(@RequestParam("params")String params ){
    
    From d1e5bbd5f474e3350f4d578c7650701476e3bc6f Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sun, 2 Jun 2019 17:32:23 +0800
    Subject: [PATCH 016/123] =?UTF-8?q?ticket=E5=AD=98=E5=9C=A8Redis=EF=BC=8C?=
     =?UTF-8?q?=E7=94=A8=E5=BC=80=E6=BA=90=E7=9A=84cas-server-integration-redi?=
     =?UTF-8?q?s?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../org/muses/jeeplatform/core/CASConsts.java |  4 +-
     code/jeeplatform-sso/pom.xml                  |  2 +-
     .../src/main/webapp/cas.properties            |  2 +-
     code/pom.xml                                  | 57 ++-----------------
     4 files changed, 8 insertions(+), 57 deletions(-)
    
    diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java
    index 632e75e..de81c97 100644
    --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java
    +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/CASConsts.java
    @@ -15,13 +15,13 @@ public class CASConsts {
     
         /* CAS单点登录配置 */
         //Cas server地址
    -    public static final String CAS_SERVER_URL_PREFIX = "http://localhost:8080/cas";
    +    public static final String CAS_SERVER_URL_PREFIX = "http://127.0.0.1:8080/cas";
         //Cas单点登录地址
         public static final String CAS_LOGIN_URL = CAS_SERVER_URL_PREFIX +"/login";
         //CAS单点登出地址
         public static final String CAS_LOGOUT_URL = CAS_SERVER_URL_PREFIX + "/logout";
         //对外提供的服务地址
    -    public static final String SERVER_URL_PREFIX = "http://localhost:8081";
    +    public static final String SERVER_URL_PREFIX = "http://127.0.0.1:8081";
         //Cas过滤器的urlPattern
         public static final String CAS_FILTER_URL_PATTERN = "/jeeplatform";
         //CAS客户端单点登录跳转地址
    diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml
    index c6ed8d7..07da431 100644
    --- a/code/jeeplatform-sso/pom.xml
    +++ b/code/jeeplatform-sso/pom.xml
    @@ -91,7 +91,7 @@
     
             
             
    -            ren.boot
    +            com.github.izerui
                 cas-server-integration-redis
                 ${cas.integration.redis.version}
             
    diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties
    index 937df46..b4405a2 100644
    --- a/code/jeeplatform-sso/src/main/webapp/cas.properties
    +++ b/code/jeeplatform-sso/src/main/webapp/cas.properties
    @@ -24,7 +24,7 @@
     # Redis registry config
      redis.hostName=127.0.0.1
      redis.database=0
    - redis.password=2ImXkZHYsZkORpSbjAqcv
    + redis.password=
      redis.port=6379
     
     ##
    diff --git a/code/pom.xml b/code/pom.xml
    index 609afa0..7ab0389 100755
    --- a/code/pom.xml
    +++ b/code/pom.xml
    @@ -236,67 +236,18 @@
     		
     
     		
    -			oschina-repos
    -			Oschina Releases
    -			http://maven.oschina.net/content/groups/public
    -		
    -
    -		
    -			java-repos
    -			Java Repository
    -			https://maven.java.net/content/repositories/public/
    -		
    -
    -		
    -			JBoss-repos
    -			JBoss Repository
    -			http://repository.jboss.org/nexus/content/groups/public/
    -		
    -
    -		
    -			springsource-repos
    -			SpringSource Repository
    -			http://repo.spring.io/release/
    -		
    -
    -		
    -			central-repos
    -			Central Repository
    -			http://repo.maven.apache.org/maven2
    -		
    -
    -		
    -			central-repos2
    -			Central Repository 2
    -			http://repo1.maven.org/maven2/
    -		
    -
    -		
    -			activiti-repos
    -			Activiti Repository
    -			https://maven.alfresco.com/nexus/content/groups/public
    -		
    -
    -		
    -			activiti-repos2
    -			Activiti Repository 2
    -			https://app.camunda.com/nexus/content/groups/public
    -		
    -
    -		
    -			easonjim-repos
    -			EasonJim Repository
    -			https://raw.github.com/easonjim/repository/master
    +			jitpack.io
    +			https://jitpack.io
     		
     	
     
     	
    -	
    +	
     
     
    
    From 63144852f4e0829f234ee499de96b8e786a37f23 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sat, 8 Jun 2019 12:41:39 +0800
    Subject: [PATCH 017/123] Update README.md
    
    ---
     README.md | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/README.md b/README.md
    index 3d0db56..1a0402d 100644
    --- a/README.md
    +++ b/README.md
    @@ -214,11 +214,11 @@ public class RedisAspect {
     为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接
     
     ### Java框架
    -* [基于RBAC模型的权限系统设计(Github开源项目)](http://blog.csdn.net/u014427391/article/details/78889378)
    -* [Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页](http://blog.csdn.net/u014427391/article/details/77434664)
    +* [基于RBAC模型的权限系统设计](http://blog.csdn.net/u014427391/article/details/78889378)
    +* [Spring Data Jpa实现分页](http://blog.csdn.net/u014427391/article/details/77434664)
     * [SpringMVC+ZTree实现树形菜单权限配置](https://blog.csdn.net/u014427391/article/details/78889378)
    -* [Github开源项目(企业信息化基础平台)](https://blog.csdn.net/u014427391/article/details/78867439)
    -* [基于权限安全框架Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766)
    +* [企业信息化基础平台项目介绍](https://blog.csdn.net/u014427391/article/details/78867439)
    +* [基于Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766)
     
     SpringBoot
     * [SpringBoot热部署配置](https://smilenicky.blog.csdn.net/article/details/89765909)
    
    From 23da06f3da6d362f6c94f0c921c46bddbe3a8a71 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 9 Jun 2019 13:14:25 +0800
    Subject: [PATCH 018/123] Update README.md
    
    ---
     README.md | 14 +++++++-------
     1 file changed, 7 insertions(+), 7 deletions(-)
    
    diff --git a/README.md b/README.md
    index 1a0402d..340cdd5 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,11 +1,11 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     
    -## 项目简介 ##
    +## 一、项目简介 ##
     一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能
     
     JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform
     
    -## 系统设计 ##
    +## 二、系统设计 ##
     ### 系统管理(模块名称jeeplatform-admin) ###
     管理系统登录页面,采用Shiro登录验证
     ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
    @@ -35,7 +35,7 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     
     ### CMS管理系统(待开发)
     
    -## 系统升级
    +## 三、关键技术
     ### 单点登录基础(模块名称jeeplatform-sso)(开发中)
     > 项目采用CAS登录登录实现,单点登录集群搭建可以参考博客:
     > http://blog.csdn.net/u014427391/article/details/78653482
    @@ -145,7 +145,7 @@ public class RedisAspect {
     
     ![这里写图片描述](http://img.blog.csdn.net/20171214104303308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQyNzM5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
     
    -## 业务方案 ##
    +## 三、业务方案 ##
     ### 系统管理通用功能 ####
     - [x] 用户管理: 系统用户	
     - [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限	OK
    @@ -163,7 +163,7 @@ public class RedisAspect {
     - [ ] 信息管理:文章管理、文章审核
     ...
     
    -## 技术方案 ##
    +## 四、技术方案 ##
     ### 后台技术 ###
     * 工作流引擎:Activiti5
     * ORM框架:Mybatis/Hibernate JPA
    @@ -208,9 +208,9 @@ public class RedisAspect {
     * UML建模:ArgoUML
     * Eclipse测试插件:EclEmma
     * 程序质量检查插件:Jdepend4eclipse(Eclipse平台)
    -## 常见问题 ##
    +## 五、常见问题 ##
     运行jeeplatform打开页面404,如果是用idea的,就可以edit configurations->configuration->edit working directory设置为:$MODULE_DIR$
    -## 项目技术博客介绍 ##
    +## 六、项目技术博客介绍 ##
     为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接
     
     ### Java框架
    
    From 809e8af656c0913388ef01a0fa47f1157fe3575a Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 9 Jun 2019 13:15:04 +0800
    Subject: [PATCH 019/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 340cdd5..cbad126 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,5 +1,5 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
    -
    +[TOC]
     ## 一、项目简介 ##
     一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能
     
    
    From c6fb25245f22647b718fd64f05c4e63a1fc8f546 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 9 Jun 2019 13:15:16 +0800
    Subject: [PATCH 020/123] Update README.md
    
    ---
     README.md | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/README.md b/README.md
    index cbad126..56c6fb1 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,4 +1,5 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
    +
     [TOC]
     ## 一、项目简介 ##
     一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能
    
    From a7432ebfd841ee11c1630a163cb292b3dbd0e555 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 16 Jun 2019 10:02:51 +0800
    Subject: [PATCH 021/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 56c6fb1..949c9cd 100644
    --- a/README.md
    +++ b/README.md
    @@ -221,7 +221,7 @@ public class RedisAspect {
     * [企业信息化基础平台项目介绍](https://blog.csdn.net/u014427391/article/details/78867439)
     * [基于Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766)
     
    -SpringBoot
    +### SpringBoot
     * [SpringBoot热部署配置](https://smilenicky.blog.csdn.net/article/details/89765909)
     * [SpringBoot集成Redis实现缓存处理](http://blog.csdn.net/u014427391/article/details/78799623)
     * [SpringBoot profles配置多环境](https://smilenicky.blog.csdn.net/article/details/89792248)
    
    From 9e471a185f3eb782b55e9692a1c739126af6828e Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 23 Jun 2019 10:02:34 +0800
    Subject: [PATCH 022/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 949c9cd..dd9b169 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,6 +1,6 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     
    -[TOC]
    +
     ## 一、项目简介 ##
     一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能
     
    
    From ab74d20ad75c6b9c141e562c083e9eee38e63492 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 30 Jun 2019 21:51:30 +0800
    Subject: [PATCH 023/123] Update README.md
    
    ---
     README.md | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index dd9b169..8cc8926 100644
    --- a/README.md
    +++ b/README.md
    @@ -2,7 +2,6 @@
     
     
     ## 一、项目简介 ##
    -一款企业信息化开发基础平台,拟集成OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能
     
     JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform
     
    
    From 036f01372bdc68ba88eb93c6e0dbc9e7d5c7aeb2 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 7 Jul 2019 08:19:19 +0800
    Subject: [PATCH 024/123] Update README.md
    
    ---
     README.md | 30 +++++++++++++++---------------
     1 file changed, 15 insertions(+), 15 deletions(-)
    
    diff --git a/README.md b/README.md
    index 8cc8926..5743760 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,12 +1,12 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     
     
    -## 一、项目简介 ##
    +## 一、项目简介 
     
     JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform
     
    -## 二、系统设计 ##
    -### 系统管理(模块名称jeeplatform-admin) ###
    +## 二、系统设计 
    +### 系统管理(模块名称jeeplatform-admin) 
     管理系统登录页面,采用Shiro登录验证
     ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     ![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/管理系统登录页面.png)
    @@ -145,8 +145,8 @@ public class RedisAspect {
     
     ![这里写图片描述](http://img.blog.csdn.net/20171214104303308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQyNzM5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
     
    -## 三、业务方案 ##
    -### 系统管理通用功能 ####
    +## 三、业务方案 
    +### 系统管理通用功能 
     - [x] 用户管理: 系统用户	
     - [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限	OK
     - [x] 权限管理: 权限管理细分到系统按钮权限,菜单权限,管理员可以对权限进行细分控制
    @@ -155,16 +155,16 @@ public class RedisAspect {
     - [ ] 报表统计:数据报表、用户分析
     - [ ] 系统监控:数据监控、系统日志(用户登录记录)
     - [ ] 通用接口:SMS(短信)、系统邮件、Excel表导出导入操作...
    -### OA系统通用功能(待开发) ###
    +### OA系统通用功能(待开发) 
     - [ ] 考勤管理:请假流程
     - [ ] 人事管理:机构管理、部门管理、员工管理
     
    -### CMS系统通用功能(待开发) ###
    +### CMS系统通用功能(待开发) 
     - [ ] 信息管理:文章管理、文章审核
     ...
     
    -## 四、技术方案 ##
    -### 后台技术 ###
    +## 四、技术方案
    +### 后台技术 
     * 工作流引擎:Activiti5
     * ORM框架:Mybatis/Hibernate JPA
     * Web框架:SpringMVC
    @@ -180,7 +180,7 @@ public class RedisAspect {
     * 缓存处理:Redis、EhCache
     * Excel表处理:POI
     
    -### 前端技术 ###
    +### 前端技术 
     * 文件上传:JQuery uploadify
     * 树形结构:EasyUI Tree
     * 日期插件:JQuery Date
    @@ -189,17 +189,17 @@ public class RedisAspect {
     * 富文本编辑器:Baidu UEDitor
     * 前端框架:Twitter Bootstrap、ExtJS
     
    -### 服务器 ####
    +### 服务器 
     * 负载均衡:Nginx
     * 分布式:alibaba Dubbo
     * 中间件:RocketMQ
     
    -### 项目测试 ###
    +### 项目测试 
     * DeBug:Junit、FindBugs、EclEmma
     * 程序质量:Jdepend4eclipse
     * 压力测试:JMeter
     
    -### 工具软件 ###
    +### 工具软件 
     * 服务器:SecureCRT
     * Java:IntelliJ IDEA/Eclipse
     * 远程控制:TeamViewer
    @@ -208,9 +208,9 @@ public class RedisAspect {
     * UML建模:ArgoUML
     * Eclipse测试插件:EclEmma
     * 程序质量检查插件:Jdepend4eclipse(Eclipse平台)
    -## 五、常见问题 ##
    +## 五、常见问题 
     运行jeeplatform打开页面404,如果是用idea的,就可以edit configurations->configuration->edit working directory设置为:$MODULE_DIR$
    -## 六、项目技术博客介绍 ##
    +## 六、项目技术博客介绍 
     为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接
     
     ### Java框架
    
    From 42d63f2556a33c5ae37d8082ff96191483959060 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 14 Jul 2019 22:52:29 +0800
    Subject: [PATCH 025/123] Update README.md
    
    ---
     README.md | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 5743760..8c91c8b 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,6 +1,5 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     
    -
     ## 一、项目简介 
     
     JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform
    
    From b823c11f38e65dc68a4dabe40487ad9badc26d04 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 21 Jul 2019 16:20:59 +0800
    Subject: [PATCH 026/123] Update README.md
    
    ---
     README.md | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/README.md b/README.md
    index 8c91c8b..66365c0 100644
    --- a/README.md
    +++ b/README.md
    @@ -225,6 +225,9 @@ public class RedisAspect {
     * [SpringBoot profles配置多环境](https://smilenicky.blog.csdn.net/article/details/89792248)
     * [SpringBoot集成Swagger2](https://smilenicky.blog.csdn.net/article/details/90706219)
     
    +### RPC框架
    +* [Dubbo服务注册与发现](https://blog.csdn.net/u014427391/article/details/90182031)
    +
     ### Redis知识
     * [Redis学习笔记之基本数据结构](https://blog.csdn.net/u014427391/article/details/82860694)
     * [Redis学习笔记之位图](https://blog.csdn.net/u014427391/article/details/87923407)
    
    From 30e1efe7fe8ad0853d71127af3e78ad7bb534295 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 21 Jul 2019 20:29:57 +0800
    Subject: [PATCH 027/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 66365c0..ffd4da6 100644
    --- a/README.md
    +++ b/README.md
    @@ -226,7 +226,7 @@ public class RedisAspect {
     * [SpringBoot集成Swagger2](https://smilenicky.blog.csdn.net/article/details/90706219)
     
     ### RPC框架
    -* [Dubbo服务注册与发现](https://blog.csdn.net/u014427391/article/details/90182031)
    +* [Dubbo服务注册与发现](https://smilenicky.blog.csdn.net/article/details/96754952)
     
     ### Redis知识
     * [Redis学习笔记之基本数据结构](https://blog.csdn.net/u014427391/article/details/82860694)
    
    From bac50170d9211b72137d621ffda3561640cc1243 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 28 Jul 2019 09:16:29 +0800
    Subject: [PATCH 028/123] Update README.md
    
    ---
     README.md | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/README.md b/README.md
    index ffd4da6..a3ed2c1 100644
    --- a/README.md
    +++ b/README.md
    @@ -232,6 +232,7 @@ public class RedisAspect {
     * [Redis学习笔记之基本数据结构](https://blog.csdn.net/u014427391/article/details/82860694)
     * [Redis学习笔记之位图](https://blog.csdn.net/u014427391/article/details/87923407)
     * [Redis学习笔记之延时队列](https://blog.csdn.net/u014427391/article/details/87905450)
    +* [Redis HyperLogLog用法简介](https://smilenicky.blog.csdn.net/article/details/95992173)
     * [Redis学习笔记之分布式锁](https://blog.csdn.net/u014427391/article/details/84934045)
     
     ### Oracle知识
    
    From 69f1f6285dff1f799b830a93e1a4c6c49e4972f8 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 4 Aug 2019 09:14:05 +0800
    Subject: [PATCH 029/123] Update README.md
    
    ---
     README.md | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/README.md b/README.md
    index a3ed2c1..89aea1e 100644
    --- a/README.md
    +++ b/README.md
    @@ -246,6 +246,9 @@ public class RedisAspect {
     ### 单点登录
     * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482)
     
    +### Docker笔记
    +[Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
    +
     
     ### SQL调优知识
     * [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696)
    
    From fea4aac585eceda7db6be8415a1d4bf11f07be6a Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 25 Aug 2019 22:49:43 +0800
    Subject: [PATCH 030/123] Update README.md
    
    ---
     README.md | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 89aea1e..e4991ef 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,7 +1,6 @@
     [![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/jeeplatform) [![Join the chat at https://gitter.im/jeeplatform/community](https://badges.gitter.im/jeeplatform/community.svg)](https://gitter.im/jeeplatform/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     
     ## 一、项目简介 
    -
     JeePlatform项目是一款以Spring Framework为核心框架,集ORM框架Mybatis,Web层框架SpringMVC和多种开源组件框架而成的一款通用基础平台,代码已经捐赠给开源中国社区:https://www.oschina.net/p/jeeplatform
     
     ## 二、系统设计 
    
    From c95d8729593f7d9d493cf7a1f9b9fd5cee4d900c Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 8 Sep 2019 10:51:46 +0800
    Subject: [PATCH 031/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index e4991ef..56664a6 100644
    --- a/README.md
    +++ b/README.md
    @@ -246,7 +246,7 @@ public class RedisAspect {
     * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482)
     
     ### Docker笔记
    -[Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
    +* [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
     
     
     ### SQL调优知识
    
    From 4ced12db3971cbc730d96d836cdff5c96d420bae Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 15 Sep 2019 08:32:57 +0800
    Subject: [PATCH 032/123] Update README.md
    
    ---
     README.md | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/README.md b/README.md
    index 56664a6..7f9d211 100644
    --- a/README.md
    +++ b/README.md
    @@ -241,6 +241,8 @@ public class RedisAspect {
     * [Oracle笔记之修改表字段类型](https://blog.csdn.net/u014427391/article/details/83046006)
     * [Oracle merge合并更新函数](https://blog.csdn.net/u014427391/article/details/87898729)
     
    +### MySQL知识
    +* [MySQL逻辑架构简介](https://smilenicky.blog.csdn.net/article/details/100170265)
     
     ### 单点登录
     * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482)
    
    From a6ca334891b3b9cd0ebca371874661433735a15e Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 22 Sep 2019 14:19:43 +0800
    Subject: [PATCH 033/123] Update README.md
    
    ---
     README.md | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/README.md b/README.md
    index 7f9d211..f918e94 100644
    --- a/README.md
    +++ b/README.md
    @@ -252,11 +252,15 @@ public class RedisAspect {
     
     
     ### SQL调优知识
    +Oracle
     * [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696)
     * [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234)
     * [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680)
     * [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262)
     * [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755)
    +MySQL
    +* [MySQL调优之Explain(https://smilenicky.blog.csdn.net/article/details/100853310)
    +* [MySQL调优之索引](https://smilenicky.blog.csdn.net/article/details/100846922)
     
     
     
    
    From 63a62eb740962514e21e8a95598f2a88cd1236e5 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 6 Oct 2019 08:20:46 +0800
    Subject: [PATCH 034/123] Update README.md
    
    ---
     README.md | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index f918e94..d0c7e66 100644
    --- a/README.md
    +++ b/README.md
    @@ -250,7 +250,6 @@ public class RedisAspect {
     ### Docker笔记
     * [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
     
    -
     ### SQL调优知识
     Oracle
     * [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696)
    
    From 5fef2733b5ed21a7bb908ccd48aaf9f4da8d61d9 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:23:41 +0800
    Subject: [PATCH 035/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index d0c7e66..a4f000b 100644
    --- a/README.md
    +++ b/README.md
    @@ -258,7 +258,7 @@ Oracle
     * [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262)
     * [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755)
     MySQL
    -* [MySQL调优之Explain(https://smilenicky.blog.csdn.net/article/details/100853310)
    +* [MySQL调优之Explain](https://smilenicky.blog.csdn.net/article/details/100853310)
     * [MySQL调优之索引](https://smilenicky.blog.csdn.net/article/details/100846922)
     
     
    
    From c2f4bfd9702c8cc5351c7853976f000737ee1fb8 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:24:13 +0800
    Subject: [PATCH 036/123] Update README.md
    
    
    From 78faafdf03dad5371cf477474a74dbc3f22d5833 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:25:48 +0800
    Subject: [PATCH 037/123] Update README.md
    
    ---
     README.md | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index a4f000b..beef195 100644
    --- a/README.md
    +++ b/README.md
    @@ -251,12 +251,14 @@ public class RedisAspect {
     * [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
     
     ### SQL调优知识
    +
     Oracle
     * [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696)
     * [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234)
     * [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680)
     * [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262)
    -* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755)
    +* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755
    +
     MySQL
     * [MySQL调优之Explain](https://smilenicky.blog.csdn.net/article/details/100853310)
     * [MySQL调优之索引](https://smilenicky.blog.csdn.net/article/details/100846922)
    
    From 35f73ac56407b7be166edaaf4150599ac57e0856 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:27:07 +0800
    Subject: [PATCH 038/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index beef195..3ff7984 100644
    --- a/README.md
    +++ b/README.md
    @@ -257,7 +257,7 @@ Oracle
     * [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234)
     * [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680)
     * [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262)
    -* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755
    +* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755)
     
     MySQL
     * [MySQL调优之Explain](https://smilenicky.blog.csdn.net/article/details/100853310)
    
    From 0dc4604464a16550437699848782e1464caa0716 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:33:08 +0800
    Subject: [PATCH 039/123] Update README.md
    
    ---
     README.md | 13 +++++++------
     1 file changed, 7 insertions(+), 6 deletions(-)
    
    diff --git a/README.md b/README.md
    index 3ff7984..46d9d89 100644
    --- a/README.md
    +++ b/README.md
    @@ -152,7 +152,8 @@ public class RedisAspect {
     - [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限	OK
     - [ ] 报表统计:数据报表、用户分析
     - [ ] 系统监控:数据监控、系统日志(用户登录记录)
    -- [ ] 通用接口:SMS(短信)、系统邮件、Excel表导出导入操作...
    +- [x] 在线文档:SwaggerUI API在线文档管理
    +- [x] 通用接口:系统邮件发送功能、Excel报表功能
     ### OA系统通用功能(待开发) 
     - [ ] 考勤管理:请假流程
     - [ ] 人事管理:机构管理、部门管理、员工管理
    @@ -164,18 +165,18 @@ public class RedisAspect {
     ## 四、技术方案
     ### 后台技术 
     * 工作流引擎:Activiti5
    -* ORM框架:Mybatis/Hibernate JPA
    +* ORM框架:Mybatis
     * Web框架:SpringMVC
     * 核心框架:Spring Framework4.0
     * 任务调度:Spring Task
    -* 权限安全:Apache Shiro/Spring Security
    -* 全文搜索引擎:Lucene/Solr
    -* 页面静态化处理:Freemark/Velocity
    +* 权限安全:Apache Shiro
    +* 全文搜索引擎:Lucene
    +* 模板引擎:JSP/Themeleaf
     * 服务器页面包含技术:SSI
     * 网页即时通讯:long polling/websocket
     * 连接池:Druid(阿里开源)
     * 日志处理:SLF4J
    -* 缓存处理:Redis、EhCache
    +* 缓存处理:Redis
     * Excel表处理:POI
     
     ### 前端技术 
    
    From efe82d29c82877e9ef9b335ba11d6029fbca1451 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Sun, 20 Oct 2019 00:35:18 +0800
    Subject: [PATCH 040/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 46d9d89..41daedd 100644
    --- a/README.md
    +++ b/README.md
    @@ -151,7 +151,7 @@ public class RedisAspect {
     - [ ] 在线管理:管理在线用户,可以强制下线
     - [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限	OK
     - [ ] 报表统计:数据报表、用户分析
    -- [ ] 系统监控:数据监控、系统日志(用户登录记录)
    +- [x] 系统监控:数据库等方面监控(采用Druid提供的)
     - [x] 在线文档:SwaggerUI API在线文档管理
     - [x] 通用接口:系统邮件发送功能、Excel报表功能
     ### OA系统通用功能(待开发) 
    
    From 83e32edd85b434a4a7ff449e5d951d326def86d4 Mon Sep 17 00:00:00 2001
    From: "Nicky.Ma" <3623307211@qq.com>
    Date: Sat, 2 Nov 2019 20:37:19 +0800
    Subject: [PATCH 041/123] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SpringBoot=20Junit?=
     =?UTF-8?q?=E6=B5=8B=E8=AF=95?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../org.muses.jeeplatform/SpringBootTest.java | 27 +++++++++++++++++++
     code/pom.xml                                  |  5 ++++
     2 files changed, 32 insertions(+)
     create mode 100644 code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java
    
    diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java
    new file mode 100644
    index 0000000..f6cd735
    --- /dev/null
    +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java
    @@ -0,0 +1,27 @@
    +package org.muses.jeeplatform;
    +
    +import org.junit.Test;
    +import org.junit.runner.RunWith;
    +import org.springframework.test.context.junit4.SpringRunner;
    +
    +/**
    + * 
    + *     SpringBoot Junit测试类
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年11月02日  修改内容:
    + * 
    + */ +@RunWith(SpringRunner.class) +@org.springframework.boot.test.context.SpringBootTest +public class SpringBootTest { + + @Test + public void testConfigurationProperties(){ + + } + +} diff --git a/code/pom.xml b/code/pom.xml index 7ab0389..af3aadd 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -166,6 +166,11 @@ spring-boot-devtools true + + + org.springframework.boot + spring-boot-starter-test + com.alibaba From 44671fd4d179c1ea7c6d33a8827ab88680ffa147 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 3 Nov 2019 15:21:19 +0800 Subject: [PATCH 042/123] =?UTF-8?q?test:=E6=B7=BB=E5=8A=A0@ConfigurationPr?= =?UTF-8?q?operties=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/HELP.md | 8 ++ .../src/main/resources/application-test.yml | 16 +++ .../org.muses.jeeplatform/SpringBootTest.java | 18 ++-- .../org.muses.jeeplatform/bean/Address.java | 41 +++++++ .../java/org.muses.jeeplatform/bean/User.java | 101 ++++++++++++++++++ 5 files changed, 172 insertions(+), 12 deletions(-) create mode 100644 code/HELP.md create mode 100644 code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java create mode 100644 code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java diff --git a/code/HELP.md b/code/HELP.md new file mode 100644 index 0000000..73e3250 --- /dev/null +++ b/code/HELP.md @@ -0,0 +1,8 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/) + diff --git a/code/jeeplatform-admin/src/main/resources/application-test.yml b/code/jeeplatform-admin/src/main/resources/application-test.yml index d6dd45b..80058d6 100644 --- a/code/jeeplatform-admin/src/main/resources/application-test.yml +++ b/code/jeeplatform-admin/src/main/resources/application-test.yml @@ -69,6 +69,22 @@ spring: maxWaitMillis : 100000 +## 测试ConfigurationProperties +user: + userName: root + isAdmin: true + regTime: 2019/11/01 + isOnline: 1 + maps: {k1 : v1,k2: v2} + lists: + - list1 + - list2 + address: + tel: 15899988899 + name: 上海市 + + + diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java index f6cd735..586814d 100644 --- a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/SpringBootTest.java @@ -2,26 +2,20 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.muses.jeeplatform.bean.User; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.junit4.SpringRunner; -/** - *
    - *     SpringBoot Junit测试类
    - * 
    - * - * @author nicky - *
    - * 修改记录
    - *    修改后版本:     修改人:  修改日期: 2019年11月02日  修改内容:
    - * 
    - */ @RunWith(SpringRunner.class) @org.springframework.boot.test.context.SpringBootTest public class SpringBootTest { + @Autowired + User user; + @Test public void testConfigurationProperties(){ - + System.out.println(user); } } diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java new file mode 100644 index 0000000..7db481e --- /dev/null +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/Address.java @@ -0,0 +1,41 @@ +package org.muses.jeeplatform.bean; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年11月03日  修改内容:
    + * 
    + */ +public class Address { + private String tel; + private String name; + + @Override + public String toString() { + return "Address{" + + "tel='" + tel + '\'' + + ", name='" + name + '\'' + + '}'; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java new file mode 100644 index 0000000..38524f4 --- /dev/null +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java @@ -0,0 +1,101 @@ +package org.muses.jeeplatform.bean; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年11月03日  修改内容:
    + * 
    + */ +@Component +@ConfigurationProperties(prefix = "user") +public class User { + + private String userName; + private boolean isAdmin; + private Date regTime; + private Long isOnline; + private Map maps; + private List lists; + private Address address; + + @Override + public String toString() { + return "User{" + + "userName='" + userName + '\'' + + ", isAdmin=" + isAdmin + + ", regTime=" + regTime + + ", isOnline=" + isOnline + + ", maps=" + maps + + ", lists=" + lists + + ", address=" + address + + '}'; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public boolean isAdmin() { + return isAdmin; + } + + public void setAdmin(boolean admin) { + isAdmin = admin; + } + + public Date getRegTime() { + return regTime; + } + + public void setRegTime(Date regTime) { + this.regTime = regTime; + } + + public Long getIsOnline() { + return isOnline; + } + + public void setIsOnline(Long isOnline) { + this.isOnline = isOnline; + } + + public Map getMaps() { + return maps; + } + + public void setMaps(Map maps) { + this.maps = maps; + } + + public List getLists() { + return lists; + } + + public void setLists(List lists) { + this.lists = lists; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} From 197e3ba51aac1da7064d9fd1c45fde5e45412301 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 3 Nov 2019 16:12:13 +0800 Subject: [PATCH 043/123] =?UTF-8?q?=E4=BF=AE=E6=94=B9;pom=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/pom.xml b/code/pom.xml index af3aadd..950e63b 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -171,6 +171,12 @@ org.springframework.boot spring-boot-starter-test + + + org.springframework.boot + spring-boot-configuration-processor + true + com.alibaba From 74949cfbf3234c877b156d4b0348af8cac684877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Fri, 8 Nov 2019 18:17:45 +0800 Subject: [PATCH 044/123] =?UTF-8?q?test:=E6=B5=8B=E8=AF=95@PropertySource?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-test.yml | 24 +++++++++---------- .../src/main/resources/user.properties | 9 +++++++ .../java/org.muses.jeeplatform/bean/User.java | 2 ++ 3 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/resources/user.properties diff --git a/code/jeeplatform-admin/src/main/resources/application-test.yml b/code/jeeplatform-admin/src/main/resources/application-test.yml index 80058d6..4088f42 100644 --- a/code/jeeplatform-admin/src/main/resources/application-test.yml +++ b/code/jeeplatform-admin/src/main/resources/application-test.yml @@ -70,18 +70,18 @@ spring: ## 测试ConfigurationProperties -user: - userName: root - isAdmin: true - regTime: 2019/11/01 - isOnline: 1 - maps: {k1 : v1,k2: v2} - lists: - - list1 - - list2 - address: - tel: 15899988899 - name: 上海市 +#user: +# userName: root +# isAdmin: true +# regTime: 2019/11/01 +# isOnline: 1 +# maps: {k1 : v1,k2: v2} +# lists: +# - list1 +# - list2 +# address: +# tel: 15899988899 +# name: 上海市 diff --git a/code/jeeplatform-admin/src/main/resources/user.properties b/code/jeeplatform-admin/src/main/resources/user.properties new file mode 100644 index 0000000..a4cdee3 --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/user.properties @@ -0,0 +1,9 @@ +user.userName= root +user.isAdmin= true +user.regTime= 2019/11/01 +user.isOnline= 1 +user.maps.k1=v1 +user.maps.k2=v2 +user.lists=list1,list2 +user.address.tel= 15899988899 +user.address.name=shanghai \ No newline at end of file diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java index 38524f4..54c4558 100644 --- a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java @@ -1,6 +1,7 @@ package org.muses.jeeplatform.bean; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; import java.util.Date; @@ -19,6 +20,7 @@ * */ @Component +@PropertySource("classpath:user.properties") @ConfigurationProperties(prefix = "user") public class User { From 0e4d35f92e90c5ae77293986c2a8acba60195f14 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 9 Nov 2019 09:50:44 +0800 Subject: [PATCH 045/123] =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=9A@PropertySou?= =?UTF-8?q?rce=E6=B3=A8=E8=A7=A3=E4=BF=AE=E6=94=B9=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/src/main/resources/user.properties | 2 +- .../src/test/java/org.muses.jeeplatform/bean/User.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/jeeplatform-admin/src/main/resources/user.properties b/code/jeeplatform-admin/src/main/resources/user.properties index a4cdee3..51722ee 100644 --- a/code/jeeplatform-admin/src/main/resources/user.properties +++ b/code/jeeplatform-admin/src/main/resources/user.properties @@ -6,4 +6,4 @@ user.maps.k1=v1 user.maps.k2=v2 user.lists=list1,list2 user.address.tel= 15899988899 -user.address.name=shanghai \ No newline at end of file +user.address.name=上海浦东区 \ No newline at end of file diff --git a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java index 54c4558..4af6973 100644 --- a/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java +++ b/code/jeeplatform-admin/src/test/java/org.muses.jeeplatform/bean/User.java @@ -20,7 +20,7 @@ * */ @Component -@PropertySource("classpath:user.properties") +@PropertySource(value = "classpath:user.properties",encoding = "utf-8") @ConfigurationProperties(prefix = "user") public class User { From 06b175a129d03017a4be5d52bc5109582f6d7362 Mon Sep 17 00:00:00 2001 From: Nicky <362330721@qq.com> Date: Sat, 23 Nov 2019 15:34:43 +0800 Subject: [PATCH 046/123] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96i18n=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-test.yml | 20 ------------------- .../src/main/resources/i18n/i18n.properties | 3 +++ .../main/resources/i18n/i18n_en_US.properties | 3 +++ .../main/resources/i18n/i18n_zh_CN.properties | 3 +++ 4 files changed, 9 insertions(+), 20 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/resources/i18n/i18n.properties create mode 100644 code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties create mode 100644 code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties diff --git a/code/jeeplatform-admin/src/main/resources/application-test.yml b/code/jeeplatform-admin/src/main/resources/application-test.yml index 4088f42..ce9a8d6 100644 --- a/code/jeeplatform-admin/src/main/resources/application-test.yml +++ b/code/jeeplatform-admin/src/main/resources/application-test.yml @@ -68,23 +68,3 @@ spring: maxIdle : 10 maxWaitMillis : 100000 - -## 测试ConfigurationProperties -#user: -# userName: root -# isAdmin: true -# regTime: 2019/11/01 -# isOnline: 1 -# maps: {k1 : v1,k2: v2} -# lists: -# - list1 -# - list2 -# address: -# tel: 15899988899 -# name: 上海市 - - - - - - diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties new file mode 100644 index 0000000..66a8e1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n.properties @@ -0,0 +1,3 @@ +login.loginBtnName=登录 +login.password=密码 +login.username=用户名 \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties new file mode 100644 index 0000000..2c67923 --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n_en_US.properties @@ -0,0 +1,3 @@ +login.loginBtnName=login +login.password=password +login.username=userName \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties b/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties new file mode 100644 index 0000000..66a8e1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/resources/i18n/i18n_zh_CN.properties @@ -0,0 +1,3 @@ +login.loginBtnName=登录 +login.password=密码 +login.username=用户名 \ No newline at end of file From 4002bc30e055103d188a5c6f0a28ff520cd94d7a Mon Sep 17 00:00:00 2001 From: smileNicky <3623307211@qq.com> Date: Sat, 23 Nov 2019 15:36:40 +0800 Subject: [PATCH 047/123] modify .gitignore file --- code/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/code/.gitignore b/code/.gitignore index 266bfaa..4ace0e4 100644 --- a/code/.gitignore +++ b/code/.gitignore @@ -19,6 +19,7 @@ mvnw.* *.ipr *.iml *.iws +.mvn # temp ignore *.log From 5655325b016500af6d6a85690c29039bc9b2ef42 Mon Sep 17 00:00:00 2001 From: smileNicky <3623307211@qq.com> Date: Sun, 1 Dec 2019 22:24:37 +0800 Subject: [PATCH 048/123] =?UTF-8?q?SpringBoot=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/CustomErrorAttributes.java | 35 ++++++++++++++ .../component/CustomExceptionHandler.java | 48 +++++++++++++++++++ .../exception/CustomException.java | 30 ++++++++++++ .../src/main/resources/application-dev.yml | 2 + 4 files changed, 115 insertions(+) create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java new file mode 100644 index 0000000..f15e6ae --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomErrorAttributes.java @@ -0,0 +1,35 @@ +package org.muses.jeeplatform.component; + +import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; + +import java.util.Map; + +/** + *
    + *   自定义异常Attributes类
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
    + * 
    + */ +@Component +public class CustomErrorAttributes extends DefaultErrorAttributes { + + //返回值的map就是页面和json能获取的所有字段 + @Override + public Map getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { + //先将默认的Attributes封装到map + Map map = super.getErrorAttributes(requestAttributes, includeStackTrace); + map.put("company","company.com"); + //获取ExceptionHandler设置的Attributes,0表示从Request中拿 + Map ext = (Map) requestAttributes.getAttribute("extend",0); + map.put("extend",ext); + return map; + } + +} \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java new file mode 100644 index 0000000..8643de6 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/component/CustomExceptionHandler.java @@ -0,0 +1,48 @@ +package org.muses.jeeplatform.component; + +import org.muses.jeeplatform.exception.CustomException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +/** + *
    + *  自定义异常处理类
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
    + * 
    + */ +//@RestControllerAdvice +@ControllerAdvice +public class CustomExceptionHandler { + +// @ExceptionHandler(NotFoundException.class) +// @ResponseBody +// //@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR) +// @Deprecated +// public Map handleException(Exception e){ +// Map map = new HashMap<>(16); +// map.put("code", "404"); +// map.put("message", e.getMessage()); +// return map; +// } + + @ExceptionHandler({CustomException.class}) + public String handleException(Exception e, HttpServletRequest request){ + Map map = new HashMap<>(16); + map.put("code", "404"); + map.put("message", e.getMessage()); + request.setAttribute("javax.servlet.error.status_code",404); + request.setAttribute("extend",map); + return "forward:/error";//BasicErrorController的接口 + } + + +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java new file mode 100644 index 0000000..909f51b --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/exception/CustomException.java @@ -0,0 +1,30 @@ +package org.muses.jeeplatform.exception; + +/** + *
    + *  自定义异常类
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年12月01日  修改内容:
    + * 
    + */ +public class CustomException extends RuntimeException{ + + private Integer code;//自定义异常码 + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public CustomException(String message, Integer code) { + super(message);// 父类的构造函数;调用底层的Throwable的构造函数,将参数message赋值到detailMessage (Throwable的属性) + this.code = code;//赋值code码 + } +} diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index 61270f4..d7cdb01 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -1,5 +1,7 @@ server: port: 8081 + error: + path: /error spring: From 042e388c700befc1efb7bed4bea053a7103e166a Mon Sep 17 00:00:00 2001 From: Nicky <362330721@qq.com> Date: Sun, 12 Jan 2020 17:31:57 +0800 Subject: [PATCH 049/123] Update README.md --- README.md | 62 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 41daedd..9fb6ac2 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ public class RedisAspect { ![这里写图片描述](http://img.blog.csdn.net/20171214104303308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQyNzM5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -## 三、业务方案 +## 四、业务方案 ### 系统管理通用功能 - [x] 用户管理: 系统用户 - [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 OK @@ -162,20 +162,20 @@ public class RedisAspect { - [ ] 信息管理:文章管理、文章审核 ... -## 四、技术方案 +## 五、技术方案 ### 后台技术 -* 工作流引擎:Activiti5 +* 工作流引擎:Activiti5(待定) * ORM框架:Mybatis * Web框架:SpringMVC * 核心框架:Spring Framework4.0 -* 任务调度:Spring Task +* 任务调度:Spring Task(待定) * 权限安全:Apache Shiro * 全文搜索引擎:Lucene -* 模板引擎:JSP/Themeleaf -* 服务器页面包含技术:SSI -* 网页即时通讯:long polling/websocket +* 模板引擎:JSP(还没使用Thymeleaf,前端需要重构) +* 服务器页面包含技术:SSI(待定) +* 网页即时通讯:websocket * 连接池:Druid(阿里开源) -* 日志处理:SLF4J +* 日志处理:SLF4J(日志门面框架)、logback * 缓存处理:Redis * Excel表处理:POI @@ -191,25 +191,37 @@ public class RedisAspect { ### 服务器 * 负载均衡:Nginx * 分布式:alibaba Dubbo -* 中间件:RocketMQ +* 中间件:RocketMQ(待定) ### 项目测试 * DeBug:Junit、FindBugs、EclEmma * 程序质量:Jdepend4eclipse -* 压力测试:JMeter +* 压力测试:JMeter(待定) ### 工具软件 * 服务器:SecureCRT -* Java:IntelliJ IDEA/Eclipse +* Java:IntelliJ IDEA * 远程控制:TeamViewer -* 版本控制:Git +* 版本控制:Git、smartgit * Jar管理:Maven * UML建模:ArgoUML * Eclipse测试插件:EclEmma * 程序质量检查插件:Jdepend4eclipse(Eclipse平台) -## 五、常见问题 +## 六、常见问题 运行jeeplatform打开页面404,如果是用idea的,就可以edit configurations->configuration->edit working directory设置为:$MODULE_DIR$ -## 六、项目技术博客介绍 + +## 七、版本说明 +* master版本 +主干版本,代码经过测试,可以正常运行,这个版本还没集成全部CAS单点代码,因为CAS单点服务端代码基本调试成功,而客户端对接出现bug,所以并没有merge代码 +* dev版本 +dev版本代码和master分支基本一致 +* 1.0.0版本 +进行CAS单点登录实验的版本,CAS集成有遇到问题,还没合并代码到dev和master + +* 1.0.1版本 +进行Dubbo微服务实验的版本,代码还没合并到dev和master + +## 八、项目技术博客介绍 为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接 ### Java框架 @@ -220,6 +232,7 @@ public class RedisAspect { * [基于Shiro的登录验证功能实现](http://blog.csdn.net/u014427391/article/details/78307766) ### SpringBoot +我的Springboot系列博客可以参考我的专栏:[SpringBoot系列博客](https://blog.csdn.net/u014427391/category_9195353.html) * [SpringBoot热部署配置](https://smilenicky.blog.csdn.net/article/details/89765909) * [SpringBoot集成Redis实现缓存处理](http://blog.csdn.net/u014427391/article/details/78799623) * [SpringBoot profles配置多环境](https://smilenicky.blog.csdn.net/article/details/89792248) @@ -247,22 +260,25 @@ public class RedisAspect { ### 单点登录 * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482) +* [CAS单点登录系列之原理简单介绍](https://blog.csdn.net/u014427391/article/details/82083995) +* [CAS单点登录系列之服务端部署](https://blog.csdn.net/u014427391/article/details/91345307) +* [CAS单点登录系列之支持数据库认证](https://blog.csdn.net/u014427391/article/details/91345240) ### Docker笔记 * [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891) ### SQL调优知识 -Oracle -* [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696) -* [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234) -* [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680) -* [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262) -* [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755) +* Oracle + * [Oracle优化器基础知识](https://blog.csdn.net/u014427391/article/details/88650696) + * [Oracle性能调优之虚拟索引用法简介](https://smilenicky.blog.csdn.net/article/details/89761234) + * [Oracle性能调优之物化视图用法简介](https://smilenicky.blog.csdn.net/article/details/89762680) + * [Orace执行计划学习笔记](https://smilenicky.blog.csdn.net/article/details/89604262) + * [Oracle共享池分析SQL资源使用情况](https://blog.csdn.net/u014427391/article/details/86562755) -MySQL -* [MySQL调优之Explain](https://smilenicky.blog.csdn.net/article/details/100853310) -* [MySQL调优之索引](https://smilenicky.blog.csdn.net/article/details/100846922) +* MySQL + * [MySQL调优之Explain](https://smilenicky.blog.csdn.net/article/details/100853310) + * [MySQL调优之索引](https://smilenicky.blog.csdn.net/article/details/100846922) From 8fe02b7654108f24cfb72908b5d061aea825dc78 Mon Sep 17 00:00:00 2001 From: Nicky <362330721@qq.com> Date: Sun, 12 Jan 2020 17:37:33 +0800 Subject: [PATCH 050/123] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9fb6ac2..c03c0c0 100644 --- a/README.md +++ b/README.md @@ -146,10 +146,10 @@ public class RedisAspect { ## 四、业务方案 ### 系统管理通用功能 - [x] 用户管理: 系统用户 -- [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 OK -- [x] 权限管理: 权限管理细分到系统按钮权限,菜单权限,管理员可以对权限进行细分控制 +- [x] 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 +- [x] 权限管理: 权限管理细分到系统菜单权限 - [ ] 在线管理:管理在线用户,可以强制下线 -- [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限 OK +- [x] 菜单管理:系统可以配置系统菜单,并分配不同的权限 - [ ] 报表统计:数据报表、用户分析 - [x] 系统监控:数据库等方面监控(采用Druid提供的) - [x] 在线文档:SwaggerUI API在线文档管理 From b44ddb901a78c482cf8ec4d843ec51f0a7bca8b6 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 11 Apr 2020 16:09:44 +0800 Subject: [PATCH 051/123] =?UTF-8?q?rebuild=EF=BC=9A=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 4 +- .../.gitignore | 0 .../pom.xml | 6 +-- .../dao/repository/admin/MenuRepository.java | 0 .../repository/admin/MenuTreeRepository.java | 0 .../admin/PermissionPageRepository.java | 0 .../admin/PermissionRepository.java | 0 .../repository/admin/RolePageRepository.java | 0 .../admin/RolePermissionRepository.java | 0 .../dao/repository/admin/RoleRepository.java | 0 .../dao/repository/admin/UserRepository.java | 0 .../repository/admin/UserRoleRepository.java | 0 .../jeeplatform/core/entity/admin/Menu.java | 0 .../core/entity/admin/Operation.java | 0 .../core/entity/admin/Permission.java | 0 .../jeeplatform/core/entity/admin/Role.java | 0 .../core/entity/admin/RolePermission.java | 0 .../jeeplatform/core/entity/admin/User.java | 0 .../core/entity/admin/UserRole.java | 0 .../core/entity/admin/dto/RoleVO.java | 0 .../core/entity/admin/dto/SysMenu.java | 0 .../core/entity/admin/dto/ZTree.java | 0 .../jeeplatform/core/web/demoController.java | 0 .../src/main/resources/application.yml | 0 .../src/main/resources/mybatis-config.xml | 0 .../src/main/resources/templates/base.html | 0 .../src/main/resources/templates/index.html | 0 .../src/main/resources/templates/login.html | 0 .../src/main/resources/templates/table.html | 0 .../src/main/resources/application.yml | 50 +++++++++++++++++++ .../src/main/resources/mybatis-config.xml | 36 +++++++++++++ code/pom.xml | 7 +-- 32 files changed, 95 insertions(+), 8 deletions(-) rename code/{jeeplatform-core => jeeplatform-provider-api}/.gitignore (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/pom.xml (86%) mode change 100755 => 100644 rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/java/org/muses/jeeplatform/core/web/demoController.java (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/application.yml (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/mybatis-config.xml (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/templates/base.html (100%) mode change 100755 => 100644 rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/templates/index.html (100%) rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/templates/login.html (100%) mode change 100755 => 100644 rename code/{jeeplatform-core => jeeplatform-provider-api}/src/main/resources/templates/table.html (100%) mode change 100755 => 100644 create mode 100644 code/jeeplatform-provider/src/main/resources/application.yml create mode 100644 code/jeeplatform-provider/src/main/resources/mybatis-config.xml diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index ba50c70..405b063 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -30,8 +30,8 @@
    org.muses.jeeplatform - jeeplatform-core - ${jeeplatform-core.version} + jeeplatform-provider-api + ${jeeplatform-provider-api.version} diff --git a/code/jeeplatform-core/.gitignore b/code/jeeplatform-provider-api/.gitignore similarity index 100% rename from code/jeeplatform-core/.gitignore rename to code/jeeplatform-provider-api/.gitignore diff --git a/code/jeeplatform-core/pom.xml b/code/jeeplatform-provider-api/pom.xml old mode 100755 new mode 100644 similarity index 86% rename from code/jeeplatform-core/pom.xml rename to code/jeeplatform-provider-api/pom.xml index ad6b46d..18505a6 --- a/code/jeeplatform-core/pom.xml +++ b/code/jeeplatform-provider-api/pom.xml @@ -6,9 +6,9 @@ jeeplatform 1.0-SNAPSHOT - jeeplatform-core - jeeplatform-core - ${jeeplatform-core.version} + jeeplatform-provider-api + jeeplatform-provider-api + ${jeeplatform-provider-api.version} jar diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/MenuTreeRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionPageRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/PermissionRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePageRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RolePermissionRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/RoleRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dao/repository/admin/UserRoleRepository.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Menu.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Operation.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Permission.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/Role.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/RolePermission.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/User.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/UserRole.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java diff --git a/code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/web/demoController.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java similarity index 100% rename from code/jeeplatform-core/src/main/java/org/muses/jeeplatform/core/web/demoController.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java diff --git a/code/jeeplatform-core/src/main/resources/application.yml b/code/jeeplatform-provider-api/src/main/resources/application.yml similarity index 100% rename from code/jeeplatform-core/src/main/resources/application.yml rename to code/jeeplatform-provider-api/src/main/resources/application.yml diff --git a/code/jeeplatform-core/src/main/resources/mybatis-config.xml b/code/jeeplatform-provider-api/src/main/resources/mybatis-config.xml similarity index 100% rename from code/jeeplatform-core/src/main/resources/mybatis-config.xml rename to code/jeeplatform-provider-api/src/main/resources/mybatis-config.xml diff --git a/code/jeeplatform-core/src/main/resources/templates/base.html b/code/jeeplatform-provider-api/src/main/resources/templates/base.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/base.html rename to code/jeeplatform-provider-api/src/main/resources/templates/base.html diff --git a/code/jeeplatform-core/src/main/resources/templates/index.html b/code/jeeplatform-provider-api/src/main/resources/templates/index.html similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/index.html rename to code/jeeplatform-provider-api/src/main/resources/templates/index.html diff --git a/code/jeeplatform-core/src/main/resources/templates/login.html b/code/jeeplatform-provider-api/src/main/resources/templates/login.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/login.html rename to code/jeeplatform-provider-api/src/main/resources/templates/login.html diff --git a/code/jeeplatform-core/src/main/resources/templates/table.html b/code/jeeplatform-provider-api/src/main/resources/templates/table.html old mode 100755 new mode 100644 similarity index 100% rename from code/jeeplatform-core/src/main/resources/templates/table.html rename to code/jeeplatform-provider-api/src/main/resources/templates/table.html diff --git a/code/jeeplatform-provider/src/main/resources/application.yml b/code/jeeplatform-provider/src/main/resources/application.yml new file mode 100644 index 0000000..796b6d2 --- /dev/null +++ b/code/jeeplatform-provider/src/main/resources/application.yml @@ -0,0 +1,50 @@ +spring: + datasource: + + # 主数据源 + shop: + url: jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 + username: root + password: root + + driver-class-name: com.mysql.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + + # 连接池设置 + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + # Oracle请使用select 1 from dual + validation-query: SELECT 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + jpa: + database: mysql + properties: + hibernate: + show_sql: false + format_sql: true + +# 端口 +server: + port: 8022 + + +#debug: true diff --git a/code/jeeplatform-provider/src/main/resources/mybatis-config.xml b/code/jeeplatform-provider/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000..793bded --- /dev/null +++ b/code/jeeplatform-provider/src/main/resources/mybatis-config.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/pom.xml b/code/pom.xml index 950e63b..edb75e6 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -18,11 +18,11 @@ UTF-8 - 1.0 + 1.0 1.0 1.0 1.0 - + 1.0 1.2.17 5.1.27 @@ -127,10 +127,11 @@ - jeeplatform-core + jeeplatform-provider-api jeeplatform-admin jeeplatform-common jeeplatform-sso + jeeplatform-provider From c87c5d8658acd5124c5e39917f5938ff2dc155c4 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 11 Apr 2020 20:52:04 +0800 Subject: [PATCH 052/123] =?UTF-8?q?=E6=8F=90=E4=BA=A4OA=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-oa/pom.xml | 16 ++++++++++++ .../muses/jeeplatform/oa/OAApplication.java | 14 +++++++++++ .../oa/web/controller/OAIndexController.java | 25 +++++++++++++++++++ code/pom.xml | 1 + 4 files changed, 56 insertions(+) create mode 100644 code/jeeplatform-oa/pom.xml create mode 100644 code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java create mode 100644 code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java diff --git a/code/jeeplatform-oa/pom.xml b/code/jeeplatform-oa/pom.xml new file mode 100644 index 0000000..01e40ba --- /dev/null +++ b/code/jeeplatform-oa/pom.xml @@ -0,0 +1,16 @@ + + + + jeeplatform + org.muses.jeeplatform + 1.0-SNAPSHOT + + 4.0.0 + + jeeplatform-oa + jar + + + \ No newline at end of file diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java new file mode 100644 index 0000000..b259ec7 --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java @@ -0,0 +1,14 @@ +package org.muses.jeeplatform.oa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OAApplication { + + public static void main(String[] args) { + SpringApplication.run(OAApplication.class, args); + } + + +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java new file mode 100644 index 0000000..b73774f --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java @@ -0,0 +1,25 @@ +package org.muses.jeeplatform.oa.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
    + * 
    + */ +@Controller +public class OAIndexController { + + @GetMapping(value = {"/index"}) + public ModelAndView toIndexPage(){ + return new ModelAndView(""); + } +} diff --git a/code/pom.xml b/code/pom.xml index edb75e6..95dae25 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -132,6 +132,7 @@ jeeplatform-common jeeplatform-sso jeeplatform-provider + jeeplatform-oa From 9d724ce971ff17a89b6c124cba9fb7927492c94c Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 11 Apr 2020 21:20:23 +0800 Subject: [PATCH 053/123] =?UTF-8?q?CAS=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=8E=A5?= =?UTF-8?q?=E5=85=A5&&CAS=E6=9C=8D=E5=8A=A1=E7=AB=AF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 13 +++-- .../muses/jeeplatform/config/CASConfig.java | 52 +++++++++++++++++++ .../src/main/resources/application-dev.yml | 7 ++- .../src/main/resources/application-prod.yml | 7 ++- .../src/main/resources/application-test.yml | 6 +++ code/jeeplatform-sso/pom.xml | 10 +++- .../CostomUsernamePasswordAuthentication.java | 0 7 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java rename code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/{providers => }/CostomUsernamePasswordAuthentication.java (100%) diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 405b063..05da808 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -68,11 +68,11 @@ shiro-ehcache ${shiro.encache.version} - + @@ -96,10 +96,17 @@ - + + + + + net.unicon.cas + cas-client-autoconfig-support + 1.5.0-GA diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java new file mode 100644 index 0000000..43199d6 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java @@ -0,0 +1,52 @@ +package org.muses.jeeplatform.config; + +import net.unicon.cas.client.configuration.CasClientConfigurerAdapter; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
    + * 
    + */ +@Configuration +@EnableCasClient +public class CASConfig extends CasClientConfigurerAdapter { + + private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login"; + private static final String SERVER_NAME = "http://localhost:8081/"; + + +// @Override +// public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { +// super.configureAuthenticationFilter(authenticationFilter); +// //authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass","com.patterncat.CustomAuthRedirectStrategy"); +// } + + @Bean + public FilterRegistrationBean filterRegistrationBean(){ + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new AuthenticationFilter()); + registrationBean.addUrlPatterns("/*"); + Map initParameters = new HashMap(16); + initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN); + initParameters.put("serverName",SERVER_NAME); + initParameters.put("ignorePattern","/logoutSuccess/*"); + registrationBean.setOrder(1); + return registrationBean; + } + + +} diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index d7cdb01..dbf87d9 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -69,7 +69,12 @@ spring: maxTotal : 100 maxIdle : 10 maxWaitMillis : 100000 - +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8081 + validation-type: cas +# use-session: true diff --git a/code/jeeplatform-admin/src/main/resources/application-prod.yml b/code/jeeplatform-admin/src/main/resources/application-prod.yml index 2223642..baa3dc7 100644 --- a/code/jeeplatform-admin/src/main/resources/application-prod.yml +++ b/code/jeeplatform-admin/src/main/resources/application-prod.yml @@ -69,6 +69,11 @@ spring: maxWaitMillis : 100000 - +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8081 + validation-type: cas +# use-session: true diff --git a/code/jeeplatform-admin/src/main/resources/application-test.yml b/code/jeeplatform-admin/src/main/resources/application-test.yml index ce9a8d6..38502d2 100644 --- a/code/jeeplatform-admin/src/main/resources/application-test.yml +++ b/code/jeeplatform-admin/src/main/resources/application-test.yml @@ -68,3 +68,9 @@ spring: maxIdle : 10 maxWaitMillis : 100000 +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8081 + validation-type: cas +# use-session: true diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml index 07da431..57ca450 100644 --- a/code/jeeplatform-sso/pom.xml +++ b/code/jeeplatform-sso/pom.xml @@ -61,7 +61,7 @@ ${cas.version} - + com.lmax @@ -123,6 +123,12 @@ --> + + org.apache.commons + commons-collections4 + 4.0 + +
    diff --git a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/providers/CostomUsernamePasswordAuthentication.java b/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java similarity index 100% rename from code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/providers/CostomUsernamePasswordAuthentication.java rename to code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java From 82a0db9303cd95c530c6d3f26b6bc45147ecd7bf Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 12 Apr 2020 21:30:06 +0800 Subject: [PATCH 054/123] =?UTF-8?q?rebuild:=E6=9B=B4=E6=8D=A2CAS=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-sso/pom.xml | 217 +++- .../CostomUsernamePasswordAuthentication.java | 90 +- .../src/main/resources/application.properties | 114 ++ .../src/main/webapp/WEB-INF/cas-servlet.xml | 100 -- .../webapp/WEB-INF/deployerConfigContext.xml | 137 -- .../src/main/webapp/WEB-INF/log4j2.xml | 221 +++- .../WEB-INF/services/Apereo-10000002.json | 26 +- .../services/HTTPSandIMAPS-10000001.json | 26 +- .../propertyFileConfigurer.xml | 23 - .../jsp/default/ui/casLoginMessageView.jsp | 22 - .../view/jsp/default/ui/casLoginView.bat.jsp | 36 - .../view/jsp/default/ui/casLoginView.jsp | 199 --- .../view/jsp/default/ui/casLogoutView.jsp | 7 - .../view/jsp/default/ui/includes/bottom.jsp | 22 - .../view/jsp/default/ui/includes/top.jsp | 33 - .../src/main/webapp/WEB-INF/web.xml | 260 ---- .../WEB-INF/webflow/login/login-webflow.xml | 212 ---- .../WEB-INF/webflow/logout/logout-webflow.xml | 35 - .../src/main/webapp/cas.properties | 733 ----------- .../src/main/webapp/css/cas.css | 528 -------- .../src/main/webapp/css/ssosessions.css | 130 -- .../src/main/webapp/images/6inchbrand-64.png | Bin 1875 -> 0 bytes .../src/main/webapp/images/cas-logo.png | Bin 2003 -> 0 bytes .../src/main/webapp/images/confirm.gif | Bin 958 -> 0 bytes .../src/main/webapp/images/error.gif | Bin 1084 -> 0 bytes .../src/main/webapp/images/error.png | Bin 1471 -> 0 bytes .../src/main/webapp/images/favicon.ico | Bin 1150 -> 0 bytes .../src/main/webapp/images/green.gif | Bin 43 -> 0 bytes .../src/main/webapp/images/info.gif | Bin 980 -> 0 bytes .../src/main/webapp/images/info.png | Bin 1505 -> 0 bytes .../src/main/webapp/images/key-point_bl.gif | Bin 102 -> 0 bytes .../src/main/webapp/images/key-point_br.gif | Bin 186 -> 0 bytes .../src/main/webapp/images/key-point_tl.gif | Bin 103 -> 0 bytes .../src/main/webapp/images/key-point_tr.gif | Bin 105 -> 0 bytes .../src/main/webapp/images/logo.png | Bin 26418 -> 0 bytes .../src/main/webapp/images/question.png | Bin 3948 -> 0 bytes .../src/main/webapp/images/red.gif | Bin 43 -> 0 bytes .../src/main/webapp/images/success.png | Bin 1569 -> 0 bytes .../src/main/webapp/images/warning.png | Bin 602 -> 0 bytes .../src/main/webapp/images/webapp.png | Bin 10166 -> 0 bytes .../jeeplatform-sso/src/main/webapp/index.jsp | 6 - .../jeeplatform-sso/src/main/webapp/js/cas.js | 62 - .../src/main/webapp/js/ssosessions.js | 181 --- .../src/main/webapp/js/statisticsview.js | 138 -- .../src/main/webapp/js/test_data.json | 1117 ----------------- .../src/main/webapp/js/viewConfig.js | 59 - .../src/main/webapp/themes/apereo/css/cas.css | 198 --- .../themes/apereo/images/apereo-logo.png | Bin 28964 -> 0 bytes .../webapp/themes/apereo/images/bg-tile.gif | Bin 26910 -> 0 bytes .../src/main/webapp/themes/apereo/js/cas.js | 20 - .../webapp/themes/jeeplatform/css/login.css | 31 - .../jeeplatform/images/air-balloon-1.png | Bin 8981 -> 0 bytes .../jeeplatform/images/air-balloon-2.png | Bin 4602 -> 0 bytes .../themes/jeeplatform/images/login-bg.jpg | Bin 71775 -> 0 bytes .../themes/jeeplatform/images/login-foot.jpg | Bin 31434 -> 0 bytes .../themes/jeeplatform/images/login.png | Bin 38326 -> 0 bytes .../webapp/themes/jeeplatform/js/fun.base.js | 13 - .../themes/jeeplatform/js/jquery-1.8.3.js | 1 - .../themes/jeeplatform/js/jquery.cookie.js | 117 -- .../themes/jeeplatform/js/jquery.tips.js | 104 -- .../webapp/themes/jeeplatform/js/login.js | 45 - 61 files changed, 539 insertions(+), 4724 deletions(-) create mode 100644 code/jeeplatform-sso/src/main/resources/application.properties delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml delete mode 100644 code/jeeplatform-sso/src/main/webapp/cas.properties delete mode 100644 code/jeeplatform-sso/src/main/webapp/css/cas.css delete mode 100644 code/jeeplatform-sso/src/main/webapp/css/ssosessions.css delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/cas-logo.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/confirm.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/error.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/error.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/favicon.ico delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/green.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/info.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/info.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/key-point_br.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/key-point_tl.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/logo.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/question.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/red.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/success.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/warning.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/images/webapp.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/index.jsp delete mode 100644 code/jeeplatform-sso/src/main/webapp/js/cas.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/js/ssosessions.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/js/statisticsview.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/js/test_data.json delete mode 100644 code/jeeplatform-sso/src/main/webapp/js/viewConfig.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/css/login.css delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-1.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-bg.jpg delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login.png delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js delete mode 100644 code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml index 57ca450..6815073 100644 --- a/code/jeeplatform-sso/pom.xml +++ b/code/jeeplatform-sso/pom.xml @@ -15,53 +15,79 @@ UTF-8 - 4.2.7 + 5.2.6 2.3.2 2.0.0-RC1 2.8.2 3.3.6 1.1.1-RELEASE + 5.1.46 + + 1.5.7.RELEASE + + -tomcat + + org.springframework.boot.loader.WarLauncher + false + ${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF + + 1.8 + 1.8 + UTF-8 - org.jasig.cas + org.apereo.cas cas-server-webapp ${cas.version} war runtime - org.jasig.cas + org.apereo.cas cas-server-core ${cas.version} - - org.jasig.cas + - org.jasig.cas + org.apereo.cas cas-server-support-rest-services ${cas.version} - org.jasig.cas + org.apereo.cas cas-server-support-jdbc ${cas.version} + org.apereo.cas + cas-server-support-jdbc-drivers + ${cas.version} + + + + + mysql + mysql-connector-java + ${mysql.driver.version} + + + - + - + + + + + org.springframework.boot + spring-boot-maven-plugin + ${springboot.version} + + ${mainClassName} + true + ${isExecutable} + WAR + + + + + repackage + + + + org.apache.maven.plugins maven-war-plugin 2.6 cas + false + false + + false + ${manifestFileToUse} + - org.jasig.cas - cas-server-webapp - - WEB-INF/cas.properties - WEB-INF/classes/log4j2.xml - WEB-INF/classes/message*.properties - WEB-INF/classes/services - + org.apereo.cas + cas-server-webapp${app.server} @@ -157,13 +215,116 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - + 3.3 + cas + + + + + true + + default + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + war + runtime + + + + + + + + false + + exec + + org.apereo.cas.web.CasWebApplication + true + + + + + + com.soebes.maven.plugins + echo-maven-plugin + 0.3.0 + + + prepare-package + + echo + + + + + + Executable profile to make the generated CAS web application executable. + + + + + + + + + + false + + bootiful + + -tomcat + false + + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + war + runtime + + + + + + + false + + pgp + + + + com.github.s4u.plugins + pgpverify-maven-plugin + 1.1.0 + + + + check + + + + + hkp://pool.sks-keyservers.net + ${settings.localRepository}/pgpkeys-cache + test + true + false + + + + + + + diff --git a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java b/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java index eb92d16..3bcb72d 100644 --- a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java +++ b/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java @@ -1,45 +1,45 @@ -package org.muses.jeeplatform.cas.authentication.security.providers; - -import org.jasig.cas.authentication.HandlerResult; -import org.jasig.cas.authentication.PreventedException; -import org.jasig.cas.authentication.UsernamePasswordCredential; -import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; - -import javax.security.auth.login.FailedLoginException; -import java.security.GeneralSecurityException; - -/** - *
    - *  CAS单点登录验证
    - * 
    - * - * @author nicky.ma - *
    - * 修改记录
    - *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
    - * 
    - */ -public class CostomUsernamePasswordAuthentication extends AbstractUsernamePasswordAuthenticationHandler { - - - @Override - protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { - if (usernamePasswordCredential == null) { - throw new FailedLoginException("No user can be accepted because none is defined"); - } - return doAuthentication(usernamePasswordCredential); - } - - /** - * 用户密码验证 - * @param credential - * @return - */ - private HandlerResult doAuthentication(UsernamePasswordCredential credential) { - String username = credential.getUsername(); - String password = credential.getPassword(); - - String fullUserName = username; - return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); - } -} +//package org.muses.jeeplatform.cas.authentication.security.providers; +// +//import org.jasig.cas.authentication.HandlerResult; +//import org.jasig.cas.authentication.PreventedException; +//import org.jasig.cas.authentication.UsernamePasswordCredential; +//import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; +// +//import javax.security.auth.login.FailedLoginException; +//import java.security.GeneralSecurityException; +// +///** +// *
    +// *  CAS单点登录验证
    +// * 
    +// * +// * @author nicky.ma +// *
    +// * 修改记录
    +// *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
    +// * 
    +// */ +//public class CostomUsernamePasswordAuthentication extends AbstractUsernamePasswordAuthenticationHandler { +// +// +// @Override +// protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { +// if (usernamePasswordCredential == null) { +// throw new FailedLoginException("No user can be accepted because none is defined"); +// } +// return doAuthentication(usernamePasswordCredential); +// } +// +// /** +// * 用户密码验证 +// * @param credential +// * @return +// */ +// private HandlerResult doAuthentication(UsernamePasswordCredential credential) { +// String username = credential.getUsername(); +// String password = credential.getPassword(); +// +// String fullUserName = username; +// return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); +// } +//} diff --git a/code/jeeplatform-sso/src/main/resources/application.properties b/code/jeeplatform-sso/src/main/resources/application.properties new file mode 100644 index 0000000..91b56d0 --- /dev/null +++ b/code/jeeplatform-sso/src/main/resources/application.properties @@ -0,0 +1,114 @@ +## +# CAS Server Context Configuration +# +server.context-path=/cas +server.port=8443 + +server.ssl.key-store=file:/etc/cas/thekeystore +server.ssl.key-store-password=changeit +server.ssl.key-password=changeit +# server.ssl.ciphers= +# server.ssl.client-auth= +# server.ssl.enabled= +# server.ssl.key-alias= +# server.ssl.key-store-provider= +# server.ssl.key-store-type= +# server.ssl.protocol= +# server.ssl.trust-store= +# server.ssl.trust-store-password= +# server.ssl.trust-store-provider= +# server.ssl.trust-store-type= + +server.max-http-header-size=2097152 +server.use-forward-headers=true +server.connection-timeout=20000 +server.error.include-stacktrace=ALWAYS + +server.compression.enabled=true +server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain + +server.tomcat.max-http-post-size=2097152 +server.tomcat.basedir=build/tomcat +server.tomcat.accesslog.enabled=true +server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms) +server.tomcat.accesslog.suffix=.log +server.tomcat.max-threads=10 +server.tomcat.port-header=X-Forwarded-Port +server.tomcat.protocol-header=X-Forwarded-Proto +server.tomcat.protocol-header-https-value=https +server.tomcat.remote-ip-header=X-FORWARDED-FOR +server.tomcat.uri-encoding=UTF-8 + +spring.http.encoding.charset=UTF-8 +spring.http.encoding.enabled=true +spring.http.encoding.force=true + +## +# CAS Cloud Bus Configuration +# +spring.cloud.bus.enabled=false +# spring.cloud.bus.refresh.enabled=true +# spring.cloud.bus.env.enabled=true +# spring.cloud.bus.destination=CasCloudBus +# spring.cloud.bus.ack.enabled=true + +endpoints.enabled=false +endpoints.sensitive=true + +endpoints.restart.enabled=false +endpoints.shutdown.enabled=false + +management.security.enabled=true +management.security.roles=ACTUATOR,ADMIN +management.security.sessions=if_required +management.context-path=/status +management.add-application-context-header=false + +security.basic.authorize-mode=role +security.basic.enabled=false +security.basic.path=/cas/status/** + +## +# CAS Web Application Session Configuration +# +server.session.timeout=300 +server.session.cookie.http-only=true +server.session.tracking-modes=COOKIE + +## +# CAS Thymeleaf View Configuration +# +spring.thymeleaf.encoding=UTF-8 +spring.thymeleaf.cache=true +spring.thymeleaf.mode=HTML +## +# CAS Log4j Configuration +# +# logging.config=file:/etc/cas/log4j2.xml +server.context-parameters.isLog4jAutoInitializationDisabled=true + +## +# CAS AspectJ Configuration +# +spring.aop.auto=true +spring.aop.proxy-target-class=true + +## +# CAS Authentication Credentials +# +cas.authn.accept.users=casuser::Mellon + +cas.tgc.secure=false +cas.serviceRegistry.initFromJson=true + +## +# CAS Internationalization +# +locale.default=zh_CN +locale.param.name=locale +message.bundle.encoding=UTF-8 +message.bundle.cacheseconds=180 +message.bundle.fallback.systemlocale=false +message.bundle.usecode.message=true +# message.bundle.basenames=classpath:custom_messages,classpath:messages +message.bundle.basenames=WEB-INF/locale/messages \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml deleted file mode 100644 index 1298744..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/cas-servlet.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml deleted file mode 100644 index 478c25b..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/deployerConfigContext.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - memberOf - - faculty - staff - org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml index d627943..e5f03ef 100644 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml @@ -1,79 +1,228 @@ - + + + /etc/cas/logs + - - + + + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + - - - + + + - + diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json index 04403d3..cda4cd7 100644 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json @@ -1,29 +1,9 @@ { - "@class" : "org.jasig.cas.services.RegexRegisteredService", + "@class" : "org.apereo.cas.services.RegexRegisteredService", "serviceId" : "^https://www.apereo.org", "name" : "Apereo", "theme" : "apereo", "id" : 10000002, "description" : "Apereo foundation sample service", - "proxyPolicy" : { - "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" - }, - "evaluationOrder" : 1, - "usernameAttributeProvider" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" - }, - "logoutType" : "BACK_CHANNEL", - "attributeReleasePolicy" : { - "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", - "principalAttributesRepository" : { - "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" - }, - "authorizedToReleaseCredentialPassword" : false, - "authorizedToReleaseProxyGrantingTicket" : false - }, - "accessStrategy" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", - "enabled" : true, - "ssoEnabled" : true - } -} \ No newline at end of file + "evaluationOrder" : 1 +} diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json index 7e1ba78..d034046 100644 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json @@ -1,28 +1,8 @@ { - "@class" : "org.jasig.cas.services.RegexRegisteredService", + "@class" : "org.apereo.cas.services.RegexRegisteredService", "serviceId" : "^(https|http|imaps)://.*", "name" : "HTTPS and IMAPS", "id" : 10000001, - "description" : "This service definition authorized all application urls that support HTTPS and IMAPS protocols.", - "proxyPolicy" : { - "@class" : "org.jasig.cas.services.RefuseRegisteredServiceProxyPolicy" - }, - "evaluationOrder" : 10000, - "usernameAttributeProvider" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceUsernameProvider" - }, - "logoutType" : "BACK_CHANNEL", - "attributeReleasePolicy" : { - "@class" : "org.jasig.cas.services.ReturnAllowedAttributeReleasePolicy", - "principalAttributesRepository" : { - "@class" : "org.jasig.cas.authentication.principal.DefaultPrincipalAttributesRepository" - }, - "authorizedToReleaseCredentialPassword" : false, - "authorizedToReleaseProxyGrantingTicket" : false - }, - "accessStrategy" : { - "@class" : "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", - "enabled" : true, - "ssoEnabled" : true - } + "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.", + "evaluationOrder" : 10000 } diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml deleted file mode 100644 index 3e300c0..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - This file lets CAS know where you've stored the cas.properties file which details some of the configuration - options - that are specific to your environment. You can specify the location of the file here. You may wish to place the - file outside - of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the - WAR file - can be moved between tiers without modification. - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp deleted file mode 100644 index 716cac3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - -
    -

    Authentication Succeeded with Warnings

    - - -

    ${message.text}

    -
    - -
    - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp deleted file mode 100644 index 441516f..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.bat.jsp +++ /dev/null @@ -1,36 +0,0 @@ - - - -<%-- -
    -

    -

    -
    -
    --%> - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp deleted file mode 100644 index 3a81dc7..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLoginView.jsp +++ /dev/null @@ -1,199 +0,0 @@ - - - -<%-- -
    -

    -

    -
    -
    --%> - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - -
    -

    ${fn:escapeXml(registeredServiceName)}

    -

    ${fn:escapeXml(registeredServiceDescription)}

    -
    - -

    - - -

    - - - - -

    - -
    - - - - - " /> - - - - - - -
    - -
    - - <%-- - NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute, - "autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more - information, see the following web page: - http://www.technofundo.com/tech/web/ie_autocomplete.html - --%> - - - -
    - - - -
    - - - - - " tabindex="6" type="submit" /> - " tabindex="7" type="reset" /> -
    -
    -
    - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp deleted file mode 100644 index 187c52a..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/casLogoutView.jsp +++ /dev/null @@ -1,7 +0,0 @@ - -
    -

    -

    -

    -
    - \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp deleted file mode 100644 index 0bde3a8..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/bottom.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp b/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp deleted file mode 100644 index 85cb24b..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/view/jsp/default/ui/includes/top.jsp +++ /dev/null @@ -1,33 +0,0 @@ - - -<%@ page pageEncoding="UTF-8" %> -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - - - - - CAS – Central Authentication Service - - - - - - - " /> - " type="image/x-icon" /> - - - - -
    -
    - -

    Central Authentication Service (CAS)

    -
    -
    diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 688d448..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - Central Authentication System (CAS) - - - - - contextConfigLocation - - /WEB-INF/spring-configuration/*.xml - /WEB-INF/deployerConfigContext.xml - - classpath*:/META-INF/spring/*.xml - - - - - characterEncodingFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - characterEncodingFilter - /* - - - - CAS Client Info Logging Filter - org.jasig.inspektr.common.web.ClientInfoThreadLocalFilter - true - - - CAS Client Info Logging Filter - /* - - - - requestParameterSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - requestParameterSecurityFilter - /* - - - - responseHeadersSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - responseHeadersSecurityFilter - /* - - - - - - org.springframework.web.context.ContextLoaderListener - - - - - org.jasig.cas.CasEnvironmentContextListener - - - - - - cas - - org.springframework.web.servlet.DispatcherServlet - - - contextConfigLocation - - /WEB-INF/cas-servlet.xml,classpath*:/META-INF/cas-servlet-*.xml,/WEB-INF/cas-servlet-*.xml - - - publishContext - false - - 1 - true - - - - cas - /login - - - - cas - /logout - - - - cas - /validate - - - - cas - /serviceValidate - - - - cas - /p3/serviceValidate - - - - cas - /proxy - - - - cas - /proxyValidate - - - - cas - /p3/proxyValidate - - - - cas - /CentralAuthenticationService - - - - cas - /status - - - - cas - /statistics - - - - cas - /statistics/ping - - - - cas - /statistics/metrics - - - - cas - /statistics/threads - - - - cas - /statistics/healthcheck - - - - cas - /statistics/ssosessions/* - - - - cas - /statistics/ssosessions - - - - cas - /status/config/* - - - - cas - /status/config - - - - cas - /authorizationFailure.html - - - - cas - /v1/tickets/* - - - cas - /v1/services/* - - - - - 5 - COOKIE - - true - - - - - 401 - /authorizationFailure.html - - - - 403 - /authorizationFailure.html - - - - 404 - / - - - - 500 - /WEB-INF/view/jsp/errors.jsp - - - - 501 - /WEB-INF/view/jsp/errors.jsp - - - - 503 - /WEB-INF/view/jsp/errors.jsp - - - - index.jsp - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml deleted file mode 100644 index e4bd281..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/login/login-webflow.xml +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml deleted file mode 100644 index 100ccc3..0000000 --- a/code/jeeplatform-sso/src/main/webapp/WEB-INF/webflow/logout/logout-webflow.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/cas.properties b/code/jeeplatform-sso/src/main/webapp/cas.properties deleted file mode 100644 index b4405a2..0000000 --- a/code/jeeplatform-sso/src/main/webapp/cas.properties +++ /dev/null @@ -1,733 +0,0 @@ - server.name=http://localhost:8080 - server.prefix=${server.name}/cas - -## -# Datasource config - platform.jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jeeplatform?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false - platform.jdbc.username=root - platform.jdbc.password=root -#platform.jdbc.publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZijIzzXp1dyksL1ZSejBmuVz1Y0vgiQVbcQ/13p4pwHRo8gU3pd6YaWutOlBTEWvHBbnGxIdnrhxnQZGwU1O0CAwEAAQ== - platform.jdbc.initialSize=10 - platform.jdbc.minIdle=10 - platform.jdbc.maxActive=50 - -# security configuration based on IP address to access the /status and /statistics pages - cas.securityContext.adminpages.ip=127\.0\.0\.1 - -## -# Unique CAS node name -# host.name is used to generate unique Service Ticket IDs and SAMLArtifacts. This is usually set to the specific -# hostname of the machine running the CAS node, but it could be any label so long as it is unique in the cluster. -# host.name= - -## -# Redis registry config - redis.hostName=127.0.0.1 - redis.database=0 - redis.password= - redis.port=6379 - -## -# JPA Ticket Registry Database Configuration -# -# ticketreg.database.ddl.auto=create-drop -# ticketreg.database.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect -# ticketreg.database.batchSize=10 -# ticketreg.database.driverClass=org.hsqldb.jdbcDriver -# ticketreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry -# ticketreg.database.user=sa -# ticketreg.database.password= -# ticketreg.database.pool.minSize=6 -# ticketreg.database.pool.maxSize=18 -# ticketreg.database.pool.maxWait=10000 -# ticketreg.database.pool.maxIdleTime=120 -# ticketreg.database.pool.acquireIncrement=6 -# ticketreg.database.pool.idleConnectionTestPeriod=30 -# ticketreg.database.pool.connectionHealthQuery=select 1 -# ticketreg.database.pool.acquireRetryAttempts=5 -# ticketreg.database.pool.acquireRetryDelay=2000 -# ticketreg.database.pool.connectionHealthQuery=select 1 - -## -# JPA Service Registry Database Configuration -# -# svcreg.database.ddl.auto=create-drop -# svcreg.database.hibernate.dialect=org.hibernate.dialect.OracleDialect|MySQLInnoDBDialect|HSQLDialect -# svcreg.database.hibernate.batchSize=10 -# svcreg.database.driverClass=org.hsqldb.jdbcDriver -# svcreg.database.url=jdbc:hsqldb:mem:cas-ticket-registry -# svcreg.database.user=sa -# svcreg.database.password= -# svcreg.database.pool.minSize=6 -# svcreg.database.pool.maxSize=18 -# svcreg.database.pool.maxWait=10000 -# svcreg.database.pool.maxIdleTime=120 -# svcreg.database.pool.acquireIncrement=6 -# svcreg.database.pool.idleConnectionTestPeriod=30 -# svcreg.database.pool.connectionHealthQuery=select 1 -# svcreg.database.pool.acquireRetryAttempts=5 -# svcreg.database.pool.acquireRetryDelay=2000 -# svcreg.database.pool.connectionHealthQuery=select 1 - -## -# CAS SSO Cookie Generation & Security -# See https://github.com/mitreid-connect/json-web-key-generator -# -# Do note that the following settings MUST be generated per deployment. -# -# The encryption secret key. By default, must be a octet string of size 256. -#tgc.encryption.key=DSi19FXiMznOlZvZRHsThtl-3FZzNKjQzbHt8QASI7Q - -# The signing secret key. By default, must be a octet string of size 512. -#tgc.signing.key=fOs-_ZjGNfcLsg8LWqkuHM6KccWlTsozxZZrwptqFMQAIvzqCD5lL9s4hvqDp5f-w1bpQM8IUAKEotw7jzhlvw - -# Decides whether SSO cookie should be created only under secure connections. - tgc.secure=false - -# The expiration value of the SSO cookie - tgc.maxAge=-1 - -# The name of the SSO cookie - tgc.name=TGC - -# The path to which the SSO cookie will be scoped - tgc.path=/cas - -# The expiration value of the SSO cookie for long-term authentications -# tgc.remember.me.maxAge=1209600 - -# Decides whether SSO Warning cookie should be created only under secure connections. - warn.cookie.secure=false - -# The expiration value of the SSO Warning cookie - warn.cookie.maxAge=-1 - -# The name of the SSO Warning cookie - warn.cookie.name=CASPRIVACY - -# The path to which the SSO Warning cookie will be scoped - warn.cookie.path=/cas - -# Whether we should track the most recent session by keeping the latest service ticket - tgt.onlyTrackMostRecentSession = true - -## -# CAS UI Theme Resolution -# -# cas.themeResolver.defaultThemeName=cas-theme-default -# cas.themeResolver.pathprefix=/WEB-INF/view/jsp/ -# cas.themeResolver.param.name=theme -# Location of the Spring xml config file where views may be collected -# cas.viewResolver.xmlFile=/META-INF/spring/views.xml - -## -# CAS Logout Behavior -# WEB-INF/cas-servlet.xml -# -# Specify whether CAS should redirect to the specified service parameter on /logout requests - cas.logout.followServiceRedirects=false - -## -# CAS Cached Attributes Timeouts -# Controls the cached attribute expiration policy -# -# Notes the duration in which attributes will be kept alive -# cas.attrs.timeToExpireInHours=2 - -## -# Single Sign-On Session -# -# Indicates whether an SSO session should be created for renewed authentication requests. - create.sso.renewed.authn=true -# -# Indicates whether an SSO session can be created if no service is present. -# create.sso.missing.service=true - -## -# CAS Authentication Policy -# -# cas.authn.policy.any.tryall=false -# cas.authn.policy.req.tryall=false -# cas.authn.policy.req.handlername=handlerName - -## -# CAS PersonDirectory Principal Resolution -# -# cas.principal.resolver.persondir.principal.attribute=cn -# cas.principal.resolver.persondir.return.null=false - -## -# CAS Internationalization -# - locale.default=zh_CN - locale.param.name=locale - message.bundle.encoding=UTF-8 - message.bundle.cacheseconds=180 - message.bundle.fallback.systemlocale=false - message.bundle.usecode.message=true -# message.bundle.basenames=classpath:custom_messages,classpath:messages -message.bundle.basenames=WEB-INF/locale/messages - -## -# CAS Authentication Throttling -# -#cas.throttle.failure.threshold= -#cas.throttle.failure.range.seconds= -#cas.throttle.username.parameter= -#cas.throttle.appcode= -#cas.throttle.authn.failurecode= -#cas.throttle.audit.query= - -## -# CAS Health Monitoring -# -# cas.monitor.st.warn.threshold=5000 -# cas.monitor.tgt.warn.threshold=10000 -# cas.monitor.free.mem.threshold=10 - -## -# CAS MongoDB Service Registry -# -# mongodb.host=mongodb database url -# mongodb.port=mongodb database port -# mongodb.userId=mongodb userid to bind -# mongodb.userPassword=mongodb password to bind -# cas.service.registry.mongo.db=Collection name to store service definitions -# mongodb.timeout=5000 - -## -# Spring Webflow Web Application Session -# Define the settings that are required to encrypt and persist the CAS web application session. -# See the cas-servlet.xml file to understand how these properties are used. -# -# The encryption secret key. By default, must be a octet string of size 256. -# webflow.encryption.key=DsCqdpcudQPzsdHz - -# The signing secret key. By default, must be a octet string of size 512. -# webflow.signing.key=U2ImXkZHYsZkORpSbjAqcvW3_gzz9oOUg6q2SWMz3Sr4Sf6NIVoNfQ97rqdhmtSZH6elMl8YgaoZrdiRWiybGw - - -## -# Remote User Authentication -# -# ip.address.range= - -## -# Apache Shiro Authentication -# -# shiro.authn.requiredRoles= -# shiro.authn.requiredPermissions= -# shiro.authn.config.file=classpath:shiro.ini - -## -# YubiKey Authentication -# -# yubikey.client.id= -# yubikey.secret.key= - -## -# JDBC Authentication -# -# cas.jdbc.authn.query.encode.sql= -# cas.jdbc.authn.query.encode.alg= -# cas.jdbc.authn.query.encode.salt.static= -# cas.jdbc.authn.query.encode.password= -# cas.jdbc.authn.query.encode.salt= -# cas.jdbc.authn.query.encode.iterations.field= -# cas.jdbc.authn.query.encode.iterations= - -# cas.jdbc.authn.query.sql= - -# cas.jdbc.authn.search.password= -# cas.jdbc.authn.search.user= -# cas.jdbc.authn.search.table= - -## -# Duo security 2fa authentication provider -# https://www.duosecurity.com/docs/duoweb#1.-generate-an-akey -# -# cas.duo.api.host= -# cas.duo.integration.key= -# cas.duo.secret.key= -# cas.duo.application.key= - -## -# File Authentication -# -# file.authn.filename=classpath:people.txt -# file.authn.separator=:: - -## -# General Authentication -# -# cas.principal.transform.upperCase=false -# cas.authn.password.encoding.char=UTF-8 -# cas.authn.password.encoding.alg=SHA-256 -# cas.principal.transform.prefix= -# cas.principal.transform.suffix= - -## -# X509 Authentication -# -# cas.x509.authn.crl.checkAll=false -# cas.x509.authn.crl.throw.failure=true -# cas.x509.authn.crl.refresh.interval= -# cas.x509.authn.revocation.policy.threshold= -# cas.x509.authn.trusted.issuer.dnpattern= -# cas.x509.authn.max.path.length= -# cas.x509.authn.max.path.length.unspecified= -# cas.x509.authn.check.key.usage= -# cas.x509.authn.require.key.usage= -# cas.x509.authn.subject.dnpattern= -# cas.x509.authn.principal.descriptor= -# cas.x509.authn.principal.serial.no.prefix= -# cas.x509.authn.principal.value.delim= - -## -# Accepted Users Authentication -# -accept.authn.users=casuser::Mellon - -## -# Rejected Users Authentication -# -# reject.authn.users= - -## -# JAAS Authentication -# -# cas.authn.jaas.realm=CAS -# cas.authn.jaas.kerb.realm= -# cas.authn.jaas.kerb.kdc= - -## -# Single Sign-On Session TGT Timeouts -# -# Inactivity Timeout Policy - tgt.timeout.maxTimeToLiveInSeconds=28800 - -# Hard Timeout Policy -# tgt.timeout.hard.maxTimeToLiveInSeconds -# -# Throttled Timeout Policy -# tgt.throttled.maxTimeToLiveInSeconds=28800 -# tgt.throttled.timeInBetweenUsesInSeconds=5 - -# Default Expiration Policy - tgt.maxTimeToLiveInSeconds=28800 - tgt.timeToKillInSeconds=7200 - -## -# Service Ticket Timeout -# -#Ĭ10룬ij1800s - st.timeToKillInSeconds=1800 -# st.numberOfUses=1 - -## -# Http Client Settings -# -# The http client read timeout in milliseconds -# http.client.read.timeout=5000 - -# The http client connection timeout in milliseconds -# http.client.connection.timeout=5000 -# -# The http client truststore file, in addition to the default's -# http.client.truststore.file=classpath:truststore.jks -# -# The http client truststore's password -# http.client.truststore.psw=changeit - -## -# Single Logout Out Callbacks -# -# To turn off all back channel SLO requests set this to true -# slo.callbacks.disabled=false -# -# To send callbacks to endpoints synchronously, set this to false -# slo.callbacks.asynchronous=true - -## -# CAS Protocol Security Filter -# -# Are multi-valued parameters accepted? -# cas.http.allow.multivalue.params=false - -# Define the list of request parameters to examine for sanity -# cas.http.check.params=ticket,service,renew,gateway,warn,target,SAMLart,pgtUrl,pgt,pgtId,pgtIou,targetService - -# Define the list of request parameters only allowed via POST -# cas.http.allow.post.params=username,password - -## -# JSON Service Registry -# -# Directory location where JSON service files may be found. - service.registry.config.location=WEB-INF/services - -## -# Service Registry Periodic Reloading Scheduler -# Default sourced from WEB-INF/spring-configuration/applicationContext.xml -# -# Force a startup delay of 2 minutes. -# service.registry.quartz.reloader.startDelay=120000 -# -# Reload services every 2 minutes -# service.registry.quartz.reloader.repeatInterval=120000 - -## -# Background Scheduler -# -# Wait for scheduler to finish running before shutting down CAS. -# scheduler.shutdown.wait=true -# -# Attempt to interrupt background jobs when shutting down CAS -# scheduler.shutdown.interruptJobs=true - -## -# Audits -# -# Use single line format for audit blocks -# cas.audit.singleline=true -# Separator to use between each fields in a single audit event -# cas.audit.singleline.separator=| -# Application code for audits -# cas.audit.appcode=CAS -# -## JDBC Audits -# -#cas.audit.max.agedays= -#cas.audit.database.dialect= -#cas.audit.database.batchSize= -#cas.audit.database.ddl.auto= -#cas.audit.database.gen.ddl= -#cas.audit.database.show.sql= -#cas.audit.database.driverClass= -#cas.audit.database.url= -#cas.audit.database.user= -#cas.audit.database.password= -#cas.audit.database.pool.minSize= -#cas.audit.database.pool.minSize= -#cas.audit.database.pool.maxSize= -#cas.audit.database.pool.maxIdleTime= -#cas.audit.database.pool.maxWait= -#cas.audit.database.pool.acquireIncrement= -#cas.audit.database.pool.acquireRetryAttempts= -#cas.audit.database.pool.acquireRetryDelay= -#cas.audit.database.pool.idleConnectionTestPeriod= -#cas.audit.database.pool.connectionHealthQuery= - -## -# Metrics -# Default sourced from WEB-INF/spring-configuration/metricsConfiguration.xml: -# -# Define how often should metric data be reported. Default is 30 seconds. -# metrics.refresh.interval=30s - -## -# Encoding -# -# Set the encoding to use for requests. Default is UTF-8 -# httprequest.web.encoding=UTF-8 - -# Default is true. Switch this to "false" to not enforce the specified encoding in any case, -# applying it as default response encoding as well. -# httprequest.web.encoding.force=true - -## -# Response Headers -# -# httpresponse.header.cache=false -# httpresponse.header.hsts=false -# httpresponse.header.xframe=false -# httpresponse.header.xcontent=false -# httpresponse.header.xss=false - -## -# SAML -# -# Indicates the SAML response issuer -# cas.saml.response.issuer=localhost -# -# Indicates the skew allowance which controls the issue instant of the SAML response -# cas.saml.response.skewAllowance=0 -# -# Indicates whether SAML ticket id generation should be saml2-compliant. -# cas.saml.ticketid.saml2=false - -## -# Default Ticket Registry -# -# default.ticket.registry.initialcapacity=1000 -# default.ticket.registry.loadfactor=1 -# default.ticket.registry.concurrency=20 - -## -# Ticket Registry Cleaner -# -# Indicates how frequently the Ticket Registry cleaner should run. Configured in seconds. -#ticket.registry.cleaner.startdelay=20 -#ticket.registry.cleaner.repeatinterval=5000 -# startdelayΪ0ͲcleanerΪҪʹredisĬϵijʱҪcascalendar - ticket.registry.cleaner.startdelay=0 - ticket.registry.cleaner.repeatinterval=0 - -## -# Ticket ID Generation -# -# lt.ticket.maxlength=20 -# st.ticket.maxlength=20 -# tgt.ticket.maxlength=50 -# pgt.ticket.maxlength=50 - -## -# Google Apps public/private key -# -# cas.saml.googleapps.publickey.file=file:/etc/cas/public.key -# cas.saml.googleapps.privatekey.file=file:/etc/cas/private.p8 -# cas.saml.googleapps.key.alg=RSA - -## -# WS-FED -# -# The claim from ADFS that should be used as the user's identifier. -# cas.wsfed.idp.idattribute=upn -# -# Federation Service identifier -# cas.wsfed.idp.id=https://adfs.example.org/adfs/services/trust -# -# The ADFS login url. -# cas.wsfed.idp.url=https://adfs.example.org/adfs/ls/ -# -# Identifies resource(s) that point to ADFS's signing certificates. -# These are used verify the WS Federation token that is returned by ADFS. -# Multiple certificates may be separated by comma. -# cas.wsfed.idp.signingcerts=classpath:adfs-signing.crt -# -# Unique identifier that will be set in the ADFS configuration. -# cas.wsfed.rp.id=urn:cas:localhost -# -# Slack dealing with time-drift between the ADFS Server and the CAS Server. -# cas.wsfed.idp.tolerance=10000 -# -# Decides which bundle of attributes should be resolved during WS-FED authentication. -# cas.wsfed.idp.attribute.resolver.enabled=true -# cas.wsfed.idp.attribute.resolver.type=WSFED -# -# Private/Public keypair used to decrypt assertions, if any. -# cas.wsfed.idp.enc.privateKey=classpath:private.key -# cas.wsfed.idp.enc.cert=classpath:certificate.crt -# cas.wsfed.idp.enc.privateKeyPassword=NONE - -## -# LDAP User Details -# -# ldap.userdetails.service.user.attr= -# ldap.userdetails.service.role.attr= - -## -# LDAP Service Registry -# -# svcreg.ldap.baseDn=dc=example,dc=org - -## -# Password Policy -# -# Warn all users of expiration date regardless of warningDays value. -# password.policy.warnAll=false - -# Threshold number of days to begin displaying password expiration warnings. -# password.policy.warningDays=30 - -# URL to which the user will be redirected to change the password. -# password.policy.url=https://password.example.edu/change - -# password.policy.warn.attribute.name=attributeName -# password.policy.warn.attribute.value=attributeValue -# password.policy.warn.display.matched=true - -## -# CAS REST API Services -# -# cas.rest.services.attributename= -# cas.rest.services.attributevalue= - -## -# Ticket Registry -# -# Secret key to use when encrypting tickets in a distributed ticket registry. -# ticket.encryption.secretkey=C@$W3bSecretKey! - -# Secret key to use when signing tickets in a distributed ticket registry. -# By default, must be a octet string of size 512. -# ticket.signing.secretkey=szxK-5_eJjs-aUj-64MpUZ-GPPzGLhYPLGl0wrYjYNVAGva2P0lLe6UGKGM7k8dWxsOVGutZWgvmY3l5oVPO3w -# Secret key algorithm used -# ticket.secretkey.alg=AES - -## -# Hazelcast Ticket Registry -# -# hz.config.location=file:/etc/cas/hazelcast.xml -# hz.mapname=tickets -# hz.cluster.logging.type=slf4j -# hz.cluster.portAutoIncrement=true -# hz.cluster.port=5701 -# hz.cluster.multicast.enabled=false -# hz.cluster.members=cas1.example.com,cas2.example.com -# hz.cluster.tcpip.enabled=true -# hz.cluster.multicast.enabled=false -# hz.cluster.max.heapsize.percentage=85 -# hz.cluster.max.heartbeat.seconds=300 -# hz.cluster.eviction.percentage=10 -# hz.cluster.eviction.policy=LRU -# hz.cluster.instance.name=${host.name} - -## -# Ehcache Ticket Registry -# -# ehcache.config.file=classpath:ehcache-replicated.xml -# ehcache.cachemanager.shared=false -# ehcache.cachemanager.name=ticketRegistryCacheManager -# ehcache.disk.expiry.interval.seconds=0 -# ehcache.disk.persistent=false -# ehcache.eternal=false -# ehcache.max.elements.memory=10000 -# ehcache.max.elements.disk=0 -# ehcache.eviction.policy=LRU -# ehcache.overflow.disk=false -# ehcache.cache.st.name=org.jasig.cas.ticket.ServiceTicket -# ehcache.cache.st.timeIdle=0 -# ehcache.cache.st.timeAlive=300 -# ehcache.cache.tgt.name=org.jasig.cas.ticket.TicketGrantingTicket -# ehcache.cache.tgt.timeIdle=7201 -# ehcache.cache.tgt.timeAlive=0 -# ehcache.cache.loader.async=true -# ehcache.cache.loader.chunksize=5000000 -# ehcache.repl.async.interval=10000 -# ehcache.repl.async.batch.size=100 -# ehcache.repl.sync.puts=true -# ehcache.repl.sync.putscopy=true -# ehcache.repl.sync.updates=true -# ehcache.repl.sync.updatesCopy=true -# ehcache.repl.sync.removals=true - -## -# Ehcache Monitoring -# -# cache.monitor.warn.free.threshold=10 -# cache.monitor.eviction.threshold=0 - -## -# Memcached Ticket Registry -# -# memcached.servers=localhost:11211 -# memcached.hashAlgorithm=FNV1_64_HASH -# memcached.protocol=BINARY -# memcached.locatorType=ARRAY_MOD -# memcached.failureMode=Redistribute - -## -# Memcached Monitoring -# -# cache.monitor.warn.free.threshold=10 -# cache.monitor.eviction.threshold=0 - -## -# RADIUS Authentication Server -# -# cas.radius.client.inetaddr=localhost -# cas.radius.client.port.acct= -# cas.radius.client.socket.timeout=60 -# cas.radius.client.port.authn= -# cas.radius.client.sharedsecret=N0Sh@ar3d$ecReT -# cas.radius.server.protocol=EAP_MSCHAPv2 -# cas.radius.server.retries=3 -# cas.radius.server.nasIdentifier= -# cas.radius.server.nasPort=-1 -# cas.radius.server.nasPortId=-1 -# cas.radius.server.nasRealPort=-1 -# cas.radius.server.nasPortType=-1 -# cas.radius.server.nasIpAddress= -# cas.radius.server.nasIpv6Address= -# cas.radius.failover.authn=false -# cas.radius.failover.exception=false - -## -# SPNEGO Authentication -# -# cas.spnego.ldap.attribute=spnegoattribute -# cas.spnego.ldap.filter=host={0} -# cas.spnego.ldap.basedn= -# cas.spnego.hostname.pattern=.+ -# cas.spnego.ip.pattern= -# cas.spnego.alt.remote.host.attribute -# cas.spengo.use.principal.domain=false -# cas.spnego.ntlm.allowed=true -# cas.spnego.kerb.debug=false -# cas.spnego.kerb.realm=EXAMPLE.COM -# cas.spnego.kerb.kdc=172.10.1.10 -# cas.spnego.login.conf.file=/path/to/login -# cas.spnego.jcifs.domain= -# cas.spnego.jcifs.domaincontroller= -# cas.spnego.jcifs.netbios.cache.policy:600 -# cas.spnego.jcifs.netbios.wins= -# cas.spnego.jcifs.password= -# cas.spnego.jcifs.service.password= -# cas.spnego.jcifs.socket.timeout:300000 -# cas.spnego.jcifs.username= -# cas.spnego.kerb.conf= -# cas.spnego.ntlm=false -# cas.spnego.supportedBrowsers=MSIE,Trident,Firefox,AppleWebKit -# cas.spnego.mixed.mode.authn=false -# cas.spnego.send.401.authn.failure=false -# cas.spnego.principal.resolver.transform=NONE -# cas.spnego.service.principal=HTTP/cas.example.com@EXAMPLE.COM - -## -# NTLM Authentication -# -# ntlm.authn.domain.controller= -# ntlm.authn.include.pattern= -# ntlm.authn.load.balance=true - -## -# Authentication delegation using pac4j -# -# cas.pac4j.client.authn.typedidused=true -# cas.pac4j.facebook.id= -# cas.pac4j.facebook.secret= -# cas.pac4j.facebook.scope= -# cas.pac4j.facebook.fields= -# cas.pac4j.twitter.id= -# cas.pac4j.twitter.secret= -# cas.pac4j.saml.keystorePassword= -# cas.pac4j.saml.privateKeyPassword= -# cas.pac4j.saml.keystorePath= -# cas.pac4j.saml.identityProviderMetadataPath= -# cas.pac4j.saml.maximumAuthenticationLifetime= -# cas.pac4j.saml.serviceProviderEntityId= -# cas.pac4j.saml.serviceProviderMetadataPath= -# cas.pac4j.cas.loginUrl= -# cas.pac4j.cas.protocol= -# cas.pac4j.oidc.id= -# cas.pac4j.oidc.secret= -# cas.pac4j.oidc.discoveryUri= -# cas.pac4j.oidc.useNonce= -# cas.pac4j.oidc.preferredJwsAlgorithm= -# cas.pac4j.oidc.maxClockSkew= -# cas.pac4j.oidc.customParamKey1= -# cas.pac4j.oidc.customParamValue1= -# cas.pac4j.oidc.customParamKey2= -# cas.pac4j.oidc.customParamValue2= - -## -# CAS Acceptable Usage Policy Settings -# -# cas.aup.ldap.search.filter=cn={0} -# cas.aup.ldap.url=ldap://127.0.0.1:1389 -# cas.aup.ldap.ssl=false -# cas.aup.ldap.startTLS=false -# cas.aup.ldap.basedn=dc=example,dc=org -# cas.aup.attribute= - diff --git a/code/jeeplatform-sso/src/main/webapp/css/cas.css b/code/jeeplatform-sso/src/main/webapp/css/cas.css deleted file mode 100644 index 9b9eaf6..0000000 --- a/code/jeeplatform-sso/src/main/webapp/css/cas.css +++ /dev/null @@ -1,528 +0,0 @@ -/*@import url(https://fonts.googleapis.com/css?family=Lato);*/ -@import url(https://fonts.googleapis.com/css?family=Lato:700,400,300,100); - -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, -address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, -b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, -thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, -hgroup, menu, nav, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-size: 100%; - vertical-align: baseline; - background: transparent; -} -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Verdana, sans-serif; font-size: 11px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - - - -@media screen and (min-width: 960px) { - #container { width: 960px; } -} - -@media screen and (min-width: 1280px) { - #ssosessions-page #container { width: 1280px; } -} - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { - -webkit-border-bottom-right-radius: 0px; - -webkit-border-bottom-left-radius: 0px; - -moz-border-radius-bottomright: 0px; - -moz-border-radius-bottomleft: 0px; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; - } -} - -body#cas { - background: #153e50; /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 20px 0; -} - -#logo { - display: block; - background: url(../images/logo.png) no-repeat; - text-indent: -999em; - float: left; - height: 100px; - width: 80%; - margin-right: 40px; - border: 0px; -} - -header h1 { - float: right; - width: 119px; - height: 60px; - background: url(../images/cas-logo.png) no-repeat; - text-indent: -999em; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../images/info.png) no-repeat 20px center; } - -.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - padding-top:5px; - margin-bottom:5px; - background: url(../images/error.png) no-repeat 20px center; -} - -#serviceui.serviceinfo { - border: 1px dotted #0066FF; - color: black; - padding-left: 10px; - padding-top: 5px; -} - -#servicedesc { - vertical-align:middle; - padding-left: 30px; - width: 90%; -} - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #7fd36e; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-providers ul { - margin-bottom: 3em; -} - -#list-languages h3, #list-providers h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li, #list-providers ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: white; -} - -footer a:link, footer a:visited { - color: white; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 855px) { - #logo { display: none; } - header h1 { font-size: 1em; width: 70px; height: 40px; background-size: 70px 40px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #70ba61; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} - - -/** - * SSO Sessions Styles - */ -#loadingMessage { - font-size: 14px; -} - -#cas-sessions, #no-cas-sessions { - display: none; -} -#no-cas-sessions div { - margin-top: 2em; -} - -.ssoSessions #content { - border-radius: 4px; - padding: 20px; -} - -#container-stable { - margin: 20px 0 20px; -} - -.ssoSessions .btn-success { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.ssoSessions .sorting_desc, .ssoSessions .sorting_asc { - background-color: rgba(239, 239, 239, 0.8); -} -.ssoSessions #removeAllSessionsButton.btn .badge { - color: #000; - padding-right: 9px; -} - -.ssoSessions .adminPanels { - border-bottom: 1px solid #efefef; - margin-bottom: 2em; - margin-top: 1em; - padding-bottom: 1em; -} - -.ssoSessions .adminPanels .panel-default>.panel-heading { - background-color: #fff; - border-bottom: none; -} -.ssoSessions .adminPanels .panel-default>.panel-heading h3 { - font-family: 'Lato', sans-serif; - font-weight: 300; - font-size: 20pt; -} - -.ssoSessions .adminPanels .panel-default > .panel-heading:after { - position: absolute; - font-family: FontAwesome; - top: -5px; - right: 30px; - font-size: 70pt; - color: #153e50; - opacity: 0.1; -} -.adminPanels .users-panel.panel-default > .panel-heading:after { - content: "\f0c0"; -} - -.adminPanels .usage-panel.panel-default > .panel-heading:after { - content: "\f201"; -} - -.adminPanels .tickets-panel.panel-default > .panel-heading:after { - content: "\f145"; -} - - -.ssoSessions td.details-control { - cursor: pointer; - font-family: FontAwesome; - font-size: 10pt; - color: #337ab7; -} -.ssoSessions td.details-control:after { - content: "\f067"; - /*content: "\002B"; - thinner plus sign */ -} -.ssoSessions tr.shown td.details-control:after { - content: "\f068"; - /*content: "\002D"; - thinner minus sign */ -} - -.row-detail-wrapper { - /*background-color: cornsilk;*/ - background-color: #d9edf7; -} -.ssoSessions .row-detail thead { - display: none; -} -.ssoSessions .row-detail { - /*font-size: 8pt;*/ - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.ssoSessions .field-label { - /*font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/ - /*font-size: 8pt;*/ - /*font-weight: bold;*/ -} - -.principal_attributes td:first-child { - width: 30%; -} -table.principal_attributes>tbody>tr>td { - border-top-color: #E6E6E6; -} - -.adminPanels .panel-body { - padding-top: 5px; -} -.adminPanels .panel-body span { - font-family: 'Lato', sans-serif; - font-size: 30pt; - font-weight: 100; -} - -.row-eq-height { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -#alertBox { - display: none; -} - -/** - SB Admin Styles - */ - -.huge { - font-size: 30pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} - -.semi-huge { - font-size: 18pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} -/** - * Statistics View - */ - -.statisticsView { - display: none; -} - -.statisticsView .progress-meter .background { - fill: #DFEAFD; -} -.statisticsView .progress-meter .foreground { - fill: #2E7AF9; -} -.statisticsView .progress-meter text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .progress-meter .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} - -.modal { - display: none; -} - -/** - * Runtime Statistics Gauge styles - */ -.statisticsView .runtimeStatistics .background { - fill: #DFEAFD; -} -.statisticsView .runtimeStatistics .foreground { - fill: #2E7AF9; -} -.statisticsView .runtimeStatistics text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .runtimeStatistics .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} -#uptime-panel { - display: none; -} -#uptime { - font-family: 'Lato', sans-serif; - font-size: 16pt; -} - -.thread-dump-view { - height: 600px; - overflow-y: auto; -} - -#metricsGauges strong { - display: block; -} - -#metricsGauges .panel { - width: 100%; -} - -#metricsGauges ul { - height : auto; - overflow : hidden; -} - -#metricsGauges li { - float : left; - width : 80px; - height: 80px; - margin: 0 0 10px 10px; - background : #d8d8d8; - -} -#metricsGauges ul li:nth-child(5n + 1) { - clear : left; -} - - -.statisticsView .equal, .statisticsView .equal > div[class*='col-'] { - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - flex:1 1 auto; -} - -.statisticsView .section { - margin-bottom: 25px; -} - -#viewSsoSessions { - color: white; -} - -.statisticsView .adminPanels.container-fluid { - padding-right: 0; -} - -/** - * View Configuration Styles - */ -#viewConfigError { - display: none; -} -#view-configuration { - display: none; -} diff --git a/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css b/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css deleted file mode 100644 index 793d0ba..0000000 --- a/code/jeeplatform-sso/src/main/webapp/css/ssosessions.css +++ /dev/null @@ -1,130 +0,0 @@ -/* -/* --------------- CUSTOM STYLES -*/ - -body,html { - background: #153e50; -} - -/*body,html,*/ - -#cas-sessions, -#container-stable, -.ui-widget { - font-family: 'Lato', sans-serif !important; - font-size: 14px; -} - - -/* Navigation -- */ -.navbar-default .navbar-brand, -.navbar-default .navbar-toggle { - color: #ffffff; -} -.navbar-default .navbar-brand { - font-family: 'Open Sans', sans-serif; - color: #ffffff; - line-height: 32px; - font-size: 20px; - padding: 0; - position: relative; - top: 8px; - left: 5px; -} -.navbar-default .navbar-brand:hover { - color: #ffffff; -} -.navbar-default .navbar-brand img { - margin-right: 8px; - width: 32px; -} -.navbar-default .navbar-brand .logo { - text-transform: uppercase; - font-size: 26px; -} -.navbar-default .navbar-brand .logo .heavy { - font-weight: 700; -} - -@media (min-width: 768px) { - .navbar-brand { - display: block; - padding: 6px 15px 0; - box-sizing: border-box; - top: auto; - left: auto; - } - .navbar-brand img { - display: inline-block; - width: 32px; - } -} - - - -#navbar > .navbar-nav > li > a { - color: #ffffff; - font-size: 12px; -} -.navbar-default { - border-bottom: 1px solid #dadada; - background-color: #346288; -} -.navbar-default .navbar-header a { - color: #ffffff; -} -.navbar-default .navbar-header a.toggle-sidebar { - padding: 15px 20px; - float: left; -} -#top-navbar .nav > li .navbar-text { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a:hover, -#top-navbar .nav > li > a:focus { - background-color: #36a9e1; -} - -/* Main content block --*/ -/*#content {*/ - /*border-radius: 4px;*/ -/*}*/ - -/* Session container --*/ -#container-stable { - margin: 40px 0 20px; -} -#container-stable h3, -#container-stable table th, -#container-stable table td { - /*font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;*/ -} -#container-stable table th { - text-align: left; -} - -/* Tables */ -#table-monitor-hdr { - font-weight: bold; - margin-left: 16px; - text-align: center -} - - -/* UI controls */ -.ui-accordion .ui-accordion-header { - margin: 15px 0 0; -} - -.btn.active, .btn:active { - color: #fff; - background-color: #286090; - border-color: #204d74; -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png b/code/jeeplatform-sso/src/main/webapp/images/6inchbrand-64.png deleted file mode 100644 index 0b97048ca9963d8519b24b17dd956b686e9f68da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1875 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 diff --git a/code/jeeplatform-sso/src/main/webapp/images/confirm.gif b/code/jeeplatform-sso/src/main/webapp/images/confirm.gif deleted file mode 100644 index 533bbba5c48c21aaddd25a4ced0f901d3cf12d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~;pNk%w1VK4wN0K^{vZ`e<$=aV0c8Mo`Gj^K3o{r1G~wuRkl?fU6xvsMXh z2btr5!}pTZ^UK`z)qLAvwbQhh$&lpt-73v0VADNN*-ufULCo>Nq~DFl=fT_V*V60D z41o*`fD8a;0L=fHA^8LW0018VEC2ui05AYB000I5;3tk`X`X0`GK3|(a4gSsoGdAm zC|>XXz@Tv0IhX>1UMB%*I-k&})ETk(EF?y!2Pt^J;ILS%DU`v8NG~x;^v>hB+*~-s z)gIiZmzn#;8wdab2yt#$3?2$!2#t=9kdclX5)~W*5|LgR9vvTviv^OSq#2bR9Rd!L zqKco2qNK8q84eE|9I30460V@J62Zd5#KjT~1Olk34aJQbzKV^(4%O8X4%ph%+1L&S z7ZV-1m(AAQ2+#_z3JBci@bT6I7XZ1amlyHD>g?{-4FU=rNN}KmWaI7$xIpk)KT!V) zN-Q|Qzyw?vFBvG9?V&UW4K9crNwOr#gUXiw;SvC@WCI5qqO}8g!GKMhHE-&?8DM}o zT=-Ja)5#E~%wsus?!*uP!_5H)fRf`dVL$+-3}dbXb{8d}Ois1|OBnms)_hxL0|S^B zC|{m8w%y*1F)W`x9kT)4pc+`E&K&e!s(WX1AKw$ZBJBYd5LnNCJ>8$*)81`QpZ$XJ z#^={(?=3@k9>iXk3wABU4Ea6teEvN$3G6;Q~4jVuz_Q-=gR0Kkw$7CB^z;-I*I zkxUl(00BS7IAf4aGD(1m6;@g0lTorW;{jSSi6aYPHhDl(oxI`!1T+d+=8-8HNx__S z);T1XhlpSWOX~6Hr<(xOY3GnG;-N<(okWn{c#JAnqmY8qN$3J@c!0$S3-I8900~6k z>8GHE8mfwcMoK{f7HqMp2^b_X#H&D9@Bo;R#>xN+1SBAUrm()s>5z0R diff --git a/code/jeeplatform-sso/src/main/webapp/images/error.gif b/code/jeeplatform-sso/src/main/webapp/images/error.gif deleted file mode 100644 index b5f4c030649a5252697d4fd0b0d56adcf2db1857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 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 Z#@`@C`g?IQt|0&b002ovPDHLkV1f~h!f*fp diff --git a/code/jeeplatform-sso/src/main/webapp/images/favicon.ico b/code/jeeplatform-sso/src/main/webapp/images/favicon.ico deleted file mode 100644 index 064a144383e0d49a9bf989c8bfc1ea17e7c7ae49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYH!1)uNia(K40v>k}|V>1gV z&H=;`AUTj4ApVaFL)F~JCJ&XvsTZUNpBj8}F#GVS!6!GE^n=_<34r+pod%hSE{4v> zrv{%K%p81b@W~A({UCP&^Mn8phXdWU9Ejh8+()eYLFxzrpn2{`~TSO{BW70#P*ug>inI| z^6B;d;`07_xa*s&*v;7Ozu)*tZKv({|7V-nfV}Ox$>)Z#pjLCe-0Jr|VXwN}_g9F` z)#mr%?)ZqF((m>A`1}0C;`x}x?WerqZ>8VN;`NHd@1)W6L}s^Zg~jOb`SSPsrMBI* z((skY@wD3aSbnB%gVtI4jv8xvJt}x%DJnhV+!)`k67ll$^b#PDV-6to{1WZ~ z$O8212Z99|7W)Ry`xj8cf`JPnMzrU^%a;K9>OFKAZz7F%0VIkXNfN}02NfQy070^) zL=GTv$ec;DX3ZTdcG%om6DC0aa14S99ZJ;XhoeZ3u2?{{sZgH*ojP5?B8EjV9zaNK zS^}hwuVBN9U9rO57!NDNss-Eirz-<+RPkk0%9WQf%y?PAAeRxpezWx9OAnohNfMQIH4*Inx0!SwmXyAbecF+MRV`R`m2OJ4 z#sLT*(Zmf`AzH=^6EvWyrfm9fg9VW)0VV>ZmTKy$r8WUZ2AOW!pCqEjDypg%ZLsMV zp~|Z35*GCFg{@FVuL#UOnv5BOlLR!RsD zB|zeXrlJqV3rHd*3Kmg>fYHcG(UM>(x3;^q>~?47_9j zu#IT1oEAdOj8e=fFF|Q>KJtSB-Ms;LcrK9T-Oc?F0+96CF*@*L$7ylZ&k> zq??6+`%q0q`%CMVp?>8YBqJsGIqBf@fdmd+z0L5Lf5xBrb9gTIaPR&v&u#{A-#cdM zu24~a>ysoKv~8Rp8b#cdfDnYGJ5_x)NhDfoBB+}l1|N-evw$(r%$LH?I7(Sd7F2<=t7Zi%JWTIWAtkLt>YOI#y+HRySpGHapmrz2oL+RRkB} zDWqK}p~&84&H@-uV((A?;L7!3pLb7OCZBEQz|t9lGyQCKu!}%|R=|e#((({44JJ*q z2X!c?Iu}xh5|)K7n%{Nsj5;qX2Es*pQ7~06MdA%CUY!`DHm|H!1nZgp=zEEe-I@}%c2T2J~|uO$5Ydb z(A7WUUm+v*7%isiDzWbZq85NiLW$KR7lh0~%{;m>it0iepY`-2`)E7W2RJ%>@_wBy z!7g^P7^yKOR(KO}TvU_z!|!5v_T%$-WNyW{^w_U`h;f(%_e_CgluJJ-gA}YKuExt* zgp2N5quAFwh&SqHV(!dRv)k@oATIz&X)=s#LN2@5$>P6)kVa;N=G=pNtO5ZvHOv{8 z_WXVg-SISkrX{&}6LNhQ5M%M_JR#LRO1q31JB&W})NgZLZTYzPlhb`bFbGJPK1TPM zEHh>oJ6ZgVlq_(}C2=y>C)y$h|S2W2a+ybMJ99>>+8ABsQ|13f*He6!5?fcA0lB^&;@P4RO$oOY9+fMy=@aN?R=Q;6^s~MiAlx2)rbRtD77JNv(u@?M&1bE0PcCfUBZ?63K*$DYClPB z0hCxkApxj+`ai$IyhVI~F$p9+V2p4wJJeSr03eS<1w@`;!P~^{runsA=PRpl|6&8S zesl)=d;2T^PY}-$tBH9zU)p+!9^xzFRMWg#FC*xDb#n24kIBO!4MRL&00000NkvXX Hu0mjfBRs>^ diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_bl.gif deleted file mode 100644 index fe6f825706ff766e7bd159b13769edb3555a1228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmZ?wbhEHbVPCbW-zb_3!L=SmJ*v-QzQ`fAvCE#pt;e7!5RQ4DjU$}bp?Wa#~K7M@p?%j*GZ=bw;`S`_)dygOAdHC@5 zg9o?n-@kb6+O=D^uH3kB>Dsl&&z{|V@Zi&zFK^$!fA!|guiw8veg6FG*Ds(sm_YHL zpmR}bVo7R>LV0FMhJw4NZvcbhPZprf@(em4>p>1-U{!jc-gm^PudS%deM=qZR;9jD YrSl>+tcOgdJ1{6s2r)S1z`VPCbW-zdb7@Tlsa|*g6`(@wp?ShX|r@F0-6J)Rk0B1}jd;kCd diff --git a/code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif b/code/jeeplatform-sso/src/main/webapp/images/key-point_tr.gif deleted file mode 100644 index 602127a5ffadfc15f757ba1a2447746a2a13c56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 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 diff --git a/code/jeeplatform-sso/src/main/webapp/images/webapp.png b/code/jeeplatform-sso/src/main/webapp/images/webapp.png deleted file mode 100644 index c2ea89be47822ada213125aadda201a5b5f6ae61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10166 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 diff --git a/code/jeeplatform-sso/src/main/webapp/index.jsp b/code/jeeplatform-sso/src/main/webapp/index.jsp deleted file mode 100644 index 08a5002..0000000 --- a/code/jeeplatform-sso/src/main/webapp/index.jsp +++ /dev/null @@ -1,6 +0,0 @@ -<%@ page language="java" session="false" %> - -<% -final String queryString = request.getQueryString(); -final String url = request.getContextPath() + "/login" + (queryString != null ? '?' + queryString : ""); -response.sendRedirect(response.encodeURL(url));%> diff --git a/code/jeeplatform-sso/src/main/webapp/js/cas.js b/code/jeeplatform-sso/src/main/webapp/js/cas.js deleted file mode 100644 index f5a2055..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/cas.js +++ /dev/null @@ -1,62 +0,0 @@ - -head.ready(document, function() { - head.load("https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js", loadjQueryUI); -}); - -function loadjQueryUI() { - head.load("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js", loadjQueryCookies); -} - -function loadjQueryCookies() { - head.load("https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js", resourceLoadedSuccessfully); -} - -function areCookiesEnabled() { - $.cookie('cookiesEnabled', 'true'); - var value = $.cookie('cookiesEnabled'); - if (value != undefined) { - $.removeCookie('cookiesEnabled'); - return true; - } - return false; -} - -function resourceLoadedSuccessfully() { - $(document).ready(function() { - - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - - if (areCookiesEnabled()) { - $('#cookiesDisabled').hide(); - } else { - $('#cookiesDisabled').show(); - $('#cookiesDisabled').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - $('#capslock-on').hide(); - $('#password').keypress(function(e) { - var s = String.fromCharCode( e.which ); - if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) { - $('#capslock-on').show(); - } else { - $('#capslock-on').hide(); - } - }); - if (typeof(jqueryReady) == "function") { - jqueryReady(); - } - }); - -}; diff --git a/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js b/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js deleted file mode 100644 index c1c1269..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/ssosessions.js +++ /dev/null @@ -1,181 +0,0 @@ -var ssoSessions = (function () { - var urls = { - destroy: { - all: '/cas/statistics/ssosessions/destroySsoSessions', - single: '/cas/statistics/ssosessions/destroySsoSession' - }, - getSessions: '/cas/statistics/ssosessions/getSsoSessions' - }; - - var createDataTable = function() { - $('#ssoSessions').DataTable( { - "order": [[ 3, "desc" ]], - "initComplete": function(settings, json) { - - if (!json || json.activeSsoSessions.length == 0) { - $('#loadingMessage').hide(); - $('#no-cas-sessions').show(); - } else { - updateAdminPanels( json ); - - $('#loadingMessage').hide(); - $("#no-cas-sessions").hide(); - $("#cas-sessions").show(); - } - }, - "language": { - //"infoEmpty": "No active sessions were found", - "emptyTable": "No sessions found", - "zeroRecords": "No matching sessions found" - }, - "processing": true, - "ajax": { - "url": '/cas/statistics/ssosessions/getSsoSessions', - "dataSrc": "activeSsoSessions" - }, - - columnDefs: [ - { - "targets": 0, - "className": 'details-control', - "orderable": false, - "data": null, - "defaultContent": '' - }, - { - "targets": 1, - "data": 'is_proxied', - 'className': 'col-xs-2 col-md-1', - "render" : function ( data, type, full, meta ) { - if ( data === true) { - return 'Proxy'; - } else { - return ' '; - } - } - }, - { - "targets": 2, - "data": 'authenticated_principal', - "className": 'col-xs-4 col-md-2', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 18 )+'...' : - data; - } - }, - { - "targets": 3, - "data": 'ticket_granting_ticket', - "className": 'hidden-xs hidden-sm col-md-4', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 40 )+'...' : - data; - } - }, - { - "targets": 4, - "data": 'authentication_date_formatted', - "className": 'col-xs-4 col-sm-4 col-md-2' - }, - { - "targets": 5, - "data": 'number_of_uses', - "className": 'hidden-xs hidden-sm visible-md-* col-md-2' - }, - { - "targets": 6, - "data": "ticket_granting_ticket", - "className": 'col-xs-2 col-sm-2 col-md-1', - "render": function (data, type, full, meta ) { - return ''; - }, - "orderable": false - }, - ] - } ); - }; - - var addEventHandlers = function() { - - /** - * The Bulk remove button - */ - $('#removeAllSessionsButton').on('click', function(e) { - e.preventDefault(); - removeSession(this.value); - }); - - /** - * Individual removal button - */ - $(document).on('click', '#ssoSessions tbody tr td:last-child button.btn-danger', function (e) { - e.preventDefault(); - removeSession( this.value ); - }); - - /** - * The filter buttons - */ - $('#filterButtons .btn').click(function() { - - var filter = $(this).data('filter'); - var table = $('#ssoSessions').DataTable(); - - // Create Filter RegEx: - if ( filter == 'proxied') { - var filterRegex = '^Proxy$'; - var deleteValue = 'PROXIED'; - var btnText = 'Remove xx Proxied Sessions'; - } else if ( filter == 'non-proxied') { - var filterRegex = '^ $'; - var deleteValue = 'DIRECT'; - var btnText = 'Remove xx Non-Proxied Sessions'; - } else { - var filterRegex = ''; - var deleteValue = 'ALL'; - var btnText = 'Remove All Sessions'; - } - - var searchTerm = table.column( 1 ).search(filterRegex, true, false).draw(); - - $('#removeAllSessionsButton').val( deleteValue ).html(btnText.replace('xx', searchTerm.page.info().recordsDisplay )) - }); - - - // Add event listener for opening and closing details - $(document).on('click', '#ssoSessions tbody td.details-control', function () { - var table = $('#ssoSessions').DataTable(); - var tr = $(this).closest('tr'); - var row = table.row( tr ); - - if ( row.child.isShown() ) { - // This row is already open - close it - row.child.hide(); - tr.removeClass('shown'); - } - else { - // Open this row - row.child( format(row.data()), 'info' ).show(); - tr.addClass('shown'); - } - } ); - - - - }; - - // initialization ******* - ( function init () { - addEventHandlers(); - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js b/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js deleted file mode 100644 index ac2513a..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/statisticsview.js +++ /dev/null @@ -1,138 +0,0 @@ -var Gauge = function (wrapper, percent, options) { - if (!wrapper || !percent) { - //console.error('wrapper and percentage are required. Please check your code.'); - return; - } - - var label = (!options.label) ? '' : options.label; - - var textClass = options.textClass || 'progress-meter'; - - var width = options.width || 200, - height = options.height || 200, - twoPi = 2 * Math.PI, - progress = 0, - total = 100, - formatPercent = d3.format(".0%"); - - var colorScale = d3.scale.linear() - .domain([0, 0.40, 0.50, 1]) - .range(["green", "green", "goldenrod", "red"]); - - var arc = d3.svg.arc() - .startAngle(0) - .innerRadius(width * 0.4) - .outerRadius(width * 0.5) - ; - - var svg = d3.select(wrapper).append("svg") - .attr("width", width) - .attr("height", height) - - .attr('fill', '#2E7AF9') - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); - - var meter = svg.append("g") - .attr("class", textClass); - - meter.append("path") - .attr("class", "background") - .attr("d", arc.endAngle(twoPi)); - - var foreground = meter.append("path") - .attr("class", "foreground"); - - var text = meter.append("text") - .attr("text-anchor", "middle"); - - var text2 = meter.append("text") - .attr('y', height * 0.15) - .attr("text-anchor", "middle") - .attr("class", "text2"); - - text2.text(label); - - var animate = function (percentage) { - var i = d3.interpolate(progress, percentage); - - foreground.transition().duration(2000) - .tween("progress", function () { - - return function (t) { - progress = i(t); - - foreground.style('fill', colorScale(progress)); - foreground.attr("d", arc.endAngle(twoPi * progress)); - text.text(formatPercent(progress)); - }; - }); - }; - - // init - (function () { - setTimeout(function () { - animate(percent); - }, 500); - })(); - - return { - update: function (newPercent) { - animate(newPercent); - } - }; -}; - - -function upTime(countTo, el) { - var wrapper = document.getElementById('uptime-panel'); - var element = document.getElementById(el); - var now = new Date(); - countTo = new Date(countTo); - var difference = (now - countTo); - - var days = Math.floor(difference / (60 * 60 * 1000 * 24) * 1); - var hours = Math.floor((difference % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1); - var mins = Math.floor(((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1); - var secs = Math.floor((((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1); - - clearTimeout(upTime.to); - - if (isNaN(days) || isNaN(hours) || isNaN(mins) || isNaN(secs) ) { - wrapper.style.display = 'none'; - } else { - days = (days == 1) ? days + ' day ' : days + ' days '; - hours = (hours == 1) ? hours + ' hour ' : hours + ' hours '; - mins = (mins == 1) ? mins + ' minute ' : mins + ' minutes '; - secs = (secs == 1) ? secs + ' second ' : secs + ' seconds'; - - var timeString = '' + days + hours + mins + secs + ''; - element.innerHTML = timeString; - wrapper.style.display = 'block'; - - upTime.to = setTimeout(function() { - upTime(countTo, el); - },1000); - - } -} - - -// Fill modal with content from link href -$("#threadDumpModal").on("show.bs.modal", function (e) { - var link = $(e.relatedTarget); - $(this).find(".modal-body pre").load(link.val()); -}); - -/** - * Thread Dump Preview - * Returnes the xx amount of characters from the end of the thread dump for preview sake. - * The length can be changed by passing ini a value, otherwise it defaults to 400. - */ -function getThreadDumpPreview(len) { - var len = len || 400; - $.get($('#threadDumpViewButton').val(), function (data) { - $('#threadDumpPreview').html(data.substr(-len)); - }); -} - diff --git a/code/jeeplatform-sso/src/main/webapp/js/test_data.json b/code/jeeplatform-sso/src/main/webapp/js/test_data.json deleted file mode 100644 index 016225c..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/test_data.json +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "activeSsoSessions": [ - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - } - ] -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js b/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js deleted file mode 100644 index 3c536fc..0000000 --- a/code/jeeplatform-sso/src/main/webapp/js/viewConfig.js +++ /dev/null @@ -1,59 +0,0 @@ -var viewConfigs = (function () { - var createDataTable = function() { - $('#viewConfigsTable').DataTable( { - "initComplete": function(settings, json) { - if (!json || json.length == 0) { - $('#loadingMessage').hide(); - $('#viewConfigError').show(); - $("#view-configuration").hide(); - } else { - $('#loadingMessage').hide(); - $('#viewConfigError').hide(); - $("#view-configuration").show(); - } - }, - "drawCallback": function( settings ) { - var api = this.api(); - if (api.page.info().pages > 1) { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "block"; - } else { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "none"; - } - }, - "processing": true, - "ajax": { - "url": '/cas/status/config/getProperties', - "dataSrc": function (json) { - var return_data = new Array(); - for(var i=0;i< json.length; i++){ - var obj = json[i]; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - return_data.push({ - 'key': key, - 'value' : obj[key], - }) - } - } - } - return return_data; - } - }, - "columns": [ - { "data": "key", 'className': 'col-xs-6' }, - { "data": "value", 'className': 'col-xs-6' } - ], - } ); - }; - // initialization ******* - ( function init () { - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css b/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css deleted file mode 100644 index 844c94b..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/apereo/css/cas.css +++ /dev/null @@ -1,198 +0,0 @@ -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { -webkit-border-bottom-right-radius: 0px; -webkit-border-bottom-left-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } -} - -body { - background: url(../images/bg-tile.gif); /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 40px 0; -} - -#logo { - display: block; - width: 250px; - height: 52px; - background: url(../images/apereo-logo.png) no-repeat; - text-indent: -999em; - float: left; - - margin-right: 40px; - border-right: 1px solid rgba(255,255,255,0.25); -} - -header h1 { - display: none; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); - box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../../../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../../../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../../../images/info.png) no-repeat 20px center; } - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #2aa4a5; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #30bfbf; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-languages h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: black; -} - -footer a:link, footer a:visited { - color: black; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 799px) { - header { padding: 10px;} - #logo { width: 156px; height: 32px; background-size: 156px 32px; margin-right: 20px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #2aa4a5; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png b/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/apereo-logo.png deleted file mode 100644 index b40f22c92b091b890ca25c2a469588c4b2390c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28964 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 I(lqq{0A?tLf&c&j diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif b/code/jeeplatform-sso/src/main/webapp/themes/apereo/images/bg-tile.gif deleted file mode 100644 index 41332ee48533cfbd9408b7f4c385e0f750eeea4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26910 zcmeIZXH?VQoA#SPLhntw0Rn{HLKTos=p8~QK4&ho|c&Yc(8*}3j}@BP_V@=aN{x`vvRH0lfB3t$ug7<|$H_3M}0 zAK$M&UHJtz3lxEAC!YTIsjsic6RlWWB>T<1v|vmQI6eA zTt`^PM;YzniU{*V8-?i_JA}DANISCMmnV`9kqPni@k9rpAR(R}Uj8y6a_lHaZ+o=N z@BY7rh1engCJAttV^{pw6Oez+sqF2ChKLIa3pfZ%2ty=91VzN)l9H1A5K&3^jW6&3ic5bzK63P6Pjc=>budy@Z?M+NQg;OFWS;OgxK`Bz?)y?0=M96S5J zCi>6zAN%t3`Ok^G{00AQkAe=~oc{Skpb690AAUtE7g;E%+A-SrpO9})N?@n3iS#q~!7{z&}SU4L=?5rIDv|8>`2 zTz^F1kHml7^%vJ45%?qVUw8e*^+yE$Nc`7be{ua0fj<)eb=O~9e?;Jq#DCrO7uO#V z_#^ROcm2inM+E*z{MTK7as3g2KNA11?jriHx(~G1?_!VO-&Gwz?604{%TB)CeEo8L z_4(7~?`o6tv(uB~qxXjg`+K`P+wb1K*?PUX@w?DuWqE0FVgA+J?9BAkHq+{`%`)ELEwraCsgYt3EcJ&U0;``rIlu_Z+<&AdG z3|56IN+yB8F`l?w=?3cT#9FyP0d#H@VZK#b@DsfZq-7GGK)V=6O0B+za5plnAS*^A zK7m6{-A_*h+&qLE?V6wVP=v!oG11>ASFoYBj|Z)V0lu|VKO0^@fOdAFL_=3wix-78 zSG)>_9SJQK?QNchV)0xyXvfxGaQ`r^sI-qLNsa(ZF}yaLL2@aO;7(a6CC357#UijX z_so3fBEZe;4M&PNk14I4&U)8_KiW(?7r3;C;3un-1_!2;!t1a0J44o+(8hHKyHQZ7 z?i*!J?$>ql&zr=dPHCt2-Q_5T^&!H?S$L#UuFTO?1Q5PQ+R_h1U)D66-7qSF7u{Di zTx6-X8@YJatQ_Sk%bNX^~Q7Qa3tbcT#NQtN-F3A_Tu10~4l5DQT zcg2$Wz6^Wjl9{bLgZ5vc%Rmq$!MgTEXWg18Ylf}*1ll43gNN`41n;|!XFf_PAjqR) z5C`kVh!m}->vb%*#rfmR2UKzjE{rXUaJdG@^A>fn+27HQaoHDBH2rL)`81bH6IDRE z_nP$+6k41eqzWsEtO&^&Hxw7Hn^eUe#=)gJb_qT-H$XX$lx3rlIq=Z9tZ}=-YZ`UB zXwom`?t51|slkHXy^bXrSIUdU@vago(=2&*LJb_D$W zc0DpF&IuM2=kKJUgmF|W`)=*~Rxd)34`Kbh(DFFaOZswMK}#iDtw+&Mb4rNFWMj9Z zYoo%|E{bqJU(gZdt2-z!KxE}KLO+=J$Y$|It4+_tN<{E$S;m=ofw?y5Zp4(>DQ9`= zJ(2+4cL#ioQ1i~hXK2mN4!4}$;8^Of5uF88;w(5Dn;D|wJNx~LoPJqe38rH*H;Z+<-HmO7 zfhNh^QcSI0!VIZLcGUBU50W-LKF_wXR7e{mLd;6|KTnL_@^N9~MX}7Y5Hg0v=7{1| zPTjISKwbIcn6E6QgCLyNK?348=-qz1cWFNN&A5)p*B`yOHREI3O$4a(gyBjrNV3-ACH-&;_(e{W^l5GKX*KYm3V=A6$$ ztH=a6Q!JTK4FT%%sA9$gW$Bv*^|rJ%aS01 zHW!X+#MZ74g}QXfVH8nDx|-_yQ411hl$p+%b#F%GQBm0UC9cUt7D;v6!(?qCI5H}W z1@E^FWa#-L0xb;5zn6eY#VbxZ+9qaazsD8VhBu|v6(&zKNp>{SoX|emCUd5kZ$^hu zqIKP@J~_6Z=W>xXb$->9reQRtadFfoz$~Y1>)>zN^?L@?OFvI4X=a%WdJia_gro{eEDi_)DXzJ3{7ALrM|X;=Nr3$UJfJWUVN)gkV;d1nmg^PZXUlke8t)D?QLX0CZ!p431EiGV{z@UYG)o4f?H+PfC zf`wmmtQc^eG(=)d6kym13KZKmvD9e_}(gA=3 zBz8F@&9O_u48s4c#zxpv?YTV%Qj!@Uw6X6*6G(VRHi2JG;KSx0bo8N{XgaDCUuH*~ z53uR`!l%yhMx`3;m2c!y4~!VtP$b3lwi{>LPk6Fpx^ot1yR17ghjQt^+7Itne7_jr zaRC^!E)}PIf#=mJ+0D}&Sd%KRF;7a}okC3ar)|4ZHa|V44J{s+d^1A#Rn=FhPmd;vhzxMgqtLq3v{^6y8bJaU zW=uC!RZ9An5LoKa`wrGYaaCX@fcgfdbw1^E^AmY74^=K3;vy4TLn zryz@XTJID*sE76fE>*xHS4keg+pv#|p&%yb?xwkH!(dxOPsDHHWgC9;7leaYTOpYR={uHwRI3>mTM4JQnfm?9F}41~Wm2(~*p9X0 z+=*|~_90rAG^En-(`7OPdk1#(P+u8O zccFFWhzT=)P9li~Zc;ayIPxFep|AQrP)%#Kg7N3v9_UOEY`D^_WTmorjK0Ty|0bbI zZ$1{UjN^xsLd+*<$Sj^2QHM3X#~@X*S6o zS8{&o4~vklou=r(2;3$_i^~B&^`-*5hn{qj9&$fJf z!fFwL5a$+^$mV6oZiuN6LV{n4*u7UOciZ3r1_BXRirr_BX|(~|a0MXjYia}~)$T3e z&<8Gy9D_{!TB*ig(%fa22!+IVjT%}8D9K35e>P>DxO4Z-5Yw5z#t%x|X%k^&C23Zx zjyWxIRSEey$Oan&wMgrAy+p+V*`xD(ok0ZVISb*8hp-m$0HHw#wlPf<;%?j#^RM~X znQY;n&;If4Z1JkJH~}sbpEb7BWz7A(QcY8AjzlKAG>gU=^fC7_`rxS?B9M=|a+Dvj zDUS(KmW7kwTf#FX$mAVZ^Gh!te}UF%u8$UNOl7n?4yRyG5bKIMbIUcCh6>Z~Pm!BW zW@5q_>H2XsJ3j7nHDNsR!}7IH?tAiDOYs9BGcrMC7E^PaLC!8;Zo;2WlL711Jtv zQvekpW-3_OAR{PtA&R%&A%~hgZP)R10U*&u0pKv2fVWzz&xJehTF=Q&`3W>&Y|V(ZLMB7ZG8+=;p`;SiUAAt_ zgC+5kFpC$^X_d{Pa5Qkq(4QwdSyOVmAljmmekQ^tWCR!d*{BUvF3@EOTEhy|^WaPs z-)hGw@1Z)5nXkDA%Tm_`MM>LcCbdpFJQXhDItxK`BJCLAlYblwXru~Q0)<(?GOApP zE)1M@&q63xKT9r%00=NrjV7)Ehl~q1v=VJHc5BXRKqe=BVT(^Z#JEX947`Th_esWW zqQz@h2@>g@La8Pg&kN1D%t1zW_3~X2^~N!84vfCqTj<1E&+lRCmz=mqTrdSFEJ!4} zd8i04qBz17&li>Eryj6zeAg=@!l)+##9>wk!OcC1S-23u@5_*-=PswWfdetB$2m{p zBjJvC2cboaG-a`HP!StDjFy>XZjMM@e+P~Cg&?D8mG0M!9;Cel*WF}CvW6l7QJ}BP9tBpdQjAhXt4`P7 zRp*8cZL#34QB)_HouQOpwU5I6i6lE3dQi$0N9Kp`*_A-d*2=;Wt55NWQ{3=rYZ$sF z!3WnF^;xs45bTYFml?_SC?vPI+$HbGgxwKTSrGasQP?=%0NF_{jcLG|N6SSIk?xve zPM?Y#>2obFL-oPD7Myl@3kLmRdOHci>=O^WjRMyE-M&%Zr^GMbG^i)+&aHkaYEqrj zXNd35h>=p$-M9m&nNJbt#dYe71^F^O#H7G4itmk+;~?|7)ypuU_1XkH-^LSAT?Au3 zzTJh^6h?`|YlsaW(NEV+IQ9(fMQo3`ivrAWi7;xu*HmP!o#8odqD0E3M|?EqJYR(k zBKMH7uWj>#%$LAo&EMT{vZ@}aM$#;*ZDh9aSILKN1DL}j(j^FYL8rU4vANs&y zzh}VWi`RfXD=U8Y8%DK%l#~uM@|!`$uR3h!UuH~vM$vNtRre{eVK@QGcm=Oxq+5~j zmN>c26Pu%$9OAksy(j7`_dLwEyX5Q>-Y*#Fk7hifsk;Oyo^2-N_yaciqVcTIvC`2h zeC8He=_ifPi$-eS5t$Yo6Zb4CUg9v4?lyRTf6hByr*nrmC%_I|ZS+9_^EvN*mA;G7x_*LS2953g#~ zsAmra+n%Ba@R7w^V*#X9t#@%8)udwvjQfcs%=L%}!$RsR8;VO^wM+S7io=?QYLtkKQL zsS{JbkYs{STXOW4$!*cjI9uMjpJX+Bo(OR<^>4)NWD5mq+nG+aiz%A3Q@L8q69Sw) zA6mT-h*yu!s0Z$8Yog=i{CU>nUDNmM$lNs5WJ#VBaN}P9C@CJXWh-)qk{&hCOTBp{ zc~nWh#sC2h7ppkUE64|Bx5x!W;9aZV8UmjFV3+n`!uIsfo-x$vasb%s$jEWZ`1yP& z^a1GzX}L2a$=8BNdhq6{r^JSfp%MR^%qr1*0F`i$uug8ts2fX%jSrh&XtZa7KV#}1 zbu+)nT$O}j?KJV%nSB-CsT9UR9yv(`*%rh5f}b9T)20$U*6Ir3&KMUgGM--G=+aB+ zu5f(W9T+cG-6Oy@#TjdktXp>!@7u2xE4_nzAWHt6pajb@^ z8?}jOi-h^>Lx&emViozmkrS`D(c?bj=QcSQ2*n~59zucKz<$T^rh3aP`P+II3u*7> zC1VPcsTs~91gif%kv#KEj|o4;(+1ri^m1VHosl+axIamu<<57^4Xg_okUAsi7t)Dqj}W=W&Hc(W@ODmPO4a5^3~_%B*0Uc^3*X)Nu6oo>VjSqDn1g zpn=A)qB$I|O42p%0S;l@Waukl=Ui0VGbiPZ{m)UX2-&`Wu_(wUW%|hTv69o4G%&iJMI_)6lpXy z9U(alk3{|n@MuZ=P}`Loo%}RmTlFzh^)tG@fJ<;t1RZ)PqArcv!HSJjQc6`B8HM+d zYYbQ2vvEcz4?siFQo--D6!GXY+nY?HP=+e0Eg&iP)avucBTEsAryCUfRMy!{0D{(Z zF_WTKHe3UFYDzV;8&~&n0Cxs(?jtxVV!l}#0)dM5utYCU33a1jUHW);wY*;bqA;70 z)0qQ*+`3vXg|q1$*LEuDOi`CoL5xOf-Mi*|-P16=Ctg117zzcI#rnrqbRA{z-eeeu z<}aMn^%<^`lE6Ud2Y$(%6?dHxd1e?Z8MU3mKm zXW_Q(F13pFkT2~B4pRw*4{F>Xp+z0ri0{(FwMQ~;$9(X!E|ZM*G3)CbpbD8Pg8XA* zMcmtgvAb#!kn08!puAT*ct_bnlOu?I5$!6ZXhZeXtNy zs}<5JelG)W_NyT6*bt24BNKi!>&Fhd56{#Ppa@qtM( z{a87V6kGMszF@_>1u$QJ|GZaNZ@mYOVi6DseVjfKF%O9Eb>At)3x0!Fm%{iOZ;Kwf zLo`7#eYr^{6O^ix)|HMvsSS8a3#xVP_6^`Cd^&Q;y$TF+T1&0&X1Z~LXzG;%srQY2y1 zB+ZNtgU37a*GZO9Zd+Q4IU32l6$vmu3T8Wgh^;pcE@$m9dLYhRq^&qw_$+MqTgJ4wq6s3A=Eyb=ypDMevGjh~ zHW3aWQGis)uts&Gs$ta42`TIjf?!;Y6bo|ac1s!eurFuFQJstjH2y=RdVBIYqlvLe zyZaOGC8DeXpm%tHceIoSmOEi9*2p}dlr#~WN_yX`o}~`%%uP}3jYaA(_U!nZjl6D7 zdba-|WI-!`-Gjdg@V47e*Da?rr1rw?UE7E`-y!6bvmXnXEwkzZ^QX}6CrhPFmU%)cLSX5z)ny-94eB)I+{nF|`p1;!vxTtw?G8=x z87C4-Oo2^NSZ9BCZ4`kkj}cGH&)_YrmgDC)R!#A4 z?TioFzpQY+N5Xh8lGvNJmzD90-xAcxY5I7h9G^dcJY`GZYM%h9FY2SFvM^mlOEz8j zkyRx`k<|O0I3lNvm2X%jSCe32Q7Y8cj9CCIUo=vbggMxtD@+JS7Bez6Hf#PGh%vRQ zK6crwmsPqYc*2;r0h?)y&G%Gbs5}!M6(9M=QSr8uxtgZy5iBzxDlU43u$o9|c0)$o zUK>EpLGx<*e20P--V`)Mtx>wLWRdSg$$s?6n$&cLLhH3(y3Gex!8jt5j9Uq*9r|OV zYB&~ZkA9%)oHqf`&b;%L){D8-)I+-Eq^qH|iUhVaUzn@@Pgp(uO~Qdy*JTjiBF15BfW3a3GTZy&16X5&XhJip^-VR7WU7mLk12%P3TZFr zc{JM-Ud1^sr5`4AN_sZaTD7@9?Y~mDnYzo(`g+4f=Ec)QA-56vE!8NKUrWX4DCM37 zSe$dycA|=l67;4dox)S;o!KpAtZ+@eH-8rMME4SmW%M!0P==EHCR;&Njgk=oU=oX} zq!YPnis1^NkN$iS-6=0E6b`yE3V3vr^$6vlJhDIym;F@235-p~S}rEuI0(@POsWgr zu*WL|-$%oVlc3)+mSiL=1znHrju;7Ph^fb(B3rH245CzZ3D1PBLFFqlS>R!4+)$5~lLEIsAx7(M~ zxf%`ZQM&lT7<+jR7WK(CS6x*_j!*KAjb6(HpwKR z5ta9Ae{S29A?C=6*lL}sff47+n&&sF80DvqOrx(0F6J`sHm`G1o4c^Rm-&7DPl{zj zO_8uD5g+F=LY(P?0#y5s>J+NQM~D;bDVdZlVrmr0g8Dr&2>1#U`QXjbA2IX{9%gh9 zcmU~$F#6|w<^)UHr$8N84AZ_JN6;A#kTwGSX?Due|^ z>&|<)r6tw6FxuN@gQK8Cjgk>yaSFBBmoFUQKti7&{&nR_241iP_TffkJEtV4D;1gCB;k!=2O=1wj$^p)buvdmKh;p1FbrQx%7B2Jde zZIt9KEOg+?^7QB95Ll&=#3u?`ZT(Bd{Yg!_<4cO71Q(k@zSd=l;ZbcIwVwn47E_3eH8wt^Ui$cL;>YrbCE+wQEx zRl*;*y?XD-AxX^@&3*1v>~@=-W|*6`Bd6So)`h;IuA5>~lhhoFlWg`qx^hue!o#uc z20?p-KUHDv_m*Db6ghGRl;)MQt+f}y6~@IXcpKI+uqm}4X)+Iw4L}UU6?oY&X`}); z3S~cr^L6s;afO{Nk*d|pZRX+upAHdd%EdYfl?X*)63)7?*sg%dK{&n(v_Tkda3pu>8q#-4KdR#eAY?fD8jq_g99;P*Dx4a4zHgBBr4!xpCDd)sH@D-mmqWLM1 zG8q>sbMc7xv31{mI|gV_@VN%zB~CvbS$&m-O$_N>+CoOl_`ZB=H+;8bB7fpes5ze8 zb+Omg%o_brIlt{$XXLkLTrqt@zl?F#TpFfzYLO-zRdM6s`UwjUb_s_-e^ONFNVmPe171hBmPSl6W}?#5f4;6c z*l9)MzWAvpIs*!eajF}tB=&L+%iynm6(L|HFZvm!*jAH zqcDPr4;mc}F%ILkRF}_B%o9=Bn2b zD{6G*hm_;g_4!-;!;o;sr3_2A9kzS&W=*9F)`aDx19OUOZ%!wy{j0NrZ}vCpCLXO1 z2Lo*TjSXYZQ)<9CwyC9}HuP4qlL+|H0Kw#T&lo`>xqM!BDewcZP#S7K4I`10-UU7NNmaT+!&j$56~I9O2ed8d=pad$$V#|}4MQ@EpCN|xXSZV&x{Rdo7~(i~m&*8=LK{vEHuQBb7K@B;Nkz1fsNZZ`-hqZAf{a!+BDV z28p+Qu-C+Z(^Y-Q4g?bjY>Na<#%&=B=56l`#48@`Ve}Oah+wW}-BRZUH)kjv6o_s>*~lY z7UC4XUiwvm^6AZ(LBMvRt0_4VBcia}IEkJ2SS{w9I!r&iBf#uXI_tPW!R`26STK@zeU@>>VoX%sRSr^atW@5n&M9)-%#ZSGtmmE| zuT{JJXftGLeiOTlUEjwXNqFuM;5o&is5d9c@eU?kTwI>r6p4Px_9{KjvdRv#ABiqw zcc4jQy`6dJTE*WLftygguaGJmQ$F4{E)-U=2a33Zs%eO=Nn}lMgx8>KhAMQ+42E*r zVlB}T>^`$YH)roTA5~k*xdrGXB#YFt47s1q(kN0MsN`rzoEhu6j#qwP&6h;N2}|^Bph~6jb$Wy+2nJ-(;EAd)pcw~128ZbF>XEA?wR6c! zrR0TFEY;zg7~qHaet0711%cRWh8pqRu4d>o-c8`MGvC?m%0|sq3CStZE)ZL5>Yg8| zzv;KkZ9hd9y2bM2G||Lf4Ynll8f+Rav-M{Z&=EPBPA9BzPAf4zR277_z8Wj74r8m_ zp2UJ6m(e85bYcUOIvLK-znp2a3`SCBbKO`M7p2@gQTRNOe65eEC|xA)k7qb=kqjMn z7a1Z5Q77y3d}JXsb72J z%Q1e@%&3lN(;U;jqV@goaS1`b#4nGpfAOl5>-$wpxwYwb&m@DlcuEYmukoeh*dw+J#nzR zjhV?&-n~cr+TV)6ZVlZQc4m0xG*L-{y2Q=`irFPX7CDvl2RNhj7MV(G0xv7STVPKg zY;SfZ**o2&aK6S(8s-)WiRUytdLtmBysya_smO>s({OHfM~r(VYcx|kk9uTfD_-yk94~hM;|9Az$U}{y^|>&=R*r@iu4hL8@6nQK zKb_hrGwYV$mv%*kcShVxNTUzW7bu9Q8FV<6Sy!k>sBm#&zI02k)&Inn3lYCzwx+ik zg=PqgX~o;aUeTd?Om(g{A9z%e-z}J2{}`hr+%G2-pP6aUKM`dj`BHFVa@EC4NMAsB zx!?n40%^StjikLuXNVYrThYVPO-1WrC27uHx$1YMy1Vdd^yyo8h1Dr)M>v!8i*-yD zJE%k=b?n7GA6M!>FwFVs89m`)Eel-D%QRv0&{&r>^ys8#qlH(?x8175g`bH0qO*dr z+2Qee>&aifDS+DHZQLIl#gTm)vBvAjuzf@GH9%5Wj|kFp0!%Jeo0Te0Wx=6GHb?H8 zc&k=G3*m_sH1{jrx*{YrY+%A{?n$r5^F@I);f?28D!kkdtPEIofeD2K4KASZy6s1` zqE1O2tOrZw+xG}mslGCGaPK{sbV_7*c6YH&L0|;KIL{R_$$Uc?$0VJ0HJySWLZ8X` z^y)|G@E2E7;(WRk2f_*=iPeKsWrdEYcy#1p&nHp3u#2JZ5!X8EQ9mzN^k?k*UKAG< z1AVrTwl{}ibQWzkj9F&3Lp7fl*j=E-oA5n%Bk{b6IB|KNcUI44FcGth!`-3My;S+M z<-N?sj9MhBl3(-KKtmGwU`1%(X!xBF>%`ndPcbdYXO3y-h3`#Tx+>;lqy4$}d=#d~ zoAW8&1*=@XJ-CcPQF#X?i;Be88MJQ5-IaK_!l*6NH~tYT-TM32{jJ%%Qg?%=W|jQM z*+=KUYpQ$-MUaGushG6Z(IlqXv5y5&vAb-Y6O}zNFZt*-eF-84o5DndJkpq}9^;k! zQYlXuBq?eWJBH)ZIn8u~^^SsJC(KXwSPEXhCY!vgLKha= zd0VjC4yipSS1MP${VA2whXk3u*MZ+}vTpe{EEKEHT}>R@6OgbSC1jsF9<_ zUZ?Wc8gx!np3*0}Zi-bH-CF2k{t0g$B&={zIN-C`_ajc{LO%-O9RRJq7HuaUGG~M; zz?F*k`-7-!8D+cQ-^lh|W7@wqI>?WK?ineps>(L3XSZ%UPd@+5`;*|~$b!{JJF#6Ds}%JfaSkAYJ6Fy)l}3u&qa9vhZclyi-kb- z>1iqNgV_*<6?BiN^}47~OZIbxMhQ7trjr!4tdST;M&rZOrOjoft`tAE8iGp5og}iOaJ#S`tTiIRFv2oz?X*Cab^m-TF%Qf zF#g3f^l}S-%BqVnk6*tN7~L1!y!KM}`voe{%ll3kO1s9+c?vxtGaa?1XoMMZNPKAB z@XV@VY`zEjoRgu6BDo==$*!LbqwJgJGgsi#IQ(SWeMudn#ZGqlK$-2Okl5d=7_Rqp^v)z6-%$Jl0E%(9c z=-z!K_k58^3x=nfW_nFa$f|$ZsYafh@(s_Fh+PS;)#!X?n)w*Qt6}cKwG*A>0MZyC zXeO+O4g$%z;tjQgJP1;ZJXqSWl%^a(8xGK8A8Ct(^Q+Ay0iHS z(qh=xj?1Vd$Gy}hN0WVl)3PxOf$q5M9X*UDugrW?6RgHgzqY`Ga*@odOi7^}VZZz1 z=s;qPhv-{i6Q~tWSCNDXtL8;2>ppx)5~n2GjQnEH#-Ezz`93A}A$9GYmMni*3401dV7dI^uzt4MLjMRfV4sv z5urBRs`cVM4RI_PR>``)2w-K@)_jwyY0EJ&8bvXNyy4K*xtt^Vq7UU|0HLxRbVuoQq;Z*i# ziZR=S@iG0P98Do?6o{$Wgo(v^=jEdeT|4drzW~z8vu(ieFq16vb_9-N6ZQRst)b3c zoJ#PVw+xmBcR?SmG%k>23to6917~Z$ljm-k$q`$mX4l`eP#wY}7rA560Co`hti$7K zkl{3c*Ov!3UqBo&o>5noLGKY`asyq)jL~{xqL@S!%8v#U(b3N|fR} zf)v}I?BkIKk~YE-{!uY0?~Bs6@k@rpNc1dYqsbPR_*)@IPTR)O+a{02Qv*`IAqwHt z6C$m4sRlweQy@{$yaJDr-I)wX2ecj~uuJ0#_GBA^6?}4HHA+JsUJlbX4Z-qG=N^TO z!oQ#8n8K#>czJtR^+c}pukO*Q8LTixB_d2}WHQEJ6-I{@Ek1IA$ICK^C5ZMH6V=yx z*dr^BN###F_Xe-rMnAmY4C^A2J~6=8a&U|F@M&2TxB)6^UH&E^wF>XSQj6#Kb zT%nYjyeD59Px8?2mQ05_hCR!yNo>*fuEl6gt>qH{CI34k4Fk-xEZHyHz2bJG6ayU^ zRGi|vQod!<$%h7U_90aDG3d8xkMHDllb0bN%AQrp{R=ZrW(q$hXyMvby$0NaaA~Km zB5r|G6#-r+sg|s*k+Cfuhrx`T_s;Z;jr76Pu6va;YYnRrg!~wcrfL?n%gMs#rBC1e z8%=Gn=nS8nz@(9Q^!aw{)RVbP1bc#FV&;1xO5$!!iOsi9!&)u(WOACDseKi~u+N&6 zx}?b@=3mO?QNh%^z(#q|2oINbFbJ~knB9kj`=gRCtCRWmd&lE$;DwNPH^e3%M!&3U zFMyXK{Kp$jP7ST+mixZqlSi)b5Di9zf2+*T&4eFAR%{OTYstraA*_6z$(6r+Uc|7o z4E%m$71wjB*hrEH><+~UGST4WYuk`lH6E4vBn} zTwTbm+g_B` diff --git a/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js b/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js deleted file mode 100644 index 7e22762..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/apereo/js/cas.js +++ /dev/null @@ -1,20 +0,0 @@ -$(document).ready(function(){ - //focus username field - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - /* - * Using the JavaScript Debug library, you may issue log messages such as: - * debug.log("Welcome to Central Authentication Service"); - */ -}); diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/css/login.css b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/css/login.css deleted file mode 100644 index fa02af8..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/css/login.css +++ /dev/null @@ -1,31 +0,0 @@ -@charset "utf-8"; -html,body{margin:0;padding:0;width:100%;} -body{font-size:12px;font-family: "微软雅黑";color:#333;line-height:160%;background: url(../images/login-bg.jpg) center top repeat-x #FFF;height:100%;} -p,ul,.name,.pwd,dd,h1,h2,h3,form,input,select,textarea{margin:0;padding:0;border:0;font-family:"微软雅黑";line-height:150%;} -ul,li{list-style:none;} -div,p{word-wrap: break-word;} -img{border: none;} -input,button,select,textarea{outline:none} - -/*login*/ -.login{padding:1px 0 0 0;background:url(../images/login-bg.jpg) center top no-repeat #FFF;padding:150px 0 0 0;} -.login input.submit{border:none;font-weight:bold;color:#FFF;margin:25px 0 0 150px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow: #CCC 0px 0px 5px;-moz-box-shadow: #CCC 0px 0px 5px;box-shadow: #CCC 0px 0px 5px;background: #31b6e7;cursor: pointer;} -.login input.submit:hover{background:#ff9229;} -.login input.submit{padding:6px 20px;} -.login .box{position:relative;z-index:100;margin:0 auto;width:700px;height:320px;background:url(../images/login.png) center top no-repeat;} -.login .log{position:relative;width:370px;height:260px;margin:0 auto;padding:60px 0 0 20px;} -.login label{display:inline-block;width:70px;text-align:right;padding-right:20px;vertical-align:middle;} -.login .name{padding:10px 5px;font-size:14px;} -.login .pwd{padding:10px 5px;font-size:14px;} -.login .rcode{padding:10px;font-size:14px;} - -.login .alt{position:absolute;top:43px;left:260px;font-size:20px;} -.login .text{filter:alpha(opacity=80);-moz-opacity:0.8;opacity:0.8;} -.login .copyright{position:absolute;left:0;width:100%;bottom:-40px;text-align:center;color:#AAA;} -.login .air-balloon{position:absolute;top:-100px;left:-100px;z-index:50;} -.login .air-balloon.ab-1{width:43px;height:78px;background:url(../images/air-balloon-1.png) no-repeat;} -.login .air-balloon.ab-2{width:24px;height:31px;background:url(../images/air-balloon-2.png) no-repeat;} -.login .footer{position: fixed;left:0;bottom:0;z-index:-1;width:100%;height:198px;background:url(../images/login-foot.jpg) center bottom repeat-x;} -.text{border:1px solid #CCC;padding:5px;background-color:#FCFCFC;line-height:14px;width:220px;font-size:12px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow: #CCC 0px 0px 5px;-moz-box-shadow: #CCC 0px 0px 5px;box-shadow: #CCC 0px 0px 5px;border:1px solid #CCC;font-size:12px;} -.text:focus{border:1px solid #31b6e7;background-color:#FFF;-webkit-box-shadow: #CCC 0px 0px 5px;-moz-box-shadow: #CCC 0px 0px 5px;box-shadow: #0178a4 0px 0px 5px;} -.text:hover{background-color:#FFF;} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-1.png b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-1.png deleted file mode 100644 index 7a44159a7c157617bc70ca146b745ab881b2d572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8981 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 diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/air-balloon-2.png deleted file mode 100644 index ac7b7e8b782f6df9bcde36384461271679664f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4602 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
      q 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 diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/images/login-foot.jpg deleted file mode 100644 index 390ce34cf03d8f001a875aa25810878ac09880df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31434 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%0DR+@C}j?{+ejVf zchGtC;5+1JN_pkI29sXbzbe1?V@FBOr~)6K9~`3c8TxY{Z4W9GIZ;BFU1r=DCxv8$ z)xwgjLQM+_3@F#E^o1pak7y+`?=Z_05Gbr(K;(cmRWveiKDFuau$x)-WfYtjG$TSxF`Ye&^T4IQ!{{XKlnvP&RM=QuLUxZ7}Jroezh# z=j$5#A#Cls*moG%Aro{3wxymX6GBtJ=CmIVo^lLY=W#FFgK{N*A69*ED}gnG3kQtW z2WR-}Ewku+Si{h*^OE7aUuP1`HFreYacgY;62+I=_Ky-{9qlaYUT3d9YQut+!J$ms zf&EuBuGyDJHhzClHdJ{Fk5kkePvEiY$9(%3;{KK-D(94I8s*5?mI3-Jo0O z4-l%!pA>G&Q-|yv8Q7rSx#frYIET~Zc%=B-_)v-T$ct%K`OLsgnMQxwq1oxj;YH8o zPio78gNhw!R;oWqVJy9EL(Nxu&VK8#>℞vfDbR0jHa|SN^i)f3!{J95z-o+BPyy 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 A4FCWD diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js deleted file mode 100644 index 36e7f60..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/fun.base.js +++ /dev/null @@ -1,13 +0,0 @@ -;function rand(mi,ma){ - var range = ma - mi; - var out = mi + Math.round( Math.random() * range) ; - return parseInt(out); -}; - -function getViewSize(){ - var de=document.documentElement; - var db=document.body; - var viewW=de.clientWidth==0 ? db.clientWidth : de.clientWidth; - var viewH=de.clientHeight==0 ? db.clientHeight : de.clientHeight; - return Array(viewW,viewH); -} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js deleted file mode 100644 index c3b7a15..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery-1.8.3.js +++ /dev/null @@ -1 +0,0 @@ -(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
      a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
      t
      ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
      ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
      ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

      ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
      ","
      "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
      ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js deleted file mode 100644 index feb62e9..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.cookie.js +++ /dev/null @@ -1,117 +0,0 @@ -/*! - * jQuery Cookie Plugin v1.4.1 - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2006, 2014 Klaus Hartl - * Released under the MIT license - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - - var pluses = /\+/g; - - function encode(s) { - return config.raw ? s : encodeURIComponent(s); - } - - function decode(s) { - return config.raw ? s : decodeURIComponent(s); - } - - function stringifyCookieValue(value) { - return encode(config.json ? JSON.stringify(value) : String(value)); - } - - function parseCookieValue(s) { - if (s.indexOf('"') === 0) { - // This is a quoted cookie as according to RFC2068, unescape... - s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); - } - - try { - // Replace server-side written pluses with spaces. - // If we can't decode the cookie, ignore it, it's unusable. - // If we can't parse the cookie, ignore it, it's unusable. - s = decodeURIComponent(s.replace(pluses, ' ')); - return config.json ? JSON.parse(s) : s; - } catch(e) {} - } - - function read(s, converter) { - var value = config.raw ? s : parseCookieValue(s); - return $.isFunction(converter) ? converter(value) : value; - } - - var config = $.cookie = function (key, value, options) { - - // Write - - if (arguments.length > 1 && !$.isFunction(value)) { - options = $.extend({}, config.defaults, options); - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setTime(+t + days * 864e+5); - } - - return (document.cookie = [ - encode(key), '=', stringifyCookieValue(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // Read - - var result = key ? undefined : {}; - - // To prevent the for loop in the first place assign an empty array - // in case there are no cookies at all. Also prevents odd result when - // calling $.cookie(). - var cookies = document.cookie ? document.cookie.split('; ') : []; - - for (var i = 0, l = cookies.length; i < l; i++) { - var parts = cookies[i].split('='); - var name = decode(parts.shift()); - var cookie = parts.join('='); - - if (key && key === name) { - // If second argument (value) is a function it's a converter... - result = read(cookie, value); - break; - } - - // Prevent storing a cookie that we couldn't decode. - if (!key && (cookie = read(cookie)) !== undefined) { - result[name] = cookie; - } - } - - return result; - }; - - config.defaults = {}; - - $.removeCookie = function (key, options) { - if ($.cookie(key) === undefined) { - return false; - } - - // Must not alter options, thus extending a fresh object... - $.cookie(key, '', $.extend({}, options, { expires: -1 })); - return !$.cookie(key); - }; - -})); diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js deleted file mode 100644 index a4d7983..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/jquery.tips.js +++ /dev/null @@ -1,104 +0,0 @@ -/** -* jquery tips 提示插件 jquery.tips.js v0.1beta -* -* 使用方法 -* $(selector).tips({ //selector 为jquery选择器 -* msg:'your messages!', //你的提示消息 必填 -* side:1, //提示窗显示位置 1,2,3,4 分别代表 上右下左 默认为1(上) 可选 -* color:'#FFF', //提示文字色 默认为白色 可选 -* bg:'#F00',//提示窗背景色 默认为红色 可选 -* time:2,//自动关闭时间 默认2秒 设置0则不自动关闭 可选 -* x:0,//横向偏移 正数向右偏移 负数向左偏移 默认为0 可选 -* y:0,//纵向偏移 正数向下偏移 负数向上偏移 默认为0 可选 -* }) -* -* -*/ -(function ($) { - $.fn.tips = function(options){ - var defaults = { - side:1, - msg:'', - color:'#FFF', - bg:'#F00', - time:2, - x:0, - y:0 - } - var options = $.extend(defaults, options); - if (!options.msg||isNaN(options.side)) { - throw new Error('params error'); - } - if(!$('#jquery_tips_style').length){ - var style=''; - $(document.body).append(style); - } - this.each(function(){ - var element=$(this); - var element_top=element.offset().top,element_left=element.offset().left,element_height=element.outerHeight(),element_width=element.outerWidth(); - options.side=options.side<1?1:options.side>4?4:Math.round(options.side); - var sideName=options.side==1?'top':options.side==2?'right':options.side==3?'bottom':options.side==4?'left':'top'; - var tips=$('
      '+options.msg+'
      ').appendTo(document.body); - tips.find('.jq_tips_arrow').css('border-'+sideName,'10px solid '+options.bg); - tips.find('.jq_tips_info').css({ - color:options.color, - backgroundColor:options.bg - }); - switch(options.side){ - case 1: - tips.css({ - top:element_top-tips.outerHeight()+options.x, - left:element_left-10+options.y - }); - break; - case 2: - tips.css({ - top:element_top-20+options.x, - left:element_left+element_width+options.y - }); - break; - case 3: - tips.css({ - top:element_top+element_height+options.x, - left:element_left-10+options.y - }); - break; - case 4: - tips.css({ - top:element_top-20+options.x, - left:element_left-tips.outerWidth()+options.y - }); - break; - default: - } - var closeTime; - tips.fadeIn('fast').click(function(){ - clearTimeout(closeTime); - tips.fadeOut('fast',function(){ - tips.remove(); - }) - }) - if(options.time){ - closeTime=setTimeout(function(){ - tips.click(); - },options.time*1000); - tips.hover(function(){ - clearTimeout(closeTime); - },function(){ - closeTime=setTimeout(function(){ - tips.click(); - },options.time*1000); - }) - } - }); - return this; - }; -})(jQuery); \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js b/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js deleted file mode 100644 index e1482ff..0000000 --- a/code/jeeplatform-sso/src/main/webapp/themes/jeeplatform/js/login.js +++ /dev/null @@ -1,45 +0,0 @@ -$(function(){ - airBalloon('div.air-balloon'); -}); - -/* -@function 热气球移动 -@update by julying , 2012/7/25 -*/ -function airBalloon(balloon){ - var viewSize = [] , viewWidth = 0 , viewHeight = 0 ; - resize(); - $(balloon).each(function(){ - $(this).css({top: rand(40, viewHeight * 0.5 ) , left : rand( 10 , viewWidth - $(this).width() ) }); - fly(this); - }); - $(window).resize(function(){ - resize() - $(balloon).each(function(){ - $(this).stop().animate({top: rand(40, viewHeight * 0.5 ) , left : rand( 10 , viewWidth - $(this).width() ) } ,1000 , function(){ - fly(this); - }); - }); - }); - function resize(){ - viewSize = getViewSize(); - viewWidth = $(document).width() ; - viewHeight = viewSize[1] ; - } - function fly(obj){ - var $obj = $(obj); - var currentTop = parseInt($obj.css('top')); - var currentLeft = parseInt($obj.css('left') ); - var targetLeft = rand( 10 , viewWidth - $obj.width() ); - var targetTop = rand(40, viewHeight /2 ); - /*求两点之间的距离*/ - var removing = Math.sqrt( Math.pow( targetLeft - currentLeft , 2 ) + Math.pow( targetTop - currentTop , 2 ) ); - /*每秒移动24px ,计算所需要的时间,从而保持 气球的速度恒定*/ - var moveTime = removing / 24; - $obj.animate({ top : targetTop , left : targetLeft} , moveTime * 1000 , function(){ - setTimeout(function(){ - fly(obj); - }, rand(1000, 3000) ); - }); - } -}; \ No newline at end of file From ccbffd583355ccc56abf6a4333980959cde1f867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Thu, 16 Apr 2020 16:53:05 +0800 Subject: [PATCH 055/123] =?UTF-8?q?rebuild=EF=BC=9ACAS=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-provider/.gitignore | 33 + code/jeeplatform-provider/pom.xml | 16 + ...eo.cas.cas-server-webapp-tomcat-5.2.3.info | 3 + ...org.jasig.cas.cas-server-webapp-4.2.7.info | 3 - .../META-INF/MANIFEST.MF | 7 - .../WEB-INF/cas-servlet.xml | 100 -- .../WEB-INF/deployerConfigContext.xml | 77 -- .../applicationContext.xml | 121 -- .../auditTrailContext.xml | 108 -- .../WEB-INF/spring-configuration/filters.xml | 39 - .../spring-configuration/metricsContext.xml | 38 - .../propertyFileConfigurer.xml | 23 - .../protocolViewsConfiguration.xml | 48 - .../spring-configuration/securityContext.xml | 35 - .../spring-configuration/webflowContext.xml | 70 -- .../clearpass-configuration.xml | 108 -- .../WEB-INF/view/jsp/authorizationFailure.jsp | 23 - .../ui/casAcceptableUsagePolicyView.jsp | 26 - .../jsp/default/ui/casAccountDisabledView.jsp | 6 - .../jsp/default/ui/casAccountLockedView.jsp | 6 - .../view/jsp/default/ui/casBadHoursView.jsp | 6 - .../jsp/default/ui/casBadWorkstationView.jsp | 6 - .../view/jsp/default/ui/casConfirmView.jsp | 5 - .../jsp/default/ui/casExpiredPassView.jsp | 6 - .../jsp/default/ui/casGenericSuccessView.jsp | 8 - .../jsp/default/ui/casLoginMessageView.jsp | 22 - .../view/jsp/default/ui/casLoginView.jsp | 198 --- .../view/jsp/default/ui/casLogoutView.jsp | 7 - .../jsp/default/ui/casMustChangePassView.jsp | 6 - .../view/jsp/default/ui/includes/bottom.jsp | 22 - .../view/jsp/default/ui/includes/top.jsp | 33 - .../jsp/default/ui/serviceErrorSsoView.jsp | 11 - .../view/jsp/default/ui/serviceErrorView.jsp | 6 - .../WEB-INF/view/jsp/errors.jsp | 6 - .../view/jsp/monitoring/viewConfig.jsp | 74 -- .../view/jsp/monitoring/viewSsoSessions.jsp | 323 ----- .../view/jsp/monitoring/viewStatistics.jsp | 218 ---- .../jsp/protocol/2.0/casProxyFailureView.jsp | 7 - .../jsp/protocol/2.0/casProxySuccessView.jsp | 7 - .../2.0/casServiceValidationFailure.jsp | 7 - .../2.0/casServiceValidationSuccess.jsp | 18 - .../3.0/casServiceValidationFailure.jsp | 7 - .../3.0/casServiceValidationSuccess.jsp | 36 - .../view/jsp/protocol/casPostResponseView.jsp | 17 - .../protocol/clearPass/clearPassFailure.jsp | 5 - .../protocol/clearPass/clearPassSuccess.jsp | 8 - .../view/jsp/protocol/oauth/confirm.jsp | 13 - .../casOpenIdAssociationFailureView.jsp | 1 - .../casOpenIdAssociationSuccessView.jsp | 9 - .../openid/casOpenIdServiceFailureView.jsp | 1 - .../openid/casOpenIdServiceSuccessView.jsp | 1 - .../WEB-INF/view/jsp/protocol/openid/user.jsp | 5 - .../WEB-INF/web.xml | 258 ---- .../WEB-INF/webflow/login/login-webflow.xml | 212 ---- .../WEB-INF/webflow/logout/logout-webflow.xml | 35 - .../css/cas.css | 528 -------- .../css/ssosessions.css | 130 -- .../favicon.ico | Bin 170 -> 0 bytes .../images/6inchbrand-64.png | Bin 1875 -> 0 bytes .../images/cas-logo.png | Bin 2003 -> 0 bytes .../images/confirm.gif | Bin 958 -> 0 bytes .../images/error.gif | Bin 1084 -> 0 bytes .../images/error.png | Bin 1471 -> 0 bytes .../images/green.gif | Bin 43 -> 0 bytes .../images/info.gif | Bin 980 -> 0 bytes .../images/info.png | Bin 1505 -> 0 bytes .../images/key-point_bl.gif | Bin 102 -> 0 bytes .../images/key-point_br.gif | Bin 186 -> 0 bytes .../images/key-point_tl.gif | Bin 103 -> 0 bytes .../images/key-point_tr.gif | Bin 105 -> 0 bytes .../images/logo.png | Bin 26418 -> 0 bytes .../images/question.png | Bin 3948 -> 0 bytes .../images/red.gif | Bin 43 -> 0 bytes .../images/success.png | Bin 1569 -> 0 bytes .../images/warning.png | Bin 602 -> 0 bytes .../images/webapp.png | Bin 10166 -> 0 bytes .../index.jsp | 6 - .../js/cas.js | 62 - .../js/ssosessions.js | 181 --- .../js/statisticsview.js | 138 -- .../js/test_data.json | 1117 ----------------- .../js/viewConfig.js | 59 - .../themes/apereo/css/cas.css | 198 --- .../themes/apereo/images/apereo-logo.png | Bin 28964 -> 0 bytes .../themes/apereo/images/bg-tile.gif | Bin 26910 -> 0 bytes .../themes/apereo/js/cas.js | 20 - code/jeeplatform-sso/pom.xml | 309 +---- .../src/main/resources/application.properties | 38 +- .../src/main/resources/casServer.crt | Bin 0 -> 857 bytes .../src/main/resources/casServer.keystore | Bin 0 -> 2215 bytes .../src/main/webapp/WEB-INF/log4j2.xml | 228 ---- .../WEB-INF/services/Client1-10000004.json | 8 + .../WEB-INF/services/Client1-10000005.json | 8 + .../WEB-INF/services/Localhost-10000003.json | 8 + .../src/main/webapp/WEB-INF/web.xml | 10 + 95 files changed, 170 insertions(+), 5372 deletions(-) create mode 100644 code/jeeplatform-provider/.gitignore create mode 100644 code/jeeplatform-provider/pom.xml create mode 100644 code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7.info delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/META-INF/MANIFEST.MF delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/cas-servlet.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/deployerConfigContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/applicationContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/auditTrailContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/filters.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/metricsContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/propertyFileConfigurer.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/protocolViewsConfiguration.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/securityContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/webflowContext.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/unused-spring-configuration/clearpass-configuration.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/authorizationFailure.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casConfirmView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLogoutView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/bottom.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/favicon.ico delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/cas-logo.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/info.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_br.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tl.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/logo.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/question.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/red.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/success.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/warning.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif delete mode 100644 code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js create mode 100644 code/jeeplatform-sso/src/main/resources/casServer.crt create mode 100644 code/jeeplatform-sso/src/main/resources/casServer.keystore delete mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/log4j2.xml create mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json create mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json create mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json create mode 100644 code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml diff --git a/code/jeeplatform-provider/.gitignore b/code/jeeplatform-provider/.gitignore new file mode 100644 index 0000000..266bfaa --- /dev/null +++ b/code/jeeplatform-provider/.gitignore @@ -0,0 +1,33 @@ +# maven ignore +target/ +*.jar +*.war +*.zip +*.tar +*.tar.gz +*.class +*.mvn +mvnw.* + +# eclipse ignore +.settings/ +.project +.classpath + +# idea ignore +.idea/ +*.ipr +*.iml +*.iws + +# temp ignore +*.log +*.cache +*.diff +*.patch +*.tmp +*.swp + +# system ignore +.DS_Store +Thumbs.db diff --git a/code/jeeplatform-provider/pom.xml b/code/jeeplatform-provider/pom.xml new file mode 100644 index 0000000..90c094c --- /dev/null +++ b/code/jeeplatform-provider/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + org.muses.jeeplatform + jeeplatform + 1.0-SNAPSHOT + + jeeplatform-provider + jeeplatform-provider + ${jeeplatform-provider.version} + jar + + + + diff --git a/code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info b/code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info new file mode 100644 index 0000000..b508d59 --- /dev/null +++ b/code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info @@ -0,0 +1,3 @@ +1587018336457 +(?:[^/]+/)*?[^/]*? +META-INF(?:$|/.+) \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7.info b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7.info deleted file mode 100644 index 059e2a2..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7.info +++ /dev/null @@ -1,3 +0,0 @@ -1558186422037 -(?:[^/]+/)*?[^/]*? -WEB-INF/cas\.properties, WEB-INF/classes/log4j2\.xml, WEB-INF/classes/message[^/]*?\.properties, WEB-INF/classes/services \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/META-INF/MANIFEST.MF b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/META-INF/MANIFEST.MF deleted file mode 100644 index 863b7a9..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/META-INF/MANIFEST.MF +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -Implementation-Date: Thu Nov 03 15:24:10 MST 2016 -Implementation-Vendor: org.jasig.cas -Implementation-Title: cas-server-webapp -Implementation-Version: 4.2.7 -Created-By: org.jasig.cas - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/cas-servlet.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/cas-servlet.xml deleted file mode 100644 index 1298744..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/cas-servlet.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/deployerConfigContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/deployerConfigContext.xml deleted file mode 100644 index 1596b19..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/deployerConfigContext.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - memberOf - - faculty - staff - org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/applicationContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/applicationContext.xml deleted file mode 100644 index ae6d5b9..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/applicationContext.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - This is the main Spring configuration file with some of the main "core" classes defined. You shouldn't really - modify this unless you know what you're doing! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - passThroughController - pingController - threadsController - metricsController - healthController - - - - - - - com.codahale.metrics.servlets.HealthCheckServlet - - - healthServlet - - - - - - com.codahale.metrics.servlets.MetricsServlet - - - metricsServlet - - - - - - com.codahale.metrics.servlets.PingServlet - - - ping - - - - - - com.codahale.metrics.servlets.ThreadDumpServlet - - - threads - - - - - - - - - - - ${scheduler.shutdown.interruptJobs:true} - - ${scheduler.shutdown.interruptJobs:true} - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/auditTrailContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/auditTrailContext.xml deleted file mode 100644 index 368cc6d..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/auditTrailContext.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - Configuration file for the Inspektr package which handles auditing for Java applications. - If enabled this should be modified to log audit and statistics information the same way - your local applications do. The default is currently to log to the console which is good - for debugging/testing purposes. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/filters.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/filters.xml deleted file mode 100644 index 6653264..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/filters.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/metricsContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/metricsContext.xml deleted file mode 100644 index d04fb73..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/metricsContext.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - This is the Spring configuration file that orchestrates the CAS metrics. - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/propertyFileConfigurer.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/propertyFileConfigurer.xml deleted file mode 100644 index 6596390..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/propertyFileConfigurer.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - This file lets CAS know where you've stored the cas.properties file which details some of the configuration - options - that are specific to your environment. You can specify the location of the file here. You may wish to place the - file outside - of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the - WAR file - can be moved between tiers without modification. - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/protocolViewsConfiguration.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/protocolViewsConfiguration.xml deleted file mode 100644 index dc845b5..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/protocolViewsConfiguration.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/securityContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/securityContext.xml deleted file mode 100644 index 2b89f9c..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/securityContext.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Security configuration for sensitive areas of CAS : status and statistics. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/webflowContext.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/webflowContext.xml deleted file mode 100644 index a65ee55..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/spring-configuration/webflowContext.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cas_views - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/unused-spring-configuration/clearpass-configuration.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/unused-spring-configuration/clearpass-configuration.xml deleted file mode 100644 index d07faf6..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/unused-spring-configuration/clearpass-configuration.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - clearPassController - - - - - - - - - - - - - - - ... - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/authorizationFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/authorizationFailure.jsp deleted file mode 100644 index 84d3986..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/authorizationFailure.jsp +++ /dev/null @@ -1,23 +0,0 @@ - - -<%@ page isErrorPage="true" %> -<%@ page import="org.jasig.cas.web.support.WebUtils"%> - -
      -

      ${pageContext.errorData.statusCode} -

      - - <% - Object casAcessDeniedKey = request.getAttribute(WebUtils.CAS_ACCESS_DENIED_REASON); - request.setAttribute("casAcessDeniedKey", casAcessDeniedKey); - - %> - - - -

      -
      -
      -

      <%=request.getAttribute("javax.servlet.error.message")%>

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp deleted file mode 100644 index 4ee34fd..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAcceptableUsagePolicyView.jsp +++ /dev/null @@ -1,26 +0,0 @@ - -
      - - -

      Acceptable Usage Policy

      -
      - The purpose of this policy is to establish acceptable and unacceptable use of electronic devices and network resources in conjunction with the established culture of ethical and lawful behavior, openness, trust, and integrity. - -

      - By using these resources, you agree to abide by the Acceptable Usage Policy. -

      - -

      Click '' to continue. Otherwise, click ''.

      -
      - -
      - - - " type="submit" /> - " type="button" - onclick="location.href = location.href;" /> -
      -
      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp deleted file mode 100644 index 0deddbf..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountDisabledView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
      -

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp deleted file mode 100644 index c41bccd..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casAccountLockedView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
      -

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp deleted file mode 100644 index ace5f80..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadHoursView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
      -

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp deleted file mode 100644 index 6f5ead2..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casBadWorkstationView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
      -

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casConfirmView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casConfirmView.jsp deleted file mode 100644 index 5d8cc96..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casConfirmView.jsp +++ /dev/null @@ -1,5 +0,0 @@ - -
      -

      -
      - \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp deleted file mode 100644 index 8ae8775..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casExpiredPassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
      -

      -

      -
      - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp deleted file mode 100644 index 956ed44..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casGenericSuccessView.jsp +++ /dev/null @@ -1,8 +0,0 @@ - -
      -

      -

      -

      -
      - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp deleted file mode 100644 index 716cac3..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - -
      -

      Authentication Succeeded with Warnings

      - - -

      ${message.text}

      -
      - -
      - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginView.jsp deleted file mode 100644 index dbccf30..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLoginView.jsp +++ /dev/null @@ -1,198 +0,0 @@ - - - -
      -

      -

      -
      -
      - - - - - - - - - - - - - - - - - - - - - - -
      -
      - - - - -
      -

      ${fn:escapeXml(registeredServiceName)}

      -

      ${fn:escapeXml(registeredServiceDescription)}

      -
      -
    -

    - - -

    - - - - -

    - -
    - - - - - " /> - - - - - - -
    - -
    - - <%-- - NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute, - "autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more - information, see the following web page: - http://www.technofundo.com/tech/web/ie_autocomplete.html - --%> - - - -
    - - - -
    - - - - - " tabindex="6" type="submit" /> - " tabindex="7" type="reset" /> -
    -
    -
    - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLogoutView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLogoutView.jsp deleted file mode 100644 index 187c52a..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casLogoutView.jsp +++ /dev/null @@ -1,7 +0,0 @@ - -
    -

    -

    -

    -
    - \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp deleted file mode 100644 index 47772dd..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/casMustChangePassView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
    -

    -

    -
    - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/bottom.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/bottom.jsp deleted file mode 100644 index 0bde3a8..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/bottom.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - -
    - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp deleted file mode 100644 index 85cb24b..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/includes/top.jsp +++ /dev/null @@ -1,33 +0,0 @@ - - -<%@ page pageEncoding="UTF-8" %> -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - - - - - CAS – Central Authentication Service - - - - - - - " /> - " type="image/x-icon" /> - - - - -
    -
    - -

    Central Authentication Service (CAS)

    -
    -
    diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp deleted file mode 100644 index a9fcb96..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorSsoView.jsp +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
    -

    -

    -
    - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp deleted file mode 100644 index 2624d1d..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/default/ui/serviceErrorView.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
    -

    -

    -
    - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp deleted file mode 100644 index ed48be6..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/errors.jsp +++ /dev/null @@ -1,6 +0,0 @@ - -
    -

    -

    -
    - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp deleted file mode 100644 index 0a380a8..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewConfig.jsp +++ /dev/null @@ -1,74 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - - - - - -
    -

    - - -
    -

    -
    - "> -
    -
    - -
    -
    - -
    -
    -

    -
    -
    -
    - - - - - - - - - - - - - - -
    -
    - -
    - -
    -
    - "> -
    -
    - -
    -<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp deleted file mode 100644 index 58bcc17..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewSsoSessions.jsp +++ /dev/null @@ -1,323 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - -
    -

    - -
    -

    -
    - "> -
    -
    - -
    -
    - -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    0
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    0
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    0
    -
    -
    -
    -
    -
    -
    - <%--
    graph
    --%> -
    -
    - -
    -
    - - - -
    - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
       
    UserTGTAuth_DateUsage_Count
    -
    -
    - -
    - "> -
    -
    -
    -
    -
    -<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp deleted file mode 100644 index 22c8ced..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/monitoring/viewStatistics.jsp +++ /dev/null @@ -1,218 +0,0 @@ -<%@include file="/WEB-INF/view/jsp/default/ui/includes/top.jsp"%> - - - -
    Loading...
    - -
    -

    - -
    - <%-- Registry Ticket Section --%> -

    -
    -
    -
    -
    -
    -
    -
    -
    ${unexpiredTgts}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    ${unexpiredSts}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    ${expiredTgts}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    ${expiredSts}
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -

    -
    - <%-- JVM Server Section --%> -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ${serverIpAddress} (${serverHostName})
    ${casTicketSuffix}
    ${startTime}
    ${upTime}
    ${freeMemory} MB
    ${totalMemory} MB
    ${maxMemory} MB
    ${availableProcessors}
    -
    -
    -
    -
    - -
    - <%-- Thread Dump Section --%> -
    -

    -
    -
    
    -                    
    -                
    -
    -
    - -
    - <%-- Metrics Section --%> -
    -

    - -
    -
    -
    - - - - - - -<%@include file="/WEB-INF/view/jsp/default/ui/includes/bottom.jsp" %> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp deleted file mode 100644 index 6e8d26e..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxyFailureView.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp deleted file mode 100644 index 2a948ff..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casProxySuccessView.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(ticket)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp deleted file mode 100644 index cdeaebe..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationFailure.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp deleted file mode 100644 index 8c1434f..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp +++ /dev/null @@ -1,18 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(principal.id)} - - ${pgtIou} - - - - - ${fn:escapeXml(proxy.principal.id)} - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp deleted file mode 100644 index cdeaebe..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationFailure.jsp +++ /dev/null @@ -1,7 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - - ${fn:escapeXml(description)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp deleted file mode 100644 index 6c7c996..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/3.0/casServiceValidationSuccess.jsp +++ /dev/null @@ -1,36 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ page import="java.util.*, java.util.Map.Entry" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(principal.id)} - - ${pgtIou} - - - - - ${fn:escapeXml(proxy.principal.id)} - - - - - - - - - - ${fn:escapeXml(attrval)} - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp deleted file mode 100644 index 0c2a471..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/casPostResponseView.jsp +++ /dev/null @@ -1,17 +0,0 @@ -<%@ page language="java" session="false"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - -
    " method="post"> -
    - - - -
    - -
    - - \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp deleted file mode 100644 index 8e3a273..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassFailure.jsp +++ /dev/null @@ -1,5 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> - - ${fn:escapeXml(description)} - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp deleted file mode 100644 index aa85b18..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/clearPass/clearPassSuccess.jsp +++ /dev/null @@ -1,8 +0,0 @@ -<%@ page session="false" contentType="application/xml; charset=UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> - - - ${fn:escapeXml(credentials)} - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp deleted file mode 100644 index defed10..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/oauth/confirm.jsp +++ /dev/null @@ -1,13 +0,0 @@ - -
    -

    - -

    - -

    - -

    - -

    -
    - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp deleted file mode 100644 index 8e376b0..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationFailureView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:cancel\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp deleted file mode 100644 index dea573d..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdAssociationSuccessView.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page import="java.util.Set, java.util.Map, java.util.Iterator" %><% - Map parameters = (Map)request.getAttribute("parameters"); - Iterator iterator = parameters.keySet().iterator(); - while (iterator.hasNext()) { - String key = (String)iterator.next(); - String parameter = (String)parameters.get(key); - out.print(key+":"+parameter+"\n"); - } -%> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp deleted file mode 100644 index 31150f3..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceFailureView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:id_res\nis_valid:false\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp deleted file mode 100644 index d108cde..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/casOpenIdServiceSuccessView.jsp +++ /dev/null @@ -1 +0,0 @@ -<%= "openid.mode:id_res\nis_valid:true\n" %> \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp deleted file mode 100644 index 05a1dbc..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/view/jsp/protocol/openid/user.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml deleted file mode 100644 index 7cbeb61..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/web.xml +++ /dev/null @@ -1,258 +0,0 @@ - - - Central Authentication System (CAS) - - - isLog4jAutoInitializationDisabled - true - - - org.apache.logging.log4j.web.Log4jServletContextListener - - - - contextConfigLocation - - /WEB-INF/spring-configuration/*.xml - /WEB-INF/deployerConfigContext.xml - - classpath*:/META-INF/spring/*.xml - - - - - characterEncodingFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - characterEncodingFilter - /* - - - - CAS Client Info Logging Filter - org.jasig.inspektr.common.web.ClientInfoThreadLocalFilter - true - - - CAS Client Info Logging Filter - /* - - - - requestParameterSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - requestParameterSecurityFilter - /* - - - - responseHeadersSecurityFilter - org.springframework.web.filter.DelegatingFilterProxy - true - - - responseHeadersSecurityFilter - /* - - - - - - org.springframework.web.context.ContextLoaderListener - - - - - org.jasig.cas.CasEnvironmentContextListener - - - - - - cas - - org.springframework.web.servlet.DispatcherServlet - - - contextConfigLocation - - /WEB-INF/cas-servlet.xml,classpath*:/META-INF/cas-servlet-*.xml,/WEB-INF/cas-servlet-*.xml - - - publishContext - false - - 1 - true - - - - cas - /login - - - - cas - /logout - - - - cas - /validate - - - - cas - /serviceValidate - - - - cas - /p3/serviceValidate - - - - cas - /proxy - - - - cas - /proxyValidate - - - - cas - /p3/proxyValidate - - - - cas - /CentralAuthenticationService - - - - cas - /status - - - - cas - /statistics - - - - cas - /statistics/ping - - - - cas - /statistics/metrics - - - - cas - /statistics/threads - - - - cas - /statistics/healthcheck - - - - cas - /statistics/ssosessions/* - - - - cas - /statistics/ssosessions - - - - cas - /status/config/* - - - - cas - /status/config - - - - cas - /authorizationFailure.html - - - - cas - /v1/tickets/* - - - cas - /v1/services/* - - - - - 5 - COOKIE - - true - - - - - 401 - /authorizationFailure.html - - - - 403 - /authorizationFailure.html - - - - 404 - / - - - - 500 - /WEB-INF/view/jsp/errors.jsp - - - - 501 - /WEB-INF/view/jsp/errors.jsp - - - - 503 - /WEB-INF/view/jsp/errors.jsp - - - - index.jsp - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml deleted file mode 100644 index e4bd281..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/login/login-webflow.xml +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml deleted file mode 100644 index 100ccc3..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/WEB-INF/webflow/logout/logout-webflow.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css deleted file mode 100644 index 9b9eaf6..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/cas.css +++ /dev/null @@ -1,528 +0,0 @@ -/*@import url(https://fonts.googleapis.com/css?family=Lato);*/ -@import url(https://fonts.googleapis.com/css?family=Lato:700,400,300,100); - -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, -address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, -b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, -thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, -hgroup, menu, nav, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-size: 100%; - vertical-align: baseline; - background: transparent; -} -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Verdana, sans-serif; font-size: 11px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - - - -@media screen and (min-width: 960px) { - #container { width: 960px; } -} - -@media screen and (min-width: 1280px) { - #ssosessions-page #container { width: 1280px; } -} - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { - -webkit-border-bottom-right-radius: 0px; - -webkit-border-bottom-left-radius: 0px; - -moz-border-radius-bottomright: 0px; - -moz-border-radius-bottomleft: 0px; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; - } -} - -body#cas { - background: #153e50; /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 20px 0; -} - -#logo { - display: block; - background: url(../images/logo.png) no-repeat; - text-indent: -999em; - float: left; - height: 100px; - width: 80%; - margin-right: 40px; - border: 0px; -} - -header h1 { - float: right; - width: 119px; - height: 60px; - background: url(../images/cas-logo.png) no-repeat; - text-indent: -999em; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../images/info.png) no-repeat 20px center; } - -.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - padding-top:5px; - margin-bottom:5px; - background: url(../images/error.png) no-repeat 20px center; -} - -#serviceui.serviceinfo { - border: 1px dotted #0066FF; - color: black; - padding-left: 10px; - padding-top: 5px; -} - -#servicedesc { - vertical-align:middle; - padding-left: 30px; - width: 90%; -} - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #7fd36e; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-providers ul { - margin-bottom: 3em; -} - -#list-languages h3, #list-providers h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li, #list-providers ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: white; -} - -footer a:link, footer a:visited { - color: white; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 855px) { - #logo { display: none; } - header h1 { font-size: 1em; width: 70px; height: 40px; background-size: 70px 40px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #70ba61; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} - - -/** - * SSO Sessions Styles - */ -#loadingMessage { - font-size: 14px; -} - -#cas-sessions, #no-cas-sessions { - display: none; -} -#no-cas-sessions div { - margin-top: 2em; -} - -.ssoSessions #content { - border-radius: 4px; - padding: 20px; -} - -#container-stable { - margin: 20px 0 20px; -} - -.ssoSessions .btn-success { - background: #70ba61; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.ssoSessions .sorting_desc, .ssoSessions .sorting_asc { - background-color: rgba(239, 239, 239, 0.8); -} -.ssoSessions #removeAllSessionsButton.btn .badge { - color: #000; - padding-right: 9px; -} - -.ssoSessions .adminPanels { - border-bottom: 1px solid #efefef; - margin-bottom: 2em; - margin-top: 1em; - padding-bottom: 1em; -} - -.ssoSessions .adminPanels .panel-default>.panel-heading { - background-color: #fff; - border-bottom: none; -} -.ssoSessions .adminPanels .panel-default>.panel-heading h3 { - font-family: 'Lato', sans-serif; - font-weight: 300; - font-size: 20pt; -} - -.ssoSessions .adminPanels .panel-default > .panel-heading:after { - position: absolute; - font-family: FontAwesome; - top: -5px; - right: 30px; - font-size: 70pt; - color: #153e50; - opacity: 0.1; -} -.adminPanels .users-panel.panel-default > .panel-heading:after { - content: "\f0c0"; -} - -.adminPanels .usage-panel.panel-default > .panel-heading:after { - content: "\f201"; -} - -.adminPanels .tickets-panel.panel-default > .panel-heading:after { - content: "\f145"; -} - - -.ssoSessions td.details-control { - cursor: pointer; - font-family: FontAwesome; - font-size: 10pt; - color: #337ab7; -} -.ssoSessions td.details-control:after { - content: "\f067"; - /*content: "\002B"; - thinner plus sign */ -} -.ssoSessions tr.shown td.details-control:after { - content: "\f068"; - /*content: "\002D"; - thinner minus sign */ -} - -.row-detail-wrapper { - /*background-color: cornsilk;*/ - background-color: #d9edf7; -} -.ssoSessions .row-detail thead { - display: none; -} -.ssoSessions .row-detail { - /*font-size: 8pt;*/ - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.ssoSessions .field-label { - /*font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/ - /*font-size: 8pt;*/ - /*font-weight: bold;*/ -} - -.principal_attributes td:first-child { - width: 30%; -} -table.principal_attributes>tbody>tr>td { - border-top-color: #E6E6E6; -} - -.adminPanels .panel-body { - padding-top: 5px; -} -.adminPanels .panel-body span { - font-family: 'Lato', sans-serif; - font-size: 30pt; - font-weight: 100; -} - -.row-eq-height { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -#alertBox { - display: none; -} - -/** - SB Admin Styles - */ - -.huge { - font-size: 30pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} - -.semi-huge { - font-size: 18pt; - font-family: 'Lato', sans-serif; - font-weight: 300; -} -/** - * Statistics View - */ - -.statisticsView { - display: none; -} - -.statisticsView .progress-meter .background { - fill: #DFEAFD; -} -.statisticsView .progress-meter .foreground { - fill: #2E7AF9; -} -.statisticsView .progress-meter text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .progress-meter .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} - -.modal { - display: none; -} - -/** - * Runtime Statistics Gauge styles - */ -.statisticsView .runtimeStatistics .background { - fill: #DFEAFD; -} -.statisticsView .runtimeStatistics .foreground { - fill: #2E7AF9; -} -.statisticsView .runtimeStatistics text { - font-family: 'Lato' sans-serif; - font-size: 25pt; - font-weight: 300; -} -.statisticsView .runtimeStatistics .text2 { - font-family: 'Georgia' sans-serif; - font-size: 10pt; -} -#uptime-panel { - display: none; -} -#uptime { - font-family: 'Lato', sans-serif; - font-size: 16pt; -} - -.thread-dump-view { - height: 600px; - overflow-y: auto; -} - -#metricsGauges strong { - display: block; -} - -#metricsGauges .panel { - width: 100%; -} - -#metricsGauges ul { - height : auto; - overflow : hidden; -} - -#metricsGauges li { - float : left; - width : 80px; - height: 80px; - margin: 0 0 10px 10px; - background : #d8d8d8; - -} -#metricsGauges ul li:nth-child(5n + 1) { - clear : left; -} - - -.statisticsView .equal, .statisticsView .equal > div[class*='col-'] { - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - flex:1 1 auto; -} - -.statisticsView .section { - margin-bottom: 25px; -} - -#viewSsoSessions { - color: white; -} - -.statisticsView .adminPanels.container-fluid { - padding-right: 0; -} - -/** - * View Configuration Styles - */ -#viewConfigError { - display: none; -} -#view-configuration { - display: none; -} diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css deleted file mode 100644 index 793d0ba..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/css/ssosessions.css +++ /dev/null @@ -1,130 +0,0 @@ -/* -/* --------------- CUSTOM STYLES -*/ - -body,html { - background: #153e50; -} - -/*body,html,*/ - -#cas-sessions, -#container-stable, -.ui-widget { - font-family: 'Lato', sans-serif !important; - font-size: 14px; -} - - -/* Navigation -- */ -.navbar-default .navbar-brand, -.navbar-default .navbar-toggle { - color: #ffffff; -} -.navbar-default .navbar-brand { - font-family: 'Open Sans', sans-serif; - color: #ffffff; - line-height: 32px; - font-size: 20px; - padding: 0; - position: relative; - top: 8px; - left: 5px; -} -.navbar-default .navbar-brand:hover { - color: #ffffff; -} -.navbar-default .navbar-brand img { - margin-right: 8px; - width: 32px; -} -.navbar-default .navbar-brand .logo { - text-transform: uppercase; - font-size: 26px; -} -.navbar-default .navbar-brand .logo .heavy { - font-weight: 700; -} - -@media (min-width: 768px) { - .navbar-brand { - display: block; - padding: 6px 15px 0; - box-sizing: border-box; - top: auto; - left: auto; - } - .navbar-brand img { - display: inline-block; - width: 32px; - } -} - - - -#navbar > .navbar-nav > li > a { - color: #ffffff; - font-size: 12px; -} -.navbar-default { - border-bottom: 1px solid #dadada; - background-color: #346288; -} -.navbar-default .navbar-header a { - color: #ffffff; -} -.navbar-default .navbar-header a.toggle-sidebar { - padding: 15px 20px; - float: left; -} -#top-navbar .nav > li .navbar-text { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a { - color: #ffffff; - padding: 15px 14px; - margin: 0; -} -#top-navbar .nav > li > a:hover, -#top-navbar .nav > li > a:focus { - background-color: #36a9e1; -} - -/* Main content block --*/ -/*#content {*/ - /*border-radius: 4px;*/ -/*}*/ - -/* Session container --*/ -#container-stable { - margin: 40px 0 20px; -} -#container-stable h3, -#container-stable table th, -#container-stable table td { - /*font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;*/ -} -#container-stable table th { - text-align: left; -} - -/* Tables */ -#table-monitor-hdr { - font-weight: bold; - margin-left: 16px; - text-align: center -} - - -/* UI controls */ -.ui-accordion .ui-accordion-header { - margin: 15px 0 0; -} - -.btn.active, .btn:active { - color: #fff; - background-color: #286090; - border-color: #204d74; -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/favicon.ico b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/favicon.ico deleted file mode 100644 index 635bac544f5072f5946dcf7305f40b738932eb8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmZ?wbhEHb6krfwSj52a<;}zAmo}eUnsIWP_qrmf>swp)wwe9^|6lPZ3j+w~fC!LU z2Il+-=HuTDnhcye6^|@FC~@d<>|4D&wWax^9?SK_Qj0>tA)gFx6incdd$HvV|zi${LIJg2?E7cAt}y^ UKFMYR!g&fY@&5c`lAH|I0Km{fS^xk5 diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/6inchbrand-64.png deleted file mode 100644 index 0b97048ca9963d8519b24b17dd956b686e9f68da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1875 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 diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/confirm.gif deleted file mode 100644 index 533bbba5c48c21aaddd25a4ced0f901d3cf12d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~;pNk%w1VK4wN0K^{vZ`e<$=aV0c8Mo`Gj^K3o{r1G~wuRkl?fU6xvsMXh z2btr5!}pTZ^UK`z)qLAvwbQhh$&lpt-73v0VADNN*-ufULCo>Nq~DFl=fT_V*V60D z41o*`fD8a;0L=fHA^8LW0018VEC2ui05AYB000I5;3tk`X`X0`GK3|(a4gSsoGdAm zC|>XXz@Tv0IhX>1UMB%*I-k&})ETk(EF?y!2Pt^J;ILS%DU`v8NG~x;^v>hB+*~-s z)gIiZmzn#;8wdab2yt#$3?2$!2#t=9kdclX5)~W*5|LgR9vvTviv^OSq#2bR9Rd!L zqKco2qNK8q84eE|9I30460V@J62Zd5#KjT~1Olk34aJQbzKV^(4%O8X4%ph%+1L&S z7ZV-1m(AAQ2+#_z3JBci@bT6I7XZ1amlyHD>g?{-4FU=rNN}KmWaI7$xIpk)KT!V) zN-Q|Qzyw?vFBvG9?V&UW4K9crNwOr#gUXiw;SvC@WCI5qqO}8g!GKMhHE-&?8DM}o zT=-Ja)5#E~%wsus?!*uP!_5H)fRf`dVL$+-3}dbXb{8d}Ois1|OBnms)_hxL0|S^B zC|{m8w%y*1F)W`x9kT)4pc+`E&K&e!s(WX1AKw$ZBJBYd5LnNCJ>8$*)81`QpZ$XJ z#^={(?=3@k9>iXk3wABU4Ea6teEvN$3G6;Q~4jVuz_Q-=gR0Kkw$7CB^z;-I*I zkxUl(00BS7IAf4aGD(1m6;@g0lTorW;{jSSi6aYPHhDl(oxI`!1T+d+=8-8HNx__S z);T1XhlpSWOX~6Hr<(xOY3GnG;-N<(okWn{c#JAnqmY8qN$3J@c!0$S3-I8900~6k z>8GHE8mfwcMoK{f7HqMp2^b_X#H&D9@Bo;R#>xN+1SBAUrm()s>5z0R diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/error.gif deleted file mode 100644 index b5f4c030649a5252697d4fd0b0d56adcf2db1857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 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 Z#@`@C`g?IQt|0&b002ovPDHLkV1f~h!f*fp diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/green.gif deleted file mode 100644 index 8d4f8023723ef4a05f7c6a6d29a82f9f78985b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 tcmZ?wbhEHbWMp7uXkcJqm`~TSO{BW70#P*ug>inI| z^6B;d;`07_xa*s&*v;7Ozu)*tZKv({|7V-nfV}Ox$>)Z#pjLCe-0Jr|VXwN}_g9F` z)#mr%?)ZqF((m>A`1}0C;`x}x?WerqZ>8VN;`NHd@1)W6L}s^Zg~jOb`SSPsrMBI* z((skY@wD3aSbnB%gVtI4jv8xvJt}x%DJnhV+!)`k67ll$^b#PDV-6to{1WZ~ z$O8212Z99|7W)Ry`xj8cf`JPnMzrU^%a;K9>OFKAZz7F%0VIkXNfN}02NfQy070^) zL=GTv$ec;DX3ZTdcG%om6DC0aa14S99ZJ;XhoeZ3u2?{{sZgH*ojP5?B8EjV9zaNK zS^}hwuVBN9U9rO57!NDNss-Eirz-<+RPkk0%9WQf%y?PAAeRxpezWx9OAnohNfMQIH4*Inx0!SwmXyAbecF+MRV`R`m2OJ4 z#sLT*(Zmf`AzH=^6EvWyrfm9fg9VW)0VV>ZmTKy$r8WUZ2AOW!pCqEjDypg%ZLsMV zp~|Z35*GCFg{@FVuL#UOnv5BOlLR!RsD zB|zeXrlJqV3rHd*3Kmg>fYHcG(UM>(x3;^q>~?47_9j zu#IT1oEAdOj8e=fFF|Q>KJtSB-Ms;LcrK9T-Oc?F0+96CF*@*L$7ylZ&k> zq??6+`%q0q`%CMVp?>8YBqJsGIqBf@fdmd+z0L5Lf5xBrb9gTIaPR&v&u#{A-#cdM zu24~a>ysoKv~8Rp8b#cdfDnYGJ5_x)NhDfoBB+}l1|N-evw$(r%$LH?I7(Sd7F2<=t7Zi%JWTIWAtkLt>YOI#y+HRySpGHapmrz2oL+RRkB} zDWqK}p~&84&H@-uV((A?;L7!3pLb7OCZBEQz|t9lGyQCKu!}%|R=|e#((({44JJ*q z2X!c?Iu}xh5|)K7n%{Nsj5;qX2Es*pQ7~06MdA%CUY!`DHm|H!1nZgp=zEEe-I@}%c2T2J~|uO$5Ydb z(A7WUUm+v*7%isiDzWbZq85NiLW$KR7lh0~%{;m>it0iepY`-2`)E7W2RJ%>@_wBy z!7g^P7^yKOR(KO}TvU_z!|!5v_T%$-WNyW{^w_U`h;f(%_e_CgluJJ-gA}YKuExt* zgp2N5quAFwh&SqHV(!dRv)k@oATIz&X)=s#LN2@5$>P6)kVa;N=G=pNtO5ZvHOv{8 z_WXVg-SISkrX{&}6LNhQ5M%M_JR#LRO1q31JB&W})NgZLZTYzPlhb`bFbGJPK1TPM zEHh>oJ6ZgVlq_(}C2=y>C)y$h|S2W2a+ybMJ99>>+8ABsQ|13f*He6!5?fcA0lB^&;@P4RO$oOY9+fMy=@aN?R=Q;6^s~MiAlx2)rbRtD77JNv(u@?M&1bE0PcCfUBZ?63K*$DYClPB z0hCxkApxj+`ai$IyhVI~F$p9+V2p4wJJeSr03eS<1w@`;!P~^{runsA=PRpl|6&8S zesl)=d;2T^PY}-$tBH9zU)p+!9^xzFRMWg#FC*xDb#n24kIBO!4MRL&00000NkvXX Hu0mjfBRs>^ diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_bl.gif deleted file mode 100644 index fe6f825706ff766e7bd159b13769edb3555a1228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmZ?wbhEHbVPCbW-zb_3!L=SmJ*v-QzQ`fAvCE#pt;e7!5RQ4DjU$}bp?Wa#~K7M@p?%j*GZ=bw;`S`_)dygOAdHC@5 zg9o?n-@kb6+O=D^uH3kB>Dsl&&z{|V@Zi&zFK^$!fA!|guiw8veg6FG*Ds(sm_YHL zpmR}bVo7R>LV0FMhJw4NZvcbhPZprf@(em4>p>1-U{!jc-gm^PudS%deM=qZR;9jD YrSl>+tcOgdJ1{6s2r)S1z`VPCbW-zdb7@Tlsa|*g6`(@wp?ShX|r@F0-6J)Rk0B1}jd;kCd diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/key-point_tr.gif deleted file mode 100644 index 602127a5ffadfc15f757ba1a2447746a2a13c56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 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 diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/images/webapp.png deleted file mode 100644 index c2ea89be47822ada213125aadda201a5b5f6ae61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10166 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 diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp deleted file mode 100644 index 08a5002..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/index.jsp +++ /dev/null @@ -1,6 +0,0 @@ -<%@ page language="java" session="false" %> - -<% -final String queryString = request.getQueryString(); -final String url = request.getContextPath() + "/login" + (queryString != null ? '?' + queryString : ""); -response.sendRedirect(response.encodeURL(url));%> diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js deleted file mode 100644 index f5a2055..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/cas.js +++ /dev/null @@ -1,62 +0,0 @@ - -head.ready(document, function() { - head.load("https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js", loadjQueryUI); -}); - -function loadjQueryUI() { - head.load("https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js", loadjQueryCookies); -} - -function loadjQueryCookies() { - head.load("https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js", resourceLoadedSuccessfully); -} - -function areCookiesEnabled() { - $.cookie('cookiesEnabled', 'true'); - var value = $.cookie('cookiesEnabled'); - if (value != undefined) { - $.removeCookie('cookiesEnabled'); - return true; - } - return false; -} - -function resourceLoadedSuccessfully() { - $(document).ready(function() { - - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - - if (areCookiesEnabled()) { - $('#cookiesDisabled').hide(); - } else { - $('#cookiesDisabled').show(); - $('#cookiesDisabled').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - $('#capslock-on').hide(); - $('#password').keypress(function(e) { - var s = String.fromCharCode( e.which ); - if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) { - $('#capslock-on').show(); - } else { - $('#capslock-on').hide(); - } - }); - if (typeof(jqueryReady) == "function") { - jqueryReady(); - } - }); - -}; diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js deleted file mode 100644 index c1c1269..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/ssosessions.js +++ /dev/null @@ -1,181 +0,0 @@ -var ssoSessions = (function () { - var urls = { - destroy: { - all: '/cas/statistics/ssosessions/destroySsoSessions', - single: '/cas/statistics/ssosessions/destroySsoSession' - }, - getSessions: '/cas/statistics/ssosessions/getSsoSessions' - }; - - var createDataTable = function() { - $('#ssoSessions').DataTable( { - "order": [[ 3, "desc" ]], - "initComplete": function(settings, json) { - - if (!json || json.activeSsoSessions.length == 0) { - $('#loadingMessage').hide(); - $('#no-cas-sessions').show(); - } else { - updateAdminPanels( json ); - - $('#loadingMessage').hide(); - $("#no-cas-sessions").hide(); - $("#cas-sessions").show(); - } - }, - "language": { - //"infoEmpty": "No active sessions were found", - "emptyTable": "No sessions found", - "zeroRecords": "No matching sessions found" - }, - "processing": true, - "ajax": { - "url": '/cas/statistics/ssosessions/getSsoSessions', - "dataSrc": "activeSsoSessions" - }, - - columnDefs: [ - { - "targets": 0, - "className": 'details-control', - "orderable": false, - "data": null, - "defaultContent": '' - }, - { - "targets": 1, - "data": 'is_proxied', - 'className': 'col-xs-2 col-md-1', - "render" : function ( data, type, full, meta ) { - if ( data === true) { - return 'Proxy'; - } else { - return ' '; - } - } - }, - { - "targets": 2, - "data": 'authenticated_principal', - "className": 'col-xs-4 col-md-2', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 18 )+'...' : - data; - } - }, - { - "targets": 3, - "data": 'ticket_granting_ticket', - "className": 'hidden-xs hidden-sm col-md-4', - "render": function ( data, type, full, meta ) { - return type === 'display' && data.length > 20 ? - ''+data.substr( 0, 40 )+'...' : - data; - } - }, - { - "targets": 4, - "data": 'authentication_date_formatted', - "className": 'col-xs-4 col-sm-4 col-md-2' - }, - { - "targets": 5, - "data": 'number_of_uses', - "className": 'hidden-xs hidden-sm visible-md-* col-md-2' - }, - { - "targets": 6, - "data": "ticket_granting_ticket", - "className": 'col-xs-2 col-sm-2 col-md-1', - "render": function (data, type, full, meta ) { - return ''; - }, - "orderable": false - }, - ] - } ); - }; - - var addEventHandlers = function() { - - /** - * The Bulk remove button - */ - $('#removeAllSessionsButton').on('click', function(e) { - e.preventDefault(); - removeSession(this.value); - }); - - /** - * Individual removal button - */ - $(document).on('click', '#ssoSessions tbody tr td:last-child button.btn-danger', function (e) { - e.preventDefault(); - removeSession( this.value ); - }); - - /** - * The filter buttons - */ - $('#filterButtons .btn').click(function() { - - var filter = $(this).data('filter'); - var table = $('#ssoSessions').DataTable(); - - // Create Filter RegEx: - if ( filter == 'proxied') { - var filterRegex = '^Proxy$'; - var deleteValue = 'PROXIED'; - var btnText = 'Remove xx Proxied Sessions'; - } else if ( filter == 'non-proxied') { - var filterRegex = '^ $'; - var deleteValue = 'DIRECT'; - var btnText = 'Remove xx Non-Proxied Sessions'; - } else { - var filterRegex = ''; - var deleteValue = 'ALL'; - var btnText = 'Remove All Sessions'; - } - - var searchTerm = table.column( 1 ).search(filterRegex, true, false).draw(); - - $('#removeAllSessionsButton').val( deleteValue ).html(btnText.replace('xx', searchTerm.page.info().recordsDisplay )) - }); - - - // Add event listener for opening and closing details - $(document).on('click', '#ssoSessions tbody td.details-control', function () { - var table = $('#ssoSessions').DataTable(); - var tr = $(this).closest('tr'); - var row = table.row( tr ); - - if ( row.child.isShown() ) { - // This row is already open - close it - row.child.hide(); - tr.removeClass('shown'); - } - else { - // Open this row - row.child( format(row.data()), 'info' ).show(); - tr.addClass('shown'); - } - } ); - - - - }; - - // initialization ******* - ( function init () { - addEventHandlers(); - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js deleted file mode 100644 index ac2513a..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/statisticsview.js +++ /dev/null @@ -1,138 +0,0 @@ -var Gauge = function (wrapper, percent, options) { - if (!wrapper || !percent) { - //console.error('wrapper and percentage are required. Please check your code.'); - return; - } - - var label = (!options.label) ? '' : options.label; - - var textClass = options.textClass || 'progress-meter'; - - var width = options.width || 200, - height = options.height || 200, - twoPi = 2 * Math.PI, - progress = 0, - total = 100, - formatPercent = d3.format(".0%"); - - var colorScale = d3.scale.linear() - .domain([0, 0.40, 0.50, 1]) - .range(["green", "green", "goldenrod", "red"]); - - var arc = d3.svg.arc() - .startAngle(0) - .innerRadius(width * 0.4) - .outerRadius(width * 0.5) - ; - - var svg = d3.select(wrapper).append("svg") - .attr("width", width) - .attr("height", height) - - .attr('fill', '#2E7AF9') - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); - - var meter = svg.append("g") - .attr("class", textClass); - - meter.append("path") - .attr("class", "background") - .attr("d", arc.endAngle(twoPi)); - - var foreground = meter.append("path") - .attr("class", "foreground"); - - var text = meter.append("text") - .attr("text-anchor", "middle"); - - var text2 = meter.append("text") - .attr('y', height * 0.15) - .attr("text-anchor", "middle") - .attr("class", "text2"); - - text2.text(label); - - var animate = function (percentage) { - var i = d3.interpolate(progress, percentage); - - foreground.transition().duration(2000) - .tween("progress", function () { - - return function (t) { - progress = i(t); - - foreground.style('fill', colorScale(progress)); - foreground.attr("d", arc.endAngle(twoPi * progress)); - text.text(formatPercent(progress)); - }; - }); - }; - - // init - (function () { - setTimeout(function () { - animate(percent); - }, 500); - })(); - - return { - update: function (newPercent) { - animate(newPercent); - } - }; -}; - - -function upTime(countTo, el) { - var wrapper = document.getElementById('uptime-panel'); - var element = document.getElementById(el); - var now = new Date(); - countTo = new Date(countTo); - var difference = (now - countTo); - - var days = Math.floor(difference / (60 * 60 * 1000 * 24) * 1); - var hours = Math.floor((difference % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1); - var mins = Math.floor(((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1); - var secs = Math.floor((((difference % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1); - - clearTimeout(upTime.to); - - if (isNaN(days) || isNaN(hours) || isNaN(mins) || isNaN(secs) ) { - wrapper.style.display = 'none'; - } else { - days = (days == 1) ? days + ' day ' : days + ' days '; - hours = (hours == 1) ? hours + ' hour ' : hours + ' hours '; - mins = (mins == 1) ? mins + ' minute ' : mins + ' minutes '; - secs = (secs == 1) ? secs + ' second ' : secs + ' seconds'; - - var timeString = '' + days + hours + mins + secs + ''; - element.innerHTML = timeString; - wrapper.style.display = 'block'; - - upTime.to = setTimeout(function() { - upTime(countTo, el); - },1000); - - } -} - - -// Fill modal with content from link href -$("#threadDumpModal").on("show.bs.modal", function (e) { - var link = $(e.relatedTarget); - $(this).find(".modal-body pre").load(link.val()); -}); - -/** - * Thread Dump Preview - * Returnes the xx amount of characters from the end of the thread dump for preview sake. - * The length can be changed by passing ini a value, otherwise it defaults to 400. - */ -function getThreadDumpPreview(len) { - var len = len || 400; - $.get($('#threadDumpViewButton').val(), function (data) { - $('#threadDumpPreview').html(data.substr(-len)); - }); -} - diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json deleted file mode 100644 index 016225c..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/test_data.json +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "activeSsoSessions": [ - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736452186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser2", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441737515763, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736463186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser4", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - }, - { - "authentication_date": 1441736515663, - "authentication_attributes": { - "authenticationMethod": "HttpBasedServiceCredentialsAuthenticationHandler" - }, - "authenticated_principal": "https://mmoayyed.unicon.net/sample1/proxyUrl", - "number_of_uses": 0, - "ticket_granting_ticket": "PGT-2-IKlUwrZMxpkOFYifIGbcv6CYDnETaEeMdmZfRYjHdpfsndK3XI-cas01.example.org", - "principal_attributes": { - }, - "is_proxied": true, - "proxied_by": "https://mmoayyed.unicon.net/sample1/", - "authenticated_services": { - } - }, - { - "authentication_date": 1441736462186, - "authentication_attributes": { - "authenticationMethod": "AcceptUsersAuthenticationHandler" - }, - "authenticated_principal": "casuser3", - "number_of_uses": 3, - "ticket_granting_ticket": "TGT-1-T5hpkh06BOW2tSY1cwGIMblwru6DjdndCtwpBI6oeUqnGzZepu-cas01.example.org", - "principal_attributes": { - "uid": "uid", - "eduPersonAffiliation": "eduPersonAffiliation", - "memberOf": [ - "faculty", - "staff", - "org" - ], - "groupMembership": "groupMembership" - }, - "is_proxied": false, - "authenticated_services": { - "ST-3-uuFc7ddf4vEdBOIIOpN4-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-1-7ZPfcD9LluG3eBZmWStj-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - }, - "ST-2-ZDheUfp2GsxrVnevhReK-cas01.example.org": { - "id": "https://mmoayyed.unicon.net/sample1/", - "originalUrl": "https://mmoayyed.unicon.net/sample1/", - "artifactId": null, - "loggedOutAlready": false, - "attributes": { - } - } - } - } - ] -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js deleted file mode 100644 index 3c536fc..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/js/viewConfig.js +++ /dev/null @@ -1,59 +0,0 @@ -var viewConfigs = (function () { - var createDataTable = function() { - $('#viewConfigsTable').DataTable( { - "initComplete": function(settings, json) { - if (!json || json.length == 0) { - $('#loadingMessage').hide(); - $('#viewConfigError').show(); - $("#view-configuration").hide(); - } else { - $('#loadingMessage').hide(); - $('#viewConfigError').hide(); - $("#view-configuration").show(); - } - }, - "drawCallback": function( settings ) { - var api = this.api(); - if (api.page.info().pages > 1) { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "block"; - } else { - $('#' + $.fn.dataTable.tables()[0].id + '_paginate')[0].style.display = "none"; - } - }, - "processing": true, - "ajax": { - "url": '/cas/status/config/getProperties', - "dataSrc": function (json) { - var return_data = new Array(); - for(var i=0;i< json.length; i++){ - var obj = json[i]; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - return_data.push({ - 'key': key, - 'value' : obj[key], - }) - } - } - } - return return_data; - } - }, - "columns": [ - { "data": "key", 'className': 'col-xs-6' }, - { "data": "value", 'className': 'col-xs-6' } - ], - } ); - }; - // initialization ******* - ( function init () { - createDataTable(); - })(); - - // Public Methods - return { - /** - * Not used - */ - }; -})(); diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css deleted file mode 100644 index 844c94b..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/css/cas.css +++ /dev/null @@ -1,198 +0,0 @@ -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -body { line-height: 1; } -nav ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } -a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; } -ins { background-color: #ff9; color: #000; text-decoration: none; } -mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; } -del { text-decoration: line-through; } -abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } -table { border-collapse: collapse; border-spacing: 0; } -hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; } -input, select { vertical-align: middle; } -body { font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.4em; background: #eee; } - -#container { width: 960px; margin: 0 auto; } - -@media only screen and (max-width: 960px) { - #container { width: 100%; } - #content { -webkit-border-bottom-right-radius: 0px; -webkit-border-bottom-left-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } -} - -body { - background: url(../images/bg-tile.gif); /* Old browsers */ -} - -a:link, a:visited { - color: #257bb2; -} - -a:hover { - color: #a0b757; -} - -p { - margin-bottom: 1.4em; -} - -header { - overflow: hidden; - padding: 40px 0; -} - -#logo { - display: block; - width: 250px; - height: 52px; - background: url(../images/apereo-logo.png) no-repeat; - text-indent: -999em; - float: left; - - margin-right: 40px; - border-right: 1px solid rgba(255,255,255,0.25); -} - -header h1 { - display: none; -} - -#content { - overflow: hidden; - background: #fff; - padding: 20px; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); - box-shadow: 0 0 8px 0 rgba(0,0,0,0.15); -} - -#msg { - padding: 20px; - margin-bottom: 40px; -} - -#msg.errors { - border: 1px dotted #BB0000; - color: #BB0000; - padding-left: 100px; - background: url(../../../images/error.png) no-repeat 20px center; -} - -#msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/success.png) no-repeat 20px center; } -#msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../../../images/info.png) no-repeat 20px center; } -#msg.question { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../../../images/question.png) no-repeat 20px center; } -#msg.warn { border: 1px dotted #960; color: #960; padding-left: 100px; background: #ffbc8f url(../../../images/info.png) no-repeat 20px center; } - -#login { - width: 320px; - float: left; - margin-right: 20px; -} - -#login h2 { - font-weight: normal; - font-size: 1.4em; - margin-bottom: 20px; -} - -#login .row { - padding: 10px 0; -} - -#login label { - display: block; - margin-bottom: 2px; -} - -#login .check label { - display: inline; -} - -#login input[type=text], #login input[type=password] { - font-size: 1.4em; - padding: 5px; -} - -#login .btn-submit { - background: #2aa4a5; - border: 0; - padding: 10px 20px; - font-weight: bold; - color: white; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-reset { - background: #eee; - padding: 10px 20px; - border: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -#login .btn-submit:hover, #login .btn-reset:hover { - cursor: pointer; -} - -#login .btn-submit:hover { - background: #30bfbf; -} - -#login .btn-reset:hover { - background: #d4d4d4; -} - -#sidebar { - width: auto; - height: 100%; -} - -#sidebar-content { - padding-left: 20px; -} - -#list-languages h3 { - margin-bottom: 1.4em; -} - -#list-languages ul li { - list-style: none; - display: inline-block; - margin-right: 2em; -} - -footer { - padding: 20px; - color: black; -} - -footer a:link, footer a:visited { - color: black; -} - -@media only screen and (max-width: 960px) { - header { padding: 20px; } - #container { width: 100%; } - #content { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - } -} - -@media only screen and (max-width: 799px) { - header { padding: 10px;} - #logo { width: 156px; height: 32px; background-size: 156px 32px; margin-right: 20px; } - #login { float: none; width: 100%; } - #fm1 .row input[type=text], - #fm1 .row input[type=password] { width: 100%; padding: 10px; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } - #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #2aa4a5; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } - #fm1 .row .btn-reset { display: none; } - #sidebar { margin-top: 20px; } - #sidebar .sidebar-content { padding: 0; } -} \ No newline at end of file diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/apereo-logo.png deleted file mode 100644 index b40f22c92b091b890ca25c2a469588c4b2390c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28964 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 I(lqq{0A?tLf&c&j diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/images/bg-tile.gif deleted file mode 100644 index 41332ee48533cfbd9408b7f4c385e0f750eeea4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26910 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 diff --git a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js b/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js deleted file mode 100644 index 7e22762..0000000 --- a/code/jeeplatform-sso/overlays/org.jasig.cas.cas-server-webapp-4.2.7/themes/apereo/js/cas.js +++ /dev/null @@ -1,20 +0,0 @@ -$(document).ready(function(){ - //focus username field - if ($(":focus").length === 0){ - $("input:visible:enabled:first").focus(); - } - - //flash error box - $('#msg.errors').animate({ backgroundColor: 'rgb(187,0,0)' }, 30).animate({ backgroundColor: 'rgb(255,238,221)' }, 500); - - //flash success box - $('#msg.success').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - //flash confirm box - $('#msg.question').animate({ backgroundColor: 'rgb(51,204,0)' }, 30).animate({ backgroundColor: 'rgb(221,255,170)' }, 500); - - /* - * Using the JavaScript Debug library, you may issue log messages such as: - * debug.log("Welcome to Central Authentication Service"); - */ -}); diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso/pom.xml index 6815073..2ffce4b 100644 --- a/code/jeeplatform-sso/pom.xml +++ b/code/jeeplatform-sso/pom.xml @@ -15,165 +15,52 @@ UTF-8 - 5.2.6 - 2.3.2 - 2.0.0-RC1 - 2.8.2 - 3.3.6 - 1.1.1-RELEASE - 5.1.46 + UTF-8 + 1.8 - 1.5.7.RELEASE - + 5.2.3 -tomcat org.springframework.boot.loader.WarLauncher false - ${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF + + ${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF + 1.8 1.8 - UTF-8 + 1.5.7.RELEASE - - - org.apereo.cas - cas-server-webapp - ${cas.version} - war - runtime - - - org.apereo.cas - cas-server-core - ${cas.version} - - - - - - org.apereo.cas - cas-server-support-rest-services - ${cas.version} - - - - org.apereo.cas - cas-server-support-jdbc - ${cas.version} - - - - org.apereo.cas - cas-server-support-jdbc-drivers - ${cas.version} - - - - - - - mysql - mysql-connector-java - ${mysql.driver.version} - - - - - - - - - - - - - - - org.apache.commons - commons-collections4 - 4.0 - - - - commons-logging - commons-logging - 1.2 - - - + + + sonatype-releases + http://oss.sonatype.org/content/repositories/releases/ + + false + + + true + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + true + + + false + + + + shibboleth-releases + https://build.shibboleth.net/nexus/content/repositories/releases + + - - com.rimerosolutions.maven.plugins - wrapper-maven-plugin - 0.0.4 - - - - org.springframework.boot spring-boot-maven-plugin @@ -208,6 +95,11 @@ org.apereo.cas cas-server-webapp${app.server} + ${cas.version} + @@ -221,110 +113,33 @@ cas + + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + war + runtime + + + + mysql + mysql-connector-java + 5.1.44 + + + + + org.apereo.cas + cas-server-support-rest + ${cas.version} + - - - - true - - default - - - org.apereo.cas - cas-server-webapp${app.server} - ${cas.version} - war - runtime - - - - - - - false - - exec - - org.apereo.cas.web.CasWebApplication - true - - - - - - com.soebes.maven.plugins - echo-maven-plugin - 0.3.0 - - - prepare-package - - echo - - - - - - Executable profile to make the generated CAS web application executable. - - - - - - + + - - - false - - bootiful - - -tomcat - false - - - - org.apereo.cas - cas-server-webapp${app.server} - ${cas.version} - war - runtime - - - - - - false - - pgp - - - - com.github.s4u.plugins - pgpverify-maven-plugin - 1.1.0 - - - - check - - - - - hkp://pool.sks-keyservers.net - ${settings.localRepository}/pgpkeys-cache - test - true - false - - - - - - diff --git a/code/jeeplatform-sso/src/main/resources/application.properties b/code/jeeplatform-sso/src/main/resources/application.properties index 91b56d0..1ee9406 100644 --- a/code/jeeplatform-sso/src/main/resources/application.properties +++ b/code/jeeplatform-sso/src/main/resources/application.properties @@ -2,11 +2,12 @@ # CAS Server Context Configuration # server.context-path=/cas -server.port=8443 +server.port=8445 -server.ssl.key-store=file:/etc/cas/thekeystore -server.ssl.key-store-password=changeit -server.ssl.key-password=changeit +#server.ssl.key-store=file:/etc/cas/thekeystore +#server.ssl.key-store=classpath:casServer.keystore +#server.ssl.key-store-password=test123 +#server.ssl.key-password=test123 # server.ssl.ciphers= # server.ssl.client-auth= # server.ssl.enabled= @@ -98,17 +99,22 @@ spring.aop.proxy-target-class=true # cas.authn.accept.users=casuser::Mellon -cas.tgc.secure=false +#开启识别json文件,默认false cas.serviceRegistry.initFromJson=true +#自动扫描服务配置,默认开启 +cas.serviceRegistry.watcherEnabled=true +#120秒扫描一遍 +cas.serviceRegistry.repeatInterval=120000 +#延迟15秒开启 +#cas.serviceRegistry.startDelay=15000 +#资源加载路径 +cas.serviceRegistry.config.location=classpath:/services + +# 开启rest验证并配置url +#cas.authn.rest.uri=https://passport.sso.com:9898/cas/v1 +# ticket过期设置 +cas.ticket.st.numberOfUses=1 +cas.ticket.st.timeToKillInSeconds=60 -## -# CAS Internationalization -# -locale.default=zh_CN -locale.param.name=locale -message.bundle.encoding=UTF-8 -message.bundle.cacheseconds=180 -message.bundle.fallback.systemlocale=false -message.bundle.usecode.message=true -# message.bundle.basenames=classpath:custom_messages,classpath:messages -message.bundle.basenames=WEB-INF/locale/messages \ No newline at end of file +cas.tgc.secure=false +cas.warningCookie.secure=false diff --git a/code/jeeplatform-sso/src/main/resources/casServer.crt b/code/jeeplatform-sso/src/main/resources/casServer.crt new file mode 100644 index 0000000000000000000000000000000000000000..c58e92d9553d3f2e5874a5582437387746ede657 GIT binary patch literal 857 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 n^Dai4>d}0t - - - - /etc/cas/logs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json new file mode 100644 index 0000000..02ad211 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://www\\.casclient1\\.com.*", + "name": "本地服务", + "id": 10000004, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json new file mode 100644 index 0000000..ec6c0ed --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://www\\.casclient2\\.com.*", + "name": "本地服务", + "id": 10000005, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json new file mode 100644 index 0000000..d4cfd24 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json @@ -0,0 +1,8 @@ +{ + "@class": "org.apereo.cas.services.RegexRegisteredService", + "serviceId": "^http://127\\.0\\.0\\.1.*", + "name": "本地服务", + "id": 10000003, + "description": "这是一个本地允许的服务,通过localhost访问都允许通过", + "evaluationOrder": 1 +} \ No newline at end of file diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..5529b65 --- /dev/null +++ b/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,10 @@ + + + Archetype Created Web Application + + + \ No newline at end of file From 4379a611c67aeb2bd342e532873296a42671ea9a Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 18 Apr 2020 13:03:25 +0800 Subject: [PATCH 056/123] =?UTF-8?q?CAS=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E4=BF=AE=E6=94=B9=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 0 ...g.apereo.cas.cas-server-webapp-tomcat-5.2.3.info | 2 +- .../pom.xml | 6 +++--- .../CostomUsernamePasswordAuthentication.java | 0 .../src/main/resources/application.properties | 7 ++++--- .../src/main/resources/casServer.crt | Bin .../src/main/resources/casServer.keystore | Bin .../main/webapp/WEB-INF/locale/messages.properties | 0 .../webapp/WEB-INF/locale/messages_ar.properties | 0 .../webapp/WEB-INF/locale/messages_ca.properties | 0 .../webapp/WEB-INF/locale/messages_cs.properties | 0 .../webapp/WEB-INF/locale/messages_de.properties | 0 .../webapp/WEB-INF/locale/messages_es.properties | 0 .../webapp/WEB-INF/locale/messages_fa.properties | 0 .../webapp/WEB-INF/locale/messages_fr.properties | 0 .../webapp/WEB-INF/locale/messages_hr.properties | 0 .../webapp/WEB-INF/locale/messages_it.properties | 0 .../webapp/WEB-INF/locale/messages_ja.properties | 0 .../webapp/WEB-INF/locale/messages_mk.properties | 0 .../webapp/WEB-INF/locale/messages_nl.properties | 0 .../webapp/WEB-INF/locale/messages_pl.properties | 0 .../webapp/WEB-INF/locale/messages_pt_BR.properties | 0 .../webapp/WEB-INF/locale/messages_pt_PT.properties | 0 .../webapp/WEB-INF/locale/messages_ru.properties | 0 .../webapp/WEB-INF/locale/messages_sk.properties | 0 .../webapp/WEB-INF/locale/messages_sl.properties | 0 .../webapp/WEB-INF/locale/messages_sv.properties | 0 .../webapp/WEB-INF/locale/messages_tr.properties | 0 .../webapp/WEB-INF/locale/messages_uk.properties | 0 .../webapp/WEB-INF/locale/messages_ur.properties | 0 .../webapp/WEB-INF/locale/messages_zh_CN.properties | 0 .../webapp/WEB-INF/locale/messages_zh_TW.properties | 0 .../webapp/WEB-INF/services/Apereo-10000002.json | 0 .../webapp/WEB-INF/services/Client1-10000004.json | 0 .../webapp/WEB-INF/services/Client1-10000005.json | 0 .../WEB-INF/services/HTTPSandIMAPS-10000001.json | 0 .../webapp/WEB-INF/services/Localhost-10000003.json | 0 .../src/main/webapp/WEB-INF/web.xml | 0 .../src/main/webapp/favicon.ico | Bin code/pom.xml | 2 +- 40 files changed, 9 insertions(+), 8 deletions(-) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/README.md (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info (72%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/pom.xml (97%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/resources/application.properties (97%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/resources/casServer.crt (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/resources/casServer.keystore (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_ar.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_ca.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_cs.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_de.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_es.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_fa.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_fr.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_hr.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_it.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_ja.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_mk.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_nl.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_pl.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_ru.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_sk.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_sl.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_sv.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_tr.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_uk.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_ur.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/services/Apereo-10000002.json (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/services/Client1-10000004.json (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/services/Client1-10000005.json (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/services/Localhost-10000003.json (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/WEB-INF/web.xml (100%) rename code/{jeeplatform-sso => jeeplatform-sso-cas}/src/main/webapp/favicon.ico (100%) diff --git a/code/jeeplatform-sso/README.md b/code/jeeplatform-sso-cas/README.md similarity index 100% rename from code/jeeplatform-sso/README.md rename to code/jeeplatform-sso-cas/README.md diff --git a/code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info similarity index 72% rename from code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info rename to code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info index b508d59..d9c73b1 100644 --- a/code/jeeplatform-sso/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info @@ -1,3 +1,3 @@ -1587018336457 +1587185901364 (?:[^/]+/)*?[^/]*? META-INF(?:$|/.+) \ No newline at end of file diff --git a/code/jeeplatform-sso/pom.xml b/code/jeeplatform-sso-cas/pom.xml similarity index 97% rename from code/jeeplatform-sso/pom.xml rename to code/jeeplatform-sso-cas/pom.xml index 2ffce4b..088dfff 100644 --- a/code/jeeplatform-sso/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -7,9 +7,9 @@ 1.0-SNAPSHOT - jeeplatform-sso - jeeplatform-sso - ${jeeplatform-sso.version} + jeeplatform-sso-cas + jeeplatform-sso-cas + ${jeeplatform-sso-cas.version} war diff --git a/code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java similarity index 100% rename from code/jeeplatform-sso/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java diff --git a/code/jeeplatform-sso/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties similarity index 97% rename from code/jeeplatform-sso/src/main/resources/application.properties rename to code/jeeplatform-sso-cas/src/main/resources/application.properties index 1ee9406..3f3358c 100644 --- a/code/jeeplatform-sso/src/main/resources/application.properties +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -2,7 +2,7 @@ # CAS Server Context Configuration # server.context-path=/cas -server.port=8445 +server.port=8081 #server.ssl.key-store=file:/etc/cas/thekeystore #server.ssl.key-store=classpath:casServer.keystore @@ -53,8 +53,9 @@ spring.cloud.bus.enabled=false # spring.cloud.bus.destination=CasCloudBus # spring.cloud.bus.ack.enabled=true -endpoints.enabled=false -endpoints.sensitive=true +# 修改设置权限 +endpoints.enabled=true +endpoints.sensitive=false endpoints.restart.enabled=false endpoints.shutdown.enabled=false diff --git a/code/jeeplatform-sso/src/main/resources/casServer.crt b/code/jeeplatform-sso-cas/src/main/resources/casServer.crt similarity index 100% rename from code/jeeplatform-sso/src/main/resources/casServer.crt rename to code/jeeplatform-sso-cas/src/main/resources/casServer.crt diff --git a/code/jeeplatform-sso/src/main/resources/casServer.keystore b/code/jeeplatform-sso-cas/src/main/resources/casServer.keystore similarity index 100% rename from code/jeeplatform-sso/src/main/resources/casServer.keystore rename to code/jeeplatform-sso-cas/src/main/resources/casServer.keystore diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ar.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ar.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ar.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ar.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ca.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ca.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ca.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ca.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_cs.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_cs.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_cs.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_cs.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_de.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_de.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_de.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_de.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_es.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_es.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_es.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_es.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fa.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fa.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fa.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fa.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_fr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_fr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_hr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_hr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_hr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_hr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_it.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_it.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_it.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_it.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ja.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ja.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ja.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ja.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_mk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_mk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_mk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_mk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_nl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_nl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_nl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_nl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_BR.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_pt_PT.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ru.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ru.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ru.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ru.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sl.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sl.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sl.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sl.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sv.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sv.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_sv.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_sv.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_tr.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_tr.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_tr.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_tr.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_uk.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_uk.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_uk.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_uk.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ur.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ur.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_ur.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_ur.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_CN.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/locale/messages_zh_TW.properties diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Apereo-10000002.json similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Apereo-10000002.json rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Apereo-10000002.json diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000004.json similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000004.json rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000004.json diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000005.json similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Client1-10000005.json rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000005.json diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Localhost-10000003.json similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/services/Localhost-10000003.json rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Localhost-10000003.json diff --git a/code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml b/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/WEB-INF/web.xml rename to code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/web.xml diff --git a/code/jeeplatform-sso/src/main/webapp/favicon.ico b/code/jeeplatform-sso-cas/src/main/webapp/favicon.ico similarity index 100% rename from code/jeeplatform-sso/src/main/webapp/favicon.ico rename to code/jeeplatform-sso-cas/src/main/webapp/favicon.ico diff --git a/code/pom.xml b/code/pom.xml index 95dae25..4f88b26 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -130,7 +130,7 @@ jeeplatform-provider-api jeeplatform-admin jeeplatform-common - jeeplatform-sso + jeeplatform-sso-cas jeeplatform-provider jeeplatform-oa From 01237751e3261a0c14200532d97a1a7d4f45bb46 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sun, 19 Apr 2020 14:26:28 +0800 Subject: [PATCH 057/123] =?UTF-8?q?sso=E5=B7=A5=E7=A8=8Bmaven=E6=89=93?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-sso-cas/pom.xml | 82 +++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index 088dfff..eccbd7f 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -18,7 +18,7 @@ UTF-8 1.8 - 5.2.3 + 5.2.6 -tomcat org.springframework.boot.loader.WarLauncher @@ -32,32 +32,30 @@ 1.5.7.RELEASE + - sonatype-releases - http://oss.sonatype.org/content/repositories/releases/ - - false - + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ true - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - true - + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ - false + true - - - shibboleth-releases - https://build.shibboleth.net/nexus/content/repositories/releases - - + + false + + + @@ -95,8 +93,8 @@ org.apereo.cas cas-server-webapp${app.server} - ${cas.version} - + @@ -135,11 +133,49 @@ cas-server-support-rest ${cas.version} - - + + org.apereo.cas + cas-server-core-authentication + ${cas.version} + + + org.apereo.cas + cas-server-core-configuration + ${cas.version} + + + org.apereo.cas + cas-server-core-webflow + ${cas.version} + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + + + true + + default + + + org.apereo.cas + cas-server-webapp${app.server} + ${cas.version} + war + runtime + + + + + From fd07a220b11cc772f19b3b30ae693fc251aca16a Mon Sep 17 00:00:00 2001 From: "nicky.ma" Date: Thu, 23 Apr 2020 16:42:01 +0800 Subject: [PATCH 058/123] =?UTF-8?q?fix=20#SSO=E5=B7=A5=E7=A8=8Bjar?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 73 +++++++++++++++ code/jeeplatform-common/pom.xml | 8 ++ code/jeeplatform-provider-api/pom.xml | 37 ++++++++ .../jeeplatform/core/web/demoController.java | 13 ++- ...eo.cas.cas-server-webapp-tomcat-5.2.6.info | 3 + code/jeeplatform-sso-cas/pom.xml | 29 +----- .../src/main/resources/application.properties | 22 ++--- code/pom.xml | 91 ------------------- 8 files changed, 141 insertions(+), 135 deletions(-) create mode 100644 code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 05da808..197f6ad 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -34,6 +34,79 @@ ${jeeplatform-provider-api.version} + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + com.alibaba + druid + ${druid.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + + + mysql + mysql-connector-java + ${mysql-connector.version} + + + + + + + + com.alibaba + fastjson + ${fastjson.version} + + io.springfox diff --git a/code/jeeplatform-common/pom.xml b/code/jeeplatform-common/pom.xml index f3df0fe..8e21368 100644 --- a/code/jeeplatform-common/pom.xml +++ b/code/jeeplatform-common/pom.xml @@ -16,4 +16,12 @@ jeeplatform-common + + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + diff --git a/code/jeeplatform-provider-api/pom.xml b/code/jeeplatform-provider-api/pom.xml index 18505a6..e1f3e1b 100644 --- a/code/jeeplatform-provider-api/pom.xml +++ b/code/jeeplatform-provider-api/pom.xml @@ -32,6 +32,43 @@ + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot.version} + + + + tk.mybatis + mapper + ${tk.mybatis.mapper.version} + + + javax.persistence + persistence-api + + + + + com.github.pagehelper + pagehelper + ${github.pagehelper.version} + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java index 736f563..74678d4 100644 --- a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/web/demoController.java @@ -1,7 +1,6 @@ package org.muses.jeeplatform.core.web; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; + /** * @author caiyuyu @@ -9,9 +8,9 @@ */ //@RestController public class demoController { - @RequestMapping("/") - public ModelAndView login(){ - ModelAndView mv = new ModelAndView("base"); - return mv; - } +// @RequestMapping("/") +// public ModelAndView login(){ +// ModelAndView mv = new ModelAndView("base"); +// return mv; +// } } diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info new file mode 100644 index 0000000..ab75a76 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info @@ -0,0 +1,3 @@ +1586750915519 +(?:[^/]+/)*?[^/]*? +META-INF(?:$|/.+) \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index eccbd7f..ad05751 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -127,33 +127,10 @@ 5.1.44 - - org.apereo.cas - cas-server-support-rest - ${cas.version} - - - org.apereo.cas - cas-server-core-authentication - ${cas.version} - - - org.apereo.cas - cas-server-core-configuration - ${cas.version} - - - org.apereo.cas - cas-server-core-webflow - ${cas.version} - - - - javax.servlet - javax.servlet-api - 4.0.1 - + io.codis.jodis + jodis + 0.5.0 diff --git a/code/jeeplatform-sso-cas/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties index 3f3358c..dd4a73f 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/application.properties +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -2,7 +2,7 @@ # CAS Server Context Configuration # server.context-path=/cas -server.port=8081 +server.port=8443 #server.ssl.key-store=file:/etc/cas/thekeystore #server.ssl.key-store=classpath:casServer.keystore @@ -54,8 +54,8 @@ spring.cloud.bus.enabled=false # spring.cloud.bus.ack.enabled=true # 修改设置权限 -endpoints.enabled=true -endpoints.sensitive=false +endpoints.enabled=false +endpoints.sensitive=true endpoints.restart.enabled=false endpoints.shutdown.enabled=false @@ -101,21 +101,21 @@ spring.aop.proxy-target-class=true cas.authn.accept.users=casuser::Mellon #开启识别json文件,默认false -cas.serviceRegistry.initFromJson=true +#cas.serviceRegistry.initFromJson=true #自动扫描服务配置,默认开启 -cas.serviceRegistry.watcherEnabled=true +#cas.serviceRegistry.watcherEnabled=true #120秒扫描一遍 -cas.serviceRegistry.repeatInterval=120000 +#cas.serviceRegistry.repeatInterval=120000 #延迟15秒开启 #cas.serviceRegistry.startDelay=15000 #资源加载路径 -cas.serviceRegistry.config.location=classpath:/services +#cas.serviceRegistry.config.location=classpath:/services # 开启rest验证并配置url #cas.authn.rest.uri=https://passport.sso.com:9898/cas/v1 # ticket过期设置 -cas.ticket.st.numberOfUses=1 -cas.ticket.st.timeToKillInSeconds=60 +#cas.ticket.st.numberOfUses=1 +#cas.ticket.st.timeToKillInSeconds=60 -cas.tgc.secure=false -cas.warningCookie.secure=false +#cas.tgc.secure=false +#cas.warningCookie.secure=false diff --git a/code/pom.xml b/code/pom.xml index 4f88b26..d260363 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -136,99 +136,8 @@ - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring-boot.version} - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot.version} - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - org.springframework.boot - spring-boot-devtools - true - - - - org.springframework.boot - spring-boot-starter-test - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - com.alibaba - druid - ${druid.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - - - - tk.mybatis - mapper - ${tk.mybatis.mapper.version} - - - javax.persistence - persistence-api - - - - - com.github.pagehelper - pagehelper - ${github.pagehelper.version} - - - - - mysql - mysql-connector-java - ${mysql-connector.version} - - - - - - - com.alibaba - fastjson - ${fastjson.version} - From 39c718c710e59d5229a6230d339059040735eb98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Thu, 23 Apr 2020 17:23:02 +0800 Subject: [PATCH 059/123] =?UTF-8?q?SSO=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=BB=95=E8=BF=87https?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eo.cas.cas-server-webapp-tomcat-5.2.6.info | 2 +- .../META-INF/MANIFEST.MF | 13 +++++++++++++ code/jeeplatform-sso-cas/pom.xml | 11 +++++++++-- .../src/main/resources/application.properties | 18 +++++++++--------- .../src/main/resources/casexample.keystore | Bin 0 -> 2630 bytes .../services/Apereo-10000002.json | 0 .../services/Client1-10000004.json | 0 .../services/Client1-10000005.json | 0 .../services/HTTPSandIMAPS-10000001.json | 0 .../services/Localhost-10000003.json | 0 10 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF create mode 100644 code/jeeplatform-sso-cas/src/main/resources/casexample.keystore rename code/jeeplatform-sso-cas/src/main/{webapp/WEB-INF => resources}/services/Apereo-10000002.json (100%) rename code/jeeplatform-sso-cas/src/main/{webapp/WEB-INF => resources}/services/Client1-10000004.json (100%) rename code/jeeplatform-sso-cas/src/main/{webapp/WEB-INF => resources}/services/Client1-10000005.json (100%) rename code/jeeplatform-sso-cas/src/main/{webapp/WEB-INF => resources}/services/HTTPSandIMAPS-10000001.json (100%) rename code/jeeplatform-sso-cas/src/main/{webapp/WEB-INF => resources}/services/Localhost-10000003.json (100%) diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info index ab75a76..ee00d81 100644 --- a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info @@ -1,3 +1,3 @@ 1586750915519 (?:[^/]+/)*?[^/]*? -META-INF(?:$|/.+) \ No newline at end of file +WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF new file mode 100644 index 0000000..6a78b56 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Implementation-Title: cas-server-webapp-tomcat +Implementation-Version: 5.2.6 +Start-Class: org.apereo.cas.web.CasWebApplication +Spring-Boot-Classes: WEB-INF/classes/ +Spring-Boot-Lib: WEB-INF/lib/ +Implementation-Date: 2018-07-05T14:53:01.852-07:00[America/Phoenix] +Spring-Boot-Version: 1.5.12.RELEASE +Created-By: org.apereo.cas +Specification-Version: f5118fffa39b90da780500631d1dffcc296bbc08 +Implementation-Vendor: org.apereo.cas +Main-Class: org.springframework.boot.loader.WarLauncher + diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index ad05751..455d29a 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -94,10 +94,10 @@ org.apereo.cas cas-server-webapp${app.server} - + @@ -109,6 +109,13 @@ cas + + + + src/main/resources + false + + diff --git a/code/jeeplatform-sso-cas/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties index dd4a73f..0c5baf8 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/application.properties +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -101,21 +101,21 @@ spring.aop.proxy-target-class=true cas.authn.accept.users=casuser::Mellon #开启识别json文件,默认false -#cas.serviceRegistry.initFromJson=true +cas.serviceRegistry.initFromJson=true #自动扫描服务配置,默认开启 -#cas.serviceRegistry.watcherEnabled=true +cas.serviceRegistry.watcherEnabled=true #120秒扫描一遍 -#cas.serviceRegistry.repeatInterval=120000 +cas.serviceRegistry.repeatInterval=120000 #延迟15秒开启 -#cas.serviceRegistry.startDelay=15000 +cas.serviceRegistry.startDelay=15000 #资源加载路径 -#cas.serviceRegistry.config.location=classpath:/services +cas.serviceRegistry.config.location=classpath:/services # 开启rest验证并配置url #cas.authn.rest.uri=https://passport.sso.com:9898/cas/v1 # ticket过期设置 -#cas.ticket.st.numberOfUses=1 -#cas.ticket.st.timeToKillInSeconds=60 +cas.ticket.st.numberOfUses=1 +cas.ticket.st.timeToKillInSeconds=60 -#cas.tgc.secure=false -#cas.warningCookie.secure=false +cas.tgc.secure=false +cas.warningCookie.secure=false diff --git a/code/jeeplatform-sso-cas/src/main/resources/casexample.keystore b/code/jeeplatform-sso-cas/src/main/resources/casexample.keystore new file mode 100644 index 0000000000000000000000000000000000000000..41619076d529b9eb54324dc8f67552223b3f27c4 GIT binary patch literal 2630 zcmY+EX*3iH8^>pu8I3GuOSa*Lri2-?6O~;k*_C}PF}X~(;k72qWC>*%l2q0#&2>YT z$-Xs>S$(jAElFK$fMEfp_tOYCliDw^yGuF1CgzEw&*3-Y#J$c`RkPvq3V zhP54T@V5?%EyOW7)}DR(%UcROecqzM89eIVfmI= zzG^H~#%~6f9sGi%tLpcpk!5_68^z`T68{A5NWbtPQaFa`dIC zC#jbn5lQZtYr0u1@5npNRdVGd_`XEsocz-KlZLjyC0QsTlq>qm-WB$6! zU_*XRgttIf)7N|bceG4D9pm!YlwMJg;Krsr(i%kV*Q_+9UTv``(pXI^R1bzaGE0qO zLxVm)`PFD^vz5$D!kUGt7kkN7$Pn_U?VqE6IHynGqBLc=81zgiCp?YV5s9lu2} zZ>3hRD)KHhTRZ@7iENnYt}q!t-~jWG0JVMTLja#JYXX799-!RE$xQr zR%)VS0L)(m3?oCq$e%+2{wK8(mx`%1f>WZJ*&_yyapo>s5dKY~)rPXW&{;2eXEYA3 zbfpq4nM#_{giYLhtEZD*zrG~0s@o2U5VzcywY_!9k2cO3GZVqHNZ}N&uj3XOM|JFg zM1qO47wrhjz5f%~ZLFe9!i{R(y#qjx?7<2Kt zw2%q%yG8D*N0WNaSd0TthC`G~L`B0NoY#k{<9EIW@}}7BiS{VA1xwQ7${TpE{q_b} z=<^19NcJL*lth_~%6FE>pKuM{UtKUF=kYRK#xCd=TXrKJU#hZXC*h6*IP~pul20nH zjq_%(!$fYAfJk-pn$lBBW%!pJeRapS{4hT&aUF%S1Ax_>!*e<{PQbPvVJFG4x2wYb>VPXCvqSMMY zSs`i2aApVpnGo0Ben*>7+jByJiBBh@rDR4;0(XlWp{RFA9~^>>L2 zawO8gBjm>c1RO1oe-hxo)C&2fR>ch`Va2w6eCE(;z2!kuIb`JE)GxKhC4k^jqe(2U zdg9&Xf>(v*n{-3{*wZ$mqjtKYAGrN{Q|Sf-RnzI_Mj8eCc!zK%_#&=I^y|=kHCK@) zFZ8)#$#j}6SCl`VFOmCgR_Jz45$m^{aD)3N9`;0vzfw6apScn7ge+!W2GuDhK{CpU z8y7g6)TY5E@+Sznx#lJZxOww@Tq7>fft{;lF0`~d$m3-`4F6f$Ai45ugqIa!szu==B z=rk<319wIaaF^D*)8?GvncNw(`FFxH*SWZ$&OD^%g9SzRV|=z1#e$OBh}5mc5s4~V zYZ%DY7{BcrhBlN6GpilfQW0@vl$M!i7_=T(o0Kw>L;ix4D4^oWo_qc0zuT%Q-kgp0 z;f(#Q3(#?XdtTPZX&aa9u#8$;huzQ_?Q$Yw^smgp{v4IqqrMODIsB57<4>zJ14;ll z2vGxDnXLoobpQEN)_YU<=J6-r3J*`D)mCZWgXeDvN5@{F2K}CCBacS| z`3^Gl0_Q*>8m-$cT~WL7EPAb!tS3{Bb%ATK@a}RI(@?Wl*G2LDMtbXt{geRPNsc&? zdO~3to0x9nM6S-f{Sn|%POW6zTGxq z@XX=()0mLYmh5Erot%PCoq5M%4{DGY=CajpY$-894jXwpJep)Aj8EP^hq2VPdn7z# z3ZHf)1K4E!Mzajy2|KC>PE9H5DjD?--$X~E+)ss?va&*OiA1wm@6{rh1r14;W>|rG zv&ZuB%F5P~sr~(uDh%jv!?_nb{SpqAC(#LQ;nK-$WML!|6wBO4i~hsR`&(_ zf{73Ns$ErOHfWa$5qbz21QY^R;N#>F0|P)py#Z!|-KwnhV&1uyLI7oeWinO;5>hTK Z8+&9|eUIJw?eNi5$F-i5_pE-Y=D+UX?ScRR literal 0 HcmV?d00001 diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Apereo-10000002.json b/code/jeeplatform-sso-cas/src/main/resources/services/Apereo-10000002.json similarity index 100% rename from code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Apereo-10000002.json rename to code/jeeplatform-sso-cas/src/main/resources/services/Apereo-10000002.json diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000004.json b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000004.json similarity index 100% rename from code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000004.json rename to code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000004.json diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000005.json b/code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000005.json similarity index 100% rename from code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Client1-10000005.json rename to code/jeeplatform-sso-cas/src/main/resources/services/Client1-10000005.json diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json b/code/jeeplatform-sso-cas/src/main/resources/services/HTTPSandIMAPS-10000001.json similarity index 100% rename from code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/HTTPSandIMAPS-10000001.json rename to code/jeeplatform-sso-cas/src/main/resources/services/HTTPSandIMAPS-10000001.json diff --git a/code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Localhost-10000003.json b/code/jeeplatform-sso-cas/src/main/resources/services/Localhost-10000003.json similarity index 100% rename from code/jeeplatform-sso-cas/src/main/webapp/WEB-INF/services/Localhost-10000003.json rename to code/jeeplatform-sso-cas/src/main/resources/services/Localhost-10000003.json From 4f232b8ad90dae048353a17a24028ac46783d0c8 Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Thu, 23 Apr 2020 22:16:13 +0800 Subject: [PATCH 060/123] =?UTF-8?q?OA=E5=B7=A5=E7=A8=8B=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-oa/pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/jeeplatform-oa/pom.xml b/code/jeeplatform-oa/pom.xml index 01e40ba..b2b5ede 100644 --- a/code/jeeplatform-oa/pom.xml +++ b/code/jeeplatform-oa/pom.xml @@ -12,5 +12,14 @@ jeeplatform-oa jar + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + \ No newline at end of file From 0008bfadda9e2e762316c5b3212710ec4043a83e Mon Sep 17 00:00:00 2001 From: "Nicky.Ma" <3623307211@qq.com> Date: Sat, 25 Apr 2020 20:57:08 +0800 Subject: [PATCH 061/123] =?UTF-8?q?CAS=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../etc/cas/config/application.yml | 2 + .../etc/cas/config/cas.properties | 7 ++ .../etc/cas/config/log4j2.xml | 117 ++++++++++++++++++ ...eo.cas.cas-server-webapp-tomcat-5.2.3.info | 3 - ...eo.cas.cas-server-webapp-tomcat-5.2.6.info | 2 +- code/jeeplatform-sso-cas/pom.xml | 81 +++++++++--- ...mUsernamePasswordAuthentication4.2.7.java} | 2 +- .../src/main/resources/application.properties | 109 ++++++++++------ 8 files changed, 264 insertions(+), 59 deletions(-) create mode 100644 code/jeeplatform-sso-cas/etc/cas/config/application.yml create mode 100644 code/jeeplatform-sso-cas/etc/cas/config/cas.properties create mode 100644 code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml delete mode 100644 code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/{CostomUsernamePasswordAuthentication.java => CustomUsernamePasswordAuthentication4.2.7.java} (93%) diff --git a/code/jeeplatform-sso-cas/etc/cas/config/application.yml b/code/jeeplatform-sso-cas/etc/cas/config/application.yml new file mode 100644 index 0000000..be1f7c3 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/application.yml @@ -0,0 +1,2 @@ +info: + description: CAS Configuration \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/etc/cas/config/cas.properties b/code/jeeplatform-sso-cas/etc/cas/config/cas.properties new file mode 100644 index 0000000..47a1477 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/cas.properties @@ -0,0 +1,7 @@ +cas.server.name: https://cas.example.org:8443 +cas.server.prefix: https://cas.example.org:8443/cas + +cas.adminPagesSecurity.ip=127\.0\.0\.1 + +logging.config: file:/etc/cas/config/log4j2.xml +# cas.serviceRegistry.config.location: classpath:/services diff --git a/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml b/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml new file mode 100644 index 0000000..e688cc0 --- /dev/null +++ b/code/jeeplatform-sso-cas/etc/cas/config/log4j2.xml @@ -0,0 +1,117 @@ + + + + + + . + + warn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info deleted file mode 100644 index d9c73b1..0000000 --- a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3.info +++ /dev/null @@ -1,3 +0,0 @@ -1587185901364 -(?:[^/]+/)*?[^/]*? -META-INF(?:$|/.+) \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info index ee00d81..3228cfa 100644 --- a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info @@ -1,3 +1,3 @@ -1586750915519 +1586664823913 (?:[^/]+/)*?[^/]*? WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index 455d29a..32799ed 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -1,13 +1,9 @@ 4.0.0 - - org.muses.jeeplatform - jeeplatform - 1.0-SNAPSHOT - - jeeplatform-sso-cas + org.apereo.cas + cas-overlay jeeplatform-sso-cas ${jeeplatform-sso-cas.version} war @@ -18,7 +14,7 @@ UTF-8 1.8 - 5.2.6 + 5.3.1 -tomcat org.springframework.boot.loader.WarLauncher @@ -29,18 +25,22 @@ 1.8 1.8 - 1.5.7.RELEASE + 1.5.14.RELEASE - + - public - aliyun nexus - http://maven.aliyun.com/nexus/content/groups/public/ + maven-ali + http://maven.aliyun.com/nexus/content/groups/public// true + + true + always + fail + @@ -59,6 +59,15 @@ + + com.rimerosolutions.maven.plugins + wrapper-maven-plugin + 0.0.4 + + + + org.springframework.boot spring-boot-maven-plugin @@ -93,7 +102,7 @@ org.apereo.cas cas-server-webapp${app.server} - + ${cas.version} WEB-INF/classes/services/* WEB-INF/classes/application/* @@ -120,25 +129,55 @@ - + + + + + org.apereo.cas + cas-server-support-jdbc + ${cas.version} - + + + mysql mysql-connector-java - 5.1.44 + 5.1.27 + runtime - io.codis.jodis - jodis - 0.5.0 + org.apereo.cas + cas-server-support-generic + ${cas.version} + + + + + org.apereo.cas + cas-server-support-shiro-authentication + ${cas.version} + + + + + org.apereo.cas + cas-server-support-rest-authentication + ${cas.version} + + @@ -156,8 +195,12 @@ war runtime + + diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java similarity index 93% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java index 3bcb72d..2b815ef 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CostomUsernamePasswordAuthentication.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java @@ -19,7 +19,7 @@ // * 修改后版本: 修改人: 修改日期: 2019年05月19日 修改内容: // * // */ -//public class CostomUsernamePasswordAuthentication extends AbstractUsernamePasswordAuthenticationHandler { +//public class CustomUsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { // // // @Override diff --git a/code/jeeplatform-sso-cas/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties index 0c5baf8..09394cf 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/application.properties +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -4,21 +4,14 @@ server.context-path=/cas server.port=8443 -#server.ssl.key-store=file:/etc/cas/thekeystore -#server.ssl.key-store=classpath:casServer.keystore -#server.ssl.key-store-password=test123 -#server.ssl.key-password=test123 -# server.ssl.ciphers= -# server.ssl.client-auth= -# server.ssl.enabled= -# server.ssl.key-alias= -# server.ssl.key-store-provider= -# server.ssl.key-store-type= -# server.ssl.protocol= -# server.ssl.trust-store= -# server.ssl.trust-store-password= -# server.ssl.trust-store-provider= -# server.ssl.trust-store-type= +#SSL配置 +#cas.server.name=https://sso.anumbrella.com:8443 +#cas.server.prefix=https://sso.anumbrella.com:8443/cas +server.ssl.enabled=true +server.ssl.key-store=classpath:thekeystore +server.ssl.key-store-password=changeit +server.ssl.key-password=changeit +server.ssl.keyAlias=caskeystore server.max-http-header-size=2097152 server.use-forward-headers=true @@ -33,7 +26,8 @@ server.tomcat.basedir=build/tomcat server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms) server.tomcat.accesslog.suffix=.log -server.tomcat.max-threads=10 +server.tomcat.min-spare-threads=10 +server.tomcat.max-threads=200 server.tomcat.port-header=X-Forwarded-Port server.tomcat.protocol-header=X-Forwarded-Proto server.tomcat.protocol-header-https-value=https @@ -48,27 +42,47 @@ spring.http.encoding.force=true # CAS Cloud Bus Configuration # spring.cloud.bus.enabled=false + +# Indicates that systemPropertiesOverride can be used. +# Set to false to prevent users from changing the default accidentally. Default true. +spring.cloud.config.allow-override=true + +# External properties should override system properties. +spring.cloud.config.override-system-properties=false + +# When allowOverride is true, external properties should take lowest priority, and not override any +# existing property sources (including local config files). +spring.cloud.config.override-none=false + # spring.cloud.bus.refresh.enabled=true # spring.cloud.bus.env.enabled=true # spring.cloud.bus.destination=CasCloudBus # spring.cloud.bus.ack.enabled=true -# 修改设置权限 endpoints.enabled=false endpoints.sensitive=true endpoints.restart.enabled=false endpoints.shutdown.enabled=false +# Control the security of the management/actuator endpoints +# The 'enabled' flag below here controls the rendering of details for the health endpoint amongst other things. management.security.enabled=true management.security.roles=ACTUATOR,ADMIN management.security.sessions=if_required management.context-path=/status management.add-application-context-header=false +# Define a CAS-specific "WARN" status code and its order +management.health.status.order=WARN, DOWN, OUT_OF_SERVICE, UNKNOWN, UP + +# Control the security of the management/actuator endpoints +# With basic authentication, assuming Spring Security and/or relevant modules are on the classpath. security.basic.authorize-mode=role -security.basic.enabled=false security.basic.path=/cas/status/** +# security.basic.enabled=true +# security.user.name=casuser +# security.user.password= ## # CAS Web Application Session Configuration @@ -83,6 +97,7 @@ server.session.tracking-modes=COOKIE spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.cache=true spring.thymeleaf.mode=HTML +spring.thymeleaf.template-resolver-order=100 ## # CAS Log4j Configuration # @@ -98,24 +113,48 @@ spring.aop.proxy-target-class=true ## # CAS Authentication Credentials # -cas.authn.accept.users=casuser::Mellon +#cas.authn.accept.users=casuser::Mellon + +## +# JDBC Authentication Credentials +# +# 查询账号密码SQL,必须包含密码字段 +cas.authn.jdbc.query[0].sql=select * from sys_user where username=? +# 指定上面的SQL查询字段名(必须) +cas.authn.jdbc.query[0].fieldPassword=password +# 指定过期字段,1为过期,若过期不可用 +cas.authn.jdbc.query[0].fieldExpired=expired +# 为不可用字段段,1为不可用,需要修改密码 +cas.authn.jdbc.query[0].fieldDisabled=disabled +# 数据库连接 +cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/jeeplatform?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8 + +# 数据库dialect配置 +cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect +# 数据库用户名 +cas.authn.jdbc.query[0].user=root +# 数据库用户密码 +cas.authn.jdbc.query[0].password=root +# 数据库事务自动提交 +cas.authn.jdbc.query[0].autocommit=false +# 数据库驱动 +cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver +# 超时配置 +cas.authn.jdbc.query[0].idleTimeout=50000 +# 默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 +# NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2 +cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT +#cas.authn.jdbc.query[0].passwordEncoder.type=net.anumbrella.sso.MyPasswordEncoder +# 字符类型 +cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 +# 加密算法 +cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5 +# 加密盐 +#cas.authn.jdbc.query[0].passwordEncoder.secret= +# 加密字符长度 +#cas.authn.jdbc.query[0].passwordEncoder.strength=16 #开启识别json文件,默认false cas.serviceRegistry.initFromJson=true -#自动扫描服务配置,默认开启 -cas.serviceRegistry.watcherEnabled=true -#120秒扫描一遍 -cas.serviceRegistry.repeatInterval=120000 -#延迟15秒开启 -cas.serviceRegistry.startDelay=15000 -#资源加载路径 -cas.serviceRegistry.config.location=classpath:/services - -# 开启rest验证并配置url -#cas.authn.rest.uri=https://passport.sso.com:9898/cas/v1 -# ticket过期设置 -cas.ticket.st.numberOfUses=1 -cas.ticket.st.timeToKillInSeconds=60 - cas.tgc.secure=false -cas.warningCookie.secure=false +cas.warningCookie.secure=false \ No newline at end of file From 98d7f6553d474a069ed846dc7cbb0f338a1e18df Mon Sep 17 00:00:00 2001 From: "nicky.ma" Date: Sun, 26 Apr 2020 09:55:38 +0800 Subject: [PATCH 062/123] =?UTF-8?q?CAS=E7=99=BB=E5=BD=95=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AE=A4=E8=AF=81=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eo.cas.cas-server-webapp-tomcat-5.2.6.info | 2 +- ...eo.cas.cas-server-webapp-tomcat-5.3.1.info | 3 + .../META-INF/MANIFEST.MF | 13 ++++ code/jeeplatform-sso-cas/pom.xml | 21 ++++- .../config/CustomAuthConfig.java | 42 ++++++++++ .../encode/MD5PasswordEncoder.java | 31 ++++++++ .../CustomUsernamePasswordAuthentication.java | 76 +++++++++++++++++++ ...omUsernamePasswordAuthentication4.2.7.java | 45 +++++++++++ .../cas/authentication/model/User.java | 62 +++++++++++++++ .../cas/authentication/package-info.java | 12 +++ .../main/resources/META-INF/spring.factories | 1 + 11 files changed, 306 insertions(+), 2 deletions(-) create mode 100644 code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info create mode 100644 code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java create mode 100644 code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info index 3228cfa..ee00d81 100644 --- a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.6.info @@ -1,3 +1,3 @@ -1586664823913 +1586750915519 (?:[^/]+/)*?[^/]*? WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info new file mode 100644 index 0000000..8ba8377 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1.info @@ -0,0 +1,3 @@ +1587720632042 +(?:[^/]+/)*?[^/]*? +WEB-INF/classes/application/[^/]*?, WEB-INF/classes/services/[^/]*? \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF new file mode 100644 index 0000000..4247a39 --- /dev/null +++ b/code/jeeplatform-sso-cas/overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.1/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Implementation-Title: cas-server-webapp-tomcat +Implementation-Version: 5.3.1 +Start-Class: org.apereo.cas.web.CasWebApplication +Spring-Boot-Classes: WEB-INF/classes/ +Spring-Boot-Lib: WEB-INF/lib/ +Implementation-Date: 2018-07-12T10:40:21.572-07:00[America/Phoenix] +Spring-Boot-Version: 1.5.14.RELEASE +Created-By: org.apereo.cas +Specification-Version: 8ac40891b296f75f73d43233252d6d2ddf491487 +Implementation-Vendor: org.apereo.cas +Main-Class: org.springframework.boot.loader.WarLauncher + diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index 32799ed..9a13623 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -157,12 +157,25 @@ runtime + org.apereo.cas - cas-server-support-generic + cas-server-core-authentication-api ${cas.version} + + + org.apereo.cas + cas-server-core-configuration-api + ${cas.version} + + + + org.apereo.cas + cas-server-support-generic + ${cas.version} + @@ -177,6 +190,12 @@ cas-server-support-rest-authentication ${cas.version} + + org.projectlombok + lombok + 1.16.10 + compile + diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java new file mode 100644 index 0000000..ed00f71 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java @@ -0,0 +1,42 @@ +package org.muses.jeeplatform.cas.authentication.config; + + +import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; +import org.apereo.cas.configuration.CasConfigurationProperties; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.authentication.handler.CustomUsernamePasswordAuthentication; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration("CustomAuthConfig") +@EnableConfigurationProperties(CasConfigurationProperties.class) +public class CustomAuthConfig implements AuthenticationEventExecutionPlanConfigurer { + + @Autowired + private CasConfigurationProperties casProperties; + + @Autowired + @Qualifier("servicesManager") + private ServicesManager servicesManager; + + + @Bean + public PrePostAuthenticationHandler myAuthenticationHandler() { + // 定义为优先使用它进行认证 +// return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(), +// servicesManager, new DefaultPrincipalFactory(), 1); + + return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(), + servicesManager, new DefaultPrincipalFactory(), 1); + } + + @Override + public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { + plan.registerAuthenticationHandler(myAuthenticationHandler()); + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java new file mode 100644 index 0000000..b631145 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java @@ -0,0 +1,31 @@ +package org.muses.jeeplatform.cas.authentication.encode; + +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/24 17:02  修改内容:
    + * 
    + */ +public class MD5PasswordEncoder implements PasswordEncoder { + + @Override + public String encode(CharSequence charSequence) { + return charSequence.toString(); + } + + @Override + public boolean matches(CharSequence charSequence, String s) { + String encodeStr = charSequence.toString() + ""; + if (encodeStr.equals(s)) { + return true; + } + return false; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java new file mode 100644 index 0000000..c43586b --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java @@ -0,0 +1,76 @@ +package org.muses.jeeplatform.cas.authentication.handler; + + +import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; +import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; +import org.apereo.cas.authentication.principal.PrincipalFactory; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.authentication.model.User; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.security.auth.login.AccountException; +import javax.security.auth.login.FailedLoginException; +import java.security.GeneralSecurityException; +import java.util.*; + +public class CustomUsernamePasswordAuthentication extends AbstractPreAndPostProcessingAuthenticationHandler { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(CustomUsernamePasswordAuthentication.class); + + public CustomUsernamePasswordAuthentication(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + super(name, servicesManager, principalFactory, order); + } + + @Override + protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException { + UsernamePasswordCredential usernamePasswordCredential = (UsernamePasswordCredential) credential; + + String username = usernamePasswordCredential.getUsername(); + String password = usernamePasswordCredential.getPassword(); + + System.out.println("username : " + username); + System.out.println("password : " + password); + + // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池 + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform"); + dataSource.setUsername("root"); + dataSource.setPassword("minstone"); + + // 创建JDBC模板 + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + + String sql = "SELECT * FROM sys_user WHERE username = ?"; + + User info = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); + + System.out.println("database username : "+ info.getUsername()); + System.out.println("database password : "+ info.getPassword()); + + + if (info == null) { + throw new AccountException("Sorry, username not found!"); + } + + if (!info.getPassword().equals(password)) { + throw new FailedLoginException("Sorry, password not correct!"); + } else { + + final List list = new ArrayList<>(); + + return createHandlerResult(usernamePasswordCredential, + this.principalFactory.createPrincipal(username, Collections.emptyMap()), list); + } + } + + + @Override + public boolean supports(Credential credential) { + return credential instanceof UsernamePasswordCredential; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java new file mode 100644 index 0000000..05c4261 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java @@ -0,0 +1,45 @@ +//package org.muses.jeeplatform.cas.authentication.handler.providers; +// +//import org.jasig.cas.authentication.HandlerResult; +//import org.jasig.cas.authentication.PreventedException; +//import org.jasig.cas.authentication.UsernamePasswordCredential; +//import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; +// +//import javax.handler.auth.login.FailedLoginException; +//import java.handler.GeneralSecurityException; +// +///** +// *
    +// *  CAS单点登录验证
    +// * 
    +// * +// * @author nicky.ma +// *
    +// * 修改记录
    +// *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
    +// * 
    +// */ +//public class CostomUsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { +// +// +// @Override +// protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { +// if (usernamePasswordCredential == null) { +// throw new FailedLoginException("No user can be accepted because none is defined"); +// } +// return doAuthentication(usernamePasswordCredential); +// } +// +// /** +// * 用户密码验证 +// * @param credential +// * @return +// */ +// private HandlerResult doAuthentication(UsernamePasswordCredential credential) { +// String username = credential.getUsername(); +// String password = credential.getPassword(); +// +// String fullUserName = username; +// return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); +// } +//} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java new file mode 100644 index 0000000..36f59ce --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java @@ -0,0 +1,62 @@ +package org.muses.jeeplatform.cas.authentication.model; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/24 17:45  修改内容:
    + * 
    + */ +@Data +public class User implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java new file mode 100644 index 0000000..3afcf64 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java @@ -0,0 +1,12 @@ +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/24 10:26  修改内容:
    + * 
    + */ +package org.muses.jeeplatform.cas.authentication; \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..c7b8f6e --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.muses.jeeplatform.cas.authentication.config.CustomAuthConfig \ No newline at end of file From a8cb4ff1a98f2ebee07ecb09eac1be451a6c1b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 11:10:23 +0800 Subject: [PATCH 063/123] =?UTF-8?q?CAS=E6=94=AF=E6=8C=81=E5=A4=9A=E7=A7=8D?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-sso-cas/pom.xml | 8 ++++ .../config/CustomAuthConfig.java | 6 +-- .../handler/ShiroAuthenticationHandler.java | 39 +++++++++++++++ ...va => UsernamePasswordAuthentication.java} | 7 ++- ... UsernamePasswordAuthentication4.2.7.java} | 2 +- .../src/main/resources/application.properties | 47 +++++++++++++++++-- .../src/main/resources/shiro.ini | 9 ++++ code/jeeplatform-sso-cas/users/whitelist/file | 1 + .../users/whitelist/file.json | 14 ++++++ 9 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/{CustomUsernamePasswordAuthentication.java => UsernamePasswordAuthentication.java} (87%) rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/{CustomUsernamePasswordAuthentication4.2.7.java => UsernamePasswordAuthentication4.2.7.java} (93%) create mode 100644 code/jeeplatform-sso-cas/src/main/resources/shiro.ini create mode 100644 code/jeeplatform-sso-cas/users/whitelist/file create mode 100644 code/jeeplatform-sso-cas/users/whitelist/file.json diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml index 9a13623..b746df5 100644 --- a/code/jeeplatform-sso-cas/pom.xml +++ b/code/jeeplatform-sso-cas/pom.xml @@ -184,12 +184,20 @@ ${cas.version} + + org.apache.shiro + shiro-spring + 1.4.0 + + org.apereo.cas cas-server-support-rest-authentication ${cas.version} + + org.projectlombok lombok diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java index ed00f71..d9ca26c 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java @@ -5,7 +5,7 @@ import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.services.ServicesManager; -import org.muses.jeeplatform.cas.authentication.handler.CustomUsernamePasswordAuthentication; +import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthentication; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -28,10 +28,10 @@ public class CustomAuthConfig implements AuthenticationEventExecutionPlanConfigu @Bean public PrePostAuthenticationHandler myAuthenticationHandler() { // 定义为优先使用它进行认证 -// return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(), +// return new UsernamePasswordAuthentication(UsernamePasswordAuthentication.class.getName(), // servicesManager, new DefaultPrincipalFactory(), 1); - return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(), + return new UsernamePasswordAuthentication(UsernamePasswordAuthentication.class.getName(), servicesManager, new DefaultPrincipalFactory(), 1); } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java new file mode 100644 index 0000000..9ce28c2 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java @@ -0,0 +1,39 @@ +package org.muses.jeeplatform.cas.authentication.handler; + +import org.apereo.cas.authentication.AuthenticationHandlerExecutionResult; +import org.apereo.cas.authentication.Credential; +import org.apereo.cas.authentication.PreventedException; +import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; +import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; +import org.apereo.cas.authentication.principal.PrincipalFactory; +import org.apereo.cas.services.ServicesManager; + +import java.security.GeneralSecurityException; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 11:03  修改内容:
    + * 
    + */ +public class ShiroAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler { + + public ShiroAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + super(name, servicesManager, principalFactory, order); + } + + @Override + protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException { + return null; + } + + @Override + public boolean supports(Credential credential) { + return false; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java similarity index 87% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java index c43586b..20d6a59 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java @@ -3,7 +3,6 @@ import org.apereo.cas.authentication.*; import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; -import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import org.apereo.cas.authentication.principal.PrincipalFactory; import org.apereo.cas.services.ServicesManager; import org.muses.jeeplatform.cas.authentication.model.User; @@ -17,10 +16,10 @@ import java.security.GeneralSecurityException; import java.util.*; -public class CustomUsernamePasswordAuthentication extends AbstractPreAndPostProcessingAuthenticationHandler { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(CustomUsernamePasswordAuthentication.class); +public class UsernamePasswordAuthentication extends AbstractPreAndPostProcessingAuthenticationHandler { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(UsernamePasswordAuthentication.class); - public CustomUsernamePasswordAuthentication(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + public UsernamePasswordAuthentication(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { super(name, servicesManager, principalFactory, order); } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java similarity index 93% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java index 05c4261..599f3ae 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/CustomUsernamePasswordAuthentication4.2.7.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java @@ -19,7 +19,7 @@ // * 修改后版本: 修改人: 修改日期: 2019年05月19日 修改内容: // * // */ -//public class CostomUsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { +//public class UsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { // // // @Override diff --git a/code/jeeplatform-sso-cas/src/main/resources/application.properties b/code/jeeplatform-sso-cas/src/main/resources/application.properties index 09394cf..36d3c39 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/application.properties +++ b/code/jeeplatform-sso-cas/src/main/resources/application.properties @@ -116,7 +116,7 @@ spring.aop.proxy-target-class=true #cas.authn.accept.users=casuser::Mellon ## -# JDBC Authentication Credentials +# JDBC Authentication # # 查询账号密码SQL,必须包含密码字段 cas.authn.jdbc.query[0].sql=select * from sys_user where username=? @@ -144,7 +144,7 @@ cas.authn.jdbc.query[0].idleTimeout=50000 # 默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 # NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT -#cas.authn.jdbc.query[0].passwordEncoder.type=net.anumbrella.sso.MyPasswordEncoder +#cas.authn.jdbc.query[0].passwordEncoder.type=org.muses.jeeplatform.cas.authentication.encode.MD5PasswordEncoder # 字符类型 cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 # 加密算法 @@ -154,7 +154,48 @@ cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5 # 加密字符长度 #cas.authn.jdbc.query[0].passwordEncoder.strength=16 +## +# 支持http方式 +# #开启识别json文件,默认false cas.serviceRegistry.initFromJson=true cas.tgc.secure=false -cas.warningCookie.secure=false \ No newline at end of file +cas.warningCookie.secure=false + +## +# File (Whitelist) Authentication +# +cas.authn.file.separator=:: +cas.authn.file.filename=file:///users/whitelist/file +cas.authn.file.name= + +## +#JSON (Whitelist) Authentication +# +cas.authn.json.location=file:///users/whitelist/file.json +cas.authn.json.name= + +## +# Reject Users (Blacklist) Authentication +# +cas.authn.reject.users=user,user1 +cas.authn.reject.name= + +## +# Shiro Authentication +# +#允许登录的用户,必须要有以下权限,否则拒绝,多个逗号隔开 +cas.authn.shiro.requiredPermissions=staff +#允许登录的用户,必须要有以下角色,否则拒绝,多个逗号隔开 +cas.authn.shiro.requiredRoles=admin +#shiro配置文件位置 +cas.authn.shiro.location=classpath:shiro.ini +# shiro name唯一 +cas.authn.shiro.name=cas-shiro + +## +# REST Authentication +# +#cas.authn.rest.uri=http://localhost:8081/jeeplatform +cas.authn.rest.name= + diff --git a/code/jeeplatform-sso-cas/src/main/resources/shiro.ini b/code/jeeplatform-sso-cas/src/main/resources/shiro.ini new file mode 100644 index 0000000..94f2dd8 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/resources/shiro.ini @@ -0,0 +1,9 @@ +[main] +cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager +securityManager.cacheManager = $cacheManager + +[users] +casuser = Mellon, admin + +[roles] +admin = system,admin,staff,superuser:* \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/users/whitelist/file b/code/jeeplatform-sso-cas/users/whitelist/file new file mode 100644 index 0000000..6cd0cae --- /dev/null +++ b/code/jeeplatform-sso-cas/users/whitelist/file @@ -0,0 +1 @@ +test::123 \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/users/whitelist/file.json b/code/jeeplatform-sso-cas/users/whitelist/file.json new file mode 100644 index 0000000..d12e4f7 --- /dev/null +++ b/code/jeeplatform-sso-cas/users/whitelist/file.json @@ -0,0 +1,14 @@ +{ + "@class" : "java.util.LinkedHashMap", + "casuser" : { + "@class" : "org.apereo.cas.adaptors.generic.CasUserAccount", + "password" : "Mellon", + "attributes" : { + "@class" : "java.util.LinkedHashMap", + "firstName" : "Apereo", + "lastName" : "CAS" + }, + "status" : "OK", + "expirationDate" : "2018-01-19" + } +} \ No newline at end of file From 9f52e77d13713151e1d4f907a9067288d85b91db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 11:21:02 +0800 Subject: [PATCH 064/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 61 ------------------- .../web/controller/UserController.java | 2 +- code/jeeplatform-provider-api/pom.xml | 6 -- .../admin/dto => dto/admin}/RoleVO.java | 2 +- .../admin/dto => dto/admin}/SysMenu.java | 2 +- .../admin/dto => dto/admin}/ZTree.java | 2 +- code/pom.xml | 44 +++++++++++++ 7 files changed, 48 insertions(+), 71 deletions(-) rename code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/{entity/admin/dto => dto/admin}/RoleVO.java (94%) rename code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/{entity/admin/dto => dto/admin}/SysMenu.java (97%) rename code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/{entity/admin/dto => dto/admin}/ZTree.java (93%) diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 197f6ad..1305389 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -34,7 +34,6 @@ ${jeeplatform-provider-api.version}
    - org.springframework.boot spring-boot-starter-data-redis @@ -46,7 +45,6 @@ spring-boot-starter-tomcat provided - @@ -55,58 +53,6 @@ ${spring-boot.version} - - org.springframework.boot - spring-boot-devtools - true - - - - org.springframework.boot - spring-boot-starter-test - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - - com.alibaba - druid - ${druid.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - - - - - - - mysql - mysql-connector-java - ${mysql-connector.version} - - - - - - - - com.alibaba - fastjson - ${fastjson.version} - - io.springfox @@ -161,13 +107,6 @@ 1.5.6 - - - commons-lang - commons-lang - 2.5 - - - - com.alibaba - fastjson - ${fastjson.version} - diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java similarity index 94% rename from code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java index 567b48a..ca318a0 100644 --- a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/RoleVO.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/RoleVO.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java similarity index 97% rename from code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java index 558febe..39d82ab 100644 --- a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/SysMenu.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/SysMenu.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java similarity index 93% rename from code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java rename to code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java index 3e11236..63b48c2 100644 --- a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/entity/admin/dto/ZTree.java +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/ZTree.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.core.entity.admin.dto; +package org.muses.jeeplatform.core.dto.admin; import java.io.Serializable; diff --git a/code/pom.xml b/code/pom.xml index d260363..5555dfa 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -137,7 +137,51 @@ + + + com.alibaba + fastjson + ${fastjson.version} + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + org.springframework.boot + spring-boot-starter-test + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.alibaba + druid + ${druid.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + mysql + mysql-connector-java + ${mysql-connector.version} + From 770892a1074b299b6d869e40102bdda71b270510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 11:25:55 +0800 Subject: [PATCH 065/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=B1=BB=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/muses/jeeplatform/Application.java | 2 +- .../java/org/muses/jeeplatform/{cache => aop}/RedisAspect.java | 3 ++- .../org/muses/jeeplatform/cache/{ => redis}/RedisCache.java | 3 ++- .../org/muses/jeeplatform/cache/{ => redis}/RedisClient.java | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) rename code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/{cache => aop}/RedisAspect.java (96%) rename code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/{ => redis}/RedisCache.java (92%) rename code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/{ => redis}/RedisClient.java (94%) diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java index 09bbe50..726d98b 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java @@ -1,7 +1,7 @@ package org.muses.jeeplatform; -import org.muses.jeeplatform.cache.RedisClient; +import org.muses.jeeplatform.cache.redis.RedisClient; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java similarity index 96% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java index 8f9c726..d886b57 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisAspect.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/aop/RedisAspect.java @@ -1,9 +1,10 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import org.muses.jeeplatform.cache.redis.RedisCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java similarity index 92% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java index af3cd3b..01ebfdf 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisCache.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisCache.java @@ -1,5 +1,6 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.cache.redis; +import org.muses.jeeplatform.cache.SerializeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java similarity index 94% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java index 101991a..ce7c0f4 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/RedisClient.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/cache/redis/RedisClient.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.cache; +package org.muses.jeeplatform.cache.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; From df76ec7713cdf989aa591f018cfe695c3e03463a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 11:30:45 +0800 Subject: [PATCH 066/123] =?UTF-8?q?=E8=B0=83=E6=95=B4sso=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...omUsernamePasswordAuthentication4.2.7.java | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java deleted file mode 100644 index 2b815ef..0000000 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/security/CustomUsernamePasswordAuthentication4.2.7.java +++ /dev/null @@ -1,45 +0,0 @@ -//package org.muses.jeeplatform.cas.authentication.security.providers; -// -//import org.jasig.cas.authentication.HandlerResult; -//import org.jasig.cas.authentication.PreventedException; -//import org.jasig.cas.authentication.UsernamePasswordCredential; -//import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; -// -//import javax.security.auth.login.FailedLoginException; -//import java.security.GeneralSecurityException; -// -///** -// *
    -// *  CAS单点登录验证
    -// * 
    -// * -// * @author nicky.ma -// *
    -// * 修改记录
    -// *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
    -// * 
    -// */ -//public class CustomUsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { -// -// -// @Override -// protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { -// if (usernamePasswordCredential == null) { -// throw new FailedLoginException("No user can be accepted because none is defined"); -// } -// return doAuthentication(usernamePasswordCredential); -// } -// -// /** -// * 用户密码验证 -// * @param credential -// * @return -// */ -// private HandlerResult doAuthentication(UsernamePasswordCredential credential) { -// String username = credential.getUsername(); -// String password = credential.getPassword(); -// -// String fullUserName = username; -// return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); -// } -//} From b8b9bc0239af9d31b83c8d5309379944cacead7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 14:46:27 +0800 Subject: [PATCH 067/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=B0=8F=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 5 ----- ...Application.java => AdminApplication.java} | 6 +++--- code/jeeplatform-common/pom.xml | 8 +------ code/jeeplatform-provider/pom.xml | 12 +++++++++++ .../jeeplatform/ProviderApplication.java | 14 +++++++++++++ code/pom.xml | 21 ++++++++++++------- 6 files changed, 44 insertions(+), 22 deletions(-) rename code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/{Application.java => AdminApplication.java} (92%) create mode 100644 code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 1305389..1c0b5c9 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -34,11 +34,6 @@ ${jeeplatform-provider-api.version}
    - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - org.springframework.boot diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java similarity index 92% rename from code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java rename to code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java index 726d98b..251e3af 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/Application.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java @@ -1,7 +1,7 @@ package org.muses.jeeplatform; -import org.muses.jeeplatform.cache.redis.RedisClient; +import org.muses.jeeplatform.common.cache.redis.RedisClient; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -27,13 +27,13 @@ //@EnableCaching @EnableAsync @Controller -public class Application { +public class AdminApplication { @Autowired RedisClient redisClient; public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(AdminApplication.class, args); } @RequestMapping("/set") diff --git a/code/jeeplatform-common/pom.xml b/code/jeeplatform-common/pom.xml index 8e21368..25baa07 100644 --- a/code/jeeplatform-common/pom.xml +++ b/code/jeeplatform-common/pom.xml @@ -17,11 +17,5 @@ jeeplatform-common - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - - + diff --git a/code/jeeplatform-provider/pom.xml b/code/jeeplatform-provider/pom.xml index 90c094c..cbe450a 100644 --- a/code/jeeplatform-provider/pom.xml +++ b/code/jeeplatform-provider/pom.xml @@ -11,6 +11,18 @@ ${jeeplatform-provider.version} jar + + + org.muses.jeeplatform + jeeplatform-provider-api + ${jeeplatform-provider-api.version} + + + org.muses.jeeplatform + jeeplatform-common + ${jeeplatform-common.version} + + diff --git a/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java b/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java new file mode 100644 index 0000000..e6f1d5a --- /dev/null +++ b/code/jeeplatform-provider/src/main/java/org/muses/jeeplatform/ProviderApplication.java @@ -0,0 +1,14 @@ +package org.muses.jeeplatform; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(ProviderApplication.class, args); + } + +} diff --git a/code/pom.xml b/code/pom.xml index 5555dfa..4019b0b 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -137,13 +137,6 @@ - - - com.alibaba - fastjson - ${fastjson.version} - - org.springframework.boot @@ -164,6 +157,12 @@ true + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + com.alibaba @@ -190,6 +189,14 @@ ${lombok.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + From 4625daa7c20d05425a77f67933a69f730f7d5e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 15:20:53 +0800 Subject: [PATCH 068/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=B0=8F=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 7 ++++++- .../main/java/org/muses/jeeplatform/AdminApplication.java | 2 +- .../muses/jeeplatform/web/controller/RoleController.java | 2 +- code/jeeplatform-common/pom.xml | 8 +++++++- code/pom.xml | 6 ------ 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 1c0b5c9..1f16850 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -34,6 +34,11 @@ ${jeeplatform-provider-api.version} + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + org.springframework.boot @@ -70,7 +75,7 @@ javax.servlet jstl - + org.apache.shiro diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java index 251e3af..0de6b81 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java @@ -1,7 +1,7 @@ package org.muses.jeeplatform; -import org.muses.jeeplatform.common.cache.redis.RedisClient; +import org.muses.jeeplatform.cache.redis.RedisClient; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java index 7248921..7180ba9 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/controller/RoleController.java @@ -1,7 +1,6 @@ package org.muses.jeeplatform.web.controller; import com.alibaba.fastjson.JSON; -import org.apache.commons.lang.StringUtils; import org.muses.jeeplatform.core.CommonConsts; import org.muses.jeeplatform.core.entity.admin.Menu; import org.muses.jeeplatform.core.entity.admin.Permission; @@ -14,6 +13,7 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; diff --git a/code/jeeplatform-common/pom.xml b/code/jeeplatform-common/pom.xml index 25baa07..8e21368 100644 --- a/code/jeeplatform-common/pom.xml +++ b/code/jeeplatform-common/pom.xml @@ -17,5 +17,11 @@ jeeplatform-common - + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + diff --git a/code/pom.xml b/code/pom.xml index 4019b0b..dcdee5a 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -157,12 +157,6 @@ true - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - - com.alibaba From 877cc75b584ab0367eea413c9a6216626153996d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 17:39:33 +0800 Subject: [PATCH 069/123] =?UTF-8?q?sso=E5=B7=A5=E7=A8=8B=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?Shiro=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeeplatform/core/shiro/ShiroRealm.java | 1 + .../web/filter/SysAccessControllerFilter.java | 7 ++ .../cas/authentication/config/JdbcConfig.java | 54 +++++++++ .../ShiroAuthenticationConfiguration.java | 103 ++++++++++++++++++ ...g.java => UsernamePasswordAuthConfig.java} | 10 +- .../handler/ShiroAuthenticationHandler.java | 36 +++++- .../UsernamePasswordAuthentication4.2.7.java | 45 -------- ...sernamePasswordAuthenticationHandler.java} | 8 +- .../shiro/ShiroAuthorizingRealm.java | 95 ++++++++++++++++ .../cas/authentication/shiro/ShiroConsts.java | 26 +++++ .../{authentication => }/package-info.java | 2 +- .../{authentication => user}/model/User.java | 2 +- .../cas/user/service/UserService.java | 48 ++++++++ .../main/resources/META-INF/spring.factories | 2 +- 14 files changed, 376 insertions(+), 63 deletions(-) create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/{CustomAuthConfig.java => UsernamePasswordAuthConfig.java} (77%) delete mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/{UsernamePasswordAuthentication.java => UsernamePasswordAuthenticationHandler.java} (88%) create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/{authentication => }/package-info.java (77%) rename code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/{authentication => user}/model/User.java (94%) create mode 100644 code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java index 6dfda18..a9a918d 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/core/shiro/ShiroRealm.java @@ -20,6 +20,7 @@ * @author Nicky * @date 2017年3月12日 */ +//登录机制代码搬到单点登录工程实现 public class ShiroRealm extends AuthorizingRealm { /**注解引入业务类**/ diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java index 1203bcd..a238ad8 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/web/filter/SysAccessControllerFilter.java @@ -22,6 +22,13 @@ import java.util.LinkedList; import java.util.Map; +/** + * TODO 功能还没实现 + * @Author mazq + * @Date 2020/04/26 17:17 + * @Param + * @return + */ public class SysAccessControllerFilter extends AccessControlFilter{ private String url;//被提出后,重定向的url diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java new file mode 100644 index 0000000..5d76133 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/JdbcConfig.java @@ -0,0 +1,54 @@ +package org.muses.jeeplatform.cas.authentication.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +/** + *
    + *  jdbc配置类
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 15:36  修改内容:
    + * 
    + */ +@Configuration +public class JdbcConfig { + + /** + * jdbc驱动连接池 + * @Author mazq + * @Date 2020/04/26 15:39 + * @Param [] + * @return org.springframework.jdbc.datasource.DriverManagerDataSource + */ + @Bean("driverManagerDataSource") + public DriverManagerDataSource driverManagerDataSource(){ + // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池 + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform"); + dataSource.setUsername("root"); + dataSource.setPassword("minstone"); + return dataSource; + } + + /** + * 创建JDBC模板 + * @Author mazq + * @Date 2020/04/26 15:39 + * @Param [] + * @return org.springframework.jdbc.core.JdbcTemplate + */ + @Bean("jdbcTemplate") + public JdbcTemplate jdbcTemplate(){ + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(driverManagerDataSource()); + return jdbcTemplate; + } +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java new file mode 100644 index 0000000..8ff6570 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java @@ -0,0 +1,103 @@ +package org.muses.jeeplatform.cas.authentication.config; + +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; +import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer; +import org.apereo.cas.authentication.AuthenticationHandler; +import org.apereo.cas.authentication.PrePostAuthenticationHandler; +import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; +import org.apereo.cas.configuration.CasConfigurationProperties; +import org.apereo.cas.services.ServicesManager; +import org.muses.jeeplatform.cas.authentication.handler.ShiroAuthenticationHandler; +import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthenticationHandler; +import org.muses.jeeplatform.cas.authentication.shiro.ShiroAuthorizingRealm; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 16:35  修改内容:
    + * 
    + */ +//@Configuration("ShiroAuthenticationConfiguration") +@EnableConfigurationProperties(CasConfigurationProperties.class) +public class ShiroAuthenticationConfiguration implements AuthenticationEventExecutionPlanConfigurer { + @Autowired + private CasConfigurationProperties casProperties; + + @Autowired + @Qualifier("servicesManager") + private ServicesManager servicesManager; + + + @Bean + public AuthenticationHandler myAuthenticationHandler() { + return new ShiroAuthenticationHandler(ShiroAuthenticationHandler.class.getName(), + servicesManager, new DefaultPrincipalFactory(), 1); + } + + @Override + public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { + plan.registerAuthenticationHandler(myAuthenticationHandler()); + } + + + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + + //拦截器. + Map filterChainDefinitionMap = new LinkedHashMap<>(); + // 配置不会被拦截的链接 顺序判断 + filterChainDefinitionMap.put("/static/**", "anon"); + filterChainDefinitionMap.put("/upload/**", "anon"); + filterChainDefinitionMap.put("/plugins/**", "anon"); + filterChainDefinitionMap.put("/code", "anon"); + filterChainDefinitionMap.put("/login", "anon"); + filterChainDefinitionMap.put("/logincheck", "anon"); + filterChainDefinitionMap.put("/**", "authc"); + + shiroFilterFactoryBean.setLoginUrl("/login"); + shiroFilterFactoryBean.setSuccessUrl("/index"); + shiroFilterFactoryBean.setUnauthorizedUrl("/login"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean + public ShiroAuthorizingRealm myShiroRealm(){ + ShiroAuthorizingRealm myShiroRealm = new ShiroAuthorizingRealm(); + myShiroRealm.setCachingEnabled(false); + //启用身份验证缓存,即缓存AuthenticationInfo信息,默认false + myShiroRealm.setAuthenticationCachingEnabled(false); + //启用授权缓存,即缓存AuthorizationInfo信息,默认false + myShiroRealm.setAuthorizationCachingEnabled(false); + return myShiroRealm; + } + + + @Bean + public SecurityManager securityManager(){ + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(myShiroRealm()); + return securityManager; + } + + + +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java similarity index 77% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java index d9ca26c..83b1676 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/CustomAuthConfig.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java @@ -5,7 +5,7 @@ import org.apereo.cas.authentication.principal.DefaultPrincipalFactory; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.services.ServicesManager; -import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthentication; +import org.muses.jeeplatform.cas.authentication.handler.UsernamePasswordAuthenticationHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -13,9 +13,9 @@ import org.springframework.context.annotation.Configuration; -@Configuration("CustomAuthConfig") +@Configuration("UsernamePasswordAuthConfig") @EnableConfigurationProperties(CasConfigurationProperties.class) -public class CustomAuthConfig implements AuthenticationEventExecutionPlanConfigurer { +public class UsernamePasswordAuthConfig implements AuthenticationEventExecutionPlanConfigurer { @Autowired private CasConfigurationProperties casProperties; @@ -28,10 +28,10 @@ public class CustomAuthConfig implements AuthenticationEventExecutionPlanConfigu @Bean public PrePostAuthenticationHandler myAuthenticationHandler() { // 定义为优先使用它进行认证 -// return new UsernamePasswordAuthentication(UsernamePasswordAuthentication.class.getName(), +// return new UsernamePasswordAuthenticationHandler(UsernamePasswordAuthenticationHandler.class.getName(), // servicesManager, new DefaultPrincipalFactory(), 1); - return new UsernamePasswordAuthentication(UsernamePasswordAuthentication.class.getName(), + return new UsernamePasswordAuthenticationHandler(UsernamePasswordAuthenticationHandler.class.getName(), servicesManager, new DefaultPrincipalFactory(), 1); } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java index 9ce28c2..deaca00 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java @@ -1,8 +1,10 @@ package org.muses.jeeplatform.cas.authentication.handler; -import org.apereo.cas.authentication.AuthenticationHandlerExecutionResult; -import org.apereo.cas.authentication.Credential; -import org.apereo.cas.authentication.PreventedException; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.apereo.cas.authentication.*; import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import org.apereo.cas.authentication.principal.PrincipalFactory; @@ -21,17 +23,39 @@ * 修改后版本: 修改人: 修改日期: 2020/04/26 11:03 修改内容: * */ -public class ShiroAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler { +public class ShiroAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler { public ShiroAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { super(name, servicesManager, principalFactory, order); } @Override - protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException { - return null; + protected AuthenticationHandlerExecutionResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential, String originalPassword) throws GeneralSecurityException, PreventedException { + UsernamePasswordToken token = new UsernamePasswordToken(credential.getUsername(),credential.getPassword()); + + if (credential instanceof RememberMeUsernamePasswordCredential) { + token.setRememberMe(RememberMeUsernamePasswordCredential.class.cast(credential).isRememberMe()); + } + + Subject subject = getCurrentExecutingSubject(); + subject.login(token); + + //获取Shiro管理的Session + //Session session = getShiroSession(subject); + + final String username = subject.getPrincipal().toString(); + return createHandlerResult(credential, this.principalFactory.createPrincipal(username)); } + protected Subject getCurrentExecutingSubject(){ + return SecurityUtils.getSubject(); + } + + protected Session getShiroSession(Subject subject){ + return subject.getSession(); + } + + @Override public boolean supports(Credential credential) { return false; diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java deleted file mode 100644 index 599f3ae..0000000 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication4.2.7.java +++ /dev/null @@ -1,45 +0,0 @@ -//package org.muses.jeeplatform.cas.authentication.handler.providers; -// -//import org.jasig.cas.authentication.HandlerResult; -//import org.jasig.cas.authentication.PreventedException; -//import org.jasig.cas.authentication.UsernamePasswordCredential; -//import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; -// -//import javax.handler.auth.login.FailedLoginException; -//import java.handler.GeneralSecurityException; -// -///** -// *
    -// *  CAS单点登录验证
    -// * 
    -// * -// * @author nicky.ma -// *
    -// * 修改记录
    -// *    修改后版本:     修改人:  修改日期: 2019年05月19日  修改内容:
    -// * 
    -// */ -//public class UsernamePasswordAuthentication4.2.7 extends AbstractUsernamePasswordAuthenticationHandler { -// -// -// @Override -// protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential usernamePasswordCredential) throws GeneralSecurityException, PreventedException { -// if (usernamePasswordCredential == null) { -// throw new FailedLoginException("No user can be accepted because none is defined"); -// } -// return doAuthentication(usernamePasswordCredential); -// } -// -// /** -// * 用户密码验证 -// * @param credential -// * @return -// */ -// private HandlerResult doAuthentication(UsernamePasswordCredential credential) { -// String username = credential.getUsername(); -// String password = credential.getPassword(); -// -// String fullUserName = username; -// return createHandlerResult(credential , this.principalFactory.createPrincipal(username), null); -// } -//} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java similarity index 88% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java index 20d6a59..77fa795 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthentication.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/UsernamePasswordAuthenticationHandler.java @@ -5,7 +5,7 @@ import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; import org.apereo.cas.authentication.principal.PrincipalFactory; import org.apereo.cas.services.ServicesManager; -import org.muses.jeeplatform.cas.authentication.model.User; +import org.muses.jeeplatform.cas.user.model.User; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; @@ -16,10 +16,10 @@ import java.security.GeneralSecurityException; import java.util.*; -public class UsernamePasswordAuthentication extends AbstractPreAndPostProcessingAuthenticationHandler { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(UsernamePasswordAuthentication.class); +public class UsernamePasswordAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(UsernamePasswordAuthenticationHandler.class); - public UsernamePasswordAuthentication(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { + public UsernamePasswordAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) { super(name, servicesManager, principalFactory, order); } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java new file mode 100644 index 0000000..7c9871b --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java @@ -0,0 +1,95 @@ +package org.muses.jeeplatform.cas.authentication.shiro; + +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.muses.jeeplatform.cas.user.model.User; +import org.muses.jeeplatform.cas.user.service.UserService; +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.jdbc.core.JdbcTemplate; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 11:33  修改内容:
    + * 
    + */ +public class ShiroAuthorizingRealm extends AuthorizingRealm { + + Logger LOG = LoggerFactory.getLogger(ShiroAuthorizingRealm.class); + + /**注解引入业务类**/ + @Autowired + UserService userService; + + /** + * 登录信息和用户验证信息验证(non-Javadoc) + * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(AuthenticationToken) + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + + String username = (String)token.getPrincipal(); //得到用户名 + String password = new String((char[])token.getCredentials()); //得到密码 + + LOG.info("Shiro doGetAuthenticationInfo>> username:{},password:{}",username,password); + + User user = userService.findByUsername(username); + + /**检测是否有此用户 **/ + if(user == null){ + throw new UnknownAccountException();//没有找到账号异常 + } + /**检验账号是否被锁定 **/ + if(Boolean.TRUE.equals(user.getLocked())){ + throw new LockedAccountException();//抛出账号锁定异常 + } + /**AuthenticatingRealm使用CredentialsMatcher进行密码匹配**/ + if(null != username && null != password){ + return new SimpleAuthenticationInfo(username, password, getName()); + }else{ + return null; + } + + } + + /** + * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法(non-Javadoc) + * @see AuthorizingRealm#doGetAuthorizationInfo(PrincipalCollection) + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { + String username = (String)pc.getPrimaryPrincipal(); + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); +// authorizationInfo.setRoles(userService.getRoles(username)); +// authorizationInfo.setStringPermissions(userService.getPermissions(username)); + System.out.println("Shiro授权"); + return authorizationInfo; + } + + @Override + public void clearCachedAuthorizationInfo(PrincipalCollection principals) { + super.clearCachedAuthorizationInfo(principals); + } + + @Override + public void clearCachedAuthenticationInfo(PrincipalCollection principals) { + super.clearCachedAuthenticationInfo(principals); + } + + @Override + public void clearCache(PrincipalCollection principals) { + super.clearCache(principals); + } + +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java new file mode 100644 index 0000000..cba6cf6 --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroConsts.java @@ -0,0 +1,26 @@ +package org.muses.jeeplatform.cas.authentication.shiro; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 16:54  修改内容:
    + * 
    + */ +public class ShiroConsts { + + //验证码Session + public static final String SESSION_SECURITY_CODE = "sessionSecCode"; + //用户信息Session + public static final String SESSION_USER = "sessionUser"; + //角色权限Session + public static final String SESSION_ROLE_RIGHTS = "sessionRoleRights"; + //所有菜单Session + public static final String SESSION_ALLMENU = "sessionAllMenu"; + //权限Session + public static final String SESSION_RIGHTS = "sessionRights"; +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java similarity index 77% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java index 3afcf64..8c49236 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/package-info.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/package-info.java @@ -9,4 +9,4 @@ * 修改后版本: 修改人: 修改日期: 2020/04/24 10:26 修改内容: * */ -package org.muses.jeeplatform.cas.authentication; \ No newline at end of file +package org.muses.jeeplatform.cas; \ No newline at end of file diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java similarity index 94% rename from code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java rename to code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java index 36f59ce..ca5313e 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/model/User.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/model/User.java @@ -1,4 +1,4 @@ -package org.muses.jeeplatform.cas.authentication.model; +package org.muses.jeeplatform.cas.user.model; import lombok.Data; diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java new file mode 100644 index 0000000..9c64dab --- /dev/null +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/user/service/UserService.java @@ -0,0 +1,48 @@ +package org.muses.jeeplatform.cas.user.service; + +import org.muses.jeeplatform.cas.user.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/26 15:26  修改内容:
    + * 
    + */ +@Service +public class UserService { + + @Autowired + @Qualifier("jdbcTemplate") + JdbcTemplate jdbcTemplate; + + + /** + * 通过用户名查询用户信息 + * @param username + * @return + */ + @Transactional(readOnly=true) + //@RedisCache(nameSpace = RedisCacheNamespace.SYS_USER) + public User findByUsername(String username){ + String sql = "SELECT * FROM sys_user WHERE username = ?"; + User info = null; + try { + info = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); + } catch (Exception e) { + e.printStackTrace(); + } + return info; + } + +} diff --git a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories index c7b8f6e..0699430 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories +++ b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.muses.jeeplatform.cas.authentication.config.CustomAuthConfig \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.muses.jeeplatform.cas.authentication.config.UsernamePasswordAuthConfig \ No newline at end of file From 2ad23ce23fa5f7653af4e8a3b6dd598c5d84814f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Sun, 26 Apr 2020 18:21:28 +0800 Subject: [PATCH 070/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=B0=8F=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShiroAuthenticationConfiguration.java | 10 ++--- .../config/UsernamePasswordAuthConfig.java | 2 +- .../handler/ShiroAuthenticationHandler.java | 42 ++++++++++++++----- .../main/resources/META-INF/spring.factories | 4 +- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java index 8ff6570..04bb8e9 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java @@ -33,7 +33,7 @@ * 修改后版本: 修改人: 修改日期: 2020/04/26 16:35 修改内容: * */ -//@Configuration("ShiroAuthenticationConfiguration") +@Configuration("ShiroAuthenticationConfiguration") @EnableConfigurationProperties(CasConfigurationProperties.class) public class ShiroAuthenticationConfiguration implements AuthenticationEventExecutionPlanConfigurer { @Autowired @@ -56,7 +56,7 @@ public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPla } - @Bean + //@Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); @@ -80,9 +80,9 @@ public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { } @Bean - public ShiroAuthorizingRealm myShiroRealm(){ + public ShiroAuthorizingRealm shiroAuthorizingRealm(){ ShiroAuthorizingRealm myShiroRealm = new ShiroAuthorizingRealm(); - myShiroRealm.setCachingEnabled(false); + //myShiroRealm.setCachingEnabled(false); //启用身份验证缓存,即缓存AuthenticationInfo信息,默认false myShiroRealm.setAuthenticationCachingEnabled(false); //启用授权缓存,即缓存AuthorizationInfo信息,默认false @@ -94,7 +94,7 @@ public ShiroAuthorizingRealm myShiroRealm(){ @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); - securityManager.setRealm(myShiroRealm()); + securityManager.setRealm(shiroAuthorizingRealm()); return securityManager; } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java index 83b1676..b2c0ae6 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/UsernamePasswordAuthConfig.java @@ -13,7 +13,7 @@ import org.springframework.context.annotation.Configuration; -@Configuration("UsernamePasswordAuthConfig") +//@Configuration("UsernamePasswordAuthConfig") @EnableConfigurationProperties(CasConfigurationProperties.class) public class UsernamePasswordAuthConfig implements AuthenticationEventExecutionPlanConfigurer { diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java index deaca00..2578df7 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/handler/ShiroAuthenticationHandler.java @@ -1,15 +1,21 @@ package org.muses.jeeplatform.cas.authentication.handler; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authc.*; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.apereo.cas.authentication.*; +import org.apereo.cas.authentication.AuthenticationException; +import org.apereo.cas.authentication.exceptions.AccountDisabledException; import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler; import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import org.apereo.cas.authentication.principal.PrincipalFactory; import org.apereo.cas.services.ServicesManager; +import javax.security.auth.login.AccountLockedException; +import javax.security.auth.login.AccountNotFoundException; +import javax.security.auth.login.CredentialExpiredException; +import javax.security.auth.login.FailedLoginException; import java.security.GeneralSecurityException; /** @@ -31,20 +37,34 @@ public ShiroAuthenticationHandler(String name, ServicesManager servicesManager, @Override protected AuthenticationHandlerExecutionResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential, String originalPassword) throws GeneralSecurityException, PreventedException { - UsernamePasswordToken token = new UsernamePasswordToken(credential.getUsername(),credential.getPassword()); + try { + UsernamePasswordToken token = new UsernamePasswordToken(credential.getUsername(), credential.getPassword()); - if (credential instanceof RememberMeUsernamePasswordCredential) { - token.setRememberMe(RememberMeUsernamePasswordCredential.class.cast(credential).isRememberMe()); - } + if (credential instanceof RememberMeUsernamePasswordCredential) { + token.setRememberMe(RememberMeUsernamePasswordCredential.class.cast(credential).isRememberMe()); + } - Subject subject = getCurrentExecutingSubject(); - subject.login(token); + Subject subject = getCurrentExecutingSubject(); + subject.login(token); - //获取Shiro管理的Session - //Session session = getShiroSession(subject); + //获取Shiro管理的Session + //Session session = getShiroSession(subject); - final String username = subject.getPrincipal().toString(); - return createHandlerResult(credential, this.principalFactory.createPrincipal(username)); + final String username = subject.getPrincipal().toString(); + return createHandlerResult(credential, this.principalFactory.createPrincipal(username)); + } catch (final UnknownAccountException uae) { + throw new AccountNotFoundException(uae.getMessage()); + } catch (final IncorrectCredentialsException ice) { + throw new FailedLoginException(ice.getMessage()); + } catch (final LockedAccountException | ExcessiveAttemptsException lae) { + throw new AccountLockedException(lae.getMessage()); + } catch (final ExpiredCredentialsException eae) { + throw new CredentialExpiredException(eae.getMessage()); + } catch (final DisabledAccountException eae) { + throw new AccountDisabledException(eae.getMessage()); + } catch (final AuthenticationException e) { + throw new FailedLoginException(e.getMessage()); + } } protected Subject getCurrentExecutingSubject(){ diff --git a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories index 0699430..e8f1755 100644 --- a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories +++ b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories @@ -1 +1,3 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.muses.jeeplatform.cas.authentication.config.UsernamePasswordAuthConfig \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.muses.jeeplatform.cas.authentication.config.ShiroAuthenticationConfiguration,\ +org.muses.jeeplatform.cas.authentication.config.JdbcConfig,\ From 131ce331cde931f7e25b6ff1f7398d9ecf5ebb3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Mon, 27 Apr 2020 11:42:25 +0800 Subject: [PATCH 071/123] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89Shiro?= =?UTF-8?q?=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShiroAuthenticationConfiguration.java | 37 ++++++++++++------- .../shiro/ShiroAuthorizingRealm.java | 23 ++++++++++-- .../main/resources/META-INF/spring.factories | 3 +- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java index 04bb8e9..d8d6545 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/config/ShiroAuthenticationConfiguration.java @@ -15,6 +15,7 @@ import org.muses.jeeplatform.cas.authentication.shiro.ShiroAuthorizingRealm; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -43,19 +44,6 @@ public class ShiroAuthenticationConfiguration implements AuthenticationEventExec @Qualifier("servicesManager") private ServicesManager servicesManager; - - @Bean - public AuthenticationHandler myAuthenticationHandler() { - return new ShiroAuthenticationHandler(ShiroAuthenticationHandler.class.getName(), - servicesManager, new DefaultPrincipalFactory(), 1); - } - - @Override - public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { - plan.registerAuthenticationHandler(myAuthenticationHandler()); - } - - //@Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); @@ -98,6 +86,29 @@ public SecurityManager securityManager(){ return securityManager; } + /** + * Spring静态注入 + * @return + */ + @Bean + public MethodInvokingFactoryBean getMethodInvokingFactoryBean(){ + MethodInvokingFactoryBean factoryBean = new MethodInvokingFactoryBean(); + factoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager"); + factoryBean.setArguments(new Object[]{securityManager()}); + return factoryBean; + } + + @Bean + public AuthenticationHandler myAuthenticationHandler() { + return new ShiroAuthenticationHandler(ShiroAuthenticationHandler.class.getName(), + servicesManager, new DefaultPrincipalFactory(), 1); + } + + @Override + public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) { + plan.registerAuthenticationHandler(myAuthenticationHandler()); + } + } diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java index 7c9871b..909dfa5 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java @@ -11,7 +11,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; /** *
    @@ -29,8 +31,8 @@ public class ShiroAuthorizingRealm extends AuthorizingRealm {
         Logger LOG = LoggerFactory.getLogger(ShiroAuthorizingRealm.class);
     
         /**注解引入业务类**/
    -    @Autowired
    -    UserService userService;
    +    //@Autowired
    +    //UserService userService;
     
         /**
          * 登录信息和用户验证信息验证(non-Javadoc)
    @@ -44,7 +46,22 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
     
             LOG.info("Shiro doGetAuthenticationInfo>> username:{},password:{}",username,password);
     
    -        User user = userService.findByUsername(username);
    +        //User user = userService.findByUsername(username);
    +        // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池
    +        DriverManagerDataSource dataSource = new DriverManagerDataSource();
    +        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    +        dataSource.setUrl("jdbc:mysql://192.168.0.152:33306/jeeplatform");
    +        dataSource.setUsername("root");
    +        dataSource.setPassword("minstone");
    +
    +        // 创建JDBC模板
    +        JdbcTemplate jdbcTemplate = new JdbcTemplate();
    +        jdbcTemplate.setDataSource(dataSource);
    +
    +        String sql = "SELECT * FROM sys_user WHERE username = ?";
    +
    +        User user = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class));
    +
     
             /**检测是否有此用户 **/
             if(user == null){
    diff --git a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories
    index e8f1755..1d0e5ac 100644
    --- a/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories
    +++ b/code/jeeplatform-sso-cas/src/main/resources/META-INF/spring.factories
    @@ -1,3 +1,2 @@
     org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    -org.muses.jeeplatform.cas.authentication.config.ShiroAuthenticationConfiguration,\
    -org.muses.jeeplatform.cas.authentication.config.JdbcConfig,\
    +org.muses.jeeplatform.cas.authentication.config.ShiroAuthenticationConfiguration
    
    From 8ffb13483ec4b3a23e1547a4752e8bde166eb7f8 Mon Sep 17 00:00:00 2001
    From: smileNicky <3623307211@qq.com>
    Date: Tue, 28 Apr 2020 15:58:54 +0800
    Subject: [PATCH 072/123] =?UTF-8?q?OA=E6=8E=A5=E5=85=A5cas=E5=8D=95?=
     =?UTF-8?q?=E7=82=B9=E7=99=BB=E5=BD=95?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     code/jeeplatform-oa/pom.xml                   | 17 +++++
     .../muses/jeeplatform/oa/OAApplication.java   |  8 +++
     .../CustomAuthticationRedirectStrategy.java   | 31 +++++++++
     .../jeeplatform/oa/config/CASConfig.java      | 63 +++++++++++++++++++
     .../jeeplatform/oa/config/DefaultView.java    | 27 ++++++++
     .../oa/web/controller/OAIndexController.java  |  6 +-
     .../src/main/resources/application.yml        | 26 ++++++++
     .../src/main/resources/templates/index.html   | 13 ++++
     8 files changed, 189 insertions(+), 2 deletions(-)
     create mode 100644 code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java
     create mode 100644 code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java
     create mode 100644 code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java
     create mode 100644 code/jeeplatform-oa/src/main/resources/application.yml
     create mode 100644 code/jeeplatform-oa/src/main/resources/templates/index.html
    
    diff --git a/code/jeeplatform-oa/pom.xml b/code/jeeplatform-oa/pom.xml
    index b2b5ede..e0134f7 100644
    --- a/code/jeeplatform-oa/pom.xml
    +++ b/code/jeeplatform-oa/pom.xml
    @@ -10,7 +10,13 @@
         4.0.0
     
         jeeplatform-oa
    +    jeeplatform-oa
         jar
    +    ${jeeplatform-oa.version}
    +
    +    
    +        jeeplatform-oa
    +    
     
         
             
    @@ -19,6 +25,17 @@
                 spring-boot-starter-web
                 ${spring-boot.version}
             
    +        
    +        
    +            org.springframework.boot
    +            spring-boot-starter-thymeleaf
    +        
    +        
    +        
    +            net.unicon.cas
    +            cas-client-autoconfig-support
    +            1.5.0-GA
    +        
         
     
     
    diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java
    index b259ec7..be5bb08 100644
    --- a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java
    +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/OAApplication.java
    @@ -2,13 +2,21 @@
     
     import org.springframework.boot.SpringApplication;
     import org.springframework.boot.autoconfigure.SpringBootApplication;
    +import org.springframework.web.bind.annotation.GetMapping;
    +import org.springframework.web.bind.annotation.RestController;
     
     @SpringBootApplication
    +@RestController
     public class OAApplication {
     
         public static void main(String[] args) {
             SpringApplication.run(OAApplication.class, args);
         }
     
    +    @GetMapping("/test")
    +    public String test(){
    +        return "hello world!";
    +    }
    +
     
     }
    diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java
    new file mode 100644
    index 0000000..e11ca43
    --- /dev/null
    +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/cas/CustomAuthticationRedirectStrategy.java
    @@ -0,0 +1,31 @@
    +package org.muses.jeeplatform.oa.cas;
    +
    +import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy;
    +
    +import javax.servlet.http.HttpServletRequest;
    +import javax.servlet.http.HttpServletResponse;
    +import java.io.IOException;
    +
    +/**
    + * 
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/27 13:37  修改内容:
    + * 
    + */ +public class CustomAuthticationRedirectStrategy implements AuthenticationRedirectStrategy { + + @Override + public void redirect(HttpServletRequest request, HttpServletResponse response, String potentialRedirectUrl) throws IOException { +// response.setCharacterEncoding("utf-8"); +// response.setContentType("application/json; charset=utf-8"); +// PrintWriter out = response.getWriter(); +// out.write("401"); + //response重定向 + response.sendRedirect(potentialRedirectUrl); + } +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java new file mode 100644 index 0000000..3b32fcb --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/CASConfig.java @@ -0,0 +1,63 @@ +package org.muses.jeeplatform.oa.config; + +import net.unicon.cas.client.configuration.CasClientConfigurerAdapter; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020年04月11日  修改内容:
    + * 
    + */ +@Configuration +@EnableCasClient +public class CASConfig extends CasClientConfigurerAdapter { + + + private static final String CAS_SERVER_URL_LOGIN = "http://127.0.0.1:8080/cas/login"; + private static final String SERVER_NAME = "http://127.0.0.1:8082/"; + + private static final String AUTHENTICATION_REDIRECT_STRATEGY_CLASS = "org.muses.jeeplatform.oa.cas.CustomAuthticationRedirectStrategy"; + + @Override + public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { + super.configureAuthenticationFilter(authenticationFilter); + authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass",AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + } + + @Override + public void configureValidationFilter(FilterRegistrationBean validationFilter) { + Map initParameters = validationFilter.getInitParameters(); + initParameters.put("encodeServiceUrl", "false"); + } + + @Bean + public FilterRegistrationBean filterRegistrationBean(){ + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new AuthenticationFilter()); + registrationBean.addUrlPatterns("/*"); + Map initParameters = new HashMap(4); + initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN); + initParameters.put("serverName",SERVER_NAME); + initParameters.put("ignorePattern","/logoutSuccess/*"); + // 自定义重定向策略 + initParameters.put("authenticationRedirectStrategyClass", AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + registrationBean.setInitParameters(initParameters); + registrationBean.setOrder(1); + return registrationBean; + } + + +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java new file mode 100644 index 0000000..84acb8f --- /dev/null +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/config/DefaultView.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.oa.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/28 13:29  修改内容:
    + * 
    + */ +//@Configuration +public class DefaultView extends WebMvcConfigurerAdapter { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + super.addViewControllers(registry); + } +} diff --git a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java index b73774f..b81fe75 100644 --- a/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java +++ b/code/jeeplatform-oa/src/main/java/org/muses/jeeplatform/oa/web/controller/OAIndexController.java @@ -2,6 +2,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** @@ -18,8 +19,9 @@ @Controller public class OAIndexController { - @GetMapping(value = {"/index"}) + @GetMapping(value = {"/"}) public ModelAndView toIndexPage(){ - return new ModelAndView(""); + return new ModelAndView("index"); } + } diff --git a/code/jeeplatform-oa/src/main/resources/application.yml b/code/jeeplatform-oa/src/main/resources/application.yml new file mode 100644 index 0000000..b04f158 --- /dev/null +++ b/code/jeeplatform-oa/src/main/resources/application.yml @@ -0,0 +1,26 @@ +server: + context-path: /oa + port: 8082 + error: + path: /error +spring: + #添加Thymeleaf配置,除了cache在项目没上线前建议关了,其它配置都可以不用配的,本博客只是列举一下有这些配置 + thymeleaf: + # cache默认开启的,这里可以关了,项目上线之前,项目上线后可以开启 + cache: false + # 这个prefix可以注释,因为默认就是templates的,您可以改成其它的自定义路径 + prefix: classpath:/templates/ + suffix: .html + mode: HTML5 + # 指定一下编码为utf8 + encoding: UTF-8 + # context-type为text/html,也可以不指定,因为boot可以自动识别 + content-type: text/html + + +cas: + server-login-url: http://127.0.0.1:8080/cas/login + server-url-prefix: http://127.0.0.1:8080/cas + client-host-url: http://127.0.0.1:8082 + + diff --git a/code/jeeplatform-oa/src/main/resources/templates/index.html b/code/jeeplatform-oa/src/main/resources/templates/index.html new file mode 100644 index 0000000..de51525 --- /dev/null +++ b/code/jeeplatform-oa/src/main/resources/templates/index.html @@ -0,0 +1,13 @@ + + + + 首页 + + + + + + +hi + + \ No newline at end of file From f6d6acc9c0dd156663e91480530b4aa3361b2131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Tue, 28 Apr 2020 16:45:15 +0800 Subject: [PATCH 073/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=8Cadmin=E5=B7=A5=E7=A8=8B=E6=9A=82=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E6=8E=A5=E5=85=A5cas=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-admin/pom.xml | 18 +++++ .../muses/jeeplatform/AdminApplication.java | 31 +++++++++ .../CustomAuthticationRedirectStrategy.java | 36 ++++++++++ .../muses/jeeplatform/config/CASConfig.java | 58 +++++++++++++--- .../muses/jeeplatform/config/CorsConfig.java | 28 ++++++++ .../muses/jeeplatform/config/DefaultView.java | 27 ++++++++ .../jeeplatform/core/dto/admin/UserDto.java | 69 +++++++++++++++++++ .../shiro/ShiroAuthorizingRealm.java | 18 ++++- code/pom.xml | 23 ++----- 9 files changed, 280 insertions(+), 28 deletions(-) create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java create mode 100644 code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java create mode 100644 code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java diff --git a/code/jeeplatform-admin/pom.xml b/code/jeeplatform-admin/pom.xml index 1f16850..c5fa26a 100644 --- a/code/jeeplatform-admin/pom.xml +++ b/code/jeeplatform-admin/pom.xml @@ -53,6 +53,18 @@ ${spring-boot.version} + + + com.alibaba + druid + ${druid.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + io.springfox @@ -120,6 +132,12 @@ cas-client-autoconfig-support 1.5.0-GA + + diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java index 0de6b81..2dab8fb 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/AdminApplication.java @@ -1,6 +1,8 @@ package org.muses.jeeplatform; +import net.unicon.cas.client.configuration.EnableCasClient; +import org.jasig.cas.client.validation.Assertion; import org.muses.jeeplatform.cache.redis.RedisClient; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; @@ -14,8 +16,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + /** * @author caiyuyu */ @@ -53,4 +61,27 @@ public String get(String key) throws Exception { // return c; // } + @GetMapping("/auth") + public void auth(HttpServletRequest request, HttpServletResponse response, HttpSession session) { + Assertion assertion = (Assertion) session.getAttribute("_const_cas_assertion_"); + response.setHeader("Content-type", "application/json;charset=UTF-8"); + response.setCharacterEncoding("utf-8"); + response.setStatus(200); + if (assertion != null) { + String redirectUrl= request.getParameter("redirectUrl"); + try { + response.setHeader("Content-type", "text/html;charset=UTF-8"); + response.sendRedirect(redirectUrl); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + try { + response.getWriter().print("401"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java new file mode 100644 index 0000000..01845de --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/authentication/cas/CustomAuthticationRedirectStrategy.java @@ -0,0 +1,36 @@ +package org.muses.jeeplatform.authentication.cas; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.shiro.authc.pam.AbstractAuthenticationStrategy; +import org.jasig.cas.client.authentication.AuthenticationRedirectStrategy; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/27 13:37  修改内容:
    + * 
    + */ +public class CustomAuthticationRedirectStrategy implements AuthenticationRedirectStrategy { + + @Override + public void redirect(HttpServletRequest request, HttpServletResponse response, String potentialRedirectUrl) throws IOException { +// response.setCharacterEncoding("utf-8"); +// response.setContentType("application/json; charset=utf-8"); +// PrintWriter out = response.getWriter(); +// out.write("401"); + //response重定向 + response.sendRedirect(potentialRedirectUrl); + } +} diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java index 43199d6..d777822 100644 --- a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CASConfig.java @@ -3,16 +3,21 @@ import net.unicon.cas.client.configuration.CasClientConfigurerAdapter; import net.unicon.cas.client.configuration.EnableCasClient; import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; import java.util.HashMap; import java.util.Map; /** *
    - *
    + *  TODO 接入CAS 单点登录
      * 
    * * @author nicky @@ -21,32 +26,63 @@ * 修改后版本: 修改人: 修改日期: 2020年04月11日 修改内容: *
    */ -@Configuration -@EnableCasClient +//@Configuration +//@EnableCasClient +//@EnableConfigurationProperties(CasConfigurationProperties.class) public class CASConfig extends CasClientConfigurerAdapter { - private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login"; - private static final String SERVER_NAME = "http://localhost:8081/"; +// @Autowired +// private CasConfigurationProperties casProperties; + + private static final String CAS_SERVER_URL_LOGIN = "http://127.0.0.1:8080/cas/login"; + private static final String SERVER_NAME = "http://127.0.0.1:8081/"; + + private static final String AUTHENTICATION_REDIRECT_STRATEGY_CLASS = "org.muses.jeeplatform.authentication.cas.CustomAuthticationRedirectStrategy"; -// @Override -// public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { -// super.configureAuthenticationFilter(authenticationFilter); -// //authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass","com.patterncat.CustomAuthRedirectStrategy"); -// } + @Override + public void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { + super.configureAuthenticationFilter(authenticationFilter); + authenticationFilter.getInitParameters().put("authenticationRedirectStrategyClass",AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + } + + @Override + public void configureValidationFilter(FilterRegistrationBean validationFilter) { + Map initParameters = validationFilter.getInitParameters(); + initParameters.put("encodeServiceUrl", "false"); + } @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new AuthenticationFilter()); registrationBean.addUrlPatterns("/*"); - Map initParameters = new HashMap(16); + Map initParameters = new HashMap(4); initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN); initParameters.put("serverName",SERVER_NAME); initParameters.put("ignorePattern","/logoutSuccess/*"); + // 自定义重定向策略 + initParameters.put("authenticationRedirectStrategyClass", AUTHENTICATION_REDIRECT_STRATEGY_CLASS); + registrationBean.setInitParameters(initParameters); registrationBean.setOrder(1); return registrationBean; } + /*@Bean + public FilterRegistrationBean corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new CorsFilter(source)); + registrationBean.setOrder(1); + return registrationBean; + }*/ + + } diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java new file mode 100644 index 0000000..e0d2d59 --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/CorsConfig.java @@ -0,0 +1,28 @@ +package org.muses.jeeplatform.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +/** + * TODO SSO跨域支持 + * @Author mazq + * @Date 2020/04/28 14:55 + * @Param + * @return + */ +//@Configuration +public class CorsConfig extends WebMvcConfigurationSupport { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedHeaders("*") + .allowedMethods("*") + .maxAge(3600) + .allowCredentials(true); + } + + +} \ No newline at end of file diff --git a/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java new file mode 100644 index 0000000..0ff2b1f --- /dev/null +++ b/code/jeeplatform-admin/src/main/java/org/muses/jeeplatform/config/DefaultView.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/28 13:29  修改内容:
    + * 
    + */ +//@Configuration +public class DefaultView extends WebMvcConfigurerAdapter { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + super.addViewControllers(registry); + } +} diff --git a/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java new file mode 100644 index 0000000..38491b0 --- /dev/null +++ b/code/jeeplatform-provider-api/src/main/java/org/muses/jeeplatform/core/dto/admin/UserDto.java @@ -0,0 +1,69 @@ +package org.muses.jeeplatform.core.dto.admin; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.muses.jeeplatform.core.entity.admin.Role; + +import java.io.Serializable; +import java.util.Date; +import java.util.Set; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/27 17:20  修改内容:
    + * 
    + */ +@Data +@AllArgsConstructor +public class UserDto implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; + + private Set roles; + +} diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java index 909dfa5..d1c01ce 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/shiro/ShiroAuthorizingRealm.java @@ -1,10 +1,13 @@ package org.muses.jeeplatform.cas.authentication.shiro; +import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.session.Session; import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.Subject; import org.muses.jeeplatform.cas.user.model.User; import org.muses.jeeplatform.cas.user.service.UserService; import org.slf4j.Logger; @@ -61,7 +64,12 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) String sql = "SELECT * FROM sys_user WHERE username = ?"; User user = (User) jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper(User.class)); - + Subject subject = getCurrentExecutingSubject(); + //获取Shiro管理的Session + Session session = getShiroSession(subject); + //Shiro添加会话 + session.setAttribute("username", username); + session.setAttribute(ShiroConsts.SESSION_USER, user); /**检测是否有此用户 **/ if(user == null){ @@ -109,4 +117,12 @@ public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } + protected Subject getCurrentExecutingSubject(){ + return SecurityUtils.getSubject(); + } + + protected Session getShiroSession(Subject subject){ + return subject.getSession(); + } + } diff --git a/code/pom.xml b/code/pom.xml index dcdee5a..bdea782 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -18,11 +18,12 @@ UTF-8 - 1.0 - 1.0 - 1.0 - 1.0 - 1.0 + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 + 1.1.0 1.2.17 5.1.27 @@ -157,17 +158,7 @@ true
    - - - com.alibaba - druid - ${druid.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - + From 5571ee0e642cfd482c8c6229e7b6cb62da4f1c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Tue, 28 Apr 2020 16:45:33 +0800 Subject: [PATCH 074/123] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=8Cadmin=E5=B7=A5=E7=A8=8B=E6=9A=82=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E6=8E=A5=E5=85=A5cas=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/jeeplatform-admin/src/main/resources/application-dev.yml b/code/jeeplatform-admin/src/main/resources/application-dev.yml index dbf87d9..30d2464 100644 --- a/code/jeeplatform-admin/src/main/resources/application-dev.yml +++ b/code/jeeplatform-admin/src/main/resources/application-dev.yml @@ -69,11 +69,12 @@ spring: maxTotal : 100 maxIdle : 10 maxWaitMillis : 100000 -cas: - server-login-url: http://127.0.0.1:8080/cas/login - server-url-prefix: http://127.0.0.1:8080/cas - client-host-url: http://127.0.0.1:8081 - validation-type: cas +#cas: +# server-login-url: http://127.0.0.1:8080/cas/login +# server-url-prefix: http://127.0.0.1:8080/cas +# client-host-url: http://127.0.0.1:8081 +# validation-type: cas +# authentication-url-patterns: /auth # use-session: true From 3272830fbfe663bd156e74a50e4fbe2e6eab539d Mon Sep 17 00:00:00 2001 From: Nicky <362330721@qq.com> Date: Tue, 28 Apr 2020 16:54:59 +0800 Subject: [PATCH 075/123] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c03c0c0..74667c0 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login ### CMS管理系统(待开发) ## 三、关键技术 -### 单点登录基础(模块名称jeeplatform-sso)(开发中) +### 单点登录基础(模块名称jeeplatform-sso-cas)(开发中) > 项目采用CAS登录登录实现,单点登录集群搭建可以参考博客: > http://blog.csdn.net/u014427391/article/details/78653482 > 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。 @@ -212,14 +212,14 @@ public class RedisAspect { ## 七、版本说明 * master版本 -主干版本,代码经过测试,可以正常运行,这个版本还没集成全部CAS单点代码,因为CAS单点服务端代码基本调试成功,而客户端对接出现bug,所以并没有merge代码 +主干版本,代码经过测试,可以正常运行,这个版本还没集成全部CAS单点代码,因为CAS单点服务端代码基本调试成功,而客户端还没实现跨越,所以并没有merge代码 * dev版本 dev版本代码和master分支基本一致 * 1.0.0版本 -进行CAS单点登录实验的版本,CAS集成有遇到问题,还没合并代码到dev和master +基础版,基本实现简单的权限管理,功能还需改善,权限控制还需要进行细粒度控制 -* 1.0.1版本 -进行Dubbo微服务实验的版本,代码还没合并到dev和master +* 1.1.0版本 +进行CAS单点登录对接实验的版本,admin工程暂时还没对接,oa工程有对接 ## 八、项目技术博客介绍 为了帮助学习者更好地理解代码,下面给出自己写的一些博客链接 From fda8da30fd844628995af5c266740a3289985f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Tue, 28 Apr 2020 17:05:14 +0800 Subject: [PATCH 076/123] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/pom.xml b/code/pom.xml index bdea782..9e93ddc 100755 --- a/code/pom.xml +++ b/code/pom.xml @@ -21,7 +21,7 @@ 1.1.0 1.1.0 1.1.0 - 1.1.0 + 1.1.0 1.1.0 1.1.0 @@ -158,8 +158,6 @@ true - - mysql From 9c9fc04aa2513ea2c560694652f85714bf4ac6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Wed, 29 Apr 2020 10:00:52 +0800 Subject: [PATCH 077/123] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cas/authentication/encode/MD5PasswordEncoder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java index b631145..9cb565b 100644 --- a/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java +++ b/code/jeeplatform-sso-cas/src/main/java/org/muses/jeeplatform/cas/authentication/encode/MD5PasswordEncoder.java @@ -4,7 +4,7 @@ /** *
    - *
    + *   自定义PasswordEncoder
      * 
    * *
    @@ -22,7 +22,7 @@ public String encode(CharSequence charSequence) {
     
         @Override
         public boolean matches(CharSequence charSequence, String s) {
    -        String encodeStr = charSequence.toString() + "";
    +        String encodeStr = charSequence.toString() + "aa";
             if (encodeStr.equals(s)) {
                 return true;
             }
    
    From 73a2ce5e940add7634ed6e73b0280ac6d13ea00b Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 10:05:13 +0800
    Subject: [PATCH 078/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 74667c0..e1a9bf1 100644
    --- a/README.md
    +++ b/README.md
    @@ -37,7 +37,7 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     ### 单点登录基础(模块名称jeeplatform-sso-cas)(开发中)
     > 项目采用CAS登录登录实现,单点登录集群搭建可以参考博客:
     > http://blog.csdn.net/u014427391/article/details/78653482
    -> 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。
    +> 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。OA已经对接CAS,admin工程暂时不对接CAS
     
     单点登录集群如图
     ![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/单点登录集群.png)
    
    From 1e03e9b6d1ce8621c8153aca1c6d733313a646c9 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 10:15:22 +0800
    Subject: [PATCH 079/123] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index e1a9bf1..920730d 100644
    --- a/README.md
    +++ b/README.md
    @@ -39,7 +39,7 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     > http://blog.csdn.net/u014427391/article/details/78653482
     > 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。OA已经对接CAS,admin工程暂时不对接CAS
     
    -单点登录集群如图
    +单点登录集群方案如图
     ![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/单点登录集群.png)
     
     ### SpringBoot集成Redis缓存处理(Spring AOP实现)
    
    From 12b172f26f0a0d64d289fc3d6c588aa6b6c0c7cb Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 10:24:49 +0800
    Subject: [PATCH 080/123] Update README.md
    
    ---
     README.md | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/README.md b/README.md
    index 920730d..0c9ee7a 100644
    --- a/README.md
    +++ b/README.md
    @@ -34,11 +34,18 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     ### CMS管理系统(待开发)
     
     ## 三、关键技术
    -### 单点登录基础(模块名称jeeplatform-sso-cas)(开发中)
    -> 项目采用CAS登录登录实现,单点登录集群搭建可以参考博客:
    +### 单点登录基础(模块名称jeeplatform-sso-cas)(功能修整中)
    +> 项目采用CAS实现单点登录,单点登录集群搭建可以参考博客:
     > http://blog.csdn.net/u014427391/article/details/78653482
     > 项目单点登录:使用nginx作为负载均衡,使用redis存储tomcat session,来实现集群中tomcat session的共享,使用redis作为cas ticket的仓库,来实现集群中cas ticket的一致性。OA已经对接CAS,admin工程暂时不对接CAS
     
    +
    +图来自官网,这里简单介绍一下,从图可以看出,CAS支持多种方式的认证,一种是LDAP的、比较常见的数据库Database的JDBC,还有Active Directory等等;支持的协议有Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等
    +![这里写图片描述](https://img-blog.csdn.net/20180902172712501?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    +
    +CAS单点登录原理,图来自官网
    +![这里写图片描述](https://img-blog.csdn.net/20180826231806797?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    +
     单点登录集群方案如图
     ![Image text](https://github.com/u014427391/jeeplatform/raw/master/screenshot/单点登录集群.png)
     
    
    From 0e9ec5bc2885d42c3f12ec2c466f87141a99575e Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 10:28:51 +0800
    Subject: [PATCH 081/123] Update README.md
    
    
    From 3148dc0bb7d28511c178ab22fb99a2d82d534d48 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 11:04:15 +0800
    Subject: [PATCH 082/123] Update README.md
    
    ---
     README.md | 8 +++++---
     1 file changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/README.md b/README.md
    index 0c9ee7a..09c7115 100644
    --- a/README.md
    +++ b/README.md
    @@ -256,10 +256,10 @@ dev版本代码和master分支基本一致
     * [Redis学习笔记之分布式锁](https://blog.csdn.net/u014427391/article/details/84934045)
     
     ### Oracle知识
    -* [Oracle知识整理笔录](https://blog.csdn.net/u014427391/article/details/82317376)
     * [Oracle笔记之锁表和解锁](https://blog.csdn.net/u014427391/article/details/83046148)
     * [select in超过1000条报错解决方法](https://blog.csdn.net/u014427391/article/details/87922878)
     * [Oracle笔记之修改表字段类型](https://blog.csdn.net/u014427391/article/details/83046006)
    +* [Oracle知识整理笔录](https://blog.csdn.net/u014427391/article/details/82317376)
     * [Oracle merge合并更新函数](https://blog.csdn.net/u014427391/article/details/87898729)
     
     ### MySQL知识
    @@ -268,8 +268,10 @@ dev版本代码和master分支基本一致
     ### 单点登录
     * [ 单点登录集群安装教程](http://blog.csdn.net/u014427391/article/details/78653482)
     * [CAS单点登录系列之原理简单介绍](https://blog.csdn.net/u014427391/article/details/82083995)
    -* [CAS单点登录系列之服务端部署](https://blog.csdn.net/u014427391/article/details/91345307)
    -* [CAS单点登录系列之支持数据库认证](https://blog.csdn.net/u014427391/article/details/91345240)
    +* [CAS系列之使用cas overlay搭建服务端(一)](https://blog.csdn.net/u014427391/article/details/105818468)
    +* [CAS 5.3.1系列之支持JDBC认证登录(二)](https://blog.csdn.net/u014427391/article/details/105603895)
    +* [CAS 5.3.1系列之自定义JDBC认证策略(三)](https://blog.csdn.net/u014427391/article/details/105820486)
    +* [CAS 5.3.1系列之自定义Shiro认证策略(四)](https://blog.csdn.net/u014427391/article/details/105820586)
     
     ### Docker笔记
     * [Docker简介和安装教程](https://smilenicky.blog.csdn.net/article/details/97613891)
    
    From 733ed2cc8075ede1fdc5c305946f06a9c335a397 Mon Sep 17 00:00:00 2001
    From: Nicky <362330721@qq.com>
    Date: Wed, 29 Apr 2020 14:48:58 +0800
    Subject: [PATCH 083/123] Update README.md
    
    ---
     README.md | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/README.md b/README.md
    index 09c7115..51f9363 100644
    --- a/README.md
    +++ b/README.md
    @@ -41,6 +41,7 @@ ps:登录链接一般为:http://127.0.0.1:8080/jeeplatform/login
     
     
     图来自官网,这里简单介绍一下,从图可以看出,CAS支持多种方式的认证,一种是LDAP的、比较常见的数据库Database的JDBC,还有Active Directory等等;支持的协议有Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等
    +
     ![这里写图片描述](https://img-blog.csdn.net/20180902172712501?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
     
     CAS单点登录原理,图来自官网
    
    From 6ea1d5f1d434b971f905cce293c3a9ab1b8ed247 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= 
    Date: Wed, 29 Apr 2020 16:41:48 +0800
    Subject: [PATCH 084/123] =?UTF-8?q?=E6=8F=90=E4=BA=A4Oauth2.0=E7=BB=9F?=
     =?UTF-8?q?=E4=B8=80=E8=AE=A4=E8=AF=81=E5=B7=A5=E7=A8=8B?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     code/jeeplatform-sso-cas/pom.xml              |   1 +
     code/jeeplatform-sso-oauth2/.gitignore        |  31 ++
     code/jeeplatform-sso-oauth2/mvnw              | 310 ++++++++++++++++++
     code/jeeplatform-sso-oauth2/pom.xml           |  66 ++++
     .../JeeplatformSsoOauth2Application.java      |  15 +
     .../jeeplatform/oauth/config/OAuthConfig.java |  39 +++
     .../src/main/resources/application.properties |   1 +
     .../src/main/resources/application.yml        |   3 +
     .../JeeplatformSsoOauth2ApplicationTests.java |  13 +
     9 files changed, 479 insertions(+)
     create mode 100644 code/jeeplatform-sso-oauth2/.gitignore
     create mode 100644 code/jeeplatform-sso-oauth2/mvnw
     create mode 100644 code/jeeplatform-sso-oauth2/pom.xml
     create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java
     create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java
     create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/application.properties
     create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/application.yml
     create mode 100644 code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java
    
    diff --git a/code/jeeplatform-sso-cas/pom.xml b/code/jeeplatform-sso-cas/pom.xml
    index b746df5..1886102 100644
    --- a/code/jeeplatform-sso-cas/pom.xml
    +++ b/code/jeeplatform-sso-cas/pom.xml
    @@ -26,6 +26,7 @@
             1.8
             1.8
             1.5.14.RELEASE
    +        1.1.0
         
     
         
    diff --git a/code/jeeplatform-sso-oauth2/.gitignore b/code/jeeplatform-sso-oauth2/.gitignore
    new file mode 100644
    index 0000000..a2a3040
    --- /dev/null
    +++ b/code/jeeplatform-sso-oauth2/.gitignore
    @@ -0,0 +1,31 @@
    +HELP.md
    +target/
    +!.mvn/wrapper/maven-wrapper.jar
    +!**/src/main/**
    +!**/src/test/**
    +
    +### STS ###
    +.apt_generated
    +.classpath
    +.factorypath
    +.project
    +.settings
    +.springBeans
    +.sts4-cache
    +
    +### IntelliJ IDEA ###
    +.idea
    +*.iws
    +*.iml
    +*.ipr
    +
    +### NetBeans ###
    +/nbproject/private/
    +/nbbuild/
    +/dist/
    +/nbdist/
    +/.nb-gradle/
    +build/
    +
    +### VS Code ###
    +.vscode/
    diff --git a/code/jeeplatform-sso-oauth2/mvnw b/code/jeeplatform-sso-oauth2/mvnw
    new file mode 100644
    index 0000000..a16b543
    --- /dev/null
    +++ b/code/jeeplatform-sso-oauth2/mvnw
    @@ -0,0 +1,310 @@
    +#!/bin/sh
    +# ----------------------------------------------------------------------------
    +# Licensed to the Apache Software Foundation (ASF) under one
    +# or more contributor license agreements.  See the NOTICE file
    +# distributed with this work for additional information
    +# regarding copyright ownership.  The ASF licenses this file
    +# to you under the Apache License, Version 2.0 (the
    +# "License"); you may not use this file except in compliance
    +# with the License.  You may obtain a copy of the License at
    +#
    +#    https://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing,
    +# software distributed under the License is distributed on an
    +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    +# KIND, either express or implied.  See the License for the
    +# specific language governing permissions and limitations
    +# under the License.
    +# ----------------------------------------------------------------------------
    +
    +# ----------------------------------------------------------------------------
    +# Maven Start Up Batch script
    +#
    +# Required ENV vars:
    +# ------------------
    +#   JAVA_HOME - location of a JDK home dir
    +#
    +# Optional ENV vars
    +# -----------------
    +#   M2_HOME - location of maven2's installed home dir
    +#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
    +#     e.g. to debug Maven itself, use
    +#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
    +#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
    +# ----------------------------------------------------------------------------
    +
    +if [ -z "$MAVEN_SKIP_RC" ] ; then
    +
    +  if [ -f /etc/mavenrc ] ; then
    +    . /etc/mavenrc
    +  fi
    +
    +  if [ -f "$HOME/.mavenrc" ] ; then
    +    . "$HOME/.mavenrc"
    +  fi
    +
    +fi
    +
    +# OS specific support.  $var _must_ be set to either true or false.
    +cygwin=false;
    +darwin=false;
    +mingw=false
    +case "`uname`" in
    +  CYGWIN*) cygwin=true ;;
    +  MINGW*) mingw=true;;
    +  Darwin*) darwin=true
    +    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
    +    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
    +    if [ -z "$JAVA_HOME" ]; then
    +      if [ -x "/usr/libexec/java_home" ]; then
    +        export JAVA_HOME="`/usr/libexec/java_home`"
    +      else
    +        export JAVA_HOME="/Library/Java/Home"
    +      fi
    +    fi
    +    ;;
    +esac
    +
    +if [ -z "$JAVA_HOME" ] ; then
    +  if [ -r /etc/gentoo-release ] ; then
    +    JAVA_HOME=`java-config --jre-home`
    +  fi
    +fi
    +
    +if [ -z "$M2_HOME" ] ; then
    +  ## resolve links - $0 may be a link to maven's home
    +  PRG="$0"
    +
    +  # need this for relative symlinks
    +  while [ -h "$PRG" ] ; do
    +    ls=`ls -ld "$PRG"`
    +    link=`expr "$ls" : '.*-> \(.*\)$'`
    +    if expr "$link" : '/.*' > /dev/null; then
    +      PRG="$link"
    +    else
    +      PRG="`dirname "$PRG"`/$link"
    +    fi
    +  done
    +
    +  saveddir=`pwd`
    +
    +  M2_HOME=`dirname "$PRG"`/..
    +
    +  # make it fully qualified
    +  M2_HOME=`cd "$M2_HOME" && pwd`
    +
    +  cd "$saveddir"
    +  # echo Using m2 at $M2_HOME
    +fi
    +
    +# For Cygwin, ensure paths are in UNIX format before anything is touched
    +if $cygwin ; then
    +  [ -n "$M2_HOME" ] &&
    +    M2_HOME=`cygpath --unix "$M2_HOME"`
    +  [ -n "$JAVA_HOME" ] &&
    +    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
    +  [ -n "$CLASSPATH" ] &&
    +    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
    +fi
    +
    +# For Mingw, ensure paths are in UNIX format before anything is touched
    +if $mingw ; then
    +  [ -n "$M2_HOME" ] &&
    +    M2_HOME="`(cd "$M2_HOME"; pwd)`"
    +  [ -n "$JAVA_HOME" ] &&
    +    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
    +fi
    +
    +if [ -z "$JAVA_HOME" ]; then
    +  javaExecutable="`which javac`"
    +  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
    +    # readlink(1) is not available as standard on Solaris 10.
    +    readLink=`which readlink`
    +    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
    +      if $darwin ; then
    +        javaHome="`dirname \"$javaExecutable\"`"
    +        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
    +      else
    +        javaExecutable="`readlink -f \"$javaExecutable\"`"
    +      fi
    +      javaHome="`dirname \"$javaExecutable\"`"
    +      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
    +      JAVA_HOME="$javaHome"
    +      export JAVA_HOME
    +    fi
    +  fi
    +fi
    +
    +if [ -z "$JAVACMD" ] ; then
    +  if [ -n "$JAVA_HOME"  ] ; then
    +    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
    +      # IBM's JDK on AIX uses strange locations for the executables
    +      JAVACMD="$JAVA_HOME/jre/sh/java"
    +    else
    +      JAVACMD="$JAVA_HOME/bin/java"
    +    fi
    +  else
    +    JAVACMD="`which java`"
    +  fi
    +fi
    +
    +if [ ! -x "$JAVACMD" ] ; then
    +  echo "Error: JAVA_HOME is not defined correctly." >&2
    +  echo "  We cannot execute $JAVACMD" >&2
    +  exit 1
    +fi
    +
    +if [ -z "$JAVA_HOME" ] ; then
    +  echo "Warning: JAVA_HOME environment variable is not set."
    +fi
    +
    +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
    +
    +# traverses directory structure from process work directory to filesystem root
    +# first directory with .mvn subdirectory is considered project base directory
    +find_maven_basedir() {
    +
    +  if [ -z "$1" ]
    +  then
    +    echo "Path not specified to find_maven_basedir"
    +    return 1
    +  fi
    +
    +  basedir="$1"
    +  wdir="$1"
    +  while [ "$wdir" != '/' ] ; do
    +    if [ -d "$wdir"/.mvn ] ; then
    +      basedir=$wdir
    +      break
    +    fi
    +    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
    +    if [ -d "${wdir}" ]; then
    +      wdir=`cd "$wdir/.."; pwd`
    +    fi
    +    # end of workaround
    +  done
    +  echo "${basedir}"
    +}
    +
    +# concatenates all lines of a file
    +concat_lines() {
    +  if [ -f "$1" ]; then
    +    echo "$(tr -s '\n' ' ' < "$1")"
    +  fi
    +}
    +
    +BASE_DIR=`find_maven_basedir "$(pwd)"`
    +if [ -z "$BASE_DIR" ]; then
    +  exit 1;
    +fi
    +
    +##########################################################################################
    +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
    +# This allows using the maven wrapper in projects that prohibit checking in binary data.
    +##########################################################################################
    +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
    +    if [ "$MVNW_VERBOSE" = true ]; then
    +      echo "Found .mvn/wrapper/maven-wrapper.jar"
    +    fi
    +else
    +    if [ "$MVNW_VERBOSE" = true ]; then
    +      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
    +    fi
    +    if [ -n "$MVNW_REPOURL" ]; then
    +      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
    +    else
    +      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
    +    fi
    +    while IFS="=" read key value; do
    +      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
    +      esac
    +    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
    +    if [ "$MVNW_VERBOSE" = true ]; then
    +      echo "Downloading from: $jarUrl"
    +    fi
    +    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
    +    if $cygwin; then
    +      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
    +    fi
    +
    +    if command -v wget > /dev/null; then
    +        if [ "$MVNW_VERBOSE" = true ]; then
    +          echo "Found wget ... using wget"
    +        fi
    +        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
    +            wget "$jarUrl" -O "$wrapperJarPath"
    +        else
    +            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
    +        fi
    +    elif command -v curl > /dev/null; then
    +        if [ "$MVNW_VERBOSE" = true ]; then
    +          echo "Found curl ... using curl"
    +        fi
    +        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
    +            curl -o "$wrapperJarPath" "$jarUrl" -f
    +        else
    +            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
    +        fi
    +
    +    else
    +        if [ "$MVNW_VERBOSE" = true ]; then
    +          echo "Falling back to using Java to download"
    +        fi
    +        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
    +        # For Cygwin, switch paths to Windows format before running javac
    +        if $cygwin; then
    +          javaClass=`cygpath --path --windows "$javaClass"`
    +        fi
    +        if [ -e "$javaClass" ]; then
    +            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
    +                if [ "$MVNW_VERBOSE" = true ]; then
    +                  echo " - Compiling MavenWrapperDownloader.java ..."
    +                fi
    +                # Compiling the Java class
    +                ("$JAVA_HOME/bin/javac" "$javaClass")
    +            fi
    +            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
    +                # Running the downloader
    +                if [ "$MVNW_VERBOSE" = true ]; then
    +                  echo " - Running MavenWrapperDownloader.java ..."
    +                fi
    +                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
    +            fi
    +        fi
    +    fi
    +fi
    +##########################################################################################
    +# End of extension
    +##########################################################################################
    +
    +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
    +if [ "$MVNW_VERBOSE" = true ]; then
    +  echo $MAVEN_PROJECTBASEDIR
    +fi
    +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
    +
    +# For Cygwin, switch paths to Windows format before running java
    +if $cygwin; then
    +  [ -n "$M2_HOME" ] &&
    +    M2_HOME=`cygpath --path --windows "$M2_HOME"`
    +  [ -n "$JAVA_HOME" ] &&
    +    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
    +  [ -n "$CLASSPATH" ] &&
    +    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
    +  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
    +    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
    +fi
    +
    +# Provide a "standardized" way to retrieve the CLI args that will
    +# work with both Windows and non-Windows executions.
    +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
    +export MAVEN_CMD_LINE_ARGS
    +
    +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
    +
    +exec "$JAVACMD" \
    +  $MAVEN_OPTS \
    +  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
    +  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
    +  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
    diff --git a/code/jeeplatform-sso-oauth2/pom.xml b/code/jeeplatform-sso-oauth2/pom.xml
    new file mode 100644
    index 0000000..b1384d1
    --- /dev/null
    +++ b/code/jeeplatform-sso-oauth2/pom.xml
    @@ -0,0 +1,66 @@
    +
    +
    +    4.0.0
    +    
    +        org.springframework.boot
    +        spring-boot-starter-parent
    +        1.5.7.RELEASE
    +         
    +    
    +    org.muses.jeeplatform
    +    jeeplatform-sso-oauth2
    +    0.0.1-SNAPSHOT
    +    jeeplatform-sso-oauth2
    +    Demo project for Spring Boot
    +
    +    
    +        1.8
    +        Hoxton.SR4
    +    
    +
    +    
    +        
    +            org.springframework.cloud
    +            spring-cloud-starter-oauth2
    +        
    +        
    +            org.springframework.cloud
    +            spring-cloud-starter-security
    +        
    +
    +        
    +            org.springframework.boot
    +            spring-boot-starter-test
    +            test
    +            
    +                
    +                    org.junit.vintage
    +                    junit-vintage-engine
    +                
    +            
    +        
    +    
    +
    +    
    +        
    +            
    +                org.springframework.cloud
    +                spring-cloud-dependencies
    +                ${spring-cloud.version}
    +                pom
    +                import
    +            
    +        
    +    
    +
    +    
    +        
    +            
    +                org.springframework.boot
    +                spring-boot-maven-plugin
    +            
    +        
    +    
    +
    +
    diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java
    new file mode 100644
    index 0000000..bcd6cb3
    --- /dev/null
    +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java
    @@ -0,0 +1,15 @@
    +package org.muses.jeeplatform.oauth;
    +
    +import org.springframework.boot.SpringApplication;
    +import org.springframework.boot.autoconfigure.SpringBootApplication;
    +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
    +
    +@SpringBootApplication
    +@EnableResourceServer
    +public class JeeplatformSsoOauth2Application {
    +
    +    public static void main(String[] args) {
    +        SpringApplication.run(JeeplatformSsoOauth2Application.class, args);
    +    }
    +
    +}
    diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java
    new file mode 100644
    index 0000000..1b7e4dc
    --- /dev/null
    +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java
    @@ -0,0 +1,39 @@
    +package org.muses.jeeplatform.oauth.config;
    +
    +import org.springframework.beans.factory.annotation.Autowired;
    +import org.springframework.context.annotation.Configuration;
    +import org.springframework.security.crypto.password.PasswordEncoder;
    +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
    +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
    +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
    +
    +/**
    + * 
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/29 15:06  修改内容:
    + * 
    + */ +@Configuration +@EnableAuthorizationServer +public class OAuthConfig extends AuthorizationServerConfigurerAdapter { + @Autowired + PasswordEncoder passwordEncoder; + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.inMemory() + .withClient("jeeplatform") + .secret(passwordEncoder.encode("123")) + .autoApprove(true) + .redirectUris("http://127.0.0.1:8082/oa", "http://127.0.0.1:8082/oa") + .scopes("user") + .accessTokenValiditySeconds(7200) + .authorizedGrantTypes("authorization_code"); + + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/application.properties b/code/jeeplatform-sso-oauth2/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/application.yml b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml new file mode 100644 index 0000000..5a8eecb --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml @@ -0,0 +1,3 @@ +server: + port: + 8888 \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java b/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java new file mode 100644 index 0000000..35b2cc7 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java @@ -0,0 +1,13 @@ +package org.muses.jeeplatform.oauth; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class JeeplatformSsoOauth2ApplicationTests { + + @Test + void contextLoads() { + } + +} From 9cfc36d833215d85290aed74b559d5a11c1bc86b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Thu, 30 Apr 2020 17:16:12 +0800 Subject: [PATCH 085/123] =?UTF-8?q?=E6=8F=90=E4=BA=A4Oauth2.0=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=AE=A4=E8=AF=81=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/jeeplatform-sso-oauth2/pom.xml | 44 +++++- .../JeeplatformSsoOauth2Application.java | 2 +- .../jeeplatform/oauth/config/OAuthConfig.java | 39 ----- .../oauth/config/OAuthConfiguration.java | 149 ++++++++++++++++++ .../oauth/config/SecurityConfiguration.java | 93 +++++++++++ .../muses/jeeplatform/oauth/dto/UserDto.java | 66 ++++++++ .../oauth/filter/SimpleCORSFilter.java | 30 ++++ .../oauth/service/UserDetailsServiceImpl.java | 44 ++++++ .../src/main/resources/application.yml | 27 +++- .../JeeplatformSsoOauth2ApplicationTests.java | 2 - 10 files changed, 452 insertions(+), 44 deletions(-) delete mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfiguration.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/dto/UserDto.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java diff --git a/code/jeeplatform-sso-oauth2/pom.xml b/code/jeeplatform-sso-oauth2/pom.xml index b1384d1..93423b5 100644 --- a/code/jeeplatform-sso-oauth2/pom.xml +++ b/code/jeeplatform-sso-oauth2/pom.xml @@ -13,20 +13,45 @@ 0.0.1-SNAPSHOT jeeplatform-sso-oauth2 Demo project for Spring Boot + jar 1.8 Hoxton.SR4 + 1.0.9.RELEASE + 0.9.0 - + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.security.oauth + spring-security-oauth2 + + + + + org.springframework.security + spring-security-jwt + ${security-jwt.version} @@ -40,6 +65,23 @@ + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + org.projectlombok + lombok + 1.16.10 + + + javax.servlet + javax.servlet-api + 3.1.0 + + diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java index bcd6cb3..a6be6a0 100644 --- a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2Application.java @@ -5,7 +5,7 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; @SpringBootApplication -@EnableResourceServer +//@EnableResourceServer public class JeeplatformSsoOauth2Application { public static void main(String[] args) { diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java deleted file mode 100644 index 1b7e4dc..0000000 --- a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfig.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.muses.jeeplatform.oauth.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; -import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; - -/** - *
    - *
    - * 
    - * - *
    - * @author mazq
    - * 修改记录
    - *    修改后版本:     修改人:  修改日期: 2020/04/29 15:06  修改内容:
    - * 
    - */ -@Configuration -@EnableAuthorizationServer -public class OAuthConfig extends AuthorizationServerConfigurerAdapter { - @Autowired - PasswordEncoder passwordEncoder; - - @Override - public void configure(ClientDetailsServiceConfigurer clients) throws Exception { - clients.inMemory() - .withClient("jeeplatform") - .secret(passwordEncoder.encode("123")) - .autoApprove(true) - .redirectUris("http://127.0.0.1:8082/oa", "http://127.0.0.1:8082/oa") - .scopes("user") - .accessTokenValiditySeconds(7200) - .authorizedGrantTypes("authorization_code"); - - } -} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfiguration.java new file mode 100644 index 0000000..ad79663 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/OAuthConfiguration.java @@ -0,0 +1,149 @@ +package org.muses.jeeplatform.oauth.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.token.DefaultTokenServices; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/29 15:06  修改内容:
    + * 
    + */ +@Configuration +@EnableAuthorizationServer//开启授权服务 +public class OAuthConfiguration extends AuthorizationServerConfigurerAdapter { + @Autowired + PasswordEncoder passwordEncoder; + @Autowired + private AuthenticationManager authenticationManager; //认证方式 + @Resource(name = "userService") + private UserDetailsService userDetailsService; + + private static final String CLIENT_ID = "jeeplatform"; + private static final String SECRET_CHAR_SEQUENCE = "secret"; + private static final String SCOPE_READ = "read"; + private static final String SCOPE_WRITE = "write"; + private static final String TRUST = "trust"; + private static final String USER ="user"; + private static final int ACCESS_TOKEN_VALIDITY_SECONDS = 1*60*60; + private static final int FREFRESH_TOKEN_VALIDITY_SECONDS = 6*60*60; + private static final String GRANT_TYPE_PASSWORD = "password"; // 密码模式授权模式 + private static final String AUTHORIZATION_CODE = "authorization_code"; //授权码模式 授权码模式使用到了回调地址 + private static final String REFRESH_TOKEN = "refresh_token"; //refresh token模式 + private static final String IMPLICIT = "implicit"; //简化授权模式 + private static final String RESOURCE_ID = "resource_id"; //指定哪些资源是需要授权验证的 + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.inMemory() // 使用内存存储 + .withClient(CLIENT_ID) //标记客户端id + .secret(bCryptPasswordEncoder().encode(SECRET_CHAR_SEQUENCE))//客户端安全码 + .autoApprove(true) //为true 则不会被重定向到授权的页面,也不需要手动给请求授权,直接自动授权成功返回code + .redirectUris("http://127.0.0.1:8082/oa", "http://127.0.0.1:8082/oa") //重定向uri + .scopes(SCOPE_READ , SCOPE_WRITE , TRUST , USER) //允许授权范围 + .accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS) //token 时间秒 + .refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS)//刷新token 时间 秒 + .authorizedGrantTypes(GRANT_TYPE_PASSWORD , AUTHORIZATION_CODE , REFRESH_TOKEN , IMPLICIT);//允许授权类型 + } + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager) + .accessTokenConverter(accessTokenConverter()) + .userDetailsService(userDetailsService) //必须注入userDetailsService否则根据refresh_token无法加载用户信息 + .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST,HttpMethod.OPTIONS) //支持GET POST 请求获取token + .reuseRefreshTokens(true) //开启刷新token + .tokenServices(tokenServices()); + } + + /** + * 认证服务器的安全配置 + * + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + .realm(RESOURCE_ID) + .tokenKeyAccess("permitAll()") + .checkTokenAccess("isAuthenticated()") //isAuthenticated():排除anonymous isFullyAuthenticated():排除anonymous以及remember-me + .allowFormAuthenticationForClients(); //允许表单认证 这段代码在授权码模式下会导致无法根据code 获取token  + } + + @Bean + public JwtAccessTokenConverter accessTokenConverter(){ + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(){ + @Override + public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { + String grantType = authentication.getOAuth2Request().getGrantType(); + //只有如下两种模式才能获取到当前用户信息 + if(AUTHORIZATION_CODE.equals(grantType) || GRANT_TYPE_PASSWORD.equals(grantType)) { + String userName = authentication.getUserAuthentication().getName(); + // 自定义一些token 信息 会在获取token返回结果中展示出来 + Map additionalInformation = new HashMap<>(); + additionalInformation.put("user_name", userName); + additionalInformation = Collections.unmodifiableMap(additionalInformation); + ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInformation); + } + OAuth2AccessToken token = super.enhance(accessToken, authentication); + return token; + } + }; + converter.setSigningKey("bcrypt"); + return converter; + } + + @Bean + public TokenStore tokenStore() { + //基于jwt实现令牌(Access Token) + return new JwtTokenStore(accessTokenConverter()); + } + + @Bean + public DefaultTokenServices tokenServices() { + final DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); + defaultTokenServices.setTokenEnhancer(accessTokenConverter()); + defaultTokenServices.setTokenStore(tokenStore()); + defaultTokenServices.setSupportRefreshToken(true); + defaultTokenServices.setAccessTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(30)); // 30天 + return defaultTokenServices; + } + + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java new file mode 100644 index 0000000..8b6ed85 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java @@ -0,0 +1,93 @@ +package org.muses.jeeplatform.oauth.config; + +import org.muses.jeeplatform.oauth.filter.SimpleCORSFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.web.context.SecurityContextPersistenceFilter; + + +import javax.annotation.Resource; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/30 15:58  修改内容:
    + * 
    + */ +@Configuration +@EnableWebSecurity +//@EnableGlobalMethodSecurity(prePostEnabled = true) +//@EnableAutoConfiguration(exclude = { +// org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class }) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + @Autowired + private SimpleCORSFilter simpleCORSFilter; + + @Resource(name = "userService") + private UserDetailsService userDetailsService; + + private static final String SECRET_CHAR_SEQUENCE = "secret"; + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + + @Autowired + public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception { + //auth.inMemoryAuthentication() + //.withUser("casuser") + //.password(bCryptPasswordEncoder().encode("Mellon")); + auth.userDetailsService(userDetailsService) + .passwordEncoder(bCryptPasswordEncoder()); + auth.parentAuthenticationManager(authenticationManagerBean()); + } + + @Override + public void configure(WebSecurity web) throws Exception { + //解决静态资源被拦截的问题 + web.ignoring().antMatchers("/assets/**"); + web.ignoring().antMatchers("/favicon.ico"); + + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() //关闭跨域保护 + .authorizeRequests() + .anyRequest().authenticated() //所有请求都需要通过认证 + .and() + .httpBasic() //Basic登录 + .and() + .formLogin() + .loginPage("/login") + .permitAll(); + //http.addFilterBefore(simpleCORSFilter, SecurityContextPersistenceFilter.class); + } + + + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/dto/UserDto.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/dto/UserDto.java new file mode 100644 index 0000000..a3e9a14 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/dto/UserDto.java @@ -0,0 +1,66 @@ +package org.muses.jeeplatform.oauth.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/30 15:24  修改内容:
    + * 
    + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserDto implements Serializable { + /** 用户Id**/ + private int id; + + /** 用户名**/ + private String username; + + /** 用户密码**/ + private String password; + + /** 手机号**/ + private String phone; + + /** 性别**/ + private String sex; + + /** 邮件**/ + private String email; + + /** 备注**/ + private String mark; + + /** 用户级别**/ + private String rank; + + /** 最后一次时间**/ + private Date lastLogin; + + /** 登录ip**/ + private String loginIp; + + /** 图片路径**/ + private String imageUrl; + + /** 注册时间**/ + private Date regTime; + + /** 账号是否被锁定**/ + private Boolean locked = Boolean.FALSE; + + /** 权限**/ + private String rights; +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java new file mode 100644 index 0000000..b182f8d --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/filter/SimpleCORSFilter.java @@ -0,0 +1,30 @@ +package org.muses.jeeplatform.oauth.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +@Slf4j +@Component +public class SimpleCORSFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + httpServletRequest.setCharacterEncoding("utf-8"); + httpServletResponse.setCharacterEncoding("utf-8"); + httpServletResponse.setHeader("Content-Type", "application/json"); + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");//允许所有域名访问 + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");//允许的访问方式 + httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type,Authorization"); + httpServletResponse.setHeader("Access-Control-Request-Headers", "x-requested-with,content-type,Accept,Authorization"); + httpServletResponse.setHeader("Access-Control-Request-Method", "GET,POST,PUT,DELETE,OPTIONS"); + filterChain.doFilter(httpServletRequest, httpServletResponse); + } +} \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..8734531 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/service/UserDetailsServiceImpl.java @@ -0,0 +1,44 @@ +package org.muses.jeeplatform.oauth.service; + +import lombok.extern.slf4j.Slf4j; +import org.muses.jeeplatform.oauth.dto.UserDto; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/04/30 15:15  修改内容:
    + * 
    + */ +@Slf4j +@Service("userService") +public class UserDetailsServiceImpl implements UserDetailsService { + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + UserDto user = new UserDto(); +// if(user == null){ +// log.info("登录用户[{}]没注册!",username); +// throw new UsernameNotFoundException("登录用户["+username + "]没注册!"); +// } + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthority()); + } + + private List getAuthority() { + //return Arrays.asList(new SimpleGrantedAuthority("admin")); + return Arrays.asList(Collections.emptyList()); + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/application.yml b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml index 5a8eecb..726c580 100644 --- a/code/jeeplatform-sso-oauth2/src/main/resources/application.yml +++ b/code/jeeplatform-sso-oauth2/src/main/resources/application.yml @@ -1,3 +1,28 @@ server: port: - 8888 \ No newline at end of file + 8888 +# JWT 配置 +jwt: + # 存放Token的Header Key + header: Authorization + # 密匙key + secret: mySecret + # 过期时间 单位秒 7天后过期 604800 + expiration: 3600 + # 自定义token 前缀字符 + tokenHead: Bearer- + # 超时时间 单位秒 + access_token: 3600 + # 刷新token时间 单位秒 + refresh_token: 3600 + route: + authentication: + path: login/entry + refresh: oauth/refresh + register: login/account + + +# 不需要拦截的url地址 +#mySecurity: +# exclude: +# antMatchers: /oauth/**,/login,/home \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java b/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java index 35b2cc7..b86c465 100644 --- a/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java +++ b/code/jeeplatform-sso-oauth2/src/test/java/org/muses/jeeplatform/oauth/JeeplatformSsoOauth2ApplicationTests.java @@ -1,12 +1,10 @@ package org.muses.jeeplatform.oauth; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class JeeplatformSsoOauth2ApplicationTests { - @Test void contextLoads() { } From 158f39b86566c963693cc011075a6d53756e93a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Wed, 6 May 2020 16:33:11 +0800 Subject: [PATCH 086/123] =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9Spring=20Security=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth/config/SecurityConfiguration.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java index 8b6ed85..1e2b36c 100644 --- a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/config/SecurityConfiguration.java @@ -52,14 +52,15 @@ public AuthenticationManager authenticationManagerBean() throws Exception { } - @Autowired - public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception { - //auth.inMemoryAuthentication() - //.withUser("casuser") - //.password(bCryptPasswordEncoder().encode("Mellon")); - auth.userDetailsService(userDetailsService) - .passwordEncoder(bCryptPasswordEncoder()); - auth.parentAuthenticationManager(authenticationManagerBean()); + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { //auth.inMemoryAuthentication() + auth.inMemoryAuthentication() + .withUser("nicky") + .password("123") + .roles("admin"); +// auth.userDetailsService(userDetailsService) +// .passwordEncoder(bCryptPasswordEncoder()); +// auth.parentAuthenticationManager(authenticationManagerBean()); } @Override @@ -72,15 +73,21 @@ public void configure(WebSecurity web) throws Exception { @Override protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable() //关闭跨域保护 + http//.requestMatchers() + //.antMatchers("") + //.antMatchers("") + //.and() .authorizeRequests() .anyRequest().authenticated() //所有请求都需要通过认证 .and() .httpBasic() //Basic登录 .and() - .formLogin() - .loginPage("/login") - .permitAll(); + //.formLogin() + //.loginPage("/login.html") + //.loginProcessingUrl("/login") + //.permitAll() + //.and() + .csrf().disable(); //关闭跨域保护; //http.addFilterBefore(simpleCORSFilter, SecurityContextPersistenceFilter.class); } From 1ae15e87c6bc08cb85e50781098c1db1d3085e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=A2=9E=E7=BE=A4?= Date: Wed, 6 May 2020 18:35:27 +0800 Subject: [PATCH 087/123] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/MessagesLocalResolver.java | 39 ++++++++ .../oauth/web/controller/LoginController.java | 27 ++++++ .../static/asserts/css/bootstrap.min.css | 7 ++ .../static/asserts/css/dashboard.css | 93 +++++++++++++++++++ .../resources/static/asserts/css/signin.css | 49 ++++++++++ .../static/asserts/img/bootstrap-solid.svg | 6 ++ .../resources/static/asserts/js/Chart.min.js | 10 ++ .../static/asserts/js/bootstrap.min.js | 7 ++ .../static/asserts/js/feather.min.js | 7 ++ .../asserts/js/jquery-3.2.1.slim.min.js | 4 + .../resources/static/asserts/js/popper.min.js | 5 + .../src/main/resources/templates/index.html | 23 +++++ .../src/main/resources/templates/login.html | 36 +++++++ 13 files changed, 313 insertions(+) create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/bootstrap.min.js create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/jquery-3.2.1.slim.min.js create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/popper.min.js create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/templates/index.html create mode 100644 code/jeeplatform-sso-oauth2/src/main/resources/templates/login.html diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java new file mode 100644 index 0000000..1ccbbdb --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/component/MessagesLocalResolver.java @@ -0,0 +1,39 @@ +package org.muses.jeeplatform.oauth.component; + + +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.LocaleResolver; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Locale; + +/** + *
    + *
    + * 
    + * + * @author nicky + *
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2019年11月23日  修改内容:
    + * 
    + */ +public class MessagesLocalResolver implements LocaleResolver { + + @Override + public Locale resolveLocale(HttpServletRequest request) { + String lang = request.getParameter("lang"); + Locale locale = Locale.getDefault(); + if (!StringUtils.isEmpty(lang)) { + String[] split = lang.split("_"); + locale = new Locale(split[0],split[1]); + } + return locale; + } + + @Override + public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { + + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java new file mode 100644 index 0000000..ec1ae7c --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/java/org/muses/jeeplatform/oauth/web/controller/LoginController.java @@ -0,0 +1,27 @@ +package org.muses.jeeplatform.oauth.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + *
    + *
    + * 
    + * + *
    + * @author mazq
    + * 修改记录
    + *    修改后版本:     修改人:  修改日期: 2020/05/06 18:11  修改内容:
    + * 
    + */ +@Controller +public class LoginController { + + @GetMapping(value = {"/login"}) + public ModelAndView toLogin(){ + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("login"); + return modelAndView; + } +} diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css new file mode 100644 index 0000000..6561b6f --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css new file mode 100644 index 0000000..ef40fe7 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/dashboard.css @@ -0,0 +1,93 @@ +body { + font-size: .875rem; +} + +.feather { + width: 16px; + height: 16px; + vertical-align: text-bottom; +} + +/* + * Sidebar + */ + +.sidebar { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 100; /* Behind the navbar */ + padding: 0; + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +} + +.sidebar-sticky { + position: -webkit-sticky; + position: sticky; + top: 48px; /* Height of navbar */ + height: calc(100vh - 48px); + padding-top: .5rem; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ +} + +.sidebar .nav-link { + font-weight: 500; + color: #333; +} + +.sidebar .nav-link .feather { + margin-right: 4px; + color: #999; +} + +.sidebar .nav-link.active { + color: #007bff; +} + +.sidebar .nav-link:hover .feather, +.sidebar .nav-link.active .feather { + color: inherit; +} + +.sidebar-heading { + font-size: .75rem; + text-transform: uppercase; +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + font-size: 1rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar .form-control { + padding: .75rem 1rem; + border-width: 0; + border-radius: 0; +} + +.form-control-dark { + color: #fff; + background-color: rgba(255, 255, 255, .1); + border-color: rgba(255, 255, 255, .1); +} + +.form-control-dark:focus { + border-color: transparent; + box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); +} + +/* + * Utilities + */ + +.border-top { border-top: 1px solid #e5e5e5; } +.border-bottom { border-bottom: 1px solid #e5e5e5; } diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css new file mode 100644 index 0000000..4257b0e --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/css/signin.css @@ -0,0 +1,49 @@ +html, +body { + height: 100%; +} + +body { + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -ms-flex-align: center; + -ms-flex-pack: center; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + padding-top: 40px; + padding-bottom: 40px; + /*background-color: #f5f5f5;*/ +} + +.form-signin { + width: 100%; + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-signin .checkbox { + font-weight: 400; +} +.form-signin .form-control { + position: relative; + box-sizing: border-box; + height: auto; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg new file mode 100644 index 0000000..b624a02 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/img/bootstrap-solid.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js new file mode 100644 index 0000000..2130e2a --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/Chart.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];e=2*s-(n=s<.5?s*(1+l):s+l-s*l),a=[0,0,0];for(var u=0;u<3;u++)(i=r+1/3*-(u-1))<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function f(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function p(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+-.4986*r,n=-.9689*a+1.8758*o+.0415*r,i=.0557*a+-.204*o+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function m(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function x(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?a=(n=100*o/903.3)/100*7.787+16/116:(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function y(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function k(t){return v(x(t))}function w(t){var e,n,i,a=t[0],o=t[1];return i=t[2]/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function M(t){return S[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return l(c(t))},hsl2keyword:function(t){return s(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return l(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return l(f(t))},hwb2keyword:function(t){return s(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return i(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return s(p(t))},keyword2rgb:M,keyword2hsl:function(t){return i(M(t))},keyword2hsv:function(t){return a(M(t))},keyword2hwb:function(t){return o(M(t))},keyword2cmyk:function(t){return l(M(t))},keyword2lab:function(t){return d(M(t))},keyword2xyz:function(t){return u(M(t))},xyz2rgb:v,xyz2lab:m,xyz2lch:function(t){return y(m(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:w,lch2xyz:function(t){return x(w(t))},lch2rgb:function(t){return k(w(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];(a[l]=a[l]||{})[s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index=0&&a>0)&&(v+=a));return o=c.getPixelForValue(v),r=c.getPixelForValue(v+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i,a,r,l,s,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],p=f.length,v=n.start,m=n.end;return 1===p?(i=g>v?g-v:m-g,a=g0&&(i=(g-f[e-1])/2,e===p-1&&(a=i)),e');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i],s=l&&l.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:u(r.backgroundColor,i,d.backgroundColor),strokeStyle:s.borderColor?s.borderColor:u(r.borderColor,i,d.borderColor),lineWidth:s.borderWidth?s.borderWidth:u(r.borderWidth,i,d.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0))+f,v={x:Math.cos(g),y:Math.sin(g)},m={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(v.x*(v.x<0?1:w),m.x*(m.x<0?1:w)),y:k?-1:Math.min(v.y*(v.y<0?1:w),m.y*(m.y<0?1:w))},S={x:b?1:Math.max(v.x*(v.x>0?1:w),m.x*(m.x>0?1:w)),y:x?1:Math.max(v.y*(v.y>0?1:w),m.y*(m.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:-.5*(S.x+M.x),y:-.5*(S.y+M.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),o.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,l=a.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=i.getDataset(),g=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(l.circumference/(2*Math.PI)),p=n&&s.animateScale?0:i.innerRadius,v=n&&s.animateScale?0:i.outerRadius,m=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:v,innerRadius:p,label:m(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),n&&s.animateRotate||(b.startAngle=0===e?l.rotation:i.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return o.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),n=0,i=u.length;n');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i].custom||{},s=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:s(r.backgroundColor,i,u.backgroundColor),strokeStyle:l.borderColor?l.borderColor:s(r.borderColor,i,u.borderColor),lineWidth:l.borderWidth?l.borderWidth:s(r.borderWidth,i,u.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,r=i.custom||{},l=e.getDataset(),s=e.chart.options.elements.line,u=e.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),n.dataset.pivot(),o.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),l=i.chart.scale,s=i.chart.options.elements.point,u=l.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{x:n?l.xCenter:u.x,y:n?l.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,s.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(n,i){var a=n._model,r=o.splineCurve(o.previousItem(e.data,i,!0)._model,a,o.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,o.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,i,o.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=n.radius?n.radius:o.valueAtIndexOrDefault(e.pointRadius,i,r.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,i,r.backgroundColor),a.borderColor=n.borderColor?n.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,i,r.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,i,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a=e.numSteps?(o.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(28),r=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function l(t){return"top"===t||"bottom"===t}var s=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),o.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return s.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),s.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,o=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(i))),l=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(i)));if((e.width!==r||e.height!==l)&&(i.width=e.width=r,i.height=e.height=l,i.style.width=r+"px",i.style.height=l+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:r,height:l};s.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(o,function(n){var o=n.options,r=a.valueOrDefault(o.type,n.dtype),s=t.scaleService.getScaleConstructor(r);if(s){l(o.position)!==l(n.dposition)&&(o.position=n.dposition);var u=new s({id:o.id,options:o,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),l=a.type||e.config.type;if(r.type&&r.type!==l&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=l,n.push(r.type),r.controller)r.controller.updateIndex(o);else{var s=t.controllers[r.type];if(void 0===s)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new s(e,o),i.push(r.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==s.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],s.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==s.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),s.notify(e,"afterScaleUpdate"),s.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==s.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);s.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==s.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),s.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==s.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),s.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=o.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=n[e].length&&n[e].push({}),!n[e][r].type||s.type&&s.type!==n[e][r].type?o.merge(n[e][r],[t.scaleService.getScaleDefaults(l),s]):o.merge(n[e][r],s)}else o._merger(e,n,i,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=0;i--){var a=t[i];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,(a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n=Math.floor(o.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,o=t.width;i.height=a*n,i.width=o*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=o+"px"}},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&!0!==o.isArray(e)?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,o,r;for(i=0,o=t.data.datasets.length;i0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return s(t,e,{intersect:!1})},point:function(t,e){return o(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var o=l(n.axis),s=r(t,a,n.intersect,o);return s.length>1&&s.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),s.slice(0,1)},x:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r},y:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rh&&st.maxHeight){s--;break}s++,c=u*d}t.labelRotation=s},afterCalculateTickRotation:function(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){l.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=i(t._ticks),r=t.options,u=r.ticks,d=r.scaleLabel,c=r.gridLines,h=r.display,f=t.isHorizontal(),g=n(u),p=r.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,a.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var v=s(d)+l.options.toPadding(d.padding).height;f?a.height+=v:a.width+=v}if(u.display&&h){var m=l.longestText(t.ctx,g.font,o,t.longestTextCache),b=l.numberOfLabelLines(o),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=m;var k=l.toRadians(t.labelRotation),w=Math.cos(k),M=Math.sin(k)*m+g.size*b+x*(b-1)+x;a.height=Math.min(t.maxHeight,a.height+M+y),t.ctx.font=g.font;var S=e(t.ctx,o[0],g.font),C=e(t.ctx,o[o.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?w*S+3:w*x+3,t.paddingRight="bottom"===r.position?w*x+3:w*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?m=0:m+=y+x,a.width=Math.min(t.maxWidth,a.width+m),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){l.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(l.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,o=this,r=o.isHorizontal(),s=o.options.ticks.minor,u=t.length,d=l.toRadians(o.labelRotation),c=Math.cos(d),h=o.longestLabelWidth*c,f=[];for(s.maxTicksLimit&&(a=s.maxTicksLimit),r&&(e=!1,(h+s.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var r=e.ctx,u=o.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),v=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),m=l.valueOrDefault(d.fontColor,u.defaultFontColor),b=n(d),x=l.valueOrDefault(c.fontColor,u.defaultFontColor),y=n(c),k=h.drawTicks?h.tickMarkLength:0,w=l.valueOrDefault(f.fontColor,u.defaultFontColor),M=n(f),S=l.options.toPadding(f.padding),C=l.toRadians(e.labelRotation),_=[],D="right"===i.position?e.left:e.right-k,I="right"===i.position?e.left+k:e.right,P="bottom"===i.position?e.top:e.bottom-k,A="bottom"===i.position?e.top+k:e.bottom;if(l.each(v,function(n,o){if(!l.isNullOrUndef(n.label)){var r,s,c,f,m=n.label;o===e.zeroLineIndex&&i.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=l.valueAtIndexOrDefault(h.lineWidth,o),s=l.valueAtIndexOrDefault(h.color,o),c=l.valueOrDefault(h.borderDash,u.borderDash),f=l.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var b,x,y,w,M,S,T,F,O,R,L="middle",z="middle",B=d.padding;if(p){var W=k+B;"bottom"===i.position?(z=g?"middle":"top",L=g?"right":"center",R=e.top+W):(z=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-W);var N=a(e,o,h.offsetGridLines&&v.length>1);N1);H0)n=t.stepSize;else{var o=i.niceNum(e.max-e.min,!1);n=i.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/n)*n,l=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(r=t.min,l=t.max);var s=(l-r)/n;s=i.almostEquals(s,Math.round(s),n/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=i.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.indexi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function d(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=l(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),o=e.afterTitle.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,r=[];return o.each(t,function(t){var o={before:[],lines:[],after:[]};n(o.before,a.beforeLabel.call(i,t,e)),n(o.lines,a.label.call(i,t,e)),n(o.after,a.afterLabel.call(i,t,e)),r.push(o)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=l(c),g=a._active,p=a._data,v={xAlign:h.xAlign,yAlign:h.yAlign},m={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[],k=[];x=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var w=[];for(n=0,i=g.length;n0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!o.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)a-=2*Math.PI;for(;a=l&&a<=s,d=r>=n.innerRadius&&r<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45),r=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,l=a._view,s=a._chart.ctx,u=l.spanGaps,d=a._children.slice(),c=r.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||r.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,o=1,r=(a=u.base)>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),v=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=v),p!==v&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var m=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"].indexOf(l,0);-1===b&&(b=0);var x=t(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=t(y),s.lineTo(x[0],x[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var o=a(n);return i(n)?t>=o.left&&t<=o.right:e>=o.top&&e<=o.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,o){if(o){var r=Math.min(o,i/2),l=Math.min(o,a/2);t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+l),t.lineTo(e+i,n+a-l),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-l),t.lineTo(e,n+l),t.quadraticCurveTo(e,n,e+r,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var o,r,l,s,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-r/2,a+u/3),t.lineTo(i+r/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var o,r,l;if(i.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(n,t[o],o);else for(o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,o;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=n=a=o=+t||0,{top:e,right:n,bottom:a,left:o,height:e+a,width:o+n}},resolve:function(t,e,n){var a,o,r;for(a=0,o=t.length;a
    ';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var l=function(){e._reset(),t()};return o(a,"scroll",l.bind(a,"expand")),o(r,"scroll",l.bind(r,"shrink")),e}function c(t,e){var n=t[m]||(t[m]={}),i=n.renderProxy=function(t){t.animationName===y&&e()};v.each(k,function(e){o(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(x)}function h(t){var e=t[m]||{},n=e.renderProxy;n&&(v.each(k,function(e){r(t,e,n)}),delete e.renderProxy),t.classList.remove(x)}function f(t,e,n){var i=t[m]||(t[m]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(l("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[m]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function p(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var v=t(45),m="$chartjs",b="chartjs-",x=b+"render-monitor",y=b+"render-animation",k=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},M=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+y+"{"+t+"}@keyframes "+y+"{"+t+"}."+x+"{-webkit-animation:"+y+" 0.001s;animation:"+y+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[m]){var n=e[m].initial;["height","width"].forEach(function(t){var i=n[t];v.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),v.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[m]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[m]||(n[m]={});o(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(s(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[m]||{}).proxies||{})[t.id+"_"+e];a&&r(i,e,a)}else g(i)}},v.addEvent=o,v.removeEvent=r},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function n(t,e,n){var i,a=t[e].fill,o=[e];if(!n)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;o.push(a),a=i.fill}return!1}function r(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function l(t){return t&&!t.skip}function s(t,e,n,i,a){var r;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r0;--r)o.canvas.lineTo(t,n[r],n[r-1],!0)}}function u(t,e,n,i,a,o){var r,u,d,c,h,f,g,p=e.length,v=i.spanGaps,m=[],b=[],x=0,y=0;for(t.beginPath(),r=0,u=p+!!o;r');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});r.configure(e,i,n),r.addBox(e,i),e.legend=i}var r=t.layoutService,l=o.noop;return t.Legend=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:l,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:function(){var t=this,e=t.options.labels||{},n=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:l,beforeFit:l,fit:function(){var t=this,n=t.options,a=n.labels,r=n.display,l=t.ctx,s=i.global,u=o.valueOrDefault,d=u(a.fontSize,s.defaultFontSize),c=u(a.fontStyle,s.defaultFontStyle),h=u(a.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,v=t.isHorizontal();if(v?(p.width=t.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=t.maxHeight),r)if(l.font=f,v){var m=t.lineWidths=[0],b=t.legendItems.length?d+a.padding:0;l.textAlign="left",l.textBaseline="top",o.each(t.legendItems,function(n,i){var o=e(a,d)+d/2+l.measureText(n.text).width;m[m.length-1]+o+a.padding>=t.width&&(b+=d+a.padding,m[m.length]=t.left),g[i]={left:0,top:0,width:o,height:d},m[m.length-1]+=o+a.padding}),p.height+=b}else{var x=a.padding,y=t.columnWidths=[],k=a.padding,w=0,M=0,S=d+x;o.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+a.padding,y.push(w),w=0,M=0),w=Math.max(w,i),M+=S,g[n]={left:0,top:0,width:i,height:d}}),k+=w,y.push(w),p.width+=k}t.width=p.width,t.height=p.height},afterFit:l,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,r=i.global,l=r.elements.line,s=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(a.fontColor,r.defaultFontColor),g=h(a.fontSize,r.defaultFontSize),p=h(a.fontStyle,r.defaultFontStyle),v=h(a.fontFamily,r.defaultFontFamily),m=o.fontString(g,p,v);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=m;var b=e(a,g),x=t.legendHitBoxes,y=function(t,e,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var a=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),n.labels&&n.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=t+u,f=e+u;o.canvas.drawPoint(c,i.pointStyle,s,d,f)}else a||c.strokeRect(t,e,b,g),c.fillRect(t,e,b,g);c.restore()}},k=function(t,e,n,i){var a=g/2,o=b+a+t,r=e+a;c.fillText(n.text,o,r),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(o,r),c.lineTo(o+i,r),c.stroke())},w=t.isHorizontal();d=w?{x:t.left+(s-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var M=g+a.padding;o.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,o=b+g/2+i,r=d.x,l=d.y;w?r+o>=s&&(l=d.y+=M,d.line++,r=d.x=t.left+(s-u[d.line])/2):l+M>t.bottom&&(r=d.x=r+t.columnWidths[d.line]+a.padding,l=d.y=t.top+a.padding,d.line++),y(r,l,e),x[n].left=r,x[n].top=l,k(r,l,e,i),w?d.x+=o+a.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(o.mergeIf(e,i.global.legend),a?(r.configure(t,a,e),a.options=e):n(t,e)):a&&(r.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,r=o.noop;return t.Title=a.extend({initialize:function(t){var e=this;o.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=this,e=o.valueOrDefault,n=t.options,a=n.display,r=e(n.fontSize,i.global.defaultFontSize),l=t.minSize,s=o.isArray(n.text)?n.text.length:1,u=o.options.toLineHeight(n.lineHeight,r),d=a?s*u+2*n.padding:0;t.isHorizontal()?(l.width=t.maxWidth,l.height=d):(l.width=d,l.height=t.maxHeight),t.width=l.width,t.height=l.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=o.valueOrDefault,a=t.options,r=i.global;if(a.display){var l,s,u,d=n(a.fontSize,r.defaultFontSize),c=n(a.fontStyle,r.defaultFontStyle),h=n(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,v=0,m=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=n(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(s=b+(y-b)/2,u=m+p,l=y-b):(s="left"===a.position?b+p:y-p,u=m+(x-m)/2,l=x-m,v=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(s,u),e.rotate(v),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var w=0,M=0;Me.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var o=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*o)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),o={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=a.generators.linear(o,t);t.handleDirectionalChanges(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,o=e.chart,r=o.data.datasets,l=i.valueOrDefault,s=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(r,function(e,n){if(!u){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(r,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===d[s]&&(d[s]=[]),i.each(a.data,function(t,i){var a=d[s],o=+e.getRightValue(t);isNaN(o)||l.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=o)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(r,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i),0!==i&&(null===e.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function s(t){var i,o,s,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;ic.r&&(c.r=v.end,h.r=g),m.startc.b&&(c.b=m.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var o=n.y,r=1.5*i,l=0;l270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,o=a.valueOrDefault,r=t.options,l=r.angleLines,s=r.pointLabels;i.lineWidth=l.lineWidth,i.strokeStyle=l.color;var u=t.getDistanceFromCenterForValue(r.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(l.display){var p=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}if(s.display){var m=t.getPointPosition(g,u+5),b=o(s.fontColor,v.defaultFontColor);i.font=f.font,i.fillStyle=b;var x=t.getIndexAngle(g),y=a.toDegrees(x);i.textAlign=d(y),h(y,t._pointLabelSizes[g],m),c(i,t.pointLabels[g]||"",m,f.size)}}}function g(t,n,i,o){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(n.color,o-1),r.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,o-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var l=e(t);if(0===l)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var u=1;u0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,o=a.valueOrDefault;if(e.display){var r=t.ctx,l=this.getIndexAngle(0),s=o(i.fontSize,v.defaultFontSize),u=o(i.fontStyle,v.defaultFontStyle),d=o(i.fontFamily,v.defaultFontFamily),c=a.fontString(s,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=o(i.fontColor,v.defaultFontColor);if(r.font=c,r.save(),r.translate(t.xCenter,t.yCenter),r.rotate(l),i.showLabelBackdrop){var h=r.measureText(e).width;r.fillStyle=i.backdropColor,r.fillRect(-h/2-i.backdropPaddingX,-u-s/2-i.backdropPaddingY,h+2*i.backdropPaddingX,s+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=d,r.fillText(e,0,-u),r.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",b,m)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},o=[];for(e=0,n=t.length;ee&&l=0&&r<=l;){if(i=r+l>>1,a=t[i-1]||null,o=t[i],!a)return{lo:null,hi:o};if(o[e]n))return{lo:a,hi:o};l=i-1}}return{lo:o,hi:null}}function l(t,e,n,i){var a=r(t,e,n),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],l=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=l[e]-o[e],u=s?(n-o[e])/s:0,d=(l[i]-o[i])*u;return o[i]+d}function s(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?m(t,i):(t instanceof m||(t=m(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(x.isNullOrUndef(t))return null;var n=e.options.time,i=s(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,o,r,l=e-t,s=w[n],u=s.size,d=s.steps;if(!d)return Math.ceil(l/((i||1)*u));for(a=0,o=d.length;a=M.indexOf(e);a--)if(o=M[a],w[o].common&&r.as(o)>=t.length)return o;return M[e?M.indexOf(e):0]}function f(t){for(var e=M.indexOf(t)+1,n=M.length;e1?e[1]:i,r=e[0],s=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2),a.time.max||(o=e[e.length-1],r=e.length>1?e[e.length-2]:n,u=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2)),{left:s,right:u}}function v(t,e){var n,i,a,o,r=[];for(n=0,i=t.length;n=a&&n<=r&&c.push(n);return i.min=a,i.max=r,i._unit=s.unit||h(c,s.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=o(i._timestamps.data,a,r,l.distribution),i._offsets=p(i._table,c,a,r,l),v(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,o=i.labels&&t=0&&t0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js new file mode 100644 index 0000000..307d788 --- /dev/null +++ b/code/jeeplatform-sso-oauth2/src/main/resources/static/asserts/js/feather.min.js @@ -0,0 +1,7 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.feather=n():e.feather=n()}("undefined"!=typeof self?self:this,function(){return function(e){function n(t){if(i[t])return i[t].exports;var l=i[t]={i:t,l:!1,exports:{}};return e[t].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var i={};return n.m=e,n.c=i,n.d=function(e,i,t){n.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(i,"a",i),i},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=49)}([function(e,n,i){var t=i(36)("wks"),l=i(15),r=i(1).Symbol,o="function"==typeof r;(e.exports=function(e){return t[e]||(t[e]=o&&r[e]||(o?r:l)("Symbol."+e))}).store=t},function(e,n){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,n){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,n,i){var t=i(1),l=i(7),r=i(8),o=i(10),a=i(11),c=function(e,n,i){var y,p,h,x,s=e&c.F,u=e&c.G,f=e&c.S,d=e&c.P,v=e&c.B,g=u?t:f?t[n]||(t[n]={}):(t[n]||{}).prototype,m=u?l:l[n]||(l[n]={}),w=m.prototype||(m.prototype={});u&&(i=n);for(y in i)p=!s&&g&&void 0!==g[y],h=(p?g:i)[y],x=v&&p?a(h,t):d&&"function"==typeof h?a(Function.call,h):h,g&&o(g,y,h,e&c.U),m[y]!=h&&r(m,y,x),d&&w[y]!=h&&(w[y]=h)};t.core=l,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,n,i){var t=i(9),l=i(29),r=i(31),o=Object.defineProperty;n.f=i(5)?Object.defineProperty:function(e,n,i){if(t(e),n=r(n,!0),t(i),l)try{return o(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[n]=i.value),e}},function(e,n,i){e.exports=!i(12)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,n){var i={}.hasOwnProperty;e.exports=function(e,n){return i.call(e,n)}},function(e,n){var i=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=i)},function(e,n,i){var t=i(4),l=i(14);e.exports=i(5)?function(e,n,i){return t.f(e,n,l(1,i))}:function(e,n,i){return e[n]=i,e}},function(e,n,i){var t=i(2);e.exports=function(e){if(!t(e))throw TypeError(e+" is not an object!");return e}},function(e,n,i){var t=i(1),l=i(8),r=i(6),o=i(15)("src"),a=Function.toString,c=(""+a).split("toString");i(7).inspectSource=function(e){return a.call(e)},(e.exports=function(e,n,i,a){var y="function"==typeof i;y&&(r(i,"name")||l(i,"name",n)),e[n]!==i&&(y&&(r(i,o)||l(i,o,e[n]?""+e[n]:c.join(String(n)))),e===t?e[n]=i:a?e[n]?e[n]=i:l(e,n,i):(delete e[n],l(e,n,i)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||a.call(this)})},function(e,n,i){var t=i(32);e.exports=function(e,n,i){if(t(e),void 0===n)return e;switch(i){case 1:return function(i){return e.call(n,i)};case 2:return function(i,t){return e.call(n,i,t)};case 3:return function(i,t,l){return e.call(n,i,t,l)}}return function(){return e.apply(n,arguments)}}},function(e,n){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,n){e.exports={}},function(e,n){e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},function(e,n){var i=0,t=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++i+t).toString(36))}},function(e,n,i){var t=i(34),l=i(19);e.exports=function(e){return t(l(e))}},function(e,n,i){var t=i(11),l=i(38),r=i(39),o=i(9),a=i(22),c=i(40),y={},p={},n=e.exports=function(e,n,i,h,x){var s,u,f,d,v=x?function(){return e}:c(e),g=t(i,h,n?2:1),m=0;if("function"!=typeof v)throw TypeError(e+" is not iterable!");if(r(v)){for(s=a(e.length);s>m;m++)if((d=n?g(o(u=e[m])[0],u[1]):g(e[m]))===y||d===p)return d}else for(f=v.call(e);!(u=f.next()).done;)if((d=l(f,g,u.value,n))===y||d===p)return d};n.BREAK=y,n.RETURN=p},function(e,n){var i=Math.ceil,t=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?t:i)(e)}},function(e,n){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,n,i){"use strict";var t=i(52),l=i(3),r=i(10),o=i(8),a=i(6),c=i(13),y=i(53),p=i(24),h=i(59),x=i(0)("iterator"),s=!([].keys&&"next"in[].keys()),u=function(){return this};e.exports=function(e,n,i,f,d,v,g){y(i,n,f);var m,w,M,b=function(e){if(!s&&e in z)return z[e];switch(e){case"keys":case"values":return function(){return new i(this,e)}}return function(){return new i(this,e)}},_=n+" Iterator",A="values"==d,k=!1,z=e.prototype,S=z[x]||z["@@iterator"]||d&&z[d],H=!s&&S||b(d),V=d?A?b("entries"):H:void 0,O="Array"==n?z.entries||S:S;if(O&&(M=h(O.call(new e)))!==Object.prototype&&M.next&&(p(M,_,!0),t||a(M,x)||o(M,x,u)),A&&S&&"values"!==S.name&&(k=!0,H=function(){return S.call(this)}),t&&!g||!s&&!k&&z[x]||o(z,x,H),c[n]=H,c[_]=u,d)if(m={values:A?H:b("values"),keys:v?H:b("keys"),entries:V},g)for(w in m)w in z||r(z,w,m[w]);else l(l.P+l.F*(s||k),n,m);return m}},function(e,n,i){var t=i(55),l=i(37);e.exports=Object.keys||function(e){return t(e,l)}},function(e,n,i){var t=i(18),l=Math.min;e.exports=function(e){return e>0?l(t(e),9007199254740991):0}},function(e,n,i){var t=i(36)("keys"),l=i(15);e.exports=function(e){return t[e]||(t[e]=l(e))}},function(e,n,i){var t=i(4).f,l=i(6),r=i(0)("toStringTag");e.exports=function(e,n,i){e&&!l(e=i?e:e.prototype,r)&&t(e,r,{configurable:!0,value:n})}},function(e,n,i){var t=i(19);e.exports=function(e){return Object(t(e))}},function(e,n,i){var t=i(35),l=i(0)("toStringTag"),r="Arguments"==t(function(){return arguments}()),o=function(e,n){try{return e[n]}catch(e){}};e.exports=function(e){var n,i,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=o(n=Object(e),l))?i:r?t(n):"Object"==(a=t(n))&&"function"==typeof n.callee?"Arguments":a}},function(e,n,i){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(n,"__esModule",{value:!0});var l=i(86),r=t(l),o=i(88),a=t(o),c=i(89),y=t(c);n.default=Object.keys(a.default).map(function(e){return new r.default(e,a.default[e],y.default[e])}).reduce(function(e,n){return e[n.name]=n,e},{})},function(e,n,i){"use strict";var t=i(51)(!0);i(20)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,n=this._t,i=this._i;return i>=n.length?{value:void 0,done:!0}:(e=t(n,i),this._i+=e.length,{value:e,done:!1})})},function(e,n,i){e.exports=!i(5)&&!i(12)(function(){return 7!=Object.defineProperty(i(30)("div"),"a",{get:function(){return 7}}).a})},function(e,n,i){var t=i(2),l=i(1).document,r=t(l)&&t(l.createElement);e.exports=function(e){return r?l.createElement(e):{}}},function(e,n,i){var t=i(2);e.exports=function(e,n){if(!t(e))return e;var i,l;if(n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;if("function"==typeof(i=e.valueOf)&&!t(l=i.call(e)))return l;if(!n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;throw TypeError("Can't convert object to primitive value")}},function(e,n){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,n,i){var t=i(9),l=i(54),r=i(37),o=i(23)("IE_PROTO"),a=function(){},c=function(){var e,n=i(30)("iframe"),t=r.length;for(n.style.display="none",i(58).appendChild(n),n.src="javascript:",e=n.contentWindow.document,e.open(),e.write("