예제 #1
0
function validatePortNumberOrMacro($port)
{
    return validatePortNumber($port) || validateUserMacro($port);
}
예제 #2
0
 /**
  * Validates the input parameters for the update() method.
  *
  * @param array $mediatypes
  *
  * @throws APIException if the input is invalid.
  */
 protected function validateUpdate(array $mediatypes)
 {
     if (self::$userData['type'] != USER_TYPE_SUPER_ADMIN) {
         self::exception(ZBX_API_ERROR_PERMISSIONS, _('Only Super Admins can edit media types.'));
     }
     if (!$mediatypes) {
         self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty input parameter.'));
     }
     // Validate given IDs.
     $this->checkObjectIds($mediatypes, 'mediatypeid', _('No "%1$s" given for media type.'), _('Empty media type ID.'), _('Incorrect media type ID.'));
     $mediatypeids = zbx_objectValues($mediatypes, 'mediatypeid');
     // Check value map names.
     $db_mediatypes = API::getApiService()->select('media_type', ['output' => ['mediatypeid', 'type', 'description', 'exec_path', 'status', 'smtp_port', 'smtp_verify_peer', 'smtp_verify_host', 'smtp_authentication'], 'mediatypeids' => $mediatypeids, 'preservekeys' => true]);
     $check_names = [];
     foreach ($mediatypes as $mediatype) {
         // Check if this media type exists.
         if (!array_key_exists($mediatype['mediatypeid'], $db_mediatypes)) {
             self::exception(ZBX_API_ERROR_PERMISSIONS, _('No permissions to referred object or it does not exist!'));
         }
         // Validate "description" field.
         if (array_key_exists('description', $mediatype)) {
             if (is_array($mediatype['description'])) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect arguments passed to function.'));
             } elseif ($mediatype['description'] === '' || $mediatype['description'] === null || $mediatype['description'] === false) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value for field "%1$s": %2$s.', 'description', _('cannot be empty')));
             }
             $check_names[$mediatype['description']] = true;
         }
     }
     if ($check_names) {
         $db_mediatype_names = API::getApiService()->select('media_type', ['output' => ['mediatypeid', 'description'], 'filter' => ['name' => array_keys($check_names)]]);
         $db_mediatype_names = zbx_toHash($db_mediatype_names, 'description');
         foreach ($mediatypes as $mediatype) {
             if (array_key_exists('description', $mediatype) && array_key_exists($mediatype['description'], $db_mediatype_names) && !idcmp($db_mediatype_names[$mediatype['description']]['mediatypeid'], $mediatype['mediatypeid'])) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, _s('Media type "%1$s" already exists.', $mediatype['description']));
             }
         }
     }
     // Populate "description" field, if not set. Type field should not be populated at this point.
     $mediatypes = $this->extendFromObjects(zbx_toHash($mediatypes, 'mediatypeid'), $db_mediatypes, ['description']);
     $duplicate_name = CArrayHelper::findDuplicate($mediatypes, 'description');
     if ($duplicate_name) {
         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Duplicate "description" value "%1$s" for media type.', $duplicate_name['description']));
     }
     foreach ($mediatypes as $mediatype) {
         $db_mediatype = $db_mediatypes[$mediatype['mediatypeid']];
         // Recheck mandatory fields if type changed.
         if (array_key_exists('type', $mediatype) && $db_mediatype['type'] != $mediatype['type']) {
             $this->checkRequiredFieldsByType($mediatype);
         } else {
             $optional_fields_by_type = [MEDIA_TYPE_EMAIL => ['smtp_server', 'smtp_helo', 'smtp_email'], MEDIA_TYPE_EXEC => ['exec_path'], MEDIA_TYPE_SMS => ['gsm_modem'], MEDIA_TYPE_JABBER => ['username'], MEDIA_TYPE_EZ_TEXTING => ['exec_path', 'username']];
             foreach ($optional_fields_by_type[$db_mediatype['type']] as $field) {
                 if (array_key_exists($field, $mediatype) && ($mediatype[$field] === '' || $mediatype[$field] === null)) {
                     self::exception(ZBX_API_ERROR_PARAMETERS, _s('Field "%1$s" is missing a value for media type "%2$s".', $field, $mediatype['description']));
                 }
             }
             // Populate "type" field from DB, since it is not set and is required for further validation.
             $mediatype['type'] = $db_mediatype['type'];
         }
         switch ($mediatype['type']) {
             case MEDIA_TYPE_EZ_TEXTING:
                 if (array_key_exists('exec_path', $mediatype)) {
                     $message_text_limit_validator = new CLimitedSetValidator(['values' => [EZ_TEXTING_LIMIT_USA, EZ_TEXTING_LIMIT_CANADA]]);
                     if ($db_mediatype['exec_path'] !== $mediatype['exec_path'] && !$message_text_limit_validator->validate($mediatype['exec_path'])) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['exec_path'], 'exec_path', $mediatype['description']));
                     }
                 }
                 break;
             case MEDIA_TYPE_EMAIL:
                 if (array_key_exists('smtp_authentication', $mediatype)) {
                     $smtp_authentication_validator = new CLimitedSetValidator(['values' => [SMTP_AUTHENTICATION_NONE, SMTP_AUTHENTICATION_NORMAL]]);
                     if (!$smtp_authentication_validator->validate($mediatype['smtp_authentication'])) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['smtp_authentication'], 'smtp_authentication', $mediatype['description']));
                     }
                     if ($mediatype['smtp_authentication'] == SMTP_AUTHENTICATION_NORMAL) {
                         // Check 'passwd' field when auth is set to 'normal' manually.
                         if ($db_mediatype['smtp_authentication'] == $mediatype['smtp_authentication'] && array_key_exists('passwd', $mediatype) && ($mediatype['passwd'] === '' || $mediatype['passwd'] === null)) {
                             /*
                              * When auth is set to 'normal', check if password field is set manually.
                              * Otherwise the password is not changed.
                              */
                             self::exception(ZBX_API_ERROR_PARAMETERS, _s('Password required for media type "%1$s".', $mediatype['description']));
                         } elseif ($db_mediatype['smtp_authentication'] != $mediatype['smtp_authentication'] && (!array_key_exists('passwd', $mediatype) || $mediatype['passwd'] === '' || $mediatype['passwd'] === null)) {
                             /*
                              * First check if 'passwd' field exists when authentication is changed from
                              * 'none' to 'normal' and then validate it.
                              */
                             self::exception(ZBX_API_ERROR_PARAMETERS, _s('Password required for media type "%1$s".', $mediatype['description']));
                         }
                     }
                 } elseif ($db_mediatype['smtp_authentication'] == SMTP_AUTHENTICATION_NORMAL && array_key_exists('passwd', $mediatype) && ($mediatype['passwd'] === '' || $mediatype['passwd'] === null)) {
                     // Check 'passwd' field depeding on authentication set from DB and when it is set to 'normal'.
                     self::exception(ZBX_API_ERROR_PARAMETERS, _s('Password required for media type "%1$s".', $mediatype['description']));
                 }
                 // Validate optional 'smtp_port' field.
                 if (array_key_exists('smtp_port', $mediatype) && $db_mediatype['smtp_port'] != $mediatype['smtp_port'] && !validatePortNumber($mediatype['smtp_port'])) {
                     self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['smtp_port'], 'smtp_port', $mediatype['description']));
                 }
                 // Validate optional field 'smtp_security'.
                 if (array_key_exists('smtp_security', $mediatype)) {
                     $smtp_security_validator = new CLimitedSetValidator(['values' => [SMTP_CONNECTION_SECURITY_NONE, SMTP_CONNECTION_SECURITY_STARTTLS, SMTP_CONNECTION_SECURITY_SSL_TLS]]);
                     if (!$smtp_security_validator->validate($mediatype['smtp_security'])) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['smtp_security'], 'smtp_security', $mediatype['description']));
                     }
                 }
                 // Validate optional field 'smtp_verify_peer'.
                 if (array_key_exists('smtp_verify_peer', $mediatype) && $db_mediatype['smtp_verify_peer'] != $mediatype['smtp_verify_peer']) {
                     $smtp_verify_peer_validator = new CLimitedSetValidator(['values' => [0, 1]]);
                     if (!$smtp_verify_peer_validator->validate($mediatype['smtp_verify_peer'])) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['smtp_verify_peer'], 'smtp_verify_peer', $mediatype['description']));
                     }
                 }
                 // Validate optional field 'smtp_verify_host'.
                 if (array_key_exists('smtp_verify_host', $mediatype) && $db_mediatype['smtp_verify_host'] != $mediatype['smtp_verify_host']) {
                     $smtp_verify_host_validator = new CLimitedSetValidator(['values' => [0, 1]]);
                     if (!$smtp_verify_host_validator->validate($mediatype['smtp_verify_host'])) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['smtp_verify_host'], 'smtp_verify_host', $mediatype['description']));
                     }
                 }
                 break;
             case MEDIA_TYPE_EXEC:
                 if (array_key_exists('exec_params', $mediatype) && $mediatype['exec_params'] !== '') {
                     $pos = strrpos($mediatype['exec_params'], "\n");
                     if ($pos === false || strlen($mediatype['exec_params']) != $pos + 1) {
                         self::exception(ZBX_API_ERROR_PARAMETERS, _s('Script parameters "%1$s" are missing the last new line feed for media type "%2$s".', $mediatype['exec_params'], $mediatype['description']));
                     }
                 }
                 break;
         }
         // Validate optional 'status' field and only when status is changed.
         if (array_key_exists('status', $mediatype) && $db_mediatype['status'] != $mediatype['status']) {
             $status_validator = new CLimitedSetValidator(['values' => [MEDIA_TYPE_STATUS_ACTIVE, MEDIA_TYPE_STATUS_DISABLED]]);
             if (!$status_validator->validate($mediatype['status'])) {
                 self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect value "%1$s" in field "%2$s" for media type "%3$s".', $mediatype['status'], 'status', $mediatype['description']));
             }
         }
     }
 }