Skip to content

Internal: Migrate and improve settings from configuration.php to .env and hosting_limits.yml - refs #5702 #5756

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.dist
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,10 @@ JWT_PASSPHRASE=your_secret_passphrase
# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages
# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages
###< symfony/messenger ###

###< additional settings ###
DB_MANAGER_ENABLED='{{DB_MANAGER_ENABLED}}'
SOFTWARE_NAME='{{SOFTWARE_NAME}}'
SOFTWARE_URL='{{SOFTWARE_URL}}'
DENY_DELETE_USERS='{{DENY_DELETE_USERS}}'
HOSTING_TOTAL_SIZE_LIMIT='{{HOSTING_TOTAL_SIZE_LIMIT}}'
11 changes: 11 additions & 0 deletions config/hosting_limits.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
parameters:
hosting_limits:
urls:
1:
- hosting_limit_users: 0
- hosting_limit_teachers: 0
- hosting_limit_courses: 0
- hosting_limit_sessions: 0
- hosting_limit_disk_space: 0
- hosting_limit_active_courses: 0
- hosting_total_size_limit: 0
1 change: 1 addition & 0 deletions config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -117,3 +117,4 @@ cocur_slugify:
imports:
- {resource: ../src/CoreBundle/Resources/config/services.yml}
- {resource: ../src/LtiBundle/Resources/config/services.yml}
- {resource: ./hosting_limits.yml}
6 changes: 3 additions & 3 deletions public/main/admin/user_list.php
Original file line number Diff line number Diff line change
Expand Up @@ -718,7 +718,7 @@ function modify_filter($user_id, $url_params, $row): string
);
}

