CRM-14199 - Incorrect Math in Import routines
authoratif-shaikh <shaikh388@gmail.com>
Mon, 30 Jun 2014 14:00:01 +0000 (19:30 +0530)
committeratif-shaikh <shaikh388@gmail.com>
Mon, 30 Jun 2014 14:00:01 +0000 (19:30 +0530)
https://issues.civicrm.org/jira/browse/CRM-14199

CRM/Activity/Import/Form/DataSource.php
CRM/Admin/Form/Setting/Miscellaneous.php
CRM/Contact/Import/Form/DataSource.php
CRM/Contribute/Import/Form/DataSource.php
CRM/Core/Config/Defaults.php
CRM/Custom/Import/Form/DataSource.php
CRM/Event/Import/Form/DataSource.php
CRM/Import/DataSource/CSV.php
CRM/Member/Import/Form/DataSource.php

index d3fd88ac702630edeb17010ea2acb3f91e679de7..9c048cc215649c22e82df9d628201cf82a885e6f 100644 (file)
@@ -47,6 +47,8 @@ class CRM_Activity_Import_Form_DataSource extends CRM_Core_Form {
   public function preProcess() {
     $session = CRM_Core_Session::singleton();
     $session->pushUserContext(CRM_Utils_System::url('civicrm/import/activity', 'reset=1'));
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
   }
 
   /**
@@ -58,21 +60,18 @@ class CRM_Activity_Import_Form_DataSource extends CRM_Core_Form {
   public function buildQuickForm() {
     //Setting Upload File Size
     $config = CRM_Core_Config::singleton();
-    if ($config->maxImportFileSize >= 8388608) {
+
+    $uploadFileSize = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    if ($uploadFileSize >= 8388608) {
       $uploadFileSize = 8388608;
     }
-    else {
-      $uploadFileSize = $config->maxImportFileSize;
-    }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
 
     $this->assign('uploadSize', $uploadSize);
-
-    $this->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
-    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
-    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
     $this->setMaxFileSize($uploadFileSize);
+    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
+    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
     $this->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
 
     $this->addElement('checkbox', 'skipColumnHeader', ts('First row contains column headers'));
index 57bdb4b6163e9d0b26ae258aa7df687801821671..d96f9a63cb90fb771b388880fa47e9c06f0ae6de 100644 (file)
@@ -51,6 +51,19 @@ class CRM_Admin_Form_Setting_Miscellaneous extends CRM_Admin_Form_Setting {
     'checksumTimeout' => CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
   );
 
+  public $_uploadMaxSize;
+
+  /**
+   * Basic setup
+   */
+
+  public function preProcess() {
+    $config     = CRM_Core_Config::singleton();
+    $this->_uploadMaxSize = (int) ini_get('upload_max_filesize');
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
+  }
+
   /**
    * Function to build the form
    *
@@ -117,6 +130,11 @@ class CRM_Admin_Form_Setting_Miscellaneous extends CRM_Admin_Form_Setting {
   static function formRule($fields, $files, $options) {
     $errors = array();
 
+    // validate max file size
+    if ($fields['maxFileSize'] > $options->_uploadMaxSize) {
+      $errors['maxFileSize'] = ts("Maximum file size cannot exceed Upload max size ('upload_max_filesize') as defined in PHP.ini.");
+    }
+
     if (!empty($fields['wkhtmltopdfPath'])) {
       // check and ensure that thi leads to the wkhtmltopdf binary
       // and it is a valid executable binary
@@ -140,6 +158,10 @@ class CRM_Admin_Form_Setting_Miscellaneous extends CRM_Admin_Form_Setting {
     $config = CRM_Core_Config::singleton();
     $params = $this->controller->exportValues($this->_name);
 
+    // update upload max size in DB
+    $params['maxImportFileSize'] = CRM_Core_Config_Defaults::formatUnitSize(ini_get('upload_max_filesize'));
+    CRM_Core_BAO_ConfigSetting::create($params);
+
     // get current logging status
     $values = $this->exportValues();
 
index 93196eb5487c6c3f606d2cf8375a5cbbf89356ec..a2a414d1999be1d0b9260d42d3c09a88e4075d9f 100644 (file)
@@ -72,6 +72,9 @@ class CRM_Contact_Import_Form_DataSource extends CRM_Core_Form {
     $handler    = opendir($config->uploadDir);
     $errorFiles = array('sqlImport.errors', 'sqlImport.conflicts', 'sqlImport.duplicates', 'sqlImport.mismatch');
 
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
+
     while ($file = readdir($handler)) {
       if ($file != '.' && $file != '..' &&
         in_array($file, $errorFiles) && !is_writable($config->uploadDir . $file)
index 843ac6fa02b4fe42835e7e31f818dff9768b8e50..1c23dd9ed4b8849d9566e922c271d47563982128 100644 (file)
@@ -47,6 +47,8 @@ class CRM_Contribute_Import_Form_DataSource extends CRM_Core_Form {
   public function preProcess() {
     $session = CRM_Core_Session::singleton();
     $session->pushUserContext(CRM_Utils_System::url('civicrm/contribute/import', 'reset=1'));
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
   }
 
   /**
@@ -58,21 +60,19 @@ class CRM_Contribute_Import_Form_DataSource extends CRM_Core_Form {
   public function buildQuickForm() {
     //Setting Upload File Size
     $config = CRM_Core_Config::singleton();
-    if ($config->maxImportFileSize >= 8388608) {
+
+    $uploadFileSize = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    if ($uploadFileSize >= 8388608) {
       $uploadFileSize = 8388608;
     }
-    else {
-      $uploadFileSize = $config->maxImportFileSize;
-    }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
 
     $this->assign('uploadSize', $uploadSize);
 
-    $this->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
-    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
-    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
     $this->setMaxFileSize($uploadFileSize);
+    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
     $this->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
 
     $this->addElement('checkbox', 'skipColumnHeader', ts('First row contains column headers'));
index 3cc1480ed790d874bb0806b6826c91270376dee1..b942b907a673c20fa85d993e35f61ec97aaaae4a 100644 (file)
@@ -69,6 +69,19 @@ class CRM_Core_Config_Defaults {
     $this->revampPages = array();
 
     $size = trim(ini_get('upload_max_filesize'));
+    if ($size) {
+      $this->maxImportFileSize = self::formatUnitSize($size);
+    }
+  }
+
+  /**
+   * Function to format size
+   *
+   * @access public
+   * @static
+   */
+
+  public static function formatUnitSize($size, $checkForPostMax = FALSE) {
     if ($size) {
       $last = strtolower($size{strlen($size) - 1});
       switch ($last) {
@@ -81,7 +94,14 @@ class CRM_Core_Config_Defaults {
         case 'k':
           $size *= 1024;
       }
-      $this->maxImportFileSize = $size;
+
+      if ($checkForPostMax) {
+        $config     = CRM_Core_Config::singleton();
+        if($config->maxImportFileSize > $size) {
+          CRM_Core_Session::setStatus(ts("Note: Upload max filesize ('upload_max_filesize') should not exceed Post max size ('post_max_size') as defined in PHP.ini, please check with your system administrator."), ts("Warning"), "alert");
+        }
+      }
+      return $size;
     }
   }
 
index b98c846e939e2841a9f82a3dd91869b32b6a41c6..a0770da02c0a2d2d724ffb0755334fbd78e29b76 100644 (file)
@@ -54,6 +54,9 @@ class CRM_Custom_Import_Form_DataSource extends CRM_Core_Form {
       $params = "reset=1";
     }
     $session->pushUserContext(CRM_Utils_System::url('civicrm/import/custom', $params));
+
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
   }
 
   /**
@@ -87,20 +90,18 @@ class CRM_Custom_Import_Form_DataSource extends CRM_Core_Form {
 
     //Setting Upload File Size
     $config = CRM_Core_Config::singleton();
-    if ($config->maxImportFileSize >= 8388608) {
+
+    $uploadFileSize = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    if ($uploadFileSize >= 8388608) {
       $uploadFileSize = 8388608;
     }
-    else {
-      $uploadFileSize = $config->maxImportFileSize;
-    }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
 
     $this->assign('uploadSize', $uploadSize);
-    $this->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
-    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
-    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
     $this->setMaxFileSize($uploadFileSize);
+    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
     $this->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
 
     $this->addElement('checkbox', 'skipColumnHeader', ts('First row contains column headers'));
index 844ea05e1b667a35c1ae2094399165743796d4a8..e93bb83ee67a0216e4bfbb565afbe15e49db9133 100644 (file)
@@ -47,6 +47,8 @@ class CRM_Event_Import_Form_DataSource extends CRM_Core_Form {
   public function preProcess() {
     $session = CRM_Core_Session::singleton();
     $session->pushUserContext(CRM_Utils_System::url('civicrm/event/import', 'reset=1'));
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
   }
 
   /**
@@ -58,21 +60,19 @@ class CRM_Event_Import_Form_DataSource extends CRM_Core_Form {
   public function buildQuickForm() {
     //Setting Upload File Size
     $config = CRM_Core_Config::singleton();
-    if ($config->maxImportFileSize >= 8388608) {
+
+    $uploadFileSize = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    if ($uploadFileSize >= 8388608) {
       $uploadFileSize = 8388608;
     }
-    else {
-      $uploadFileSize = $config->maxImportFileSize;
-    }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
 
     $this->assign('uploadSize', $uploadSize);
 
-    $this->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
-    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
-    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
     $this->setMaxFileSize($uploadFileSize);
+    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
     $this->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
 
     $this->addElement('checkbox', 'skipColumnHeader', ts('First row contains column headers'));
index bf4e102ef90b890cabcba684412b822264db3bef..c9cee1e0f31314a18dd106f1bba134a1323cf71a 100644 (file)
@@ -71,11 +71,11 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
     $config = CRM_Core_Config::singleton();
 
     // FIXME: why do we limit the file size to 8 MiB if it's larger in config?
-    $uploadFileSize = $config->maxImportFileSize >= 8388608 ? 8388608 : $config->maxImportFileSize;
+    $sizeInBytes = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    $uploadFileSize = $sizeInBytes >= 8388608 ? 8388608 : $sizeInBytes;
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
     $form->assign('uploadSize', $uploadSize);
-    $form->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
+    $form->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
     $form->setMaxFileSize($uploadFileSize);
     $form->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
     $form->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
@@ -91,7 +91,6 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
    */
   function postProcess(&$params, &$db, &$form) {
     $file = $params['uploadFile']['name'];
-
     $result = self::_CsvToTable($db,
       $file,
       CRM_Utils_Array::value('skipColumnHeader', $params, FALSE),
index 466427f8113b77c5cd9a908e15c3dc374d21068b..57aa30ef291c12dc8a6aff8cf2d1583f18788e49 100644 (file)
@@ -47,6 +47,8 @@ class CRM_Member_Import_Form_DataSource extends CRM_Core_Form {
   public function preProcess() {
     $session = CRM_Core_Session::singleton();
     $session->pushUserContext(CRM_Utils_System::url('civicrm/member/import', 'reset=1'));
+    // check for post max size
+    CRM_Core_Config_Defaults::formatUnitSize(ini_get('post_max_size'), TRUE);
   }
 
   /**
@@ -58,21 +60,19 @@ class CRM_Member_Import_Form_DataSource extends CRM_Core_Form {
   public function buildQuickForm() {
     //Setting Upload File Size
     $config = CRM_Core_Config::singleton();
-    if ($config->maxImportFileSize >= 8388608) {
+
+    $uploadFileSize = CRM_Core_Config_Defaults::formatUnitSize($config->maxFileSize.'m');
+    if ($uploadFileSize >= 8388608) {
       $uploadFileSize = 8388608;
     }
-    else {
-      $uploadFileSize = $config->maxImportFileSize;
-    }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
 
     $this->assign('uploadSize', $uploadSize);
 
-    $this->add('file', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
-
-    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
-    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
     $this->setMaxFileSize($uploadFileSize);
+    $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', array(1 => $uploadSize, 2 => $uploadFileSize)), 'maxfilesize', $uploadFileSize);
+    $this->addRule('uploadFile', ts('A valid file must be uploaded.'), 'uploadedfile');
     $this->addRule('uploadFile', ts('Input file must be in CSV format'), 'utf8File');
 
     $this->addElement('checkbox', 'skipColumnHeader', ts('First row contains column headers'));