diff --git a/cas.properties b/cas.properties new file mode 100644 index 0000000..a0f90bf --- /dev/null +++ b/cas.properties @@ -0,0 +1,715 @@ +server.port=8081 +server.name=http://localhost:8080 +server.prefix=${server.name}/cas + +# 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= + +## +# 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= + +# The signing secret key. By default, must be a octet string of size 512. +# tgc.signing.key= + +# Decides whether SSO cookie should be created only under secure connections. +# tgc.secure=true + +# 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=true + +# 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=en +# 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 + +## +# 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= + +# The signing secret key. By default, must be a octet string of size 512. +# webflow.signing.key= + +## +# 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= + +datasource.url=jdbc:mysql://172.16.4.6/yobr-daily?useUnicode=true&characterEncoding=utf8 +datasource.username=yobr_query +datasource.password=yobr_query! + +## +# 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=select password from br_auth_user where account = ? + +# 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.authn.password.encoding.alg=MD5 +# 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 +# +# st.timeToKillInSeconds=10 +# 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=classpath: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 + +## +# 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/log4j2.xml b/log4j2.xml new file mode 100644 index 0000000..bf6cb67 --- /dev/null +++ b/log4j2.xml @@ -0,0 +1,125 @@ + + + + + + DEBUG + .logs + %-d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t][%c{1.}] %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 69e0769..e7ed0a3 100644 --- a/pom.xml +++ b/pom.xml @@ -18,8 +18,11 @@ 3.1.5 1.8 + 1.8 + 1.8 1.8 1.8 + false yyyy-MM-dd HH:mm:ss.SSS UTF-8 @@ -28,8 +31,8 @@ - com.pudonghot.emtomcat - emtomcat-core + me.chyxion.emtc + emtomcat 0.0.1 @@ -200,20 +203,18 @@ - - + + org.projectlombok + lombok + 1.18.16 + provided + org.springframework spring-test @@ -230,6 +231,21 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + + -Xlint:unchecked + + + org.springframework.boot spring-boot-maven-plugin diff --git a/src/main/java/org/jasig/cas/web/CasWebServer.java b/src/main/java/org/jasig/cas/web/CasWebServer.java index 1b53dcf..98f6090 100644 --- a/src/main/java/org/jasig/cas/web/CasWebServer.java +++ b/src/main/java/org/jasig/cas/web/CasWebServer.java @@ -1,14 +1,85 @@ package org.jasig.cas.web; -import com.pudonghot.emtomcat.EmTomcat; +import lombok.val; +import java.io.File; +import java.net.URL; +import java.io.IOException; +import java.util.Properties; +import java.io.FileInputStream; +import me.chyxion.emtc.EmTomcat; +import lombok.extern.slf4j.Slf4j; +import java.io.FileNotFoundException; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.core.config.Configurator; /** * @author Donghuang * @date Jul 24, 2021 15:15:58 */ +@Slf4j public class CasWebServer { - public static void main(String[] args) { - EmTomcat.run(8090); + static final String ARG_LOGGING_CONFIG_NAME = "--logging.config="; + static final String ARG_SPRING_CONFIG_NAME = "--spring.config.location="; + static final String ARG_SERVER_PORT = "--server.port="; + static final String PROP_SPRING_CONFIG_NAME = "spring.config.location"; + static final String PROP_SERVER_PORT_NAME = "server.port"; + + public static void main(final String[] args) throws IOException { + Integer port = null; + for (val arg : args) { + if (arg.startsWith(ARG_LOGGING_CONFIG_NAME)) { + val loggingConfig = arg.substring(ARG_LOGGING_CONFIG_NAME.length()); + if (StringUtils.isNotBlank(loggingConfig)) { + val configFile = new File(loggingConfig); + if (!configFile.isFile()) { + throw new FileNotFoundException( + "Log4j2 config [" + loggingConfig + "] is not a valid file"); + } + + Configurator.initialize(null, loggingConfig); + log.info("Logging config [{}] loaded.", loggingConfig); + continue; + } + } + + if (arg.startsWith(ARG_SPRING_CONFIG_NAME)) { + val springConfig = arg.substring(ARG_SPRING_CONFIG_NAME.length()); + if (StringUtils.isNotBlank(springConfig)) { + System.setProperty(PROP_SPRING_CONFIG_NAME, springConfig); + continue; + } + } + + if (arg.startsWith(ARG_SERVER_PORT)) { + val serverPort = arg.substring(ARG_SERVER_PORT.length()); + if (StringUtils.isNotBlank(serverPort)) { + log.info("Server port [{}] got from command line.", serverPort); + port = Integer.parseInt(serverPort); + continue; + } + } + } + + if (port == null) { + val springConfig = System.getProperty(PROP_SPRING_CONFIG_NAME); + if (StringUtils.isNotBlank(springConfig)) { + log.info("Load spring config [{}].", springConfig); + try (val fin = new File(springConfig).isFile() ? + new FileInputStream(springConfig) : + new URL(springConfig).openStream()) { + + val props = new Properties(); + props.load(fin); + val serverPort = props.getProperty(PROP_SERVER_PORT_NAME); + if (StringUtils.isNotBlank(serverPort)) { + log.info("Server port [{}] got from spring config.", serverPort); + port = Integer.parseInt(serverPort); + } + } + } + } + + EmTomcat.run(port != null ? port : 8080); } } diff --git a/src/main/resources/WEB-INF/spring-configuration/propertyFileConfigurer.xml b/src/main/resources/WEB-INF/spring-configuration/propertyFileConfigurer.xml index 6596390..66d8d88 100644 --- a/src/main/resources/WEB-INF/spring-configuration/propertyFileConfigurer.xml +++ b/src/main/resources/WEB-INF/spring-configuration/propertyFileConfigurer.xml @@ -16,7 +16,7 @@ can be moved between tiers without modification. - + diff --git a/start.sh b/start.sh index 2cb69f0..afc8fb7 100755 --- a/start.sh +++ b/start.sh @@ -28,6 +28,9 @@ echo "Work dir [$WORK_DIR]" mvn -T 4C -DskipTests clean \ spring-boot:run \ -Dspring-boot.run.jvmArguments='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000' \ + -Dspring-boot.run.arguments="--spring.main.banner-mode=OFF + --spring.config.location=file://$WORK_DIR/cas.properties + --logging.config=$WORK_DIR/log4j2.xml" \ -Dspring-boot.run.fork=false popd > /dev/null