$deleteAllowed = !api_get_configuration_value('deny_delete_users');
$deleteAllowed = api_get_env_variable('DENY_DELETE_USERS', false);
if ($deleteAllowed) {
if ($user_id != $currentUserId &&
!$user_is_anonymous &&
Expand Down Expand Up @@ -1297,14 +1297,14 @@ function($from, $number_of_items, $column, $direction) use ($showDeletedUsers) {
$table->set_column_filter(11, 'modify_deleted_filter');
$actionsList['restore'] = get_lang('Restore');
if (api_is_platform_admin() &&
!api_get_configuration_value('deny_delete_users')
!api_get_env_variable('DENY_DELETE_USERS', false)
) {
$actionsList['destroy'] = get_lang('Destroy');
}
} else {
$table->set_column_filter(11, 'modify_filter');
if (api_is_platform_admin() &&
!api_get_configuration_value('deny_delete_users')
!api_get_env_variable('DENY_DELETE_USERS', false)
) {
$actionsList['delete'] = get_lang('Remove from portal');
}
Expand Down
2 changes: 1 addition & 1 deletion public/main/admin/user_list_consent.php
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ function status_filter($status)
// Only show empty actions bar if delete users has been blocked
$actionsList = [];
if (api_is_platform_admin() &&
!api_get_configuration_value('deny_delete_users')
!api_get_env_variable('DENY_DELETE_USERS', false)
) {
$actionsList['delete'] = get_lang('Remove from portal');
}
Expand Down
13 changes: 6 additions & 7 deletions public/main/course_info/infocours.php
Original file line number Diff line number Diff line change
Expand Up @@ -949,15 +949,14 @@
$illustrationRepo->deleteIllustration($courseEntity);
}

$limitCourses = api_get_configuration_value('hosting_limit_active_courses');
if ($limitCourses > 0) {
$access_url_id = api_get_current_access_url_id();

$limitCourses = get_hosting_limit($access_url_id, 'hosting_limit_active_courses');
if ($limitCourses !== null && $limitCourses > 0) {
$courseInfo = api_get_course_info_by_id($courseId);

// Check if
if (COURSE_VISIBILITY_HIDDEN == $courseInfo['visibility'] &&
$visibility != $courseInfo['visibility']
) {
$num = CourseManager::countActiveCourses($urlId);
if (COURSE_VISIBILITY_HIDDEN == $courseInfo['visibility'] && $visibility != $courseInfo['visibility']) {
$num = CourseManager::countActiveCourses($access_url_id);
if ($num >= $limitCourses) {
api_warn_hosting_contact('hosting_limit_active_courses');

Expand Down
2 changes: 1 addition & 1 deletion public/main/cron/user_import/client.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
'import_users',
[
'filepath' => api_get_path(SYS_UPLOAD_PATH)."users_import.csv",
'security_key' => api_get_configuration_value('security_key'),
'security_key' => api_get_env_variable('kernel.secret'),
]
);
echo $response;
6 changes: 2 additions & 4 deletions public/main/inc/global.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,8 @@
}

try {
// Load legacy configuration.php
if ($kernel->isInstalled()) {
require_once $kernel->getConfigurationFile();
} else {

if (!$kernel->isInstalled()) {
throw new Exception('Chamilo is not installed');
}

Expand Down
70 changes: 63 additions & 7 deletions public/main/inc/lib/api.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Yaml\Yaml;
use ZipStream\Option\Archive;
use ZipStream\ZipStream;
use Chamilo\CoreBundle\Component\Utils\ActionIcon;
Expand Down Expand Up @@ -4307,12 +4308,8 @@ function api_get_version()
*/
function api_get_software_name()
{
$name = api_get_configuration_value('software_name');
if (!empty($name)) {
return $name;
} else {
return 'Chamilo';
}
$name = api_get_env_variable('SOFTWARE_NAME', 'Chamilo');
return $name;
}

function api_get_status_list()
Expand Down Expand Up @@ -5213,7 +5210,7 @@ function api_is_valid_secret_key($original_key_secret, $security_key)
return false;
}

return (string) $original_key_secret === sha1($security_key);
return (string) $original_key_secret === hash('sha512', $security_key);
}

/**
Expand Down Expand Up @@ -6816,6 +6813,65 @@ function api_get_configuration_value($variable)
return false;
}

/**
* Loads hosting limits from the YAML file.
*
* @return array The hosting limits.
*/
function load_hosting_limits(): array
{
$container = Container::$container;

$hostingLimits = $container->getParameter('hosting_limits');

return $hostingLimits['urls'] ?? [];
}

/**
* Gets a specific hosting limit.
*
* @param int $urlId The URL ID.
* @param string $limitName The name of the limit.
* @return mixed The value of the limit, or null if not found.
*/
function get_hosting_limit(int $urlId, string $limitName): mixed
{
$limits = load_hosting_limits();

foreach ($limits[$urlId] as $limitArray) {
if (isset($limitArray[$limitName])) {
return $limitArray[$limitName];
}
}

return null;
}


/**
* Retrieves an environment variable value with validation and handles boolean conversion.
*
* @param string $variable The name of the environment variable.
* @param mixed $default The default value to return if the variable is not set.
* @return mixed The value of the environment variable, converted to boolean if necessary, or the default value.
*/
function api_get_env_variable(string $variable, mixed $default = null): mixed
{
if (Container::$container->hasParameter($variable)) {
$value = Container::$container->getParameter($variable);

if ($value === '0') {
return false;
}
if ($value === '1') {
return true;
}

return $value;
}

return $default;
}
/**
* Retreives and returns a value in a hierarchical configuration array
* api_get_configuration_sub_value('a/b/c') returns api_get_configuration_value('a')['b']['c'].
Expand Down
10 changes: 6 additions & 4 deletions public/main/inc/lib/course.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -6709,20 +6709,22 @@ public static function addVisibilityOptions(FormValidator $form): void
*
* @return bool|string
*/
private static function checkCreateCourseAccessUrlParam($_configuration, $accessUrlId, $param, $msgLabel)
private static function checkCreateCourseAccessUrlParam($accessUrlId, $param, $msgLabel)
{
if (isset($_configuration[$accessUrlId][$param]) && $_configuration[$accessUrlId][$param] > 0) {
$hostingLimit = get_hosting_limit($accessUrlId, $param);

if ($hostingLimit !== null && $hostingLimit > 0) {
$num = null;
switch ($param) {
case 'hosting_limit_courses':
$num = self::count_courses($accessUrlId);
$num = self::count_courses($accessUrlId);
break;
case 'hosting_limit_active_courses':
$num = self::countActiveCourses($accessUrlId);
break;
}

if ($num && $num >= $_configuration[$accessUrlId][$param]) {
if ($num && $num >= $hostingLimit) {
api_warn_hosting_contact($param);

Display::addFlash(
Expand Down
28 changes: 13 additions & 15 deletions public/main/inc/lib/diagnoser.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,24 +213,22 @@ public function get_chamilo_data()

if (1 === $access_url_id) {
$size = '-';
global $_configuration;
$message2 = '';
if (1 === $access_url_id) {
if (api_is_windows_os()) {
$message2 .= get_lang('The space used on disk cannot be measured properly on Windows-based systems.');
} else {
$dir = api_get_path(SYS_PATH);
$du = exec('du -sh '.$dir, $err);
list($size, $none) = explode("\t", $du);
unset($none);

if (api_is_windows_os()) {
$message2 .= get_lang('The space used on disk cannot be measured properly on Windows-based systems.');
} else {
$dir = api_get_path(SYS_PATH);
$du = exec('du -sh ' . $dir, $err);
list($size, $none) = explode("\t", $du);
unset($none);

$limit = get_hosting_limit($access_url_id, 'hosting_limit_disk_space');
if ($limit === null) {
$limit = 0;
if (isset($_configuration[$access_url_id])) {
if (isset($_configuration[$access_url_id]['hosting_limit_disk_space'])) {
$limit = $_configuration[$access_url_id]['hosting_limit_disk_space'];
}
}
$message2 .= sprintf(get_lang('Total space used by portal %s limit is %s MB'), $size, $limit);
}

$message2 .= sprintf(get_lang('Total space used by portal %s limit is %s MB'), $size, $limit);
}

$array[] = $this->build_setting(
Expand Down
10 changes: 4 additions & 6 deletions public/main/inc/lib/sessionmanager.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,11 @@ public static function create_session(
? (empty($accessUrlId) ? api_get_current_access_url_id() : (int) $accessUrlId)
: 1;

if (isset($_configuration[$accessUrlId]) &&
is_array($_configuration[$accessUrlId]) &&
isset($_configuration[$accessUrlId]['hosting_limit_sessions']) &&
$_configuration[$accessUrlId]['hosting_limit_sessions'] > 0
) {
$hostingLimitSessions = get_hosting_limit($accessUrlId, 'hosting_limit_sessions');

if ($hostingLimitSessions !== null && $hostingLimitSessions > 0) {
$num = self::count_sessions();
if ($num >= $_configuration[$accessUrlId]['hosting_limit_sessions']) {
if ($num >= $hostingLimitSessions) {
api_warn_hosting_contact('hosting_limit_sessions');

return get_lang('The number of sessions limit for this portal has been reached');
Expand Down
42 changes: 20 additions & 22 deletions public/main/inc/lib/usermanager.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,11 @@ public static function create_user(
}
}

if (isset($_configuration[$access_url_id]) &&
is_array($_configuration[$access_url_id]) &&
isset($_configuration[$access_url_id]['hosting_limit_users']) &&
$_configuration[$access_url_id]['hosting_limit_users'] > 0) {
$hostingLimitUsers = get_hosting_limit($access_url_id, 'hosting_limit_users');

if ($hostingLimitUsers !== null && $hostingLimitUsers > 0) {
$num = self::get_number_of_users();
if ($num >= $_configuration[$access_url_id]['hosting_limit_users']) {
if ($num >= $hostingLimitUsers) {
api_warn_hosting_contact('hosting_limit_users');
Display::addFlash(
Display::return_message(
Expand All @@ -201,23 +200,22 @@ public static function create_user(
}
}

if (1 === $status &&
isset($_configuration[$access_url_id]) &&
is_array($_configuration[$access_url_id]) &&
isset($_configuration[$access_url_id]['hosting_limit_teachers']) &&
$_configuration[$access_url_id]['hosting_limit_teachers'] > 0
) {
$num = self::get_number_of_users(1);
if ($num >= $_configuration[$access_url_id]['hosting_limit_teachers']) {
Display::addFlash(
Display::return_message(
get_lang('Sorry, this installation has a teachers limit, which has now been reached. To increase the number of teachers allowed on this Chamilo installation, please contact your hosting provider or, if available, upgrade to a superior hosting plan.'),
'warning'
)
);
api_warn_hosting_contact('hosting_limit_teachers');
if (1 === $status) {
$hostingLimitTeachers = get_hosting_limit($access_url_id, 'hosting_limit_teachers');

return false;
if ($hostingLimitTeachers !== null && $hostingLimitTeachers > 0) {
$num = self::get_number_of_users(1);
if ($num >= $hostingLimitTeachers) {
Display::addFlash(
Display::return_message(
get_lang('Sorry, this installation has a teachers limit, which has now been reached. To increase the number of teachers allowed on this Chamilo installation, please contact your hosting provider or, if available, upgrade to a superior hosting plan.'),
'warning'
)
);
api_warn_hosting_contact('hosting_limit_teachers');

return false;
}
}
}

Expand Down Expand Up @@ -612,7 +610,7 @@ public static function create_user(
*/
public static function canDeleteUser($user_id)
{
$deny = api_get_configuration_value('deny_delete_users');
$deny = api_get_env_variable('DENY_DELETE_USERS', false);

if ($deny) {
return false;
Expand Down
Loading
Loading