Permalink
Browse files

Merge remote-tracking branch 'upstream/master'

  • Loading branch information...
2 parents 74a5f77 + ea780b9 commit a76e697488d8526403bc997d34f82f78f2e846f9 @dsklyut committed Mar 15, 2012
Showing with 533 additions and 316 deletions.
  1. +93 −14 SpringSecurityCoreGrailsPlugin.groovy
  2. +4 −3 application.properties
  3. +3 −1 build.xml
  4. +22 −21 grails-app/conf/BuildConfig.groovy
  5. +6 −1 grails-app/conf/DefaultSecurityConfig.groovy
  6. +1 −1 grails-app/domain/test/TestPersistentLogin.groovy
  7. +1 −1 grails-app/domain/test/TestRequestmap.groovy
  8. +1 −1 grails-app/domain/test/TestRole.groovy
  9. +1 −1 grails-app/domain/test/TestUser.groovy
  10. +1 −1 grails-app/domain/test/TestUserRole.groovy
  11. +1 −1 grails-app/services/grails/plugins/springsecurity/SpringSecurityService.groovy
  12. +2 −2 grails-app/taglib/grails/plugins/springsecurity/SecurityTagLib.groovy
  13. +5 −6 scripts/CreateS2TestApps.groovy
  14. +1 −2 scripts/S2CreatePersistentToken.groovy
  15. +1 −1 scripts/S2Quickstart.groovy
  16. +0 −99 scripts/_Events.groovy
  17. +1 −1 scripts/_S2Common.groovy
  18. +26 −0 src/docs/guide/1 Introduction to the Spring Security Plugin.gdoc
  19. +11 −8 src/docs/guide/11 Custom UserDetailsService.gdoc
  20. +10 −10 src/docs/guide/13 URL Properties.gdoc
  21. +6 −5 src/docs/guide/16 Filters.gdoc
  22. +18 −0 src/docs/guide/17 Channel Security.gdoc
  23. +8 −8 src/docs/guide/22 Miscellaneous Properties.gdoc
  24. +1 −1 src/docs/guide/23.1 Using Controller Annotations to Secure URLs.gdoc
  25. +8 −5 src/docs/guide/23.2 Migration From the Acegi Plugin.gdoc
  26. +5 −5 src/docs/guide/25 Internationalization.gdoc
  27. +1 −1 src/docs/guide/3 Migrating from the Acegi Plugin.gdoc
  28. +19 −0 src/docs/guide/5 Configuring Request Mappings to Secure URLs.gdoc
  29. +1 −1 src/docs/guide/5.1 Defining Secured Annotations.gdoc
  30. +3 −3 src/docs/guide/7.1 Event Notification.gdoc
  31. +3 −2 src/docs/guide/7.2 Registering an Event Listener.gdoc
  32. +5 −5 src/docs/guide/7.3 Registering Callback Closures.gdoc
  33. +2 −2 src/docs/guide/9.2 Certificate (X509) Login Authentication.gdoc
  34. +6 −6 src/docs/guide/9.3 Remember-Me Cookie.gdoc
  35. +1 −1 src/groovy/org/codehaus/groovy/grails/plugins/springsecurity/GormPersistentTokenRepository.groovy
  36. +1 −1 src/groovy/org/codehaus/groovy/grails/plugins/springsecurity/GormUserDetailsService.groovy
  37. +1 −1 src/groovy/org/codehaus/groovy/grails/plugins/springsecurity/ReflectionUtils.groovy
  38. +1 −1 src/java/grails/plugins/springsecurity/BCryptPasswordEncoder.java
  39. +1 −1 src/java/grails/plugins/springsecurity/DigestAuthPasswordEncoder.java
  40. +1 −1 src/java/grails/plugins/springsecurity/Secured.java
  41. +1 −1 src/java/grails/plugins/springsecurity/SecurityConfigType.java
  42. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/AbstractFilterInvocationDefinition.java
  43. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAccessDeniedHandler.java
  44. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationEntryPoint.java
  45. +1 −1 ...java/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationFailureHandler.java
  46. +1 −1 ...java/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationSuccessHandler.java
  47. +30 −9 src/java/org/codehaus/groovy/grails/plugins/springsecurity/AnnotationFilterInvocationDefinition.java
  48. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/AuthenticatedVetoableDecisionManager.java
  49. +1 −1 ...roovy/grails/plugins/springsecurity/ChannelFilterInvocationSecurityMetadataSourceFactoryBean.java
  50. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/DefaultPostAuthenticationChecks.java
  51. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/DefaultPreAuthenticationChecks.java
  52. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/GrailsUser.java
  53. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/GrailsUserDetailsService.java
  54. +1 −1 ...java/org/codehaus/groovy/grails/plugins/springsecurity/GrailsWebInvocationPrivilegeEvaluator.java
  55. +72 −0 src/java/org/codehaus/groovy/grails/plugins/springsecurity/HeaderCheckInsecureChannelProcessor.java
  56. +72 −0 src/java/org/codehaus/groovy/grails/plugins/springsecurity/HeaderCheckSecureChannelProcessor.java
  57. +1 −1 .../org/codehaus/groovy/grails/plugins/springsecurity/InterceptUrlMapFilterInvocationDefinition.java
  58. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/IpAddressFilter.java
  59. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/MutableLogoutFilter.java
  60. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/NullLogoutHandlerRememberMeServices.java
  61. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/NullSaltSource.java
  62. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/RequestHolderAuthenticationFilter.java
  63. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/RequestmapFilterInvocationDefinition.java
  64. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/SecurityEventListener.java
  65. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/SecurityFilterPosition.java
  66. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/SecurityRequestHolder.java
  67. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/SpringSecurityUtils.java
  68. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/WebExpressionConfigAttribute.java
  69. +1 −1 src/java/org/codehaus/groovy/grails/plugins/springsecurity/WebExpressionVoter.java
  70. +2 −4 test/integration/grails/plugins/springsecurity/SecurityTagLibTests.groovy
  71. +1 −2 test/integration/grails/plugins/springsecurity/SpringSecurityServiceIntegrationTests.groovy
  72. +1 −1 ...ation/org/codehaus/groovy/grails/plugins/springsecurity/GormPersistentTokenRepositoryTests.groovy
  73. +1 −1 .../integration/org/codehaus/groovy/grails/plugins/springsecurity/GormUserDetailsServiceTests.groovy
  74. +1 −1 ...egration/org/codehaus/groovy/grails/plugins/springsecurity/ReflectionUtilsIntegrationTests.groovy
  75. +2 −2 ...tion/org/codehaus/groovy/grails/plugins/springsecurity/SpringSecurityUtilsIntegrationTests.groovy
  76. +1 −1 test/unit/grails/plugins/springsecurity/BCryptPasswordEncoderTests.groovy
  77. +1 −1 test/unit/grails/plugins/springsecurity/SpringSecurityServiceTests.groovy
  78. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAccessDeniedHandlerTests.groovy
  79. +1 −1 ...t/org/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationEntryPointTests.groovy
  80. +1 −1 ...g/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationFailureHandlerTests.groovy
  81. +1 −1 ...g/codehaus/groovy/grails/plugins/springsecurity/AjaxAwareAuthenticationSuccessHandlerTests.groovy
  82. +2 −2 ...rg/codehaus/groovy/grails/plugins/springsecurity/AnnotationFilterInvocationDefinitionTests.groovy
  83. +1 −1 ...rg/codehaus/groovy/grails/plugins/springsecurity/AuthenticatedVetoableDecisionManagerTests.groovy
  84. +1 −1 ...rails/plugins/springsecurity/ChannelFilterInvocationSecurityMetadataSourceFactoryBeanTests.groovy
  85. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/FakeApplication.groovy
  86. +1 −1 ...dehaus/groovy/grails/plugins/springsecurity/InterceptUrlMapFilterInvocationDefinitionTests.groovy
  87. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/IpAddressFilterTests.groovy
  88. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/MutableLogoutFilterTests.groovy
  89. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/NullSaltSourceTests.groovy
  90. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/ReflectionUtilsTests.groovy
  91. +1 −1 ...t/org/codehaus/groovy/grails/plugins/springsecurity/RequestHolderAuthenticationFilterTests.groovy
  92. +21 −24 ...rg/codehaus/groovy/grails/plugins/springsecurity/RequestmapFilterInvocationDefinitionTests.groovy
  93. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/SecurityEventListenerTests.groovy
  94. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/SecurityRequestHolderTests.groovy
  95. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/SecurityTestUtils.groovy
  96. +1 −1 test/unit/org/codehaus/groovy/grails/plugins/springsecurity/SpringSecurityUtilsTests.groovy
