package org.apereo.cas.services; import com.google.common.base.Throwables; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apereo.cas.util.crypto.PublicKeyFactoryBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.util.ResourceUtils; import java.security.PublicKey; /** * Represents a public key for a CAS registered service. * @author Misagh Moayyed * @since 4.1 */ public class RegisteredServicePublicKeyImpl implements RegisteredServicePublicKey { private static final long serialVersionUID = -8497658523695695863L; private static final Logger LOGGER = LoggerFactory.getLogger(RegisteredServicePublicKeyImpl.class); private String location; private String algorithm; private Class<PublicKeyFactoryBean> publicKeyFactoryBeanClass = PublicKeyFactoryBean.class; /** * Instantiates a new Registered service public key impl. * Required for proper serialization. */ public RegisteredServicePublicKeyImpl() {} /** * Instantiates a new Registered service public key impl. * * @param location the location * @param algorithm the algorithm */ public RegisteredServicePublicKeyImpl(final String location, final String algorithm) { this.location = location; this.algorithm = algorithm; } public void setLocation(final String location) { this.location = location; } public void setAlgorithm(final String algorithm) { this.algorithm = algorithm; } @Override public String getLocation() { return this.location; } @Override public String getAlgorithm() { return this.algorithm; } /** * Sets public key factory bean class. * * @param publicKeyFactoryBeanClass the public key factory bean class */ public void setPublicKeyFactoryBeanClass(final Class<PublicKeyFactoryBean> publicKeyFactoryBeanClass) { this.publicKeyFactoryBeanClass = publicKeyFactoryBeanClass; } @Override public PublicKey createInstance() throws Exception { try { final PublicKeyFactoryBean factory = this.publicKeyFactoryBeanClass.newInstance(); if (this.location.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) { factory.setLocation(new ClassPathResource(StringUtils.removeStart(this.location, ResourceUtils.CLASSPATH_URL_PREFIX))); } else { factory.setLocation(new FileSystemResource(this.location)); } factory.setAlgorithm(this.algorithm); factory.setSingleton(false); return factory.getObject(); } catch (final Exception e) { LOGGER.warn(e.getMessage(), e); throw Throwables.propagate(e); } } @Override public String toString() { return new ToStringBuilder(this) .append("location", this.location) .append("algorithm", this.algorithm) .toString(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final RegisteredServicePublicKeyImpl rhs = (RegisteredServicePublicKeyImpl) obj; return new EqualsBuilder() .append(this.location, rhs.location) .append(this.algorithm, rhs.algorithm) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(this.location) .append(this.algorithm) .toHashCode(); } }