001/*
002 * (C) Copyright 2006-2013 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Nuxeo
016 */
017
018package org.nuxeo.ecm.platform.oauth2.openid;
019
020import java.util.Collection;
021import java.util.HashMap;
022import java.util.Map;
023
024import org.nuxeo.runtime.model.ContributionFragmentRegistry;
025
026/**
027 * @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a>
028 * @since 5.7
029 */
030public class OpenIDProviderFragmentRegistry extends ContributionFragmentRegistry<OpenIDConnectProviderDescriptor> {
031
032    protected final Map<String, OpenIDConnectProviderDescriptor> providers = new HashMap<String, OpenIDConnectProviderDescriptor>();
033
034    @Override
035    public OpenIDConnectProviderDescriptor clone(OpenIDConnectProviderDescriptor source) {
036
037        OpenIDConnectProviderDescriptor copy = new OpenIDConnectProviderDescriptor();
038
039        copy.scopes = source.scopes;
040        copy.authorizationServerURL = source.authorizationServerURL;
041        copy.clientId = source.clientId;
042        copy.clientSecret = source.clientSecret;
043        copy.icon = source.icon;
044        copy.enabled = source.enabled;
045        copy.name = source.name;
046        copy.tokenServerURL = source.tokenServerURL;
047        copy.userInfoURL = source.userInfoURL;
048        copy.label = source.label;
049        copy.description = source.description;
050        copy.redirectUriResolver = source.redirectUriResolver;
051        copy.userResolverClass = source.userResolverClass;
052        copy.accessTokenKey = source.accessTokenKey;
053        copy.userInfoClass = source.userInfoClass;
054        return copy;
055    }
056
057    @Override
058    public void contributionRemoved(String name, OpenIDConnectProviderDescriptor origContrib) {
059        providers.remove(name);
060    }
061
062    @Override
063    public void contributionUpdated(String name, OpenIDConnectProviderDescriptor contrib,
064            OpenIDConnectProviderDescriptor newOrigContrib) {
065        if (contrib.isEnabled()) {
066            providers.put(name, contrib);
067        } else {
068            providers.remove(name);
069        }
070    }
071
072    @Override
073    public String getContributionId(OpenIDConnectProviderDescriptor contrib) {
074        return contrib.getName();
075    }
076
077    @Override
078    public void merge(OpenIDConnectProviderDescriptor src, OpenIDConnectProviderDescriptor dst) {
079
080        if (dst.authorizationServerURL == null || dst.authorizationServerURL.isEmpty()) {
081            dst.authorizationServerURL = src.authorizationServerURL;
082        }
083        if (dst.clientId == null || dst.clientId.isEmpty()) {
084            dst.clientId = src.clientId;
085        }
086        if (dst.clientSecret == null || dst.clientSecret.isEmpty()) {
087            dst.clientSecret = src.clientSecret;
088        }
089        if (dst.icon == null || dst.icon.isEmpty()) {
090            dst.icon = src.icon;
091        }
092        if (dst.scopes == null || dst.scopes.length == 0) {
093            dst.scopes = src.scopes;
094        }
095        if (dst.tokenServerURL == null || dst.tokenServerURL.isEmpty()) {
096            dst.tokenServerURL = src.tokenServerURL;
097        }
098        if (dst.userInfoURL == null || dst.userInfoURL.isEmpty()) {
099            dst.userInfoURL = src.userInfoURL;
100        }
101        if (dst.label == null || dst.label.isEmpty()) {
102            dst.label = src.label;
103        }
104        if (dst.description == null || dst.description.isEmpty()) {
105            dst.description = src.description;
106        }
107        if (!src.accessTokenKey.equals(OpenIDConnectProviderDescriptor.DEFAULT_ACCESS_TOKEN_KEY)) {
108            dst.accessTokenKey = src.accessTokenKey;
109        }
110        if (src.userInfoClass != OpenIDConnectProviderDescriptor.DEFAULT_USER_INFO_CLASS) {
111            dst.userInfoClass = src.userInfoClass;
112        }
113        if (src.redirectUriResolver != OpenIDConnectProviderDescriptor.DEFAULT_REDIRECT_URI_RESOLVER_CLASS) {
114            dst.redirectUriResolver = src.redirectUriResolver;
115        }
116        if (src.userResolverClass != OpenIDConnectProviderDescriptor.DEFAULT_USER_RESOLVER_CLASS) {
117            dst.userResolverClass = src.userResolverClass;
118        }
119
120        dst.accessTokenKey = src.accessTokenKey;
121
122        dst.userInfoClass = src.userInfoClass;
123
124        dst.redirectUriResolver = src.redirectUriResolver;
125
126        dst.userResolverClass = src.userResolverClass;
127
128        dst.enabled = src.enabled;
129    }
130
131    public Collection<OpenIDConnectProviderDescriptor> getContribs() {
132        return providers.values();
133    }
134}