/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.syncope.core.spring.security; import org.apache.syncope.core.spring.security.DefaultPasswordGenerator; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf; import org.apache.syncope.common.lib.policy.PasswordRuleConf; import org.apache.syncope.core.provisioning.api.utils.policy.InvalidPasswordRuleConf; import org.apache.syncope.core.provisioning.api.utils.policy.PolicyPattern; import org.junit.Test; public class PasswordGeneratorTest { private final DefaultPasswordGenerator passwordGenerator = new DefaultPasswordGenerator(); private DefaultPasswordRuleConf createBaseDefaultPasswordRuleConf() { DefaultPasswordRuleConf baseDefaultPasswordRuleConf = new DefaultPasswordRuleConf(); baseDefaultPasswordRuleConf.setAlphanumericRequired(false); baseDefaultPasswordRuleConf.setDigitRequired(false); baseDefaultPasswordRuleConf.setLowercaseRequired(false); baseDefaultPasswordRuleConf.setMaxLength(1000); baseDefaultPasswordRuleConf.setMinLength(8); baseDefaultPasswordRuleConf.setMustEndWithAlpha(false); baseDefaultPasswordRuleConf.setMustEndWithDigit(false); baseDefaultPasswordRuleConf.setMustEndWithNonAlpha(false); baseDefaultPasswordRuleConf.setMustStartWithAlpha(false); baseDefaultPasswordRuleConf.setMustStartWithDigit(false); baseDefaultPasswordRuleConf.setMustStartWithNonAlpha(false); baseDefaultPasswordRuleConf.setMustntEndWithAlpha(false); baseDefaultPasswordRuleConf.setMustntEndWithDigit(false); baseDefaultPasswordRuleConf.setMustntEndWithNonAlpha(false); baseDefaultPasswordRuleConf.setMustntStartWithAlpha(false); baseDefaultPasswordRuleConf.setMustntStartWithDigit(false); baseDefaultPasswordRuleConf.setMustntStartWithNonAlpha(false); baseDefaultPasswordRuleConf.setNonAlphanumericRequired(false); baseDefaultPasswordRuleConf.setUppercaseRequired(false); return baseDefaultPasswordRuleConf; } @Test public void startEndWithDigit() throws InvalidPasswordRuleConf { DefaultPasswordRuleConf pwdRuleConf = createBaseDefaultPasswordRuleConf(); pwdRuleConf.setMustStartWithDigit(true); DefaultPasswordRuleConf pwdRuleConf2 = createBaseDefaultPasswordRuleConf(); pwdRuleConf2.setMustEndWithDigit(true); List<PasswordRuleConf> ruleConfs = new ArrayList<>(); ruleConfs.add(pwdRuleConf); ruleConfs.add(pwdRuleConf2); String generatedPassword = passwordGenerator.generate(ruleConfs); assertTrue(Character.isDigit(generatedPassword.charAt(0))); assertTrue(Character.isDigit(generatedPassword.charAt(generatedPassword.length() - 1))); } @Test public void startWithDigitAndWithAlpha() throws InvalidPasswordRuleConf { DefaultPasswordRuleConf pwdRuleConf = createBaseDefaultPasswordRuleConf(); pwdRuleConf.setMustStartWithDigit(true); DefaultPasswordRuleConf pwdRuleConf2 = createBaseDefaultPasswordRuleConf(); pwdRuleConf2.setMustEndWithAlpha(true); List<PasswordRuleConf> pwdRuleConfs = new ArrayList<>(); pwdRuleConfs.add(pwdRuleConf); pwdRuleConfs.add(pwdRuleConf2); String generatedPassword = passwordGenerator.generate(pwdRuleConfs); assertTrue(Character.isDigit(generatedPassword.charAt(0))); assertTrue(Character.isLetter(generatedPassword.charAt(generatedPassword.length() - 1))); } @Test public void passwordWithNonAlpha() throws InvalidPasswordRuleConf { DefaultPasswordRuleConf pwdRuleConf = createBaseDefaultPasswordRuleConf(); pwdRuleConf.setNonAlphanumericRequired(true); DefaultPasswordRuleConf pwdRuleConf2 = createBaseDefaultPasswordRuleConf(); pwdRuleConf2.setMustEndWithAlpha(true); List<PasswordRuleConf> pwdRuleConfs = new ArrayList<>(); pwdRuleConfs.add(pwdRuleConf); pwdRuleConfs.add(pwdRuleConf2); String generatedPassword = passwordGenerator.generate(pwdRuleConfs); assertTrue(PolicyPattern.NON_ALPHANUMERIC.matcher(generatedPassword).matches()); assertTrue(Character.isLetter(generatedPassword.charAt(generatedPassword.length() - 1))); } @Test(expected = InvalidPasswordRuleConf.class) public void incopatiblePolicies() throws InvalidPasswordRuleConf { DefaultPasswordRuleConf pwdRuleConf = createBaseDefaultPasswordRuleConf(); pwdRuleConf.setMinLength(12); DefaultPasswordRuleConf pwdRuleConf2 = createBaseDefaultPasswordRuleConf(); pwdRuleConf.setMaxLength(10); List<PasswordRuleConf> pwdRuleConfs = new ArrayList<>(); pwdRuleConfs.add(pwdRuleConf); pwdRuleConfs.add(pwdRuleConf2); passwordGenerator.generate(pwdRuleConfs); } @Test public void issueSYNCOPE678() { String password = null; try { password = passwordGenerator.generate(Collections.<PasswordRuleConf>emptyList()); } catch (InvalidPasswordRuleConf e) { fail(e.getMessage()); } assertNotNull(password); DefaultPasswordRuleConf ppSpec = createBaseDefaultPasswordRuleConf(); ppSpec.setMinLength(0); password = null; try { password = passwordGenerator.generate(Collections.<PasswordRuleConf>singletonList(ppSpec)); } catch (InvalidPasswordRuleConf e) { fail(e.getMessage()); } assertNotNull(password); } }