File: /var/www/apklausos/application/models/UserParser.php
<?php
/**
* Importing class to get users from a CSV file
*
* @author LimeSurvey GmbH <info@limesurvey.org>
* @license GPL3.0
*/
class UserParser
{
/**
* reads an uploaded csv file
*
* @param array $FILES PHP Global $_FILES
* @return array Liste der hinzuzufügenden Nutzer
*/
public static function getDataFromCSV($FILES)
{
$sRandomFileName = randomChars(20);
$sFilePath = Yii::app()->getConfig('tempdir') . DIRECTORY_SEPARATOR . $sRandomFileName;
$aPathinfo = pathinfo((string) $FILES['the_file']['name']);
$sExtension = $aPathinfo['extension'];
$bMoveFileResult = false;
if ($_FILES['the_file']['error'] == 1 || $_FILES['the_file']['error'] == 2) {
Yii::app()->setFlashMessage(sprintf(gT("Sorry, this file is too large. Only files up to %01.2f MB are allowed."), getMaximumFileUploadSize() / 1024 / 1024), 'error');
Yii::app()->getController()->redirect(array('/userManagement/index'));
Yii::app()->end();
} elseif (strtolower($sExtension) == 'csv') {
$bMoveFileResult = @move_uploaded_file($_FILES['the_file']['tmp_name'], $sFilePath);
} else {
Yii::app()->setFlashMessage(gT("This is not a .csv file."), 'error');
Yii::app()->getController()->redirect(array('/userManagement/index'));
Yii::app()->end();
}
if ($bMoveFileResult === false) {
Yii::app()->setFlashMessage(gT("An error occurred uploading your file. This may be caused by incorrect permissions for the application /tmp folder."), 'error');
Yii::app()->getController()->redirect(array('/userManagement/index'));
Yii::app()->end();
return;
}
$delimiter = self::detectCsvDelimiter($sFilePath);
$oCSVFile = fopen($sFilePath, 'r');
if ($oCSVFile === false) {
// Throw a 500 error here : file was moved by LimeSurvey at set $bMoveFileResult : there are an install issue
throw new \CException('File can not be read.');
}
$aFirstLine = fgetcsv($oCSVFile, 0, $delimiter, '"');
if (empty($aFirstLine)) {
Yii::app()->setFlashMessage(gT("This CSV file seems to be empty"), 'error');
Yii::app()->getController()->redirect(array('/userManagement/index'));
Yii::app()->end();
}
$iHeaderCount = count($aFirstLine);
$aToBeAddedUsers = [];
while (($row = fgetcsv($oCSVFile, 0, $delimiter, '"')) !== false) {
$rowarray = array();
for ($i = 0; $i < $iHeaderCount; ++$i) {
$val = ($row[$i] ?? '');
// if Excel was used, it surrounds strings with quotes and doubles internal double quotes. Fix that.
if (preg_match('/^".*"$/', (string) $val)) {
$val = trim(str_replace('""', '"', substr((string) $val, 1, -1)), "\xC2\xA0\n");
}
$rowarray[$aFirstLine[$i]] = $val;
}
$aToBeAddedUsers[] = $rowarray;
}
fclose($oCSVFile);
return $aToBeAddedUsers;
}
/**
* reads an uploaded json file
*
* @param array $FILES PHP Global $_FILES
* @return array List of users to create
*/
public static function getDataFromJSON($FILES)
{
$json = file_get_contents($FILES['the_file']['tmp_name']);
$decoded = json_decode($json, true);
foreach ($decoded as $data) {
if (!isset($data["email"]) || !isset($data["users_name"]) || !isset($data["full_name"]) || !isset($data["lang"]) || !isset($data["password"])) {
Yii::app()->setFlashMessage(
sprintf(gT("Wrong definition! Please make sure that your JSON arrays contain the fields '%s', '%s', '%s', '%s', and '%s'"), '<b>users_name</b>', '<b>full_name</b>', '<b>email</b>', '<b>lang</b>', '<b>password</b>'),
'error'
);
Yii::app()->getController()->redirect(array('/userManagement/index'));
Yii::app()->end();
}
}
return $decoded;
}
/**
*Function to get the delimiter of a Csv file
* @param string $csvFile Path to the CSV file
* @return string Delimiter
*/
private static function detectCsvDelimiter($csvFile)
{
$delimiters = array(
';' => 0,
',' => 0,
"\t" => 0,
"|" => 0
);
$handle = fopen($csvFile, "r");
$firstLine = fgets($handle);
fclose($handle);
foreach ($delimiters as $delimiter => &$count) {
$count = count(str_getcsv($firstLine, $delimiter));
}
return array_search(max($delimiters), $delimiters);
}
}