Author: marcel.offermans at luminis.nl
Date: Tue Jan 4 17:35:28 2011
New Revision: 557
Log:
AMDATU-222 Fixed an issue with not properly encoding and decoding attribute
values, and dealing with spaces. Added unit tests to prevent these bugs from
reappearing.
Added:
trunk/amdatu-authentication/tokenprovider/src/test/
trunk/amdatu-authentication/tokenprovider/src/test/java/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/tokenprovider/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/tokenprovider/service/
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImplTest.java
Modified:
trunk/amdatu-authentication/tokenprovider/src/main/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImpl.java
Modified:
trunk/amdatu-authentication/tokenprovider/src/main/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImpl.java
==============================================================================
---
trunk/amdatu-authentication/tokenprovider/src/main/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImpl.java
(original)
+++
trunk/amdatu-authentication/tokenprovider/src/main/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImpl.java
Tue Jan 4 17:35:28 2011
@@ -17,6 +17,7 @@
package org.amdatu.authentication.tokenprovider.service;
import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@@ -105,29 +106,35 @@
// Converts a map of attribute keys and values into a single String
representation, using
// URL encoding
- private String attributesToString(SortedMap<String, String> attributes)
throws UnsupportedEncodingException {
- String result = "";
+ String attributesToString(SortedMap<String, String> attributes) throws
UnsupportedEncodingException {
+ StringBuffer result = new StringBuffer();
if (attributes != null && attributes.size() > 0) {
for (String key : attributes.keySet()) {
String value = attributes.get(key);
- String encKey =
URLEncoder.encode(key.toString(),DEFAULT_CHARSET);
- String encValue =
URLEncoder.encode(value.toString(),DEFAULT_CHARSET);
- result += " " + encKey + "=" + encValue;
+ String encKey = URLEncoder.encode(key, DEFAULT_CHARSET);
+ String encValue = URLEncoder.encode(value, DEFAULT_CHARSET);
+ if (result.length() > 0) {
+ result.append(' ');
+ }
+ result.append(encKey);
+ result.append('=');
+ result.append(encValue);;
}
}
- return result;
+ return result.toString();
}
// Converts a single String into a map of attribute keys and values using
URL deencoding
- private SortedMap<String, String> stringToAttributes(String string) throws
UnsupportedEncodingException {
+ SortedMap<String, String> stringToAttributes(String string) throws
UnsupportedEncodingException {
SortedMap<String, String> attributes = null;
if (string != null && !"".equals(string)) {
attributes = new TreeMap<String, String>();
String[] keyvalues = string.split(" "); // space is the attribute
separator
for (String keyvalue : keyvalues) {
- String key = keyvalue.split("=")[0];
- String value = keyvalue.split("=")[1];
- attributes.put(key, value);
+ String[] entry = keyvalue.split("=");
+ String key = entry[0];
+ String value = entry[1];
+ attributes.put(key, URLDecoder.decode(value, DEFAULT_CHARSET));
}
}
return attributes;
@@ -150,7 +157,7 @@
// First create the unencrypted token
String signature = generateSignature(attributes);
- String token = signature + attributesToString(attributes);
+ String token = signature + " " + attributesToString(attributes);
// Encode the token using utf-8
byte[] utf8 = token.getBytes(DEFAULT_CHARSET);
Added:
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImplTest.java
==============================================================================
--- (empty file)
+++
trunk/amdatu-authentication/tokenprovider/src/test/java/org/amdatu/authentication/tokenprovider/service/TokenProviderImplTest.java
Tue Jan 4 17:35:28 2011
@@ -0,0 +1,58 @@
+package org.amdatu.authentication.tokenprovider.service;
+
+import java.net.URLEncoder;
+import java.util.SortedMap;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TokenProviderImplTest {
+ private static final String DEFAULT_CHARSET = "UTF-8";
+
+ @Test
+ public void testStringToSingleAttributeConversion() throws Exception {
+ TokenProviderImpl provider = new TokenProviderImpl();
+
+ String string = "a=1";
+ SortedMap<String,String> attributes =
provider.stringToAttributes(string);
+ Assert.assertEquals(1, attributes.size());
+ Assert.assertEquals("1", attributes.get("a"));
+ Assert.assertEquals(string,
provider.attributesToString(attributes));
+ }
+
+ @Test
+ public void testEncodedStringToSingleAttributeConversion() throws
Exception {
+ TokenProviderImpl provider = new TokenProviderImpl();
+
+ String string = "a=+";
+ SortedMap<String,String> attributes =
provider.stringToAttributes(string);
+ Assert.assertEquals(1, attributes.size());
+ Assert.assertEquals(" ", attributes.get("a"));
+ Assert.assertEquals(string,
provider.attributesToString(attributes));
+ }
+
+ @Test
+ public void testStringToMultipleAttributeConversion() throws Exception {
+ TokenProviderImpl provider = new TokenProviderImpl();
+
+ String string = "a=1 b=2 c=3";
+ SortedMap<String,String> attributes =
provider.stringToAttributes(string);
+ Assert.assertEquals(3, attributes.size());
+ Assert.assertEquals("3", attributes.get("c"));
+ Assert.assertEquals(string,
provider.attributesToString(attributes));
+ }
+
+ @Test
+ public void testEncodedStringToMultipleAttributeConversion() throws
Exception {
+ TokenProviderImpl provider = new TokenProviderImpl();
+
+ String avalue = "a=3";
+ String aencvalue = URLEncoder.encode(avalue, DEFAULT_CHARSET);
+ String string = "a=" + aencvalue + " b=2 c=3";
+ SortedMap<String,String> attributes =
provider.stringToAttributes(string);
+ Assert.assertEquals(3, attributes.size());
+ Assert.assertEquals("3", attributes.get("c"));
+ Assert.assertEquals(avalue, attributes.get("a"));
+ Assert.assertEquals(string,
provider.attributesToString(attributes));
+ }
+}