package org.alfresco.repo.remotecredentials; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.alfresco.repo.node.encryption.MetadataEncryptor; import org.alfresco.service.cmr.remotecredentials.BaseCredentialsInfo; import org.alfresco.service.cmr.remotecredentials.OAuth2CredentialsInfo; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; /** * The Factory for building {@link OAuth2CredentialsInfo} objects * * @author Nick Burch * @since Odin */ public class OAuth2CredentialsFactory implements RemoteCredentialsInfoFactory { private MetadataEncryptor metadataEncryptor; public void setMetadataEncryptor(MetadataEncryptor metadataEncryptor) { this.metadataEncryptor = metadataEncryptor; } /** * Creates a new {@link OAuth2CredentialsInfo} based on the details of the underlying node. */ public OAuth2CredentialsInfo createCredentials(QName type, NodeRef nodeRef, String remoteSystemName, NodeRef remoteSystemContainerNodeRef, Map properties) { // Decrypt the token details String accessToken = (String)metadataEncryptor.decrypt( RemoteCredentialsModel.PROP_OAUTH2_ACCESS_TOKEN, properties.get(RemoteCredentialsModel.PROP_OAUTH2_ACCESS_TOKEN)); String refreshToken = (String)metadataEncryptor.decrypt( RemoteCredentialsModel.PROP_OAUTH2_REFRESH_TOKEN, properties.get(RemoteCredentialsModel.PROP_OAUTH2_REFRESH_TOKEN)); // Get the dates Date tokenIssuedAt = (Date)properties.get(RemoteCredentialsModel.PROP_OAUTH2_TOKEN_ISSUED_AT); Date tokenExpiresAt = (Date)properties.get(RemoteCredentialsModel.PROP_OAUTH2_TOKEN_EXPIRES_AT); // Build the object OAuth2CredentialsInfoImpl credentials = new OAuth2CredentialsInfoImpl(nodeRef, remoteSystemName, remoteSystemContainerNodeRef); // Populate RemoteCredentialsInfoFactory.FactoryHelper.setCoreCredentials(credentials, properties); credentials.setOauthAccessToken(accessToken); credentials.setOauthRefreshToken(refreshToken); credentials.setOauthTokenIssuedAt(tokenIssuedAt); credentials.setOauthTokenExpiresAt(tokenExpiresAt); // All done return credentials; } /** * Serializes the given {@link BaseCredentialsInfo} object to node properties. * * @param info The Credentials object to serialize * @return The final set of properties to be serialized for the node */ public Map serializeCredentials(BaseCredentialsInfo info) { if (! (info instanceof OAuth2CredentialsInfo)) { throw new IllegalStateException("Incorrect registration, info must be a OAuth2CredentialsInfo"); } // Encrypt the token details OAuth2CredentialsInfo credentials = (OAuth2CredentialsInfo)info; Serializable accessTokenEncrypted = metadataEncryptor.encrypt( RemoteCredentialsModel.PROP_OAUTH2_ACCESS_TOKEN, credentials.getOAuthAccessToken()); Serializable refreshTokenEncrypted = metadataEncryptor.encrypt( RemoteCredentialsModel.PROP_OAUTH2_REFRESH_TOKEN, credentials.getOAuthRefreshToken()); // Store our specific types and return Map properties = new HashMap(); properties.put(RemoteCredentialsModel.PROP_OAUTH2_ACCESS_TOKEN, accessTokenEncrypted); properties.put(RemoteCredentialsModel.PROP_OAUTH2_REFRESH_TOKEN, refreshTokenEncrypted); properties.put(RemoteCredentialsModel.PROP_OAUTH2_TOKEN_ISSUED_AT, credentials.getOAuthTicketIssuedAt()); properties.put(RemoteCredentialsModel.PROP_OAUTH2_TOKEN_EXPIRES_AT, credentials.getOAuthTicketExpiresAt()); return properties; } }