/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License
* at:
*
* http://opensource.org/licenses/ecl2.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package org.opencastproject.security.urlsigning.service.impl;
import static java.util.Objects.requireNonNull;
import static org.opencastproject.security.urlsigning.exception.UrlSigningException.urlNotSupported;
import org.opencastproject.security.urlsigning.exception.UrlSigningException;
import org.opencastproject.security.urlsigning.provider.UrlSigningProvider;
import org.opencastproject.security.urlsigning.service.UrlSigningService;
import org.opencastproject.urlsigning.common.Policy;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class UrlSigningServiceImpl implements UrlSigningService {
/** The logging facility */
private static final Logger logger = LoggerFactory.getLogger(UrlSigningServiceImpl.class);
/** List of registered signing providers */
private final List<UrlSigningProvider> signingProviders = new CopyOnWriteArrayList<>();
/** OSGi callback for registering {@link UrlSigningProvider} */
void registerSigningProvider(final UrlSigningProvider provider) {
signingProviders.add(provider);
logger.info("{} registered", provider);
}
/** OSGi callback for unregistering {@link UrlSigningProvider} */
void unregisterSigningProvider(final UrlSigningProvider provider) {
signingProviders.remove(provider);
logger.info("{} unregistered", provider);
}
@Override
public boolean accepts(String baseUrl) {
for (final UrlSigningProvider provider : signingProviders) {
if (provider.accepts(baseUrl)) {
logger.debug("{} accepted to sign base URL '{}'", provider, baseUrl);
return true;
}
}
logger.debug("No provider accepted to sign the URL '{}'", baseUrl);
return false;
}
@Override
public String sign(final String baseUrl, final Long validUntilDuration, final Long validFromDuration,
final String ipAddr) throws UrlSigningException {
requireNonNull(validUntilDuration);
DateTime validUntil = new DateTime(DateTimeZone.UTC).plus(validUntilDuration * DateTimeConstants.MILLIS_PER_SECOND);
DateTime validFrom = validFromDuration == null ? null : new DateTime(DateTimeZone.UTC).plus(validFromDuration
* DateTimeConstants.MILLIS_PER_SECOND);
return sign(baseUrl, validUntil, validFrom, ipAddr);
}
@Override
public String sign(final String baseUrl, final DateTime validUntil, final DateTime validFrom, final String ipAddr)
throws UrlSigningException {
requireNonNull(baseUrl);
requireNonNull(validUntil);
final Policy policy = Policy.mkPolicyValidFromWithIP(baseUrl, validUntil, validFrom, ipAddr);
for (final UrlSigningProvider provider : signingProviders) {
if (provider.accepts(baseUrl)) {
logger.debug("{} accepted to sign base URL '{}'", provider, baseUrl);
return provider.sign(policy);
}
}
logger.warn("No signing provider accepted to sign URL '{}'", baseUrl);
throw urlNotSupported();
}
}