package com.evolveum.midpoint.web.page.login; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import com.evolveum.midpoint.schema.util.SecurityPolicyUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAuthenticationPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthenticationsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailAuthenticationPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.NonceCredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RegistrationsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SelfRegistrationPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SmsAuthenticationPolicyType; public class SelfRegistrationDto implements Serializable { enum AuthenticationPolicy { MAIL, SMS, NONE; } private static final long serialVersionUID = 1L; private String name; private List<ObjectReferenceType> defaultRoles; private MailAuthenticationPolicyType mailAuthenticationPolicy; private SmsAuthenticationPolicyType smsAuthenticationPolicy; private NonceCredentialsPolicyType noncePolicy; private String requiredLifecycleState; private String initialLifecycleState; private ObjectReferenceType formRef; public void initSelfRegistrationDto(SecurityPolicyType securityPolicy) throws SchemaException { if (securityPolicy == null) { return; } SelfRegistrationPolicyType selfRegistration = getSelfRegistrationPolicy(securityPolicy); if (selfRegistration == null) { return; } this.name = selfRegistration.getName(); this.defaultRoles = selfRegistration.getDefaultRole(); this.initialLifecycleState = selfRegistration.getInitialLifecycleState(); this.requiredLifecycleState = selfRegistration.getRequiredLifecycleState(); this.formRef = selfRegistration.getFormRef(); AbstractAuthenticationPolicyType authPolicy = SecurityPolicyUtil.getAuthenticationPolicy( selfRegistration.getAdditionalAuthenticationName(), securityPolicy); if (authPolicy instanceof MailAuthenticationPolicyType) { this.mailAuthenticationPolicy = (MailAuthenticationPolicyType) authPolicy; noncePolicy = SecurityPolicyUtil.getCredentialPolicy(((MailAuthenticationPolicyType) authPolicy).getMailNonce(), securityPolicy); } else if (authPolicy instanceof SmsAuthenticationPolicyType) { this.smsAuthenticationPolicy = (SmsAuthenticationPolicyType) authPolicy; noncePolicy = SecurityPolicyUtil.getCredentialPolicy(((SmsAuthenticationPolicyType) authPolicy).getSmsNonce(), securityPolicy); } } public boolean isEmpty() { return StringUtils.isEmpty(name) && CollectionUtils.isEmpty(defaultRoles) && mailAuthenticationPolicy == null && smsAuthenticationPolicy == null && noncePolicy == null; } public AuthenticationPolicy getAuthenticationMethod () { if (mailAuthenticationPolicy != null) { return AuthenticationPolicy.MAIL; } if (smsAuthenticationPolicy != null) { return AuthenticationPolicy.SMS; } return AuthenticationPolicy.NONE; } private SelfRegistrationPolicyType getSelfRegistrationPolicy(SecurityPolicyType securityPolicyType) { RegistrationsPolicyType registrationPolicy = securityPolicyType.getRegistration(); if (registrationPolicy == null) { return null; } return registrationPolicy.getSelfRegistration(); } // private AbstractAuthenticationPolicyType getAuthenticationPolicy(String selfRegistrationAuthPoliocyName, // SecurityPolicyType securityPolicy) throws SchemaException { // MailAuthenticationPolicyType mailAuthPolicy = getMailAuthenticationPolicy( // selfRegistrationAuthPoliocyName, securityPolicy); // SmsAuthenticationPolicyType smsAuthPolicy = getSmsAuthenticationPolicy( // selfRegistrationAuthPoliocyName, securityPolicy); // return checkAndGetAuthPolicyConsistence(mailAuthPolicy, smsAuthPolicy); // // } // private MailAuthenticationPolicyType getMailAuthenticationPolicy(String authName, // SecurityPolicyType securityPolicy) throws SchemaException { // AuthenticationsPolicyType authPolicies = securityPolicy.getAuthentication(); // if (authPolicies == null) { // return null; // } // return getAuthenticationPolicy(authName, authPolicies.getMailAuthentication()); // } // // private SmsAuthenticationPolicyType getSmsAuthenticationPolicy(String authName, // SecurityPolicyType securityPolicy) throws SchemaException { // AuthenticationsPolicyType authPolicies = securityPolicy.getAuthentication(); // if (authPolicies == null) { // return null; // } // return getAuthenticationPolicy(authName, authPolicies.getSmsAuthentication()); // } // // private AbstractAuthenticationPolicyType checkAndGetAuthPolicyConsistence( // MailAuthenticationPolicyType mailPolicy, SmsAuthenticationPolicyType smsPolicy) // throws SchemaException { // if (mailPolicy != null && smsPolicy != null) { // throw new SchemaException( // "Found both, mail and sms authentication method for registration. Only one of them can be present at the moment"); // } // // if (mailPolicy != null) { // return mailPolicy; // } // // return smsPolicy; // // } // private <T extends AbstractAuthenticationPolicyType> T getAuthenticationPolicy(String authName, // List<T> authPolicies) throws SchemaException { // // List<T> smsPolicies = new ArrayList<>(); // // for (T smsAuthPolicy : authPolicies) { // if (smsAuthPolicy.getName() == null && authName != null) { // continue; // } // // if (smsAuthPolicy.getName() != null && authName == null) { // continue; // } // // if (smsAuthPolicy.getName() == null && authName == null) { // smsPolicies.add(smsAuthPolicy); // } // // if (smsAuthPolicy.getName().equals(authName)) { // smsPolicies.add(smsAuthPolicy); // } // // } // // if (smsPolicies.size() > 1) { // throw new SchemaException( // "Found more than one mail authentication policy. Please review your configuration"); // } // // if (smsPolicies.size() == 0) { // return null; // } // // return smsPolicies.iterator().next(); // // } // private NonceCredentialsPolicyType getCredentialPolicy(String policyName, // SecurityPolicyType securityPolicy) throws SchemaException { // CredentialsPolicyType credentialsPolicy = securityPolicy.getCredentials(); // if (credentialsPolicy == null) { // return null; // } // // List<NonceCredentialsPolicyType> noncePolicies = credentialsPolicy.getNonce(); // // List<NonceCredentialsPolicyType> availableNoncePolicies = new ArrayList<>(); // for (NonceCredentialsPolicyType noncePolicy : noncePolicies) { // if (noncePolicy.getName() == null && policyName == null) { // availableNoncePolicies.add(noncePolicy); // } // // if (noncePolicy.getName() == null && policyName != null) { // continue; // } // // if (noncePolicy.getName() != null && policyName == null) { // continue; // } // // if (noncePolicy.getName().equals(policyName)) { // availableNoncePolicies.add(noncePolicy); // } // } // // if (availableNoncePolicies.size() > 1) { // throw new SchemaException( // "Found more than one nonce credentials policy. Please review your configuration"); // } // // if (availableNoncePolicies.size() == 0) { // return null; // } // // return availableNoncePolicies.iterator().next(); // } public boolean isMailMailAuthentication() { return mailAuthenticationPolicy != null; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<ObjectReferenceType> getDefaultRoles() { return defaultRoles; } public void setDefaultRoles(List<ObjectReferenceType> defaultRoles) { this.defaultRoles = defaultRoles; } public MailAuthenticationPolicyType getMailAuthenticationPolicy() { return mailAuthenticationPolicy; } public void setMailAuthenticationPolicy(MailAuthenticationPolicyType mailAuthenticationPolicy) { this.mailAuthenticationPolicy = mailAuthenticationPolicy; } public SmsAuthenticationPolicyType getSmsAuthenticationPolicy() { return smsAuthenticationPolicy; } public void setSmsAuthenticationPolicy(SmsAuthenticationPolicyType smsAuthenticationPolicy) { this.smsAuthenticationPolicy = smsAuthenticationPolicy; } public NonceCredentialsPolicyType getNoncePolicy() { return noncePolicy; } public void setNoncePolicy(NonceCredentialsPolicyType noncePolicy) { this.noncePolicy = noncePolicy; } public String getInitialLifecycleState() { return initialLifecycleState; } public void setInitialLifecycleState(String initialLifecycleState) { this.initialLifecycleState = initialLifecycleState; } public String getRequiredLifecycleState() { return requiredLifecycleState; } public void setRequiredLifecycleState(String requiredLifecycleState) { this.requiredLifecycleState = requiredLifecycleState; } public ObjectReferenceType getFormRef() { return formRef; } }