org.gluu.oxtrust.action.JoinFederationAction.java Source code

Java tutorial

Introduction

Here is the source code for org.gluu.oxtrust.action.JoinFederationAction.java

Source

/*
 * oxTrust is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
 *
 * Copyright (c) 2014, Gluu
 */

package org.gluu.oxtrust.action;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;

import javax.faces.context.FacesContext;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.gluu.oxtrust.ldap.service.FederationService;
import org.gluu.oxtrust.ldap.service.OrganizationService;
import org.gluu.oxtrust.ldap.service.Shibboleth2ConfService;
import org.gluu.oxtrust.model.GluuMetadataSourceType;
import org.gluu.oxtrust.model.GluuSAMLFederationProposal;
import org.gluu.oxtrust.util.OxTrustConstants;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;
import org.xdi.ldap.model.GluuStatus;
import org.xdi.util.StringHelper;
import org.xdi.util.io.ExcludeFilterInputStream;
import org.xdi.util.io.FileUploadWrapper;
import org.xdi.util.io.ResponseHelper;

@Scope(ScopeType.CONVERSATION)
@Name("joinFederationAction")
public class JoinFederationAction implements Serializable {

    private static final long serialVersionUID = -1032167044333943680L;

    private GluuSAMLFederationProposal federationProposal;

    private String inum;

    @In(value = "#{facesContext}")
    private FacesContext facesContext;

    @In
    private FederationService federationService;

    @In
    private Shibboleth2ConfService shibboleth2ConfService;

    @In
    private FacesMessages facesMessages;

    @In(create = true)
    @Out(scope = ScopeType.CONVERSATION)
    private TrustContactsAction trustContactsAction;

    private FileUploadWrapper fileWrapper = new FileUploadWrapper();

    public String add() {
        if (this.federationProposal != null) {
            return OxTrustConstants.RESULT_SUCCESS;
        }

        this.federationProposal = new GluuSAMLFederationProposal();
        this.federationProposal.setOwner(OrganizationService.instance().getOrganization().getDn());
        this.federationProposal.setStatus(GluuStatus.INACTIVE);

        init();

        return OxTrustConstants.RESULT_SUCCESS;
    }

    public String view() {
        if (this.federationProposal != null) {
            return OxTrustConstants.RESULT_SUCCESS;
        }

        this.federationProposal = federationService.getProposalByInum(inum);

        this.fileWrapper = new FileUploadWrapper();
        this.fileWrapper.setFileName(this.federationProposal.getSpMetaDataFN());

        init();

        return OxTrustConstants.RESULT_SUCCESS;
    }

    public void init() {
        trustContactsAction.initContacts(this.federationProposal);
    }

    public boolean isActive() {
        return GluuStatus.ACTIVE.equals(this.federationProposal.getStatus());
    }

    public String acceptToggle() {
        if (isActive()) {
            this.federationProposal.setStatus(GluuStatus.INACTIVE);
            federationService.updateFederationProposal(federationProposal);
        } else {
            this.federationProposal.setStatus(GluuStatus.ACTIVE);
            federationService.updateFederationProposal(federationProposal);
        }
        return OxTrustConstants.RESULT_SUCCESS;
    }

    public String delete() {

        federationService.removeFederationProposal(this.federationProposal);

        return OxTrustConstants.RESULT_SUCCESS;
    }

    public String save(boolean federation) {
        if (this.federationProposal.isRulesAccepted() || federation) {
            if (inum == null) {
                this.inum = federationService.generateInumForNewFederationProposal();
                String dn = federationService.getDnForFederationProposal(this.getInum());

                this.federationProposal.setInum(this.getInum());
                this.federationProposal.setDn(dn);
                if (!federation && !saveSpMetaDataFile()) {
                    return OxTrustConstants.RESULT_FAILURE;
                }
                trustContactsAction.saveContacts();
                this.federationProposal.setFederation(federation);
                federationService.addFederationProposal(federationProposal);
            } else {
                if (!federation && !saveSpMetaDataFile()) {
                    return OxTrustConstants.RESULT_FAILURE;
                }
                trustContactsAction.saveContacts();
                federationService.updateFederationProposal(federationProposal);
            }

            return OxTrustConstants.RESULT_SUCCESS;
        } else {
            facesMessages.add(Severity.ERROR, "You should accept Federation Policies and Operating Procedures");
            return OxTrustConstants.RESULT_FAILURE;
        }
    }

    public String cancel() {
        return OxTrustConstants.RESULT_SUCCESS;
    }

    private boolean saveSpMetaDataFile() {
        boolean result = false;
        if (GluuMetadataSourceType.FILE.equals(federationProposal.getSpMetaDataSourceType())) {
            result = saveSpMetaDataFileSourceTypeFile();
        } else if (GluuMetadataSourceType.URI.equals(federationProposal.getSpMetaDataSourceType())) {
            result = saveSpMetaDataFileSourceTypeURI();
        }

        if (!result) {
            facesMessages.add(Severity.ERROR,
                    "Failed to save meta-data file. Please check if you provide correct file");
            return result;
        }

        if (shibboleth2ConfService.isCorrectMetadataFile(federationProposal.getSpMetaDataFN())) {
            return true;
        }

        facesMessages.add(Severity.ERROR,
                "Failed to parse meta-data file. Please check if you provide correct file");
        shibboleth2ConfService.removeMetadataFile(federationProposal.getSpMetaDataFN());

        return false;
    }

