/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.security.sso.openid.internal; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.security.sso.openid.OpenIdProvider; import com.liferay.portal.security.sso.openid.OpenIdProviderRegistry; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Modified; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; /** * @author Michael C. Han */ @Component( immediate = true, property = { "open.id.ax.schema[default]=email,firstname,lastname", "open.id.ax.schema[yahoo]=email,fullname", "open.id.ax.type.email[default]=http://schema.openid.net/contact/email", "open.id.ax.type.email[yahoo]=http://axschema.org/contact/email", "open.id.ax.type.firstname[default]=http://schema.openid.net/namePerson/first", "open.id.ax.type.fullname[yahoo]=http://axschema.org/namePerson", "open.id.ax.type.lastname[default]=http://schema.openid.net/namePerson/last", "open.id.url[yahoo]=open.login.yahooapis.com" }, service = OpenIdProviderRegistry.class ) public class OpenIdProviderRegistryImpl implements OpenIdProviderRegistry { @Override public OpenIdProvider getOpenIdProvider(String name) { return _openIdProviders.get(name); } @Override public OpenIdProvider getOpenIdProvider(URL url) { for (OpenIdProvider openIdProvider : _openIdProviders.values()) { if (Objects.equals(openIdProvider.getUrl(), url.getHost())) { return openIdProvider; } } return _openIdProviders.get(OPEN_ID_PROVIDER_NAME_DEFAULT); } @Override public Collection<String> getOpenIdProviderNames() { return Collections.unmodifiableCollection(_openIdProviders.keySet()); } @Activate @Modified protected void activate(Map<String, Object> properties) { Collection<OpenIdProvider> openIdProviders = initOpenIdProviders( properties); for (OpenIdProvider openIdProvider : openIdProviders) { setOpenIdProvider(openIdProvider); } } protected Collection<OpenIdProvider> initOpenIdProviders( Map<String, Object> properties) { Map<String, OpenIdProvider> openIdProviders = new HashMap<>(2); for (Map.Entry<String, Object> entry : properties.entrySet()) { String key = entry.getKey(); int index = key.indexOf("["); if (index < 0) { continue; } String name = key.substring(index + 1, key.length() - 1); OpenIdProvider openIdProvider = openIdProviders.get(name); if (openIdProvider == null) { openIdProvider = new OpenIdProvider(); openIdProvider.setName(name); openIdProviders.put(name, openIdProvider); } String value = GetterUtil.getString(entry.getValue()); if (key.startsWith(_OPEN_ID_AX_SCHEMA)) { openIdProvider.setAxSchema(StringUtil.split(value)); } else if (key.startsWith(_OPEN_ID_URL)) { openIdProvider.setUrl(value); } else { openIdProvider.setAxTypes( key.substring(_OPEN_ID_AX_TYPE.length() + 1, index), value); } } return openIdProviders.values(); } @Reference( cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC ) protected void setOpenIdProvider(OpenIdProvider openIdProvider) { _openIdProviders.put(openIdProvider.getName(), openIdProvider); } protected void unsetOpenIdProvider(OpenIdProvider openIdProvider) { _openIdProviders.remove(openIdProvider.getName()); } private static final String _OPEN_ID_AX_SCHEMA = "open.id.ax.schema"; private static final String _OPEN_ID_AX_TYPE = "open.id.ax.type"; private static final String _OPEN_ID_URL = "open.id.url"; private final Map<String, OpenIdProvider> _openIdProviders = new HashMap<>(); }