Fix unknown security name

This commit is contained in:
ViacheslavKlimov 2024-08-26 16:12:27 +03:00
parent 99df23bdc9
commit 5e47e16913

View File

@ -24,6 +24,7 @@ import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModel; import org.snmp4j.security.SecurityModel;
import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM; import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address; import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID; import org.snmp4j.smi.OID;
@ -72,28 +73,23 @@ public class SnmpAuthService {
OctetString engineId = OctetString.fromString(deviceTransportConfig.getEngineId(), 16); OctetString engineId = OctetString.fromString(deviceTransportConfig.getEngineId(), 16);
OID authenticationProtocol = new OID(deviceTransportConfig.getAuthenticationProtocol().getOid()); OID authenticationProtocol = new OID(deviceTransportConfig.getAuthenticationProtocol().getOid());
byte[] authenticationPassphrase = SecurityProtocols.getInstance().passwordToKey(authenticationProtocol, OctetString authenticationPassphrase = Optional.ofNullable(SecurityProtocols.getInstance().passwordToKey(authenticationProtocol,
new OctetString(deviceTransportConfig.getAuthenticationPassphrase()), engineId.getValue()); new OctetString(deviceTransportConfig.getAuthenticationPassphrase()), engineId.getValue()))
if (authenticationPassphrase == null) { .map(OctetString::new)
throw new UnsupportedOperationException("Authentication protocol " + deviceTransportConfig.getAuthenticationProtocol() + " is not supported"); .orElseThrow(() -> new UnsupportedOperationException("Authentication protocol " + deviceTransportConfig.getAuthenticationProtocol() + " is not supported"));
}
OID privacyProtocol = new OID(deviceTransportConfig.getPrivacyProtocol().getOid()); OID privacyProtocol = new OID(deviceTransportConfig.getPrivacyProtocol().getOid());
byte[] privacyPassphrase = SecurityProtocols.getInstance().passwordToKey(privacyProtocol, OctetString privacyPassphrase = Optional.ofNullable(SecurityProtocols.getInstance().passwordToKey(privacyProtocol,
authenticationProtocol, new OctetString(deviceTransportConfig.getPrivacyPassphrase()), engineId.getValue()); authenticationProtocol, new OctetString(deviceTransportConfig.getPrivacyPassphrase()), engineId.getValue()))
if (privacyPassphrase == null) { .map(OctetString::new)
throw new UnsupportedOperationException("Privacy protocol " + deviceTransportConfig.getPrivacyProtocol() + " is not supported"); .orElseThrow(() -> new UnsupportedOperationException("Privacy protocol " + deviceTransportConfig.getPrivacyProtocol() + " is not supported"));
}
USM usm = snmpTransportService.getSnmp().getUSM(); USM usm = snmpTransportService.getSnmp().getUSM();
if (usm.hasUser(engineId, securityName)) { if (usm.hasUser(engineId, securityName)) {
usm.removeAllUsers(username, engineId); usm.removeAllUsers(username, engineId);
} }
usm.addLocalizedUser( UsmUser usmUser = new UsmUser(username, authenticationProtocol, authenticationPassphrase, privacyProtocol, privacyPassphrase, engineId);
engineId.getValue(), username, usm.addUser(username, engineId, usmUser);
authenticationProtocol, authenticationPassphrase,
privacyProtocol, privacyPassphrase
);
UserTarget userTarget = new UserTarget(); UserTarget userTarget = new UserTarget();
userTarget.setSecurityName(securityName); userTarget.setSecurityName(securityName);