@@ -1,4 +1,4 @@
-/* Copyright 2006-2011 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -92,6 +92,8 @@ import org.codehaus.groovy.grails.plugins.springsecurity.ChannelFilterInvocation
import org.codehaus.groovy.grails.plugins.springsecurity.GormPersistentTokenRepository
import org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsWebInvocationPrivilegeEvaluator
+import org.codehaus.groovy.grails.plugins.springsecurity.HeaderCheckSecureChannelProcessor
+import org.codehaus.groovy.grails.plugins.springsecurity.HeaderCheckInsecureChannelProcessor
import org.codehaus.groovy.grails.plugins.springsecurity.InterceptUrlMapFilterInvocationDefinition
import org.codehaus.groovy.grails.plugins.springsecurity.IpAddressFilter
import org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter
@@ -111,7 +113,7 @@ import org.codehaus.groovy.grails.plugins.springsecurity.WebExpressionVoter
*/
class SpringSecurityCoreGrailsPlugin {
- String version = '1.2.4'
+ String version = '1.2.7.2'
String grailsVersion = '1.2.2 > *'
List observe = ['controllers']
List loadAfter = ['controllers', 'services', 'hibernate']
@@ -130,11 +132,15 @@ class SpringSecurityCoreGrailsPlugin {
String documentation = 'http://grails.org/plugin/spring-security-core'
String license = 'APACHE'
- def organization = [ name: 'SpringSource', url: 'http://www.springsource.org/' ]
- def developers = [
- [ name: 'Burt Beckwith', email: 'beckwithb@vmware.com' ] ]
- def issueManagement = [ system: 'JIRA', url: 'http://jira.grails.org/browse/GPSPRINGSECURITYCORE' ]
- def scm = [ url: 'https://github.com/grails-plugins/grails-spring-security-core' ]
+ def organization = [name: 'SpringSource', url: 'http://www.springsource.org/']
+ def issueManagement = [system: 'JIRA', url: 'http://jira.grails.org/browse/GPSPRINGSECURITYCORE']
+ def scm = [url: 'https://github.com/grails-plugins/grails-spring-security-core']
+
+ // make sure the filter chain filter is after the Grails filter
+ def getWebXmlFilterOrder() {
+ def FilterManager = getClass().getClassLoader().loadClass('grails.plugin.webxml.FilterManager')
+ [springSecurityFilterChain: FilterManager.GRAILS_WEB_REQUEST_POSITION + 100]
+ }
def doWithWebDescriptor = { xml ->
@@ -147,7 +153,29 @@ class SpringSecurityCoreGrailsPlugin {
return
}
- // filter chain is added in _Events.groovy to ensure correct positioning
+ // we add the filter(s) right after the last context-param
+ def contextParam = xml.'context-param'
+
+ // the name of the filter matches the name of the Spring bean that it delegates to
+ contextParam[contextParam.size() - 1] + {
+ 'filter' {
+ 'filter-name'('springSecurityFilterChain')
+ 'filter-class'(DelegatingFilterProxy.name)
+ }
+ }
+
+ // add the filter-mapping after the Spring character encoding filter
+ findMappingLocation.delegate = delegate
+ def mappingLocation = findMappingLocation(xml)
+ mappingLocation + {
+ 'filter-mapping' {
+ 'filter-name'('springSecurityFilterChain')
+ 'url-pattern'('/*')
+ 'dispatcher'('ERROR')
+ 'dispatcher'('FORWARD')
+ 'dispatcher'('REQUEST')
+ }
+ }
if (conf.useHttpSessionEventPublisher) {
def filterMapping = xml.'filter-mapping'
@@ -177,7 +205,7 @@ class SpringSecurityCoreGrailsPlugin {
return
}
- println '\nConfiguring Spring Security ...'
+ println '\nConfiguring Spring Security Core ...'
createRefList.delegate = delegate
@@ -491,6 +519,8 @@ to default to 'Annotation'; setting value to 'Annotation'
if (conf.registerLoggerListener) {
loggerListener(LoggerListener)
}
+
+ println '... finished configuring Spring Security Core\n'
}
def doWithDynamicMethods = { ctx ->
@@ -875,16 +905,31 @@ to default to 'Annotation'; setting value to 'Annotation'
portResolver = ref('portResolver')
}
- secureChannelProcessor(SecureChannelProcessor) {
- entryPoint = retryWithHttpsEntryPoint
+ if (conf.secureChannel.useHeaderCheckChannelSecurity) {
+ secureChannelProcessor(HeaderCheckSecureChannelProcessor) {
+ entryPoint = ref('retryWithHttpsEntryPoint')
+ headerName = conf.secureChannel.secureHeaderName // 'X-Forwarded-Proto'
+ headerValue = conf.secureChannel.secureHeaderValue // 'http'
+ }
+
+ insecureChannelProcessor(HeaderCheckInsecureChannelProcessor) {
+ entryPoint = ref('retryWithHttpEntryPoint')
+ headerName = conf.secureChannel.insecureHeaderName // 'X-Forwarded-Proto'
+ headerValue = conf.secureChannel.insecureHeaderValue // 'https'
+ }
}
+ else {
+ secureChannelProcessor(SecureChannelProcessor) {
+ entryPoint = ref('retryWithHttpsEntryPoint')
+ }
- insecureChannelProcessor(InsecureChannelProcessor) {
- entryPoint = retryWithHttpEntryPoint
+ insecureChannelProcessor(InsecureChannelProcessor) {
+ entryPoint = ref('retryWithHttpEntryPoint')
+ }
}
channelDecisionManager(ChannelDecisionManagerImpl) {
- channelProcessors = [insecureChannelProcessor, secureChannelProcessor]
+ channelProcessors = [ref('insecureChannelProcessor'), ref('secureChannelProcessor')]
}
channelFilterInvocationSecurityMetadataSource(ChannelFilterInvocationSecurityMetadataSourceFactoryBean) {
@@ -988,4 +1033,38 @@ to default to 'Annotation'; setting value to 'Annotation'
authenticationEntryPoint(Http403ForbiddenEntryPoint)
}
+
+ private findMappingLocation = { xml ->
+
+ // find the location to insert the filter-mapping; needs to be after the 'charEncodingFilter'
+ // which may not exist. should also be before the sitemesh filter.
+ // thanks to the JSecurity plugin for the logic.
+
+ def mappingLocation = xml.'filter-mapping'.find { it.'filter-name'.text() == 'charEncodingFilter' }
+ if (mappingLocation) {
+ return mappingLocation
+ }
+
+ // no 'charEncodingFilter'; try to put it before sitemesh
+ int i = 0
+ int siteMeshIndex = -1
+ xml.'filter-mapping'.each {
+ if (it.'filter-name'.text().equalsIgnoreCase('sitemesh')) {
+ siteMeshIndex = i
+ }
+ i++
+ }
+ if (siteMeshIndex > 0) {
+ return xml.'filter-mapping'[siteMeshIndex - 1]
+ }
+
+ if (siteMeshIndex == 0 || xml.'filter-mapping'.size() == 0) {
+ def filters = xml.'filter'
+ return filters[filters.size() - 1]
+ }
+
+ // neither filter found
+ def filters = xml.'filter'
+ return filters[filters.size() - 1]
+ }
}
View
@@ -1,3 +1,4 @@
-app.grails.version=2.0.0.M2
-plugins.hibernate=2.0.0.M2
-plugins.svn=1.0.0.M1
+#Grails Metadata file
+#Fri Jan 27 15:00:07 EST 2012
+app.grails.version=2.0.0
+plugins.release=1.0.1
View
@@ -43,7 +43,9 @@
</target>
<target name='test' description='Run unit tests' depends='clean'>
- <grails action='test-app' environment='test' />
+ <grails action='test-app' environment='test'>
+ <args><arg value='--non-interactive' /></args>
+ </grails>
</target>
<target name='package' description='Package the plugin'
@@ -1,12 +1,11 @@
-grails.project.class.dir = 'target/classes'
-grails.project.test.class.dir = 'target/test-classes'
-grails.project.test.reports.dir = 'target/test-reports'
+import grails.util.Metadata
+
+grails.project.work.dir = 'target'
grails.project.docs.output.dir = 'docs/manual' // for backwards-compatibility, the docs are checked into gh-pages branch
grails.project.dependency.resolution = {
inherits 'global'
-
log 'warn'
repositories {
@@ -18,29 +17,31 @@ grails.project.dependency.resolution = {
}
dependencies {
- compile('org.springframework.security:spring-security-core:3.0.5.RELEASE') {
- transitive = false
+ compile('org.springframework.security:spring-security-core:3.0.7.RELEASE') {
+// transitive = false
+ excludes 'spring-expression', 'spring-core', 'spring-context', 'spring-tx',
+ 'spring-aop', 'spring-jdbc', 'spring-web', 'spring-test', 'aspectjrt',
+ 'aspectjweaver', 'cglib-nodep', 'ehcache', 'commons-collections',
+ 'hsqldb', 'jsr250-api', 'log4j', 'junit', 'mockito-core', 'jmock-junit4'
}
- compile('org.springframework.security:spring-security-web:3.0.5.RELEASE') {
- transitive = false
+ compile('org.springframework.security:spring-security-web:3.0.7.RELEASE') {
+// transitive = false
+ excludes 'spring-security-core', 'spring-web', 'spring-jdbc', 'spring-test',
+ 'commons-codec', 'hsqldb', 'servlet-api', 'junit', 'mockito-core', 'jmock-junit4'
}
}
plugins {
- build(':release:1.0.0.RC3') {
- export = false
+
+ if (Metadata.current.getGrailsVersion()[0] != '1') {
+ build(":hibernate:$grailsVersion") {
+ export = false
+ excludes 'dom4j'
+ }
}
- }
-}
-coverage {
- enabledByDefault = true
- sourceInclusions = ['grails-app/conf']
- exclusionListOverride = [
- '*GrailsPlugin*',
- 'DataSource*',
- '*Config*',
- 'test/**'
- ]
+ // hackish using 'provided' but 'build' doesn't put it in the pom
+ provided ':webxml:1.4.1'
+ }
}
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -199,6 +199,11 @@ security {
// secure channel filter (http/https)
secureChannel.definition = [:]
+ secureChannel.useHeaderCheckChannelSecurity = false
+ secureChannel.secureHeaderName = 'X-Forwarded-Proto'
+ secureChannel.secureHeaderValue = 'http'
+ secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
+ secureChannel.insecureHeaderValue = 'https'
// X509
useX509 = false
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -258,7 +258,7 @@ class SecurityTagLib {
}
protected synchronized Expression findOrCreateExpression(String text) {
- Expression expression = expressionCache.get(text);
+ Expression expression = expressionCache.get(text)
if (!expression) {
expression = webExpressionHandler.expressionParser.parseExpression(text)
expressionCache[text] = expression
@@ -56,13 +56,12 @@ resolver localPluginResolver
""")
}
- buildConfig.withWriter {
- it.writeLine contents
- // install plugins in local dir to make optional STS setup easier
- it.writeLine 'grails.project.plugins.dir = "plugins"'
- }
+ contents = contents.replace('grails.project.class.dir = "target/classes"', "grails.project.work.dir = 'target'")
+ contents = contents.replace('grails.project.test.class.dir = "target/test-classes"', '')
+ contents = contents.replace('grails.project.test.reports.dir = "target/test-reports"', '')
+
+ buildConfig.withWriter { it.writeLine contents }
- ant.mkdir dir: "$testprojectRoot/plugins"
callGrails(grailsHome, testprojectRoot, 'dev', 'install-plugin') {
ant.arg value: "functional-test $functionalTestPluginVersion"
}
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -12,7 +12,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import groovy.text.SimpleTemplateEngine
includeTargets << new File("$springSecurityCorePluginDir/scripts/_S2Common.groovy")
@@ -1,4 +1,4 @@
-/* Copyright 2006-2010 the original author or authors.
+/* Copyright 2006-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Oops, something went wrong.

0 comments on commit a76e697

Please sign in to comment.