pandorafms/pandora_console/include/functions_files_repository.php

417 lines
11 KiB
PHP

<?php
/**
* Functions File repository
*
* @category Files repository
* @package Pandora FMS
* @subpackage Enterprise
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2007-2023 Artica Soluciones Tecnologicas, http://www.artica.es
* This code is NOT free software. This code is NOT licenced under GPL2 licence
* You cannnot redistribute it without written permission of copyright holder.
* ============================================================================
*/
global $config;
/**
* Check repository writable.
*
* @return mixed
*/
function files_repo_check_directory()
{
global $config;
$attachment_path = io_safe_output($config['attachment_store']);
$files_repo_path = $attachment_path.'/files_repo';
$result = false;
$messages = '';
$msg_error = __('Attachment directory is not writable by HTTP Server');
$msg_error .= '</h3><p>';
$msg_error .= sprintf(
__('Please check that the web server has write rights on the %s directory'),
$attachment_path
);
// Attachment/ check.
if (is_writable($attachment_path) === false) {
$messages .= ui_print_error_message(
[
'message' => $msg_error,
'no_close' => true,
'force_style' => 'color: #000000 !important',
],
'',
true
);
} else {
// Attachment/agent_packages/ check.
if (file_exists($files_repo_path) === false || is_writable($files_repo_path) === false) {
// Create the directoty if not exist.
if (file_exists($files_repo_path) === false) {
mkdir($files_repo_path);
}
if (is_writable($files_repo_path) === false) {
$messages .= ui_print_error_message(
[
'message' => $msg_error,
'no_close' => true,
'force_style' => 'color: #000000 !important',
],
'',
true
);
} else {
$result = true;
}
} else {
$result = true;
}
}
echo $messages;
return $result;
}
/**
* Check acl file
*
* @param integer $file_id ID.
* @param boolean $user_id Users.
* @param boolean $file_groups File Groups.
* @param boolean $user_groups User Groups.
*
* @return boolean
*/
function files_repo_check_file_acl(
$file_id,
$user_id=false,
$file_groups=false,
$user_groups=false
) {
global $config;
$result = false;
if (empty($user_id) === true) {
$user_id = $config['id_user'];
}
if (is_user_admin($user_id) === true) {
return true;
}
if (!$file_groups) {
$file_groups = files_repo_get_file_groups($file_id);
if (empty($file_groups) === true) {
$file_groups = [];
}
}
if (in_array(0, $file_groups) === true) {
return true;
}
if (!$user_groups) {
$user_groups = users_get_groups($user_id, false, true);
if (empty($user_groups) === true) {
$user_groups = [];
}
}
foreach ($file_groups as $group_id) {
// $user_groups has the id in the array keys.
if (in_array($group_id, $user_groups) === true) {
$result = true;
break;
}
}
return $result;
}
/**
* File groups.
*
* @param integer $file_id File.
*
* @return array
*/
function files_repo_get_file_groups($file_id)
{
$groups = [];
$filter = ['id_file' => $file_id];
$result = db_get_all_rows_filter('tfiles_repo_group', $filter, 'id_group');
if (empty($result) === false) {
foreach ($result as $key => $value) {
$groups[] = $value['id_group'];
}
}
return $groups;
}
/**
* File user groups.
*
* @param string $user_id User id.
*
* @return array
*/
function files_repo_get_user_groups($user_id)
{
$groups = [];
$filter = ['id_usuario' => $user_id];
$result = db_get_all_rows_filter('tusuario_perfil', $filter, 'id_grupo');
if (empty($result) === false) {
foreach ($result as $key => $value) {
$groups[] = $value['id_grupo'];
}
}
return $groups;
}
/**
* Get files.
*
* @param array $filter Filters.
* @param boolean $count Count.
*
* @return array
*/
function files_repo_get_files($filter=[], $count=false)
{
global $config;
// Don't use the realpath for the download links!
$files_repo_path = io_safe_output($config['attachment_store']).'/files_repo';
$sql = 'SELECT *
FROM tfiles_repo
'.db_format_array_where_clause_sql($filter, 'AND', 'WHERE');
$files = db_get_all_rows_sql($sql);
if ($files === false) {
$files = [];
}
$user_groups = files_repo_get_user_groups($config['id_user']);
$files_data = [];
foreach ($files as $file) {
$file_groups = files_repo_get_file_groups($file['id']);
$permission = files_repo_check_file_acl($file['id'], $config['id_user'], $file_groups, $user_groups);
if (!$permission) {
continue;
}
$data = [];
$data['name'] = $file['name'];
$data['description'] = $file['description'];
$data['location'] = $files_repo_path.'/'.$file['id'].'_'.$data['name'];
// Size in bytes.
$data['size'] = filesize($data['location']);
// Last modification time in unix timestamp.
$data['mtime'] = filemtime($data['location']);
$data['groups'] = $file_groups;
$data['hash'] = $file['hash'];
$files_data[$file['id']] = $data;
}
if ($count) {
$files_data = count($files_data);
}
return $files_data;
}
/**
* Add file.
*
* @param string $file_input_name Name.
* @param string $description Description.
* @param array $groups Groups.
* @param boolean $public Mode.
*
* @return array
*/
function files_repo_add_file($file_input_name='upfile', $description='', $groups=[], $public=false)
{
global $config;
$attachment_path = io_safe_output($config['attachment_store']);
$files_repo_path = $attachment_path.'/files_repo';
$result = [];
$result['status'] = false;
$result['message'] = '';
$upload_status = get_file_upload_status($file_input_name);
$upload_result = translate_file_upload_status($upload_status);
if ($upload_result === true) {
$filename = $_FILES[$file_input_name]['name'];
// Invalid extensions.
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$invalid_extensions = '/^(php|php1|php2|php3|php4|php5|php7|php8|phar|phptml|phps)$/i';
if (preg_match($invalid_extensions, $extension) === 0) {
// Replace conflictive characters.
$filename = str_replace([' ', '=', '?', '&'], '_', $filename);
$filename = filter_var($filename, FILTER_SANITIZE_URL);
// The filename should not be larger than 200 characters.
if (mb_strlen($filename, 'UTF-8') > 200) {
$filename = mb_substr($filename, 0, 200, 'UTF-8');
}
$hash = '';
if ($public) {
$hash = md5(time().$config['dbpass']);
$hash = mb_substr($hash, 0, 8, 'UTF-8');
}
$values = [
'name' => $filename,
'description' => $description,
'hash' => $hash,
];
$file_id = db_process_sql_insert('tfiles_repo', $values);
if ($file_id) {
$file_tmp = $_FILES[$file_input_name]['tmp_name'];
$destination = $files_repo_path.'/'.$file_id.'_'.$filename;
if (move_uploaded_file($file_tmp, $destination)) {
if (is_array($groups) && !empty($groups)) {
db_process_sql_delete('tfiles_repo_group', ['id_file' => $file_id]);
foreach ($groups as $group) {
$values = [
'id_file' => $file_id,
'id_group' => $group,
];
db_process_sql_insert('tfiles_repo_group', $values);
}
}
$result['status'] = true;
} else {
db_process_sql_delete('tfiles_repo', ['id' => $file_id]);
unlink($file_tmp);
$result['message'] = __('The file could not be copied');
}
} else {
$result['message'] = __('There was an error creating the file');
}
} else {
$result['message'] = __('File has an invalid extension');
}
} else {
$result['message'] = $upload_result;
}
return $result;
}
/**
* Update file.
*
* @param string $file_id File Name.
* @param string $description Description.
* @param array $groups Groups.
* @param boolean $public Mode.
*
* @return array
*/
function files_repo_update_file($file_id, $description='', $groups=[], $public=false)
{
global $config;
$result = [];
$result['status'] = false;
$result['message'] = '';
$hash = '';
if ($public) {
$hash = md5(time().$config['dbpass']);
$hash = mb_substr($hash, 0, 8, 'UTF-8');
}
$values = [
'description' => $description,
'hash' => $hash,
];
$filter = ['id' => $file_id];
$res = db_process_sql_update('tfiles_repo', $values, $filter);
if ($res !== false) {
if (is_array($groups) && !empty($groups)) {
db_process_sql_delete('tfiles_repo_group', ['id_file' => $file_id]);
foreach ($groups as $group) {
$values = [
'id_file' => $file_id,
'id_group' => $group,
];
db_process_sql_insert('tfiles_repo_group', $values);
}
}
$result['status'] = true;
} else {
$result['message'] = __('There was an error updating the file');
}
return $result;
}
/**
* Delete File
*
* @param string $file_id File Name.
*
* @return mixed
*/
function files_repo_delete_file($file_id)
{
global $config;
$result = -1;
$filename = db_get_value('name', 'tfiles_repo', 'id', $file_id);
if ($filename) {
$attachment_path = io_safe_output($config['attachment_store']);
$files_repo_path = $attachment_path.'/files_repo';
$location = $files_repo_path.'/'.$file_id.'_'.$filename;
if (file_exists($location)) {
$result = false;
if (unlink($location)) {
$result = (bool) db_process_sql_delete('tfiles_repo', ['id' => $file_id]);
}
}
}
return $result;
}