From 059dffedc57882c2a00d3a5b016731a3d6b09755 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:41:20 -0500 Subject: [PATCH 01/10] Minor - replaced & by & for XHTML support --- main/template/default/auth/courses_categories.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/main/template/default/auth/courses_categories.php b/main/template/default/auth/courses_categories.php index ae9019e087..26d3a91266 100755 --- a/main/template/default/auth/courses_categories.php +++ b/main/template/default/auth/courses_categories.php @@ -28,7 +28,7 @@ $stok = Security::get_token(); -
+ @@ -59,7 +59,7 @@ $stok = Security::get_token(); if ($code == $category_code) { $category_link = ''.$category_name.' ('.$count_courses_lv1.')'; } else { - $category_link = ''.$category_name.' ('.$count_courses_lv1.')'; + $category_link = ''.$category_name.' ('.$count_courses_lv1.')'; } echo '
'.$category_link.'
'; @@ -72,7 +72,7 @@ $stok = Security::get_token(); if ($code == $subcategory1_code) { $subcategory1_link = ''.$subcategory1_name.' ('.$count_courses_lv2.')'; } else { - $subcategory1_link = ''.$subcategory1_name.' ('.$count_courses_lv2.')'; + $subcategory1_link = ''.$subcategory1_name.' ('.$count_courses_lv2.')'; } echo '
'.$subcategory1_link.'
'; } @@ -85,7 +85,7 @@ $stok = Security::get_token(); if ($code == $subcategory2_code) { $subcategory2_link = ''.$subcategory2_name.' ('.$count_courses_lv3.')'; } else { - $subcategory2_link = ''.$subcategory2_name.' ('.$count_courses_lv3.')'; + $subcategory2_link = ''.$subcategory2_name.' ('.$count_courses_lv3.')'; } echo '
'.$subcategory2_link.'
'; } @@ -148,11 +148,11 @@ $stok = Security::get_token(); // we display the icon to subscribe or the text already subscribed if (!in_array($course['code'], $user_coursecodes)) { if ($course['subscribe'] == SUBSCRIBE_ALLOWED) { - echo ''.get_lang('Subscribe').''; + echo ''.get_lang('Subscribe').''; } } if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') { - echo ''.get_lang('CourseDetails').''; + echo ''.get_lang('CourseDetails').''; } echo ' From 35fb20aa1223269c76b3ca88c78e8ce006cd23b5 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:42:15 -0500 Subject: [PATCH 02/10] Minor - Replaced $hidden_links by 0 in condition that leaves little doubt over the value of $hidden_links and avoids notice undefined --- main/template/default/auth/courses_categories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/template/default/auth/courses_categories.php b/main/template/default/auth/courses_categories.php index 26d3a91266..7e900f3be0 100755 --- a/main/template/default/auth/courses_categories.php +++ b/main/template/default/auth/courses_categories.php @@ -28,7 +28,7 @@ $stok = Security::get_token(); - + From 00ef05dfc1ffbfe5085ff584d420e576b225092f Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:49:11 -0500 Subject: [PATCH 03/10] Added XSS security filter before display just in case --- main/auth/courses_controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/auth/courses_controller.php b/main/auth/courses_controller.php index 9d53dbf2ae..de8c2e8118 100755 --- a/main/auth/courses_controller.php +++ b/main/auth/courses_controller.php @@ -100,7 +100,7 @@ class CoursesController { // extends Controller { $data['browse_courses_in_category'] = $this->model->browse_courses_in_category($category_code); $data['browse_course_categories'] = $browse_course_categories; - $data['code'] = $category_code; + $data['code'] = Security::remove_XSS($category_code); // getting all the courses to which the user is subscribed to $curr_user_id = api_get_user_id(); From 56c1005ac12889a38ef13bfacd7290b2ce6c2089 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:53:55 -0500 Subject: [PATCH 04/10] Minor - added comments --- main/inc/lib/app_view.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main/inc/lib/app_view.php b/main/inc/lib/app_view.php index 1676a4de63..b2f2b7b4fd 100755 --- a/main/inc/lib/app_view.php +++ b/main/inc/lib/app_view.php @@ -75,13 +75,14 @@ class View { } /** - * It's used into render method for rendering data the template and layout views + * It's used into render method for rendering data in the template and layout views + * @return String Rendered template (as HTML, most of the time) */ private function render_template() { $target = $this->tool_path.$this->template.'.php'; if (file_exists($target)) { ob_start(); - @extract($this->data, EXTR_OVERWRITE); + @extract($this->data, EXTR_OVERWRITE); //pass the $this->data array into local scope require_once $target; $content = ob_get_clean(); return $content; From a68da1c95118e9f762e8729cce13543a5e1cf7a0 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:55:20 -0500 Subject: [PATCH 05/10] Security - Added filtering of search_term variable --- main/auth/courses_controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/auth/courses_controller.php b/main/auth/courses_controller.php index de8c2e8118..f5cab448af 100755 --- a/main/auth/courses_controller.php +++ b/main/auth/courses_controller.php @@ -141,7 +141,7 @@ class CoursesController { // extends Controller { $data['browse_courses_in_category'] = $this->model->search_courses($search_term); $data['browse_course_categories'] = $browse_course_categories; - $data['search_term'] = $search_term; + $data['search_term'] = Security::remove_XSS($search_term); //filter before showing in template // getting all the courses to which the user is subscribed to $curr_user_id = api_get_user_id(); From a1d1fce93235fbfd317d9758d7e308500c368124 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 09:59:59 -0500 Subject: [PATCH 06/10] Removed double string escaping --- main/inc/lib/group_portal_manager.lib.php | 1 - 1 file changed, 1 deletion(-) diff --git a/main/inc/lib/group_portal_manager.lib.php b/main/inc/lib/group_portal_manager.lib.php index 413625a472..ca19f6f1bc 100755 --- a/main/inc/lib/group_portal_manager.lib.php +++ b/main/inc/lib/group_portal_manager.lib.php @@ -565,7 +565,6 @@ class GroupPortalManager //@todo implement visibility if (isset ($keyword)) { - $keyword = Database::escape_string($keyword); $sql .= " WHERE (g.name LIKE '%".$keyword."%' OR g.description LIKE '%".$keyword."%' OR g.url LIKE '%".$keyword."%' )"; } From a5c6c585ab1d851e33f5d8c05ae36cd0d17fa4f2 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 10:02:34 -0500 Subject: [PATCH 07/10] Remove intermediate variable to avoid confusion about filtering --- main/social/search.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/main/social/search.php b/main/social/search.php index 0961576207..18081dc7d4 100755 --- a/main/social/search.php +++ b/main/social/search.php @@ -28,15 +28,14 @@ echo '
'; echo '
'; echo '
'; - $query = $_GET['q']; - echo UserManager::get_search_form($query); + echo UserManager::get_search_form($_GET['q']); //I'm searching something - if ($query != '') { - if (isset($query) && $query!='') { + if ($_GET['q'] != '') { + if (isset($_GET['q']) && $_GET['q']!='') { //get users from tags - $users = UserManager::get_all_user_tags($query, 0, 0, 5); - $groups = GroupPortalManager::get_all_group_tags($query); + $users = UserManager::get_all_user_tags($_GET['q'], 0, 0, 5); + $groups = GroupPortalManager::get_all_group_tags($_GET['q']); if (empty($users) && empty($groups)) { echo get_lang('SorryNoResults'); From 7714ca952620d0594eb32ff1bc0161333e2853d9 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 11:37:28 -0500 Subject: [PATCH 08/10] Added security recommendations page --- documentation/security.html | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 documentation/security.html diff --git a/documentation/security.html b/documentation/security.html new file mode 100644 index 0000000000..fda2b25d24 --- /dev/null +++ b/documentation/security.html @@ -0,0 +1,60 @@ + + + + + Chamilo 1.8.8 Optimization Guide + + + + + +
+

Chamilo 1.8.8 : Security Guide

+
+ +Documentation > Security Guide +
+
+

+ +

We recommend you don't take security issues too lightly. Chamilo is security-audited at least once a year, but you're never too sure. This list is a work in progress. Feel free to recommend additional measures by sending us an e-mail at info@chamilo.org.

+ + +

Contents

+ +
    + +
  1. Disclosing server info
  2. +
  3. Keeping up to date
  4. +
+ +

Disclosing server info

+

+It is considered a safer behaviour not to disclose server information from your Chamilo page. In order to avoid both web server and PHP information disclosure, you might want to take the following actions: +

    +
  • Locate the ServerTokens setting inside your Apache configuration and set it to "Prod"
  • +
  • Locate the ServerSignature setting inside your Apache configuration and set it to "Off"
  • +
  • Locate the expose_php setting inside your PHP configuration and set it to "Off"
  • +
  • Reload Apache
  • +
+

+ +

4. Keeping up to date

+

+Make sure you check our security issues page from time to time. +Subscribe to our free security alerts mailing-list: http://lists.chamilo.org/listinfo/security or that you follow our security Twitter feed: http://twitter.com/chamilosecurity. +

+ +
+

Authors

+ + From e44f2ff00e4a1cf0060f7838f83731e41821e844 Mon Sep 17 00:00:00 2001 From: ywarnier Date: Sun, 24 Apr 2011 11:38:12 -0500 Subject: [PATCH 09/10] Updated installation manual and optimization manual to version 1.8.8. Still requires improvements for Rapid and Xapian guides --- documentation/installation_guide.html | 159 +++++++++++++++++--------- documentation/optimization.html | 4 +- 2 files changed, 107 insertions(+), 56 deletions(-) diff --git a/documentation/installation_guide.html b/documentation/installation_guide.html index a5b7740abd..2329f0e340 100755 --- a/documentation/installation_guide.html +++ b/documentation/installation_guide.html @@ -16,7 +16,7 @@
-

Chamilo 1.8.7.1 : Installation Guide

+

Chamilo 1.8.8 : Installation Guide

Documentation > Installation Guide @@ -24,7 +24,7 @@

-

Thank you for downloading Chamilo 1.8.7.1.

+

Thank you for downloading Chamilo 1.8.8.

@@ -39,13 +39,15 @@
  • Pre-requisites
  • Installation of Chamilo LMS
  • -
  • Upgrade from a previous version of Chamilo/Dokeos
  • +
  • Upgrade from a previous version of Chamilo/Dok€os
  • Troubleshooting
  • Administration section
  • LDAP 
  • Mathematical formulas with LaTeX
  • Mathematical formulas with ASCIIMathML
  • Mathematical formulas with WIRIS
  • +
  • Full-text indexation with Xapian
  • +
  • Chamilo Rapid - PPT conversion system

  • @@ -131,6 +133,12 @@ enable CSS styles package upload and sub-language definition:
  • [chamilo]/main/css/
  • [chamilo]/main/lang/
  • +Since Chamilo 1.8.8, you can also enable full-text indexing features which +require the php5-xapian PHP's extension module to be installed. If you do use +it, you will need to allow your system to write into the sarchdb directory: +
      +
    • [chamilo]/searchdb
    • +

    On Linux, Mac OS X and BSD operating systems you can use the CHMOD 0777 command for this (although we recommend you seek advice from an @@ -139,12 +147,12 @@ On Windows, you may need to check the properties of the folders (by right-clicking on them).

    -2.5. The following files need to be readable and writeable for the web browser, +2.5. The following directory needs to be readable and writeable for the web browser, only during the installation process:

      -
    • chamilo/main/inc/conf/configuration.php (if present)
    • +
    • chamilo/main/inc/conf/ (if present)
    @@ -163,8 +171,9 @@ folders (by right-clicking on them).

    Do not modify the home_*.html files directly. Instead, choose "Configure the homepage" in the Chamilo administration section.

    -

    Windows : with combination packages like XAMPP, out of the box, login and password - for MySQL should probably remain empty.

    +

    Windows : with all-in-one packages +like XAMPP, you can install Chamilo easily. In this case (and unless you use it +in production), the login and password for MySQL will probably remain empty.

    @@ -174,7 +183,8 @@ choose "Configure the homepage" in the Chamilo administration section.

    • Protect your configuration file: -make sure no one can overwrite it. You can find the config file in (chamilo folder)/main/inc/conf/configuration.php. +make sure no one can overwrite it. You can find the config file in +(chamilo folder)/main/inc/conf/configuration.php. Make it read-only (windows/xwindows: right-click the file to edit the properties. linux/bsd/macosx: use the chmod 444 command). The config file is created by Apache so you may need to be root user to change its @@ -202,6 +212,8 @@ in the administration section of Chamilo, you can use the Chamilo Config Setting most of Chamilo uses the mail settings from the php.ini file. However, the announcements tool uses phpMailer (another free software project) and the settings for this tool can be adjusted in (chamilo folder)/main/inc/conf/mail.conf.php.
    • + +
    • Check our new security guide for more

    @@ -214,28 +226,27 @@ To get the best of Chamilo, you need to finetune PHP settings. Consider :
      -
    • Editing php.ini file (on windows can be located at C:\xampp\php\php.ini, on Ubuntu Linux : /etc/php5/apache2/php.ini
    • - +
    • Editing php.ini file (on windows can be located at + C:\xampp\php\php.ini, + on Ubuntu Linux : + /etc/php5/apache2/php.ini
    • search the word "max" and increase values to optimise the server
    • - -
    • you may want to end up with the following values :
    • +
    • we recommend the following values :
    - -
    - max_execution_time = 300    ; Maximum execution time of each script, in seconds
    - max_input_time = 600 ; Maximum amount of time each script may spend parsing request data
    - memory_limit = 256M      ; Maximum amount of memory a script may consume (128MB)
    - post_max_size = 64M
    - upload_max_filesize = 100M + max_execution_time = 300; Maximum execution time of each script, in seconds
    + max_input_time = 600; Maximum amount of time each script may spend parsing request data
    + memory_limit = 256M; Maximum amount of memory a script may consume (128MB)
    + post_max_size = 64M;
    + upload_max_filesize = 100M;

    Some users could meet problems if their PHP settings don't fit these ones:

      -
    • short_open_tag = On
    • +
    • short_open_tag = Off
    • safe_mode = Off
    • magic_quotes_gpc = On
    • magic_quotes_runtime = Off
    • @@ -243,16 +254,20 @@ these ones:

      Past Chamilo versions required register_globals to be set to On. This is -no longer necessary, this can be set to Off and Chamilo will work fine.

      +no longer necessary, this can be set to Off and Chamilo will work fine. +It is considered a bad choice in terms of security to set register_globals to On.

      -

      Note: if you are using PHP 5.3 or higher, you need to set your date.timezone setting to whatever your server's timezone is. -For example, if your server is in the 'America/New_York' timezone, set this in your php.ini:

      +

      Note: if you are using PHP 5.3 or higher, you need to set +your date.timezone setting to whatever your server's timezone is. +For example, if your server is in the 'America/New_York' timezone, set this +in your php.ini:

      date.timezone = 'America/New_York'
      -

      BSD users: these php libraries have to be included during php installation:

      +

      BSD users: these php libraries have to be included during + php installation:

      • php-mysql The mysql shared extension for php
      • @@ -274,34 +289,37 @@ date.timezone = 'America/New_York'
        -

        3. Upgrade from a previous version of Chamilo/Dokeos

        +

        3. Upgrade from a +previous version of Chamilo or Dok€os (versions <2.0)

        Before upgrading we heavily recommend you do a full backup of the previous -Chamilo/Dokeos directories and databases. If you are unsure how to achieve this +Chamilo or Dok€os directories and databases. If you are unsure how to achieve this please ask your hosting provider for advice.
        +
        + NOTE: This version of Chamilo can only be used to upgrade from +smaller versions of Chamilo or Dok€os. For example, you cannot use the normal +upgrade scripts Chamilo 1.8.8 to upgrade from Dok€os 2.0. If you need this, +please contact one of the Chamilo Association's official providers.

        -

        3.1 Upgrading from Chamilo 1.8.7

        +

        3.1 Upgrading from Chamilo 1.8.x

        • check that you haven't left any customised stylesheet or image*
        • -
        • download the Chamilo 1.8.7.1 Palmas install package from the Chamilo download page
        • -
        • unzip the new files of Chamilo 1.8.7.1 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)
        • -
        • update $_configuration['system_version'] to '1.8.7.1' in the main/inc/conf/configuration.php file
        • -
        • that's it! You are now using Chamilo 1.8.7.1
        • +
        • download the Chamilo 1.8.8 Miraflores install package from the Chamilo download page
        • +
        • unzip the new files of Chamilo 1.8.8 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)
        • +
        • update $_configuration['system_version'] to '1.8.8' in the main/inc/conf/configuration.php file
        • +
        • that's it! You are now using Chamilo 1.8.8

        +

        3.2 Upgrading from Dok€os 1.8.x

        - -

        3.2 Upgrading from Dokeos 1.8.x

        - - -If you upgrade from Dokeos 1.8.x :  +If you upgrade from Dok€os 1.8.x
        • check that you haven't left any customised stylesheet or image*
        • -
        • download the Chamilo 1.8.7.1 Palmas install package from the Chamilo download page
        • -
        • unzip the new files of Chamilo 1.8.7.1 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)
        • +
        • download the Chamilo 1.8.8 Miraflores install package from the Chamilo download page
        • +
        • unzip the new files of Chamilo 1.8.8 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)
        • point your browser on your portal URL + main/install/
        • choose your language and click Upgrade from 1.8.x
        @@ -314,7 +332,7 @@ directories. You can still recover them from your backup if you have made it. overwritten by the next step. To avoid loosing your customisations, always ensure you copy the styles/images under a new name and use and modify the copy, not the original. The original will always be overwritten by newer - versions. In Dokeos 1.8.5, we have changed the name of several CSS themes. + versions. In Dok€os 1.8.5, we have changed the name of several CSS themes. Backwards compatibility is ensured by the fact that an upgrade only adds the new themes, but you should try and use these new themes rather than sticking to the old ones which will be deprecated shortly (not maintained). @@ -322,14 +340,14 @@ to the old ones which will be deprecated shortly (not maintained).

        -

        3.3 Upgrading from Dokeos 1.6.x

        +

        3.3 Upgrading from Dok€os 1.6.x

        -If you upgrade from a lower version of Dokeos (1.6.x), the first +If you upgrade from a lower version of Dok€os (1.6.x), the first and most important thing to do is to *move* your current directory to another place.
        An easy way to do that is to create a subdirectory called "old_version" -in your current Chamilo/Dokeos directory and move everything in there using a +in your current Chamilo/Dok€os directory and move everything in there using a simple "move" command (i.e. under Linux: mkdir old_version; mv * old_verion/), then make the old_version/ directory writeable by the web server so that courses/ and upload/ directories can be moved from the @@ -337,15 +355,15 @@ old to the new installation.

        The complete process is as follow:
          -
        • move the current Dokeos directory contents to a subdirectory called +
        • move the current Dok€os directory contents to a subdirectory called old_version and make it writeable by the web server. This is important to allow the move of the courses/ and upload/ directories to the new install
        • -
        • download the Chamilo 1.8.7.1 install package from the +
        • download the Chamilo 1.8.8 install package from the Chamilo download page
        • -
        • unzip the new files of Chamilo 1.8.7.1 in the main Chamilo/Dokeos directory. The +
        • unzip the new files of Chamilo 1.8.8 in the main Chamilo/Dok€os directory. The new directory main should be located directly inside your -Chamilo/Dokeos root folder
        • +Chamilo/Dok€os root folder
        • point your browser on your portal URL
        • choose your language and click Upgrade from 1.6.x and confirm the current directory of the old version
        • @@ -366,7 +384,7 @@ all the 1.8.x versions

          WARNING:
          -Do not delete the previous Chamilo/Dokeos installation directory before installing +Do not delete the previous Chamilo/Dok€os installation directory before installing the new one. When the update is successfully finished, you can remove the old path.

          @@ -416,16 +434,16 @@ On the command-line, type:
        • mkdir /var/www/chamilo/old_version
        • mv /var/www/chamilo/* /var/www/chamilo/old_version/
        • chmod -R 0777 /var/www/chamilo/old_version/
        • -
        • wget http://www.chamilo.org/files/chamilo-1.8.7.1.tar.gz
        • -
        • tar zxvf chamilo-1.8.7.1.tar.gz
        • -
        • sudo cp -ra chamilo-1.8.7.1/* /var/www/chamilo/
        • -
        • rm chamilo-1.8.7.1.tar.gz
        • -
        • sudo rm -r chamilo-1.8.7.1/
        • +
        • wget http://chamilo.googlecode.com/files/chamilo-1.8.8.tar.gz
        • +
        • tar zxvf chamilo-1.8.8.tar.gz
        • +
        • sudo cp -ra chamilo-1.8.8/* /var/www/chamilo/
        • +
        • rm chamilo-1.8.8.tar.gz
        • +
        • sudo rm -r chamilo-1.8.8/

        -Then (for cases other than from 1.8.7): +Then:
        • Direct your browser to http://www.portalurl.com/main/install/
        • Proceed with the installation
        • @@ -692,6 +710,38 @@ You may need to alter the setting to be for example:

          9. Mathematical formulas with WIRIS

          Installing this plugin you get WIRIS editor and WIRIS CAS.
          This activation is not fully realized unless it has been previously downloaded the PHP plugin for FCKeditor WIRIS and unzipped its contents in the Chamilo's directory main/inc/lib/fckeditor/editor/plugins/fckeditor_wiris/
          This is necessary because Wiris is proprietary software and his services are commercial. To make adjustments to the plugin, edit configuration.ini file or replace his content by configuration.ini.default Chamilo file.

          + +
          +

          Full-text indexation with Xapian

          +

          +Note: This step will require a dedicated server or a virtual dedicated server as the packages involved are not available on most shared hosting solutions.
          +On Debian or Ubuntu 10.04 and superior, you will simply need to install the php5-xapian package and restart your web server: +

          +sudo apt-get install php5-xapian
          +sudo /etc/init.d/apache2 restart
          +
          + +Then go to your administration page -> Configuration settings -> Search +and enable the search tool. Follow the recommendations on the page to get the +complete indexing suite installed. Once you're done, all documents you import +into your Chamilo portal in a recognized format will be indexed and searchable. +Chamilo Administrators training (which you can ask any Chamilo's Official +Provider for) include a full review of the full-text search feature. +

          + +
          +

          Chamilo Rapid - PPT conversion system

          +

          +Note: This step will require a dedicated server or a virtual dedicated server as the packages involved are not available on most shared hosting solutions.
          +On Debian or Ubuntu 10.04 and superior, install OpenOffice.org v3 (this might work with LibreOffice) and start it as a headless server: +

          +sudo apt-get install openoffice.org
          +sudo soffice -nologo -nofirststartwizard -headless -norestore -invisible "-accept=socket,host=localhost,port=2002,tcpNoDelay=1;urp;"
          +
          +Then go to your administration page -> Chamilo Rapid and set the host to "localhost" and the port to "2002". Save. Go to your course, learning path tool and see the new icon appeared. Import your PPT. This should work. +Note: Sometimes, this doesn't work out so easily. You can probably ask for the assistance of any system administrator around with a bit of Java and PHP experience, or you can always ask one of the Chamilo's Official Providers for assistance (ask for a guaranteed commercial contract). +

          +


          @@ -710,4 +760,5 @@ This activation is not fully realized unless it has been previously downloaded t Valid CSS - + + \ No newline at end of file diff --git a/documentation/optimization.html b/documentation/optimization.html index 83a432f56e..d97b0c860e 100644 --- a/documentation/optimization.html +++ b/documentation/optimization.html @@ -2,7 +2,7 @@ - Chamilo 1.8.7.1 Optimization Guide + Chamilo 1.8.8 Optimization Guide