/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS */ package org.opends.server.snmp; import com.sun.management.snmp.UserAcl; import java.util.SortedSet; import org.opends.server.admin.std.meta.SNMPConnectionHandlerCfgDefn.*; import org.opends.server.admin.std.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; } }