/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.events.handlers;
import com.google.common.collect.ImmutableSet;
import java.util.Collection;
import java.util.Set;
import java.util.regex.Pattern;
import org.apereo.portal.events.PortalEvent;
import org.apereo.portal.security.IPerson;
import org.apereo.portal.spring.context.ApplicationEventFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEvent;
/** Filters {@link PortalEvent}s based on */
public final class UserFilteringPortalEventHandler<E extends PortalEvent>
implements ApplicationEventFilter<E> {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
/** The list of supported classes. */
private boolean supportGuest = true;
private Set<String> supportedUserNames;
private Set<String> ignoredUserNames;
private Set<Pattern> ignoredUserNamePatterns;
/**
* If no <code>supportedUserNames</code> {@link Collection} is configured all user-names are
* supported otherwise exact String equality matching is done to determine supported userNames.
* The property defaults to null (all user names)
*
* @param supportedUserNames the supportedUserNames to set
*/
public void setSupportedUserNames(Collection<String> supportedUserNames) {
if (supportedUserNames == null) {
this.supportedUserNames = null;
} else {
this.supportedUserNames = ImmutableSet.copyOf(supportedUserNames);
}
}
/**
* If no <code>ignoredUserNames</code> {@link Collection} is configured all user-names are
* supported otherwise exact String equality matching is done to determine ignored userNames.
* The property defaults to null (all user names)
*
* @param ignoredUserNames the ignoredUserNames to set
*/
public void setIgnoredUserNames(Collection<String> ignoredUserNames) {
if (ignoredUserNames == null) {
this.ignoredUserNames = null;
} else {
this.ignoredUserNames = ImmutableSet.copyOf(ignoredUserNames);
}
}
/**
* If no <code>ignoredUserNamePatterns</code> {@link Collection} is configured all user-names
* are supported otherwise exact regex pattern matching is done to determine ignored userNames.
* The property defaults to null (all user names)
*
* @param ignoredUserNamePatterns the ignoredUserNamePatterns to set
*/
public void setIgnoredUserNamePatterns(Collection<Pattern> ignoredUserNamePatterns) {
if (ignoredUserNamePatterns == null) {
this.ignoredUserNamePatterns = null;
} else {
this.ignoredUserNamePatterns = ImmutableSet.copyOf(ignoredUserNamePatterns);
}
}
/**
* If the <code>supportGuest</code> property is true {@link ApplicationEvent}s where {@link
* IPerson#isGuest()} is true or false will be supported. If the <code>supportGuest</code>
* property is false only {@link ApplicationEvent}s where {@link IPerson#isGuest()} is false
* will be supported. The property defaults to true.
*/
public void setSupportGuest(boolean supportGuest) {
this.supportGuest = supportGuest;
}
@Override
public boolean supports(E event) {
if (!(event instanceof PortalEvent)) {
return false;
}
//Guest support check
final IPerson person = event.getPerson();
if (person != null && !this.supportGuest && person.isGuest()) {
return false;
}
//userName check
final String userName = event.getUserName();
if (this.supportedUserNames != null && this.supportedUserNames.contains(userName)) {
return true;
}
//ignored userName check
if (this.ignoredUserNames != null && this.ignoredUserNames.contains(userName)) {
return false;
}
//ignored userName pattern check
if (this.ignoredUserNamePatterns != null) {
for (final Pattern ignoredUserNamePattern : this.ignoredUserNamePatterns) {
if (ignoredUserNamePattern.matcher(userName).matches()) {
return false;
}
}
}
return this.supportedUserNames == null || this.supportedUserNames.isEmpty();
}
}