diff --git a/hook.php b/hook.php
index f9fbfc2..ee11926 100644
--- a/hook.php
+++ b/hook.php
@@ -92,6 +92,14 @@ function plugin_printercounters_install() {
$DB->runFile(PLUGIN_PRINTERCOUNTERS_DIR. "/install/sql/update-2.0.2.sql");
}
+ if (!$DB->fieldExists("glpi_plugin_printercounters_snmpauthentications", 'security_level')) {
+ $DB->runFile(PLUGIN_PRINTERCOUNTERS_DIR. "/install/sql/update-2.0.2-snmp-sec-level.sql");
+ }
+
+ if (!$DB->fieldExists("glpi_plugin_printercounters_snmpauthentications", 'context')) {
+ $DB->runFile(PLUGIN_PRINTERCOUNTERS_DIR. "/install/sql/update-2.0.2-snmp-context.sql");
+ }
+
CronTask::Register('PluginPrintercountersItem_Ticket', 'PrintercountersCreateTicket', DAY_TIMESTAMP);
CronTask::Register('PluginPrintercountersErrorItem', 'PluginPrintercountersErrorItem', DAY_TIMESTAMP);
diff --git a/inc/commonsnmpobject.class.php b/inc/commonsnmpobject.class.php
index ba6c03a..0874af7 100644
--- a/inc/commonsnmpobject.class.php
+++ b/inc/commonsnmpobject.class.php
@@ -171,19 +171,26 @@ public function setSNMPAuth($snmp_auth) {
$snmp_auth['community'],
$this->maxTimeout,
$this->maxRetries);
-
- if (!empty($snmp_auth['authentication_encrypt'])
- && !empty($snmp_auth['authentication_password'])
- && !empty($snmp_auth['data_encrypt'])
- && !empty($snmp_auth['data_password'])) {
- $this->session->setSecurity('authPriv',
- $snmp_auth['authentication_encrypt'],
- $snmp_auth['authentication_password'],
- $snmp_auth['data_encrypt'],
- $snmp_auth['data_password'], '', '');
- } else {
- throw new PluginPrintercountersException(__('Bad SNMP V3 parameters', 'printercounters'), 0, null, $this->items_id, $this->itemtype);
- }
+ $is_security_OK =
+ $snmp_auth['security_level'] == 'noAuthNoPriv'
+ ||
+ ! ( empty($snmp_auth['authentication_encrypt']) ||
+ empty($snmp_auth['authentication_password']) )
+ ||
+ ( $snpm_auth['security_level'] == 'authPriv' &&
+ ! ( empty($snmp_auth['data_encrypt']) ||
+ empty($snmp_auth['data_password']) ) )
+ ;
+
+ if ( $is_security_OK ) {
+ $this->session->setSecurity($snmp_auth['security_level'],
+ $snmp_auth['authentication_encrypt'],
+ $snmp_auth['authentication_password'],
+ $snmp_auth['data_encrypt'],
+ $snmp_auth['data_password'], $snmp_auth['context'], '');
+ } else {
+ throw new PluginPrintercountersException(__('Bad SNMP V3 parameters', 'printercounters'), 0, null, $this->items_id, $this->itemtype);
+ }
break;
default :
diff --git a/inc/snmpauthentication.class.php b/inc/snmpauthentication.class.php
index f2cf08b..16599ed 100644
--- a/inc/snmpauthentication.class.php
+++ b/inc/snmpauthentication.class.php
@@ -46,6 +46,11 @@ class PluginPrintercountersSnmpauthentication extends CommonDropdown {
const SNMPV2 = 1;
const SNMPV3 = 3;
+ // Security levels
+ const noAuthNoPriv = 0;
+ const authNoPriv = 1;
+ const authPriv = 2;
+
// Auth encryption
const SHA = 1;
const MD5 = 2;
@@ -159,6 +164,24 @@ public function rawSearchOptions() {
'massiveaction' => true
];
+ $tab[] = [
+ 'id' => '51',
+ 'table' => $this->getTable(),
+ 'field' => 'context',
+ 'name' => __('Context', 'printercounters'),
+ 'datatype' => 'specific',
+ 'massiveaction' => true
+ ];
+
+ $tab[] = [
+ 'id' => '52',
+ 'table' => $this->getTable(),
+ 'field' => 'security_level',
+ 'name' => __('Security level', 'printercounters'),
+ 'datatype' => 'specific',
+ 'massiveaction' => true
+ ];
+
return $tab;
}
@@ -170,43 +193,51 @@ public function rawSearchOptions() {
function getAdditionalFields() {
$tab = [
- ['name' => 'version',
- 'label' => __('Version'),
- 'type' => 'specific',
- 'list' => true],
- ['name' => 'community',
- 'label' => __('Community', 'printercounters'),
- 'type' => 'text',
- 'list' => true],
- ['name' => 'community_write',
- 'label' => __('Community write', 'printercounters'),
- 'type' => 'text',
- 'list' => true],
- ['name' => 'authentication_encrypt',
- 'label' => __('Authentication encryption', 'printercounters'),
- 'type' => 'specific',
- 'list' => true],
- ['name' => 'data_encrypt',
- 'label' => __('Data encryption', 'printercounters'),
- 'type' => 'specific',
- 'list' => true],
- ['name' => 'user',
- 'label' => __('User'),
- 'type' => 'text',
- 'list' => true],
- ['name' => 'authentication_password',
- 'label' => __('Authentication password', 'printercounters'),
- 'type' => 'specific',
- 'list' => true],
- ['name' => 'data_password',
- 'label' => __('Data password', 'printercounters'),
- 'type' => 'specific',
- 'list' => true],
- ['name' => 'is_default',
- 'label' => __('Is default', 'printercounters'),
- 'type' => 'bool',
- 'list' => true],
- ];
+ ['name' => 'version',
+ 'label' => __('Version'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'community',
+ 'label' => __('Community', 'printercounters'),
+ 'type' => 'text',
+ 'list' => true],
+ ['name' => 'community_write',
+ 'label' => __('Community write', 'printercounters'),
+ 'type' => 'text',
+ 'list' => true],
+ ['name' => 'context',
+ 'label' => __('Context', 'printercounters'),
+ 'type' => 'text',
+ 'list' => true],
+ ['name' => 'security_level',
+ 'label' => __('Security level', 'printercounters'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'authentication_encrypt',
+ 'label' => __('Authentication encryption', 'printercounters'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'data_encrypt',
+ 'label' => __('Data encryption', 'printercounters'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'user',
+ 'label' => __('User'),
+ 'type' => 'text',
+ 'list' => true],
+ ['name' => 'authentication_password',
+ 'label' => __('Authentication password', 'printercounters'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'data_password',
+ 'label' => __('Data password', 'printercounters'),
+ 'type' => 'specific',
+ 'list' => true],
+ ['name' => 'is_default',
+ 'label' => __('Is default', 'printercounters'),
+ 'type' => 'bool',
+ 'list' => true],
+ ];
return $tab;
}
@@ -232,6 +263,9 @@ function displaySpecificTypeField($ID, $field = [], array $options = []) {
case 'version':
self::dropdownVersion(['value' => $value]);
break;
+ case 'security_level':
+ self::dropdownSecurityLevel(['value' => $value]);
+ break;
case 'authentication_encrypt':
self::dropdownAuthenticationEncryption(['value' => $value]);
break;
@@ -239,7 +273,7 @@ function displaySpecificTypeField($ID, $field = [], array $options = []) {
self::dropdownDataEncryption(['value' => $value]);
break;
case 'authentication_password':case 'data_password':
- echo "";
+ echo "";
break;
}
}
@@ -259,6 +293,8 @@ static function getSpecificValueToDisplay($field, $values, array $options = [])
switch ($field) {
case 'version' :
return self::getVersion($values[$field]);
+ case 'security_level' :
+ return self::getSecurityLevel($values[$field]);
case 'authentication_encrypt' :
return self::getAuthenticationEncryption($values[$field]);
case 'data_encrypt' :
@@ -287,6 +323,8 @@ static function getSpecificValueToSelect($field, $name = '', $values = '', array
switch ($field) {
case 'version':
return self::dropdownVersion($options);
+ case 'security_level':
+ return self::dropdownSecurityLevel($options);
case 'authentication_encrypt':
return self::dropdownAuthenticationEncryption($options);
case 'data_encrypt':
@@ -356,9 +394,8 @@ static function getAllVersionArray() {
// To be overridden by class
$tab = [self::SNMPV1 => __('SNMP v1', 'printercounters'),
- self::SNMPV2 => __('SNMP v2c', 'printercounters'),
- self::SNMPV3 => __('SNMP v3', 'printercounters')];
-
+ self::SNMPV2 => __('SNMP v2c', 'printercounters'),
+ self::SNMPV3 => __('SNMP v3', 'printercounters')];
return $tab;
}
@@ -393,9 +430,45 @@ static function getAllAuthenticationEncryptionArray() {
// To be overridden by class
$tab = [0 => Dropdown::EMPTY_VALUE,
- self::SHA => __('SHA', 'printercounters'),
- self::MD5 => __('MD5', 'printercounters')];
+ self::SHA => __('SHA', 'printercounters'),
+ self::MD5 => __('MD5', 'printercounters')];
+ return $tab;
+ }
+
+ /**
+ * Show the SNMP security level dropdown
+ *
+ * @return an array
+ */
+ static function dropdownSecurityLevel(array $options = []) {
+ return Dropdown::showFromArray('security_level', self::getAllSecurityLevelArray(), $options);
+ }
+ /**
+ * Function get the SNMP security level
+ *
+ * @param type $value
+ * @return type
+ */
+ static function getSecurityLevel($value) {
+ if (!empty($value)) {
+ $data = self::getAllSecurityLevelArray();
+ return $data[$value];
+ }
+ }
+
+ /**
+ * Get the SNMP security level list
+ *
+ * @return an array
+ */
+ static function getAllSecurityLevelArray() {
+
+ // To be overridden by class
+ $tab = [0 => Dropdown::EMPTY_VALUE,
+ self::noAuthNoPriv => __('noAuthNoPriv', 'printercounters'),
+ self::authNoPriv => __('authNoPriv', 'printercounters'),
+ self::authPriv => __('authPriv', 'printercounters')];
return $tab;
}
@@ -431,11 +504,10 @@ static function getAllDataEncryptionArray() {
// To be overridden by class
$tab = [0 => Dropdown::EMPTY_VALUE,
- self::DES => __('DES', 'printercounters'),
- self::AES128 => __('AES128', 'printercounters'),
- self::AES192 => __('AES192', 'printercounters'),
- self::AES256 => __('AES256', 'printercounters')];
-
+ self::DES => __('DES', 'printercounters'),
+ self::AES128 => __('AES128', 'printercounters'),
+ self::AES192 => __('AES192', 'printercounters'),
+ self::AES256 => __('AES256', 'printercounters')];
return $tab;
}
@@ -460,6 +532,8 @@ function getItemAuthentication($items_id, $itemtype) {
`".$this->getTable()."`.`version`,
`".$this->getTable()."`.`community`,
`".$this->getTable()."`.`community_write`,
+ `".$this->getTable()."`.`security_level`,
+ `".$this->getTable()."`.`context`,
`".$this->getTable()."`.`authentication_encrypt`,
`".$this->getTable()."`.`data_encrypt`,
`".$this->getTable()."`.`user`,
@@ -475,13 +549,15 @@ function getItemAuthentication($items_id, $itemtype) {
if ($DB->numrows($result)) {
while ($data = $DB->fetchAssoc($result)) {
$output[$data['items_id']] = ['version' => $data['version'],
- 'community' => !empty($data['community']) ? $data['community'] : '',
- 'community_write' => !empty($data['community_write']) ? $data['community_write'] : '',
- 'authentication_encrypt' => !empty($data['authentication_encrypt']) ? self::getAuthenticationEncryption($data['authentication_encrypt']) : '',
- 'data_encrypt' => !empty($data['data_encrypt']) ? self::getDataEncryption($data['data_encrypt']) : '',
- 'user' => $data['user'],
- 'authentication_password' => $data['authentication_password'],
- 'data_password' => $data['data_password']];
+ 'community' => !empty($data['community']) ? $data['community'] : '',
+ 'community_write' => !empty($data['community_write']) ? $data['community_write'] : '',
+ 'context' => !empty($data['context']) ? $data['context'] : '' ,
+ 'security_level' => !empty($data['security_level']) ? self::getSecurityLevel($data['security_level']) : '',
+ 'authentication_encrypt' => !empty($data['authentication_encrypt']) ? self::getAuthenticationEncryption($data['authentication_encrypt']) : '',
+ 'data_encrypt' => !empty($data['data_encrypt']) ? self::getDataEncryption($data['data_encrypt']) : '',
+ 'user' => $data['user'],
+ 'authentication_password' => $data['authentication_password'],
+ 'data_password' => $data['data_password']];
}
}
}
@@ -575,8 +651,8 @@ function checkMandatoryFields($input) {
$checkKo = false;
$mandatory_fields = ['name' => __('Name'),
- 'community' => __('Community', 'printercounters'),
- 'community_write' => __('Community write', 'printercounters')];
+ 'community' => __('Community', 'printercounters'),
+ 'community_write' => __('Community write', 'printercounters')];
foreach ($input as $key => $value) {
if (array_key_exists($key, $mandatory_fields)) {
@@ -588,18 +664,34 @@ function checkMandatoryFields($input) {
}
// SNMP V3
- if ($input['version'] == self::SNMPV3 && empty($input['authentication_encrypt'])
- && empty($input['authentication_password'])
- && empty($input['data_encrypt'])
- && empty($input['data_password'])) {
-
- $msg[] = __('Authentication encryption', 'printercounters');
- $msg[] = __('Data encryption', 'printercounters');
- $msg[] = __('User');
- $msg[] = __('Authentication password', 'printercounters');
- $msg[] = __('Data password', 'printercounters');
-
- $checkKo = true;
+ if ($input['version'] == self::SNMPV3 ) {
+ $checkKo = false;
+ if ( empty($input['user'] ) ) {
+ $msg[] = __('User', 'printercounters');
+ $checkKo = true;
+ }
+ if ( $input['security_level'] != self::noAuthNoPriv ) { // both authNoPriv and authPriv request authentication parameters
+ if ( empty($input['authentication_encrypt']) || empty($input['authentication_password']) ) {
+ if ( empty($input['authentication_encrypt']) ) {
+ $msg[] = __('Authentication encryption', 'printercounters');
+ }
+ if( empty($input['authentication_password']) ) {
+ $msg[] = __('Authentication password', 'printercounters');
+ }
+ $checkKo = true;
+ }
+ }
+ if ( $input['security_level'] == self::authPriv ) {
+ if ( empty($input['data_encrypt']) || empty($input['data_password']) ) {
+ if ( empty($input['data_encrypt']) ) {
+ $msg[] = __('Data encryption', 'printercounters');
+ }
+ if ( empty($input['data_password']) ) {
+ $msg[] = __('Data password', 'printercounters');
+ }
+ $checkKo = true;
+ }
+ }
}
if ($checkKo) {
diff --git a/install/sql/update-2.0.2-snmp-context.sql b/install/sql/update-2.0.2-snmp-context.sql
new file mode 100644
index 0000000..f36c1c1
--- /dev/null
+++ b/install/sql/update-2.0.2-snmp-context.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `glpi_plugin_printercounters_snmpauthentications`
+ ADD `context` varchar(255) DEFAULT '';
diff --git a/install/sql/update-2.0.2-snmp-sec-level.sql b/install/sql/update-2.0.2-snmp-sec-level.sql
new file mode 100644
index 0000000..4338c7b
--- /dev/null
+++ b/install/sql/update-2.0.2-snmp-sec-level.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `glpi_plugin_printercounters_snmpauthentications`
+ ADD `security_level` tinyint NOT NULL DEFAULT '0';
diff --git a/setup.php b/setup.php
index ba4406d..f32a15e 100644
--- a/setup.php
+++ b/setup.php
@@ -27,7 +27,7 @@
--------------------------------------------------------------------------
*/
-define('PLUGIN_PRINTERCOUNTERS_VERSION', '2.0.2');
+define('PLUGIN_PRINTERCOUNTERS_VERSION', '2.0.3');
if (!defined("PLUGIN_PRINTERCOUNTERS_DIR")) {
define("PLUGIN_PRINTERCOUNTERS_DIR", Plugin::getPhpDir("printercounters"));