    private boolean saveSpMetaDataFileSourceTypeFile() {
        String metadataFileName = federationProposal.getSpMetaDataFN();
        boolean emptySpMetadataFileName = StringHelper.isEmpty(metadataFileName);

        if (fileWrapper.getStream() == null) {
            if (emptySpMetadataFileName) {
                return false;
            }

            // Admin doesn't provide new file. Check if we already has this file
            String filePath = shibboleth2ConfService.getMetadataFilePath(metadataFileName);
            if (filePath == null) {
                return false;
            }

            File file = new File(filePath);
            if (!file.exists()) {
                return false;
            }

            // File already exist
            return true;
        }

        if (emptySpMetadataFileName) {
            // Generate new file name
            metadataFileName = shibboleth2ConfService.getNewMetadataFileName(this.federationProposal,
                    federationService.getAllFederationProposals());
        }

        // Save new file
        boolean result = shibboleth2ConfService.saveMetadataFile(metadataFileName, fileWrapper.getStream());
        if (result) {
            federationProposal.setSpMetaDataFN(metadataFileName);
        }

        return result;

    }

    private boolean saveSpMetaDataFileSourceTypeURI() {
        String metadataFileName = federationProposal.getSpMetaDataFN();
        boolean emptyMetadataFileName = StringHelper.isEmpty(metadataFileName);

        if (emptyMetadataFileName) {
            // Generate new file name
            metadataFileName = shibboleth2ConfService.getNewMetadataFileName(this.federationProposal,
                    federationService.getAllFederationProposals());
        }

        boolean result = shibboleth2ConfService.saveMetadataFile(federationProposal.getSpMetaDataURL(),
                metadataFileName);
        if (result) {
            federationProposal.setSpMetaDataFN(metadataFileName);
        }

        return result;
    }

    public GluuSAMLFederationProposal getFederationProposal() {
        return federationProposal;
    }

    public void setInum(String inum) {
        this.inum = inum;
    }

    public String getInum() {
        return inum;
    }

    public void setFileWrapper(FileUploadWrapper fileWrapper) {
        this.fileWrapper = fileWrapper;
    }

    public FileUploadWrapper getFileWrapper() {
        return fileWrapper;
    }

    public String getMetadata() throws IOException {
        if (federationProposal == null) {
            return null;
        }

        String filename = federationProposal.getSpMetaDataFN();
        File metadataFile = null;
        if (!StringUtils.isEmpty(filename)) {
            metadataFile = new File(shibboleth2ConfService.getMetadataFilePath(filename));

            if (metadataFile.exists()) {
                return FileUtils.readFileToString(metadataFile);
            }
        }

        return null;
    }

    public String downloadFederation() throws IOException {
        boolean result = false;
        if (StringHelper.isNotEmpty(inum)) {
            GluuSAMLFederationProposal federation = federationService.getProposalByInum(inum);
            if (!federation.isFederation() || !federation.getStatus().equals(GluuStatus.ACTIVE)) {
                return OxTrustConstants.RESULT_FAILURE;
            }

            Shibboleth2ConfService shibboleth2ConfService = Shibboleth2ConfService.instance();
            ByteArrayOutputStream bos = new ByteArrayOutputStream(16384);
            String head = String.format(
                    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<EntitiesDescriptor Name=\"%s\"  xmlns=\"urn:oasis:names:tc:SAML:2.0:metadata\">\n",
                    StringHelper.removePunctuation(federation.getInum()));
            bos.write(head.getBytes());
            for (GluuSAMLFederationProposal proposal : federationService.getAllActiveFederationProposals()) {
                if (proposal.getContainerFederation() != null
                        && proposal.getContainerFederation().equals(federation)) {
                    String filename = proposal.getSpMetaDataFN();
                    if (!StringUtils.isEmpty(filename)) {
                        File metadataFile = new File(shibboleth2ConfService.getMetadataFilePath(filename));
                        InputStream is = FileUtils.openInputStream(metadataFile);
                        ExcludeFilterInputStream filtered = new ExcludeFilterInputStream(is, "<?", "?>");
                        IOUtils.copy(filtered, bos);
                    }
                }
            }
            String tail = "</EntitiesDescriptor>";
            bos.write(tail.getBytes());

            result = ResponseHelper.downloadFile("federation.xml", OxTrustConstants.CONTENT_TYPE_TEXT_PLAIN,
                    bos.toByteArray(), facesContext);
        }
        return result ? OxTrustConstants.RESULT_SUCCESS : OxTrustConstants.RESULT_FAILURE;
    }

    public void setRules(String rules) {
        this.federationProposal.setFederationRules(rules);
    }

    public String getRules() {
        String rules = null;
        if (this.federationProposal.isFederation()) {
            rules = this.federationProposal.getFederationRules();
        } else if (this.federationProposal.getContainerFederation() != null) {
            rules = this.federationProposal.getContainerFederation().getFederationRules();
        }
        return rules;
    }

}