Author: thomas.heute(a)jboss.com
Date: 2007-08-27 11:11:39 -0400 (Mon, 27 Aug 2007)
New Revision: 8048
Modified:
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/core/model/portal/PortalObjectPath.java
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/test/core/model/portal/PortalObjectPathTestCase.java
Log:
JBPORTAL-1614: Cannot access dashboard if logged in as user that has a "." (dot)
in the username
Fixed and rollbacked again.
Modified:
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/core/model/portal/PortalObjectPath.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/core/model/portal/PortalObjectPath.java 2007-08-24
20:52:39 UTC (rev 8047)
+++
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/core/model/portal/PortalObjectPath.java 2007-08-27
15:11:39 UTC (rev 8048)
@@ -34,6 +34,7 @@
* A path for a portal object.
*
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
* @version $Revision: 1.1 $
*/
public class PortalObjectPath implements Comparable, Serializable
@@ -365,7 +366,10 @@
{
break;
}
- length++;
+ if (next > 0 && value.charAt(next-1) != '\\')
+ {
+ length++;
+ }
previous = next + 1;
}
@@ -373,17 +377,26 @@
String[] names = new String[length];
length = 0;
previous = 1;
+ int next = 1;
while (true)
{
- int next = value.indexOf(PATH_SEPARATOR, previous);
+ next = value.indexOf(PATH_SEPARATOR, next);
if (next == -1)
{
break;
}
- names[length++] = value.substring(previous, next);
- previous = next + 1;
+ if (next > 0 && value.charAt(next-1) != '\\')
+ {
+ String name = value.substring(previous, next);
+ name = decodeName(name);
+ names[length++] = name;
+ previous = next + 1;
+ }
+ next++;
}
- names[length] = value.substring(previous);
+ String name = value.substring(previous);
+ name = decodeName(name);
+ names[length] = name;
//
return names;
@@ -406,11 +419,23 @@
{
throw new IllegalArgumentException("No null name expected in the
name string array");
}
+ name = encodeName(name);
tmp.append(PATH_SEPARATOR).append(name);
}
return tmp.toString();
}
}
+
+ protected String decodeName(String name)
+ {
+ return name.replaceAll("\\/", "/");
+ }
+
+ protected String encodeName(String name)
+ {
+ return name.replaceAll("/", "\\/");
+ }
+
}
;
@@ -438,18 +463,25 @@
int length = 1;
for (int next = value.indexOf('.'); next != -1; next =
value.indexOf('.', next + 1))
{
- length++;
+ if (next > 0 && value.charAt(next-1) != '\\')
+ {
+ length++;
+ }
}
//
String[] names = new String[length];
length = 0;
int previous = 0;
- for (int next = value.indexOf('.'); next != -1; previous = next + 1,
next = value.indexOf('.', next + 1))
+ for (int next = value.indexOf('.'); next != -1; next =
value.indexOf('.', next + 1))
{
- String name = value.substring(previous, next);
- name = decodeName(name);
- names[length++] = name;
+ if (next > 0 && value.charAt(next-1) != '\\')
+ {
+ String name = value.substring(previous, next);
+ name = decodeName(name);
+ names[length++] = name;
+ previous = next + 1;
+ }
}
String name = value.substring(previous);
name = decodeName(name);
@@ -490,13 +522,14 @@
protected String decodeName(String name)
{
- return name;
+ return name.replaceAll("\\\\\\.", ".");
}
protected String encodeName(String name)
{
- return name;
+ return name.replaceAll("\\.", "\\\\\\.");
}
+
}
public static final PortalObjectPath.Format LEGACY_BASE64_FORMAT = new
PortalObjectPath.LegacyFormat()
Modified:
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/test/core/model/portal/PortalObjectPathTestCase.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/test/core/model/portal/PortalObjectPathTestCase.java 2007-08-24
20:52:39 UTC (rev 8047)
+++
branches/JBoss_Portal_Branch_2_6/core/src/main/org/jboss/portal/test/core/model/portal/PortalObjectPathTestCase.java 2007-08-27
15:11:39 UTC (rev 8048)
@@ -141,11 +141,30 @@
assertEquals(new PortalObjectPath(new String[]{}),
PortalObjectPath.parse("/", PortalObjectPath.CANONICAL_FORMAT));
assertEquals(new PortalObjectPath(new String[]{"a"}),
PortalObjectPath.parse("/a", PortalObjectPath.CANONICAL_FORMAT));
assertEquals(new PortalObjectPath(new String[]{"a","b"}),
PortalObjectPath.parse("/a/b", PortalObjectPath.CANONICAL_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{"a.b", "c"}),
PortalObjectPath.parse(new PortalObjectPath(new String[]{"a.b",
"c"}).toString(PortalObjectPath.CANONICAL_FORMAT),
PortalObjectPath.CANONICAL_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{".a.b", "c"}),
PortalObjectPath.parse(new PortalObjectPath(new String[]{".a.b",
"c"}).toString(PortalObjectPath.CANONICAL_FORMAT),
PortalObjectPath.CANONICAL_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{"\\.a.b/",
"\\c"}), PortalObjectPath.parse(new PortalObjectPath(new
String[]{"\\.a.b/",
"\\c"}).toString(PortalObjectPath.CANONICAL_FORMAT),
PortalObjectPath.CANONICAL_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{"/"}),
PortalObjectPath.parse(new PortalObjectPath(new
String[]{"/"}).toString(PortalObjectPath.CANONICAL_FORMAT),
PortalObjectPath.CANONICAL_FORMAT));
+ String a = "a.b";
+ String b = "c";
+ PortalObjectPath pop1 = new PortalObjectPath(new String[]{a, b});
+ PortalObjectPath pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.CANONICAL_FORMAT), PortalObjectPath.CANONICAL_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.CANONICAL_FORMAT),
pop2.toString(PortalObjectPath.CANONICAL_FORMAT));
+
+ a = ".a.b";
+ b = "c";
+ pop1 = new PortalObjectPath(new String[]{a, b});
+ pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.CANONICAL_FORMAT), PortalObjectPath.CANONICAL_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.CANONICAL_FORMAT),
pop2.toString(PortalObjectPath.CANONICAL_FORMAT));
+
+ a = "\\.a.b/";
+ b = "\\c";
+ pop1 = new PortalObjectPath(new String[]{a, b});
+ pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.CANONICAL_FORMAT), PortalObjectPath.CANONICAL_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.CANONICAL_FORMAT),
pop2.toString(PortalObjectPath.CANONICAL_FORMAT));
+
+ a = "/";
+ pop1 = new PortalObjectPath(new String[]{a});
+ pop2 = PortalObjectPath.parse(new PortalObjectPath(new
String[]{a}).toString(PortalObjectPath.CANONICAL_FORMAT),
PortalObjectPath.CANONICAL_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.CANONICAL_FORMAT),
pop2.toString(PortalObjectPath.CANONICAL_FORMAT));
+
//
try
{
@@ -171,10 +190,23 @@
assertEquals(new PortalObjectPath(new String[]{"a"}),
PortalObjectPath.parse("a", PortalObjectPath.LEGACY_FORMAT));
assertEquals(new PortalObjectPath(new String[]{"a","b"}),
PortalObjectPath.parse("a.b", PortalObjectPath.LEGACY_FORMAT));
+ String a = "a.b";
+ String b = "c";
+ PortalObjectPath pop1 = new PortalObjectPath(new String[]{a, b});
+ PortalObjectPath pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.LEGACY_FORMAT), PortalObjectPath.LEGACY_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.LEGACY_FORMAT),
pop2.toString(PortalObjectPath.LEGACY_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{"a.b", "c"}),
PortalObjectPath.parse(new PortalObjectPath(new String[]{"a.b",
"c"}).toString(PortalObjectPath.LEGACY_FORMAT),
PortalObjectPath.LEGACY_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{".a.b", "c"}),
PortalObjectPath.parse(new PortalObjectPath(new String[]{".a.b",
"c"}).toString(PortalObjectPath.LEGACY_FORMAT),
PortalObjectPath.LEGACY_FORMAT));
- assertEquals(new PortalObjectPath(new String[]{"\\.a.b/",
"\\c"}), PortalObjectPath.parse(new PortalObjectPath(new
String[]{"\\.a.b/", "\\c"}).toString(PortalObjectPath.LEGACY_FORMAT),
PortalObjectPath.LEGACY_FORMAT));
+ a = ".a.b";
+ b = "c";
+ pop1 = new PortalObjectPath(new String[]{a, b});
+ pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.LEGACY_FORMAT), PortalObjectPath.LEGACY_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.LEGACY_FORMAT),
pop2.toString(PortalObjectPath.LEGACY_FORMAT));
+
+ a = "\\.a.b/";
+ b = "\\c";
+ pop1 = new PortalObjectPath(new String[]{a, b});
+ pop2 = PortalObjectPath.parse(new PortalObjectPath(new String[]{a,
b}).toString(PortalObjectPath.LEGACY_FORMAT), PortalObjectPath.LEGACY_FORMAT);
+ assertEquals(pop1.toString(PortalObjectPath.LEGACY_FORMAT),
pop2.toString(PortalObjectPath.LEGACY_FORMAT));
}
public void testEquals()