/* * Copyright (c) 2011 ICM Uniwersytet Warszawski All rights reserved. * See LICENCE file for licensing information. */ package eu.emi.security.authn.x509.helpers.ns; import java.io.IOException; import java.util.regex.Pattern; import javax.security.auth.x500.X500Principal; import eu.emi.security.authn.x509.impl.OpensslNameUtils; /** * Represents a namespace policy, i.e. defines which subject DNs are permitted or denied for an issuer. * @author K. Benedyczak */ public class OpensslNamespacePolicyImpl implements NamespacePolicy { private String issuer; private String subject; private String definedForSubject; private String identification; private boolean permit; private Pattern pattern; public OpensslNamespacePolicyImpl(String issuer, String subject, String definedForSubject, boolean permit, String identification) throws IOException { this.issuer = issuer; this.identification = identification; this.subject = subject; this.permit = permit; this.definedForSubject = definedForSubject; try { this.pattern = Pattern.compile(this.subject, Pattern.CASE_INSENSITIVE); } catch (Exception e) { throw new IOException("Problem parsing the regular expression in " + identification + ". Regular expression >>" + subject + "<< is invalid: " + e.getMessage(), e); } } /** * @return the issuer */ @Override public String getIssuer() { return issuer; } /** * @return the subject */ public String getSuject() { return subject; } /** * @return whether the policy is permit or deny */ @Override public boolean isPermit() { return permit; } /** * @return the identification */ @Override public String getIdentification() { return identification; } /** * Checks whether the given subject name is matching this policy. * @param subject to be checked * @return true if subject is matched, false otherwise */ @Override public boolean isSubjectMatching(X500Principal subject) { String opensslDn = OpensslNameUtils.convertFromRfc2253(subject.getName(), false); String normalized = OpensslNameUtils.normalize(opensslDn); return pattern.matcher(normalized).matches(); } @Override public String getDefinedFor() { return definedForSubject; } }