Darn it; I'm using APPLICATION_VERSION not TAPESTRY_APP_PACKAGE_PARAM.
 I'll fix this in a bit.

On Mon, Oct 8, 2012 at 10:26 AM,  <[email protected]> wrote:
> Updated Branches:
>   refs/heads/5.3 acac8db6f -> 9f935bc9f
>
>
> Make the default HMAC passphrase the application root package name
> Use the AlertManager to (help) ensure that the developer knows about an 
> unconfigured HMAC passphrase
>
>
> Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
> Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/9f935bc9
> Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/9f935bc9
> Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/9f935bc9
>
> Branch: refs/heads/5.3
> Commit: 9f935bc9f52a3c6bfa20e7ff0e0211ce19cc5f60
> Parents: acac8db
> Author: Howard M. Lewis Ship <[email protected]>
> Authored: Mon Oct 8 10:26:34 2012 -0700
> Committer: Howard M. Lewis Ship <[email protected]>
> Committed: Mon Oct 8 10:26:51 2012 -0700
>
> ----------------------------------------------------------------------
>  .../internal/services/ClientDataEncoderImpl.java   |   23 +++++++++++----
>  .../services/ClientDataEncoderImplTest.groovy      |   17 ++++++----
>  2 files changed, 27 insertions(+), 13 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f935bc9/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientDataEncoderImpl.java
> ----------------------------------------------------------------------
> diff --git 
> a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientDataEncoderImpl.java
>  
> b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientDataEncoderImpl.java
> index 3bf26cc..fc6293c 100644
> --- 
> a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientDataEncoderImpl.java
> +++ 
> b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientDataEncoderImpl.java
> @@ -15,6 +15,7 @@
>  package org.apache.tapestry5.internal.services;
>
>  import org.apache.tapestry5.SymbolConstants;
> +import org.apache.tapestry5.alerts.AlertManager;
>  import org.apache.tapestry5.internal.TapestryInternalUtils;
>  import org.apache.tapestry5.internal.util.Base64InputStream;
>  import org.apache.tapestry5.internal.util.MacOutputStream;
> @@ -38,19 +39,29 @@ public class ClientDataEncoderImpl implements 
> ClientDataEncoder
>
>      private final Key hmacKey;
>
> -    public ClientDataEncoderImpl(URLEncoder urlEncoder, 
> @Symbol(SymbolConstants.HMAC_PASSPHRASE) String passphrase, Logger logger) 
> throws UnsupportedEncodingException
> +    public ClientDataEncoderImpl(URLEncoder urlEncoder, 
> @Symbol(SymbolConstants.HMAC_PASSPHRASE) String passphrase,
> +                                 Logger logger,
> +                                 @Symbol(SymbolConstants.APPLICATION_VERSION)
> +                                 String applicationPackageName, AlertManager 
> alertManager) throws UnsupportedEncodingException
>      {
>          this.urlEncoder = urlEncoder;
>
>          if (passphrase.equals(""))
>          {
> -            logger.error(String.format("The symbol '%s' has not been 
> configured. " +
> +            String message = String.format("The symbol '%s' has not been 
> configured. " +
>                      "This is used to configure hash-based message 
> authentication of Tapestry data stored in forms, or in the URL. " +
> -                    "You application is less secure, and more vulnerable to 
> denial-of-service attacks, when this symbol is left unconfigured.",
> -                    SymbolConstants.HMAC_PASSPHRASE));
> +                    "You application is less secure, and more vulnerable to 
> denial-of-service attacks, when this symbol is not configured.",
> +                    SymbolConstants.HMAC_PASSPHRASE);
>
> -            // Errors at lower levels if the passphrase is empty, so 
> override the parameter to set a default value.
> -            passphrase = "DEFAULT";
> +            // Now to really get the attention of the developer!
> +
> +            alertManager.error(message);
> +
> +            logger.error(message);
> +
> +            // Override the blank parameter to set a default value. Use the 
> application package name,
> +            // which is justly slightly more secure than having a fixed 
> default.
> +            passphrase = applicationPackageName;
>          }
>
>          hmacKey = new SecretKeySpec(passphrase.getBytes("UTF8"), "HmacSHA1");
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f935bc9/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ClientDataEncoderImplTest.groovy
> ----------------------------------------------------------------------
> diff --git 
> a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ClientDataEncoderImplTest.groovy
>  
> b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ClientDataEncoderImplTest.groovy
> index 07399f4..68e1ab7 100644
> --- 
> a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ClientDataEncoderImplTest.groovy
> +++ 
> b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ClientDataEncoderImplTest.groovy
> @@ -1,5 +1,6 @@
>  package org.apache.tapestry5.internal.services
>
> +import org.apache.tapestry5.alerts.AlertManager
>  import org.apache.tapestry5.ioc.test.TestBase
>  import org.apache.tapestry5.services.ClientDataEncoder
>  import org.easymock.EasyMock
> @@ -43,12 +44,14 @@ class ClientDataEncoderImplTest extends TestBase {
>      @Test
>      void blank_passphrase_works_but_logs_error() {
>          Logger logger = newMock Logger
> +        AlertManager alertManager = newMock AlertManager
>
>          logger.error(EasyMock.isA(String))
> +        alertManager.error(EasyMock.isA(String))
>
>          replay()
>
> -        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "", logger)
> +        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "", logger, 
> "foo.bar", alertManager)
>
>          tryEncodeAndDecode cde
>
> @@ -57,15 +60,15 @@ class ClientDataEncoderImplTest extends TestBase {
>
>      @Test
>      void no_logged_error_with_non_blank_passphrase() {
> -        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "Testing, 
> Testing, 1.., 2.., 3...", null)
> +        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "Testing, 
> Testing, 1.., 2.., 3...", null, "foo.bar", null)
>
>          tryEncodeAndDecode cde
>      }
>
>      @Test
>      void passphrase_affects_encoded_output() {
> -        ClientDataEncoder first = new ClientDataEncoderImpl(null, "first 
> passphrase", null)
> -        ClientDataEncoder second = new ClientDataEncoderImpl(null, " 
> different passphrase ", null)
> +        ClientDataEncoder first = new ClientDataEncoderImpl(null, "first 
> passphrase", null, "foo.bar", null)
> +        ClientDataEncoder second = new ClientDataEncoderImpl(null, " 
> different passphrase ", null, "foo.bar", null)
>
>          def input = "current time millis is ${System.currentTimeMillis()} ms"
>
> @@ -79,7 +82,7 @@ class ClientDataEncoderImplTest extends TestBase {
>
>      @Test(expectedExceptions = IllegalArgumentException)
>      void decode_with_missing_hmac_prefix_is_a_failure() {
> -        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "a 
> passphrase", null)
> +        ClientDataEncoder cde = new ClientDataEncoderImpl(null, "a 
> passphrase", null, "foo.bar", null)
>
>          cde.decodeClientData("so completely invalid")
>      }
> @@ -89,8 +92,8 @@ class ClientDataEncoderImplTest extends TestBase {
>
>          // Simulate tampering by encoding with one passphrase and attempting 
> to decode with a different
>          // passphrase.
> -        ClientDataEncoder first = new ClientDataEncoderImpl(null, "first 
> passphrase", null)
> -        ClientDataEncoder second = new ClientDataEncoderImpl(null, " 
> different passphrase ", null)
> +        ClientDataEncoder first = new ClientDataEncoderImpl(null, "first 
> passphrase", null, "foo.bar", null)
> +        ClientDataEncoder second = new ClientDataEncoderImpl(null, " 
> different passphrase ", null, "foo.bar", null)
>
>          def input = "current time millis is ${System.currentTimeMillis()} ms"
>
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to