/*
|
* The contents of this file are subject to the terms of the Common Development and
|
* Distribution License (the License). You may not use this file except in compliance with the
|
* License.
|
*
|
* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
|
* specific language governing permission and limitations under the License.
|
*
|
* When distributing Covered Software, include this CDDL Header Notice in each file and include
|
* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
|
* Header, with the fields enclosed by brackets [] replaced by your own identifying
|
* information: "Portions Copyright [year] [name of copyright owner]".
|
*
|
* Copyright 2008 Sun Microsystems, Inc.
|
* Portions Copyright 2014-2016 ForgeRock AS.
|
*/
|
package org.opends.server.snmp;
|
|
import com.sun.management.snmp.UserAcl;
|
import java.util.SortedSet;
|
import org.forgerock.opendj.server.config.meta.SNMPConnectionHandlerCfgDefn.*;
|
import org.forgerock.opendj.server.config.server.SNMPConnectionHandlerCfg;
|
|
/**
|
* The SNMP User ACL.
|
*/
|
public class SNMPUserAcl implements UserAcl {
|
|
/** If '*' then all the users are allowed to access in read. */
|
private static final String ALL_USERS_ALLOWED = "*";
|
/** Default User for cloning mechanism. */
|
private static final String DEFAULT_USER = "defaultUser";
|
/** Admin User for cloning mechanism. */
|
private static final String ADMIN_USER = "snmpAdmin";
|
/** Current Security Configuration for the SNMP Connection Handler. */
|
private SNMPConnectionHandlerCfg currentConfig;
|
/** Configured hosts list. */
|
private SortedSet usersList;
|
/** Configured traps destinations. */
|
private SortedSet trapDestinations;
|
/** Configured context name. */
|
private String contextName;
|
/** Configured Security level. */
|
private int securityLevel;
|
|
/**
|
* Builds an instance of this class.
|
*
|
* @param configuration of the SNMP Connection Handler
|
*/
|
public SNMPUserAcl(SNMPConnectionHandlerCfg configuration) {
|
// Keep the configuration
|
this.currentConfig = configuration;
|
// Get the community/context string to accept
|
this.contextName = this.currentConfig.getCommunity();
|
// Get the list of allowed users (SNMPV3)
|
this.usersList = this.currentConfig.getAllowedUser();
|
// Get the traps destinations
|
this.trapDestinations = this.currentConfig.getTrapsDestination();
|
// Get the min security level to accept
|
SecurityLevel level = this.currentConfig.getSecurityLevel();
|
this.securityLevel =
|
SNMPConnectionHandlerDefinitions.SECURITY_LEVELS.get(
|
level.toString());
|
}
|
|
/** {@inheritDoc} */
|
public String getName() {
|
// ACL Name
|
return "OpenDS";
|
}
|
|
/** {@inheritDoc} */
|
public boolean checkReadPermission(String user) {
|
// Test if clone user
|
if (user.equals(DEFAULT_USER) || user.equals(ADMIN_USER)) {
|
return false;
|
}
|
|
return this.usersList.contains(ALL_USERS_ALLOWED)
|
|| this.usersList.contains(user);
|
}
|
|
/**
|
* {@inheritDoc}
|
* @param user
|
* @param contextName
|
* @param securityLevel
|
*/
|
public boolean checkReadPermission(String user, String contextName,
|
int securityLevel) {
|
// Special check for the defaultUser
|
if (user.equals(ADMIN_USER)
|
&& contextName.equals("null")
|
&& checkSecurityLevel(securityLevel)) {
|
return true;
|
}
|
|
// Else
|
return checkReadPermission(user)
|
&& checkContextName(contextName)
|
&& checkSecurityLevel(securityLevel);
|
}
|
|
/**
|
* {@inheritDoc}
|
* @return true if the context is correct, false otherwise.
|
*/
|
public boolean checkContextName(String contextName) {
|
return this.contextName.equals(contextName);
|
}
|
|
/**
|
* {@inheritDoc}
|
* @param user to check the write permission.
|
* @return true if the user has the write permission, false otherwise.
|
*/
|
public boolean checkWritePermission(String user) {
|
return user.equals(ADMIN_USER);
|
}
|
|
/** {@inheritDoc} */
|
public boolean checkWritePermission(String user, String contextName,
|
int securityLevel) {
|
return checkWritePermission(user)
|
&& contextName.equals("null")
|
&& checkSecurityLevel(securityLevel);
|
}
|
|
/**
|
* Check the incoming security level of the request.
|
* @param securityLevel
|
* @return true if the securityLevel is appropriated, else return false
|
*/
|
private boolean checkSecurityLevel(int securityLevel) {
|
return securityLevel >= this.securityLevel;
|
}
|
}
|