|
@@ -0,0 +1,158 @@
|
|
|
+/* Copyright 2004 Acegi Technology Pty Limited
|
|
|
+ *
|
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
+ * you may not use this file except in compliance with the License.
|
|
|
+ * You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ * See the License for the specific language governing permissions and
|
|
|
+ * limitations under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+package net.sf.acegisecurity.providers.encoding;
|
|
|
+
|
|
|
+import junit.framework.TestCase;
|
|
|
+
|
|
|
+import org.springframework.dao.DataAccessException;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * TestCase for BasePasswordEncoder.
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author Ben Alex
|
|
|
+ * @version $Id$
|
|
|
+ */
|
|
|
+public class BasePasswordEncoderTests extends TestCase {
|
|
|
+ //~ Methods ================================================================
|
|
|
+
|
|
|
+ public void testDemergeHandlesEmptyAndNullSalts() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ String merged = pwd.nowMergePasswordAndSalt("password", null, true);
|
|
|
+
|
|
|
+ String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
|
|
|
+ assertEquals("password", demerged[0]);
|
|
|
+ assertEquals("", demerged[1]);
|
|
|
+
|
|
|
+ merged = pwd.nowMergePasswordAndSalt("password", "", true);
|
|
|
+
|
|
|
+ demerged = pwd.nowDemergePasswordAndSalt(merged);
|
|
|
+ assertEquals("password", demerged[0]);
|
|
|
+ assertEquals("", demerged[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testDemergeWithEmptyStringIsRejected() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ try {
|
|
|
+ pwd.nowDemergePasswordAndSalt("");
|
|
|
+ fail("Should have thrown IllegalArgumentException");
|
|
|
+ } catch (IllegalArgumentException expected) {
|
|
|
+ assertEquals("Cannot pass a null or empty String",
|
|
|
+ expected.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testDemergeWithNullIsRejected() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ try {
|
|
|
+ pwd.nowDemergePasswordAndSalt(null);
|
|
|
+ fail("Should have thrown IllegalArgumentException");
|
|
|
+ } catch (IllegalArgumentException expected) {
|
|
|
+ assertEquals("Cannot pass a null or empty String",
|
|
|
+ expected.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testMergeDemerge() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ String merged = pwd.nowMergePasswordAndSalt("password", "foo", true);
|
|
|
+ assertEquals("password{foo}", merged);
|
|
|
+
|
|
|
+ String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
|
|
|
+ assertEquals("password", demerged[0]);
|
|
|
+ assertEquals("foo", demerged[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testMergeDemergeWithDelimitersInPassword() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ String merged = pwd.nowMergePasswordAndSalt("p{ass{w{o}rd", "foo", true);
|
|
|
+ assertEquals("p{ass{w{o}rd{foo}", merged);
|
|
|
+
|
|
|
+ String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
|
|
|
+ System.out.println(demerged[0]);
|
|
|
+ System.out.println(demerged[1]);
|
|
|
+
|
|
|
+ assertEquals("p{ass{w{o}rd", demerged[0]);
|
|
|
+ assertEquals("foo", demerged[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testMergeDemergeWithNullAsPassword() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ String merged = pwd.nowMergePasswordAndSalt(null, "foo", true);
|
|
|
+ assertEquals("{foo}", merged);
|
|
|
+
|
|
|
+ String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
|
|
|
+ assertEquals("", demerged[0]);
|
|
|
+ assertEquals("foo", demerged[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testStrictMergeRejectsDelimitersInSalt1() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ try {
|
|
|
+ pwd.nowMergePasswordAndSalt("password", "f{oo", true);
|
|
|
+ fail("Should have thrown IllegalArgumentException");
|
|
|
+ } catch (IllegalArgumentException expected) {
|
|
|
+ assertEquals("Cannot use { or } in salt.toString()",
|
|
|
+ expected.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testStrictMergeRejectsDelimitersInSalt2() {
|
|
|
+ MockPasswordEncoder pwd = new MockPasswordEncoder();
|
|
|
+
|
|
|
+ try {
|
|
|
+ pwd.nowMergePasswordAndSalt("password", "f}oo", true);
|
|
|
+ fail("Should have thrown IllegalArgumentException");
|
|
|
+ } catch (IllegalArgumentException expected) {
|
|
|
+ assertEquals("Cannot use { or } in salt.toString()",
|
|
|
+ expected.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //~ Inner Classes ==========================================================
|
|
|
+
|
|
|
+ private class MockPasswordEncoder extends BasePasswordEncoder {
|
|
|
+ public boolean isPasswordValid(String encPass, String rawPass,
|
|
|
+ Object salt) throws DataAccessException {
|
|
|
+ throw new UnsupportedOperationException(
|
|
|
+ "mock method not implemented");
|
|
|
+ }
|
|
|
+
|
|
|
+ public String encodePassword(String rawPass, Object salt)
|
|
|
+ throws DataAccessException {
|
|
|
+ throw new UnsupportedOperationException(
|
|
|
+ "mock method not implemented");
|
|
|
+ }
|
|
|
+
|
|
|
+ public String[] nowDemergePasswordAndSalt(String password) {
|
|
|
+ return demergePasswordAndSalt(password);
|
|
|
+ }
|
|
|
+
|
|
|
+ public String nowMergePasswordAndSalt(String password, Object salt,
|
|
|
+ boolean strict) {
|
|
|
+ return mergePasswordAndSalt(password, salt, strict